摇杆一般在航模、电玩、遥控车、云台等设备上应用广泛,很多带有屏幕的设备也经常使用摇杆作为菜单选择的输入控制。本篇介绍双轴按键摇杆的使用。

1. 双轴按键摇杆介绍

双轴按键摇杆主要由两个10K的电位器和一个按键开关组成,两个电位器随着摇杆扭转角度分别输出X、Y轴上对应的电压值,在Z轴方向上按下摇杆可触发轻触按键。在配套机械结构的作用下,无外力扭动的摇杆初始状态下,两个电位器都处在量程的中间位置。

期末开放任务素材:双轴摇杆 - 图1
摇杆模块
不同厂商生产的按键摇杆模块的引脚输出会有所不同,但都会有VCC、GND电源引脚和X、Y、Z输出引脚。

2. 实验材料

  • Uno R3开发板
  • 配套USB数据线
  • 面包板及配套连接线
  • 双轴按键摇杆模块

    3. 实验步骤

    1. 根据原理图搭建电路图。

    双轴按键摇杆模块的VCC、GND分别连接开发板的5V、GND,模块的X轴输出、Y轴输出分别连接开发板的模拟引脚A0、A1,模块的Z轴输出连接开发板数字引脚2。
    实验原理图如下图所示:
    期末开放任务素材:双轴摇杆 - 图2
    实验原理图
    实物连接图如下图所示:
    期末开放任务素材:双轴摇杆 - 图3
    实物连接图

    2. 新建sketch,拷贝如下代码替换自动生成的代码并进行下载

    ```c /*
    • JoyStick
    • 双轴按键摇杆 */

      define pinX A0

      define pinY A1

      define pinK 2

int value = 0;

void setup() { pinMode(pinK, INPUT); Serial.begin(9600); }

void loop() { value = analogRead(pinX); Serial.print(“X: “); Serial.print(value);

value = analogRead(pinY); Serial.print(“ Y: “); Serial.print(value);

value = digitalRead(pinK); Serial.print(“ Z: “); Serial.println(value);

delay(1000); }

  1. <a name="hRjuP"></a>
  2. ## 4. 实验现象
  3. 打开串口监视器,波特率设置成与程序中相一致的9600,扭动摇杆,监视器将显示X、Y轴对应的电压对应的AD数值。<br />![](https://cdn.nlark.com/yuque/0/2021/webp/732467/1621315321125-7eea32bb-9e95-43db-bdee-33e8bec228c0.webp#clientId=ub980ab43-8e53-4&from=paste&height=244&id=u331d9a10&margin=%5Bobject%20Object%5D&originHeight=488&originWidth=352&originalType=url&status=done&style=none&taskId=u2ec99ad1-b1d8-4f4f-a1b4-4a029ab3987&width=176)<br />由于开发板的ADC是10位精度,AD值在[0, 1023]之间,理论上X、Y轴输出中间值512,但由于电位器及结构差异,原点值会有偏差,有些应用中需要进行校准。
  4. <a name="UgONf"></a>
  5. ## 5.通过简单案例中认识摇杆
  6. ```c
  7. #include <Servo.h>
  8. Servo myservo1;//创建伺服器对象
  9. Servo myservo2;//创建伺服器对象
  10. int psx = A0;//定义摇杆信号线接口
  11. int psy = A1;//定义摇杆信号线接口
  12. int psk = 2;
  13. int valx;//定义变量,从摇杆接口读取值(0-1023,不过一般取不到,大概在90-900多左右)
  14. int valy;//定义变量,从摇杆接口读取值(0-1023,不过一般取不到,大概在90-900多左右)
  15. void setup()
  16. {
  17. Serial.begin(9600);
  18. pinMode(psx, OUTPUT);
  19. pinMode(psy, OUTPUT);
  20. pinMode(psk,INPUT);
  21. myservo1.attach(4);
  22. myservo2.attach(5);
  23. }
  24. void loop()
  25. {
  26. valx = analogRead(psx);
  27. valy = analogRead(psy);
  28. valx = map(valx,0,1023,0,179);
  29. valy = map(valy,0,1023,0,179);
  30. Serial.println(valx, DEC);
  31. Serial.println(valy, DEC);
  32. if(valx<90){
  33. myservo1.write(0);
  34. myservo2.write(0);
  35. }
  36. if(valx>90){
  37. myservo1.write(90);
  38. myservo2.write(90);
  39. }
  40. delay(15);
  41. }