风筝
发表于: 2018-3-25 22:02:32 | 显示全部楼层

Interfacing-Joystick-with-Arduino.jpg


我们听到Joystick这个词时,脑海里呈现出来的第一件事就是游戏控制器。是的,操纵杆常用于操作各种游戏。除了游戏,它还有许多其他的DIY电子应用。操纵杆包含两个分别用于X和Y平面的电位器。它通过电位计读取电压并向Arduino开发板给出相应的模拟值,模拟值随着我们移动操纵杆轴(也就是电位计指针)而改变。


在本篇文章中,我们将Joystick和Arduino开发板进行连接,通过移动操纵杆,很容易实现控制四个LED。我们已经放置了4个LED,以表示操纵杆轴的运动方向。这个操纵杆还有另外一个按钮,可以用于各种其他目的。单个LED也会连接到操纵杆的开关上,当操纵杆按钮按下时,单个LED将点亮。


所需的材料

●    Arduino UNO开发板

●    Joystick操纵杆模块

●    5个LED指示灯

●    3个100欧姆的电阻

●    连接导线

●    面包板


电路原理图

Interfacing-Circuit-diadram-of-Joystick-with-Arduino.png


操纵杆模块

操纵杆有不同的形状和尺寸。下图显示了常见的操纵杆模块。该Joystick模块通常提供模拟输出,并且该模块提供的输出电压根据我们移动的方向不断变化。我们可以通过使用一些微控制器解析这些电压变化来获得移动的方向。

Joystick-Module.jpg

你可以看到这个操纵杆模块有两个方向轴。它们是X轴和Y轴。 JOYSTICK的每个轴都安装在电位器上。这些电位器的中点作为Rx和Ry输出。所以Rx和Ry是这些电位器的可变点。当操纵杆处于待机状态时,Rx和Ry充当分压器。

当操纵杆沿水平轴移动时,Rx引脚上的电压发生变化。同样,当它沿着垂直轴移动时,Ry引脚的电压也会改变。所以我们在两个ADC输出上有四个操纵杆方向。当操纵杆移动时,每个引脚上的电压根据方向变高或变低。

在这里,我们将这个Joystick模块与Arduino UNO开发板连接起来,后者内置有一个ADC(模数转换器)。。


代码和说明

在本文的末尾处列出了完整的Arduino代码。


在下面的代码中,我们分别为模拟引脚A0和A1定义了操纵杆模块的X轴和Y轴。

  1. #define joyX A0
  2. #define joyY A1
复制代码

现在,在下面的代码中,我们为操纵杆模块的开关(按钮)初始化Arduino的PIN 2,并且在开始时buttonstate和buttonstate1的值将为0。

  1. int button=2;
  2. int buttonState = 0;
  3. int buttonState1 = 0;
复制代码

在下面的代码中,我们将波特率设置为9600,并将引脚7定义为输出引脚,将按钮引脚定义为输入引脚。最初,按钮引脚将保持高电平,直到开关按下。

  1. void setup() {
  2.   pinMode(7,OUTPUT);
  3.   pinMode(button,INPUT);
  4.   digitalWrite(button, HIGH);
  5.   Serial.begin(9600);
  6. }
复制代码

在此代码中,我们正在读取模拟引脚A0和A1的值,并串行打印。

  1. int xValue = analogRead(joyX);
  2. int yValue = analogRead(joyY);

  3.   Serial.print(xValue);
  4.   Serial.print("\t");
  5.   Serial.println(yValue);
复制代码

在下面的代码中定义了根据操纵杆方向轴的运动打开和关闭LED的条件。这里我们只是在Arduino的引脚A0和A1处获取电压的模拟值。这些模拟值将随着我们移动操纵杆而改变,并且LED将根据操纵杆的移动而发光。

X-Y-position-value-of-Joystick-module.png


下列情况适用于操纵杆轴在-Y轴方向移动

  1. if (xValue>=0 && yValue<=10){
  2.     digitalWrite(10, HIGH);
  3.   }
  4.   else{digitalWrite(10, LOW);}
复制代码

下列情况适用于操纵杆轴在-X轴方向上移动

  1. if (xValue<=10 && yValue>=500){
  2.     digitalWrite(11, HIGH);
  3.   }
  4.   else{digitalWrite(11, LOW);}
复制代码

下列情况适用于操纵杆轴沿+ X轴方向移动

  1.   if (xValue>=1020 && yValue>=500){
  2.     digitalWrite(9, HIGH);
  3.   }
  4.   else{digitalWrite(9, LOW);}
复制代码

下列情况适用于操纵杆轴沿+ Y轴方向移动

  1.   if (xValue>=500 && yValue>=1020){
  2.     digitalWrite(8, HIGH);
  3.   }
  4.   else{digitalWrite(8, LOW);}
复制代码

当我们沿着对角线移动操纵杆轴时,当X和Y的模拟值分别为1023和1023时,就会出现一个位置,引脚9和引脚8 LED都会发光。因为它满足了LED的条件。所以,为了消除这种不匹配,我们给出了一个条件,如果(X,Y)的值是(1023,1023),那么两个LED都保持OFF状态

  1.   if (xValue>=1020 && yValue>=1020)  {
  2.     digitalWrite(9, LOW);
  3.     digitalWrite(8, LOW);
  4.   }
复制代码

以下条件用于操作连接到按钮开关的LED。当我们按下操纵杆开关时,LED将会打开并锁定,直至释放按钮。它可以使用Joystick模块上的按钮开关。

  1.   if (buttonState == LOW)  {
  2.     Serial.println("Switch = High");
  3.     digitalWrite(7, HIGH);
  4.   }
  5.   else{digitalWrite(7, LOW);}
复制代码

使用Arduino开发板和操纵杆控制LED灯

Interfacing-Joystick-with-Arduino-in-action.jpg

将代码上传到Arduino开发板,并根据电路图连接组件后,我们现在可以使用操纵杆控制LED。根据操纵杆方向轴的运动,我们可以打开每个方向的四个LED。操纵杆内部有两个电位器,一个用于X轴移动,另一个用于Y轴移动。每个电位器都从Arduino获取得5v。所以当我们移动操纵杆时,电压值会改变,模拟引脚A0和A1的模拟值也会改变。


因此,从Arduino中,我们读取X和Y轴的模拟值,并根据操纵杆的轴移动开启LED。 Joystick模块上的按钮开关用于控制电路中的单个LED。


代码

以下列出了本教程使用的完整代码: main.c (1.17 KB, 下载次数: 123)

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 714 | 回复: 1501



手机版|

GMT+8, 2024-12-22 15:13 , Processed in 0.039064 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表