摇杆一般在航模、电玩、遥控车、云台等设备上应用广泛,很多带有屏幕的设备也经常使用摇杆作为菜单选择的输入控制。本篇介绍双轴按键摇杆的使用。
1. 双轴按键摇杆介绍
双轴按键摇杆主要由两个10K的电位器和一个按键开关组成,两个电位器随着摇杆扭转角度分别输出X、Y轴上对应的电压值,在Z轴方向上按下摇杆可触发轻触按键。在配套机械结构的作用下,无外力扭动的摇杆初始状态下,两个电位器都处在量程的中间位置。
摇杆模块
不同厂商生产的按键摇杆模块的引脚输出会有所不同,但都会有VCC、GND电源引脚和X、Y、Z输出引脚。
2. 实验材料
- Uno R3开发板
- 配套USB数据线
- 面包板及配套连接线
- 双轴按键摇杆模块
3. 实验步骤
1. 根据原理图搭建电路图。
双轴按键摇杆模块的VCC、GND分别连接开发板的5V、GND,模块的X轴输出、Y轴输出分别连接开发板的模拟引脚A0、A1,模块的Z轴输出连接开发板数字引脚2。
实验原理图如下图所示:
实验原理图
实物连接图如下图所示:
实物连接图2. 新建sketch,拷贝如下代码替换自动生成的代码并进行下载
```c /*
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); }
<a name="hRjuP"></a>
## 4. 实验现象
打开串口监视器,波特率设置成与程序中相一致的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,但由于电位器及结构差异,原点值会有偏差,有些应用中需要进行校准。
<a name="UgONf"></a>
## 5.通过简单案例中认识摇杆
```c
#include <Servo.h>
Servo myservo1;//创建伺服器对象
Servo myservo2;//创建伺服器对象
int psx = A0;//定义摇杆信号线接口
int psy = A1;//定义摇杆信号线接口
int psk = 2;
int valx;//定义变量,从摇杆接口读取值(0-1023,不过一般取不到,大概在90-900多左右)
int valy;//定义变量,从摇杆接口读取值(0-1023,不过一般取不到,大概在90-900多左右)
void setup()
{
Serial.begin(9600);
pinMode(psx, OUTPUT);
pinMode(psy, OUTPUT);
pinMode(psk,INPUT);
myservo1.attach(4);
myservo2.attach(5);
}
void loop()
{
valx = analogRead(psx);
valy = analogRead(psy);
valx = map(valx,0,1023,0,179);
valy = map(valy,0,1023,0,179);
Serial.println(valx, DEC);
Serial.println(valy, DEC);
if(valx<90){
myservo1.write(0);
myservo2.write(0);
}
if(valx>90){
myservo1.write(90);
myservo2.write(90);
}
delay(15);
}