如何使用Arduino和joystick模块控制舵机
关于舵机控制的文章,前期写了好几篇了,有通过Arduino控制舵机的,树莓派3B控制舵机的,Nodemcu控制舵机的,以及舵机控制的原理等等。今天我们再将Arduino控制舵机的问题继续延展开来,采用joystick操作杆模块来控制舵机。
joystick操作杆模块接口定义和内部结构
2-AXIS Joystick游戏操作杆模块由两个电位器组成,每个电位器对应一个轴(X轴和Y轴),两个10k的可变电位器独立于各自的特定方向移动。开关(SW)引脚在内部是连接到一个按钮开关上的。
模块共有5个引脚,分别是VCC、GND、KEY(数字)、VER(模拟)、HOR(模拟)。其中,VER是垂直方向信号引脚,其电压与Y轴成正比,HOR是水平方向信号引脚,其电压与X轴成正比,因此,在其它兼容模块中也有标示为VRx和VRy的,意思完全相同。KEY开关引脚,也标示为SW。
Arduino和joystick模块与舵机的连接
这个项目的硬件部分很容易制作。首先,将操纵杆模块与Arduino连接。操纵杆模块与Arduino的连接方式如下:
- 将操纵杆模块上的VCC与Arduino上的5V引脚连接
- 将操纵杆模块上的GND引脚与Arduino上的GND连接
- 将操纵杆模块上的VER引脚与Arduino上的A0连接
- 将操纵杆模块上的HOR引脚与Arduino上的A1连接
然后,将舵机与Arduino连接。舵机与Arduino的连接方式如下:
- 连接两个舵机上的黑色电线和Arduino上的GND
- 将两个舵机上的红线与Arduino上的5V引脚连接
- 将第一个舵机上的黄线与Arduino上的pin 8连接
- 将第二舵机上的黄线与Arduino上的pin 9连接
使用Arduino和joystick模块控制舵机的原理
使用Arduino和joystick模块控制舵机的原理:当操纵杆模块在水平或垂直方向移动时,它会向Arduino控制板传输一个0到1023之间的值。基于此,我们可以在代码中应用一个条件,如果这个值小于300或大于700,则舵机将移动。当操纵杆在水平方向移动时,第一个舵机将向右或向左移动,当操纵杆在垂直方向移动时,第二个舵机将向右或向左移动。
控制代码解析
首先,代码包含了舵机的库文件,它将帮助我们简化代码。然后,初始化两个变量,每个变量分别对应两个舵机。
#include <Servo.h> Servo servo1; Servo servo2;
然后,初始化引脚,在这里我们连接了操纵杆模块上的垂直和水平两个引脚,以及舵机上的信号引脚。
int x_key = A1; int y_key = A0; int x_pos; int y_pos; int servo1_pin = 8; int servo2_pin = 9; int initial_position = 90; int initial_position1 = 90;
然后,告诉Arduino舵机引脚的位置,并在初始化引脚位置时伺服电机移动到90度,接着将操纵杆模块上的垂直和水平引脚都声明为输入引脚。
servo1.attach (servo1_pin ) ; servo2.attach (servo2_pin ) ; servo1.write (initial_position); servo2.write (initial_position1); pinMode (x_key, INPUT) ; pinMode (y_key, INPUT) ;
在循环函数中,我们从操纵杆模块读取水平和垂直位置的值,并将这些值保存在变量中。然后我们应用了一个条件,如果水平位置的值小于300,那么第一个舵机将向右移动。
x_pos = analogRead (x_key) ; y_pos = analogRead (y_key) ; if (x_pos < 300){ if (initial_position < 10) { } else{ initial_position = initial_position - 20; servo1.write ( initial_position ) ; delay (100) ; } }
如果水平位置的值大于700,则舵机将向左移动。同样对于操纵杆模块的垂直位置,如果数值小于300,则第二个舵机向左移动,如果数值大于700,则第二个舵机向右移动。
if (x_pos > 700){ if (initial_position > 180) { } else{ initial_position = initial_position + 20; servo1.write ( initial_position ) ; delay (100) ; } }
这样,我们就可以实现通过Joystick游戏操作杆模块控制舵机的运动了。
完整的控制代码如下:
#include <Servo.h> Servo servo1; Servo servo2; int x_key = A1; int y_key = A0; int x_pos; int y_pos; int servo1_pin = 8; int servo2_pin = 9; int initial_position = 90; int initial_position1 = 90; void setup ( ) { Serial.begin (9600) ; servo1.attach (servo1_pin ) ; servo2.attach (servo2_pin ) ; servo1.write (initial_position); servo2.write (initial_position1); pinMode (x_key, INPUT) ; pinMode (y_key, INPUT) ; } void loop ( ) { x_pos = analogRead (x_key) ; y_pos = analogRead (y_key) ; if (x_pos < 300){ if (initial_position < 10) { } else{ initial_position = initial_position - 20; servo1.write ( initial_position ) ; delay (100) ; } } if (x_pos > 700){ if (initial_position > 180) { } else{ initial_position = initial_position + 20; servo1.write ( initial_position ) ; delay (100) ; } } if (y_pos < 300){ if (initial_position1 < 10) { } else{ initial_position1 = initial_position1 - 20; servo2.write ( initial_position1 ) ; delay (100) ; } } if (y_pos > 700){ if (initial_position1 > 180) { } else{ initial_position1 = initial_position1 + 20; servo2.write ( initial_position1 ) ; delay (100) ; } } }