如何使用Arduino和joystick模块控制舵机

  • 内容
  • ....
  • 相关

关于舵机控制的文章,前期写了好几篇了,有通过Arduino控制舵机的,树莓派3B控制舵机的,Nodemcu控制舵机的,以及舵机控制的原理等等。今天我们再将Arduino控制舵机的问题继续延展开来,采用joystick操作杆模块来控制舵机。

Arduino使用ps2 joystick模块控制舵机

joystick操作杆模块接口定义和内部结构

游戏操作杆模块的内部电路结构

2-AXIS Joystick游戏操作杆模块由两个电位器组成,每个电位器对应一个轴(X轴和Y轴),两个10k的可变电位器独立于各自的特定方向移动。开关(SW)引脚在内部是连接到一个按钮开关上的。

Arduino 2 AXIS 操作杆模块原理

模块共有5个引脚,分别是VCC、GND、KEY(数字)、VER(模拟)、HOR(模拟)。其中,VER是垂直方向信号引脚,其电压与Y轴成正比,HOR是水平方向信号引脚,其电压与X轴成正比,因此,在其它兼容模块中也有标示为VRx和VRy的,意思完全相同。KEY开关引脚,也标示为SW。

Arduino和joystick模块与舵机的连接

Arduino使用ps2 joystick模块控制舵机电路连接图

这个项目的硬件部分很容易制作。首先,将操纵杆模块与Arduino连接。操纵杆模块与Arduino的连接方式如下:

  1. 将操纵杆模块上的VCC与Arduino上的5V引脚连接
  2. 将操纵杆模块上的GND引脚与Arduino上的GND连接
  3. 将操纵杆模块上的VER引脚与Arduino上的A0连接
  4. 将操纵杆模块上的HOR引脚与Arduino上的A1连接

然后,将舵机与Arduino连接。舵机与Arduino的连接方式如下:

  1. 连接两个舵机上的黑色电线和Arduino上的GND
  2. 将两个舵机上的红线与Arduino上的5V引脚连接
  3. 将第一个舵机上的黄线与Arduino上的pin 8连接
  4. 将第二舵机上的黄线与Arduino上的pin 9连接

使用Arduino和joystick模块控制舵机的原理

Arduino使用ps2 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) ;
}
}
}