工具 :
1.舵机 (一个或两个)
2.PS2摇杆 * 1
3.Arduino开发板
这里先来聊聊PS2摇杆,PS2摇杆内部相当于一个不能显示数值的可调电阻,可以把这个可调电阻数值看成下图的数值坐标:
因为PS2摇杆可以左右上下摇动,所以可以对应坐标的xy轴,左到右相当于x轴上数值从0到1023,上到下相当于y轴上数值从0到1023(上下左右的位置相对于上图摆放来说)。PS2上VRX就可以看成x轴,VRY看成y轴,SW就是控制将摇杆按下的按键。电路图如下:
那么既然我们要用坐标数值来表示PS2转动的幅度,所以PS2中VRX,VRY就可以接入analog in上的引脚,然后如果SW不需要,就不要接入(如果你只有一个舵机,那么VRY或VRX接入其中一个就好,当然别忘了接入正负极)。
下面聊聊舵机,舵机比步进电机控制角度来的更方便也更准确,还有舵机的线一般是棕 : GND,红 : VCC,橙: 控制线即OUT引脚。
舵机转动的角度是由控制线的持续脉冲产生的,由上图可以看出最小的脉冲宽度是1ms,最大宽度是2ms,当脉冲宽度为1ms,这里的旋转角度为0°不是在原地不动,而是回到初始的位置,每一次转动的角度都是相对于初始位置而言,知道这一点挺重要的。Arduino中可以调用Servo这个库中的函数来实现对角度不那么精确的控制。
看看自己有没有Servo舵机库,如果没有,要上划到库管理器中添加Servo这个库。这里值得一提的map函数,其用法 map(num,旧区间初值,旧区间终值,新区间初值,新区间终值),这里可以将0到1023的值简单的线性映射成角度从0到180,至于映射范围可以自己设定不一定要是0°到180°。
下面是完整代码:
#include <Servo.h>
Servo a;
Servo b;
int i,p,j,k;
void setup(){
a.attach(3);//指定舵机a的OUT引脚为3号引脚
b.attach(5);//指定舵机b的OUT引脚为5号引脚
Serial.begin(9600);
}
void loop(){
i = analogRead(A0);//获取A0引脚的输入值,即PS2摇杆X轴的数值
j = analogRead(A1);//获取A1引脚的输入值,即PS2摇杆Y轴的数值
Serial.print("映射前x轴:");
Serial.print(i);
Serial.print(" ");
Serial.print("映射前y轴:");
Serial.print(j);
Serial.print(" ");
p = map(i,0,1023,0,180);//将0到1023的值映射成0到180
k = map(j,0,1023,0,180);
Serial.print("映射后x轴:");
Serial.print(p);
Serial.print(" ");
Serial.print("映射后y轴:");
Serial.println(k);
a.write(p);//设置舵机a角度为p
b.write(k);//设置舵机b角度为k
}
最后可以打开串口监视器看看映射后角度变化(这是两个舵机的效果)
心得:
Arduino不得不说,用它来控制舵机还是非常容易的。之前我也用过步进电机控制角度,但不是太精确。(⊙﹏⊙)当然用PS2控制舵机转动角度也不是很精确,主要是PS2摇杆的转动方向不太好固定。但是单纯从控制角度精确程度,舵机是要优于步进电机的😜