本文将继续围绕舵机的控制进行,我们将以Tower Pro (辉盛)SG90舵机的控制为例,因为SG90是市面上价格较便宜,也是实验中用得最多的产品之一。
舵机
舵机(servo motor),常用于遥控模型飞机,所以又常称为RC伺服电机(RC Servo,Radio Control Servo,Remote Control Servo)。详见:什么是舵机?
舵机里含有直流马达、齿轮箱、轴柄、以及控制电路,我们可透过信号控制轴柄的转动角度,大概都是0到180度,但不同厂牌型号会有不同的范围;经由齿轮箱降速后,变成适当可用的转速,并且提供更高的转矩(扭力)。详见:舵机的工作原理
不过每个厂牌型号的舵机可允许旋转的角度各不相同,也就是说可接受的信号脉冲范围也不相同,必须查阅产品资料规格书,若超出范围可能会损害舵机。下面是Tower Pro SG90的规格:
重量:9g
尺寸:23*12.2*29mm
工作电压:4.8V转矩:1.8kg-cm,当工作电压为4.8V时
运转速度:0.1秒 ∕ 60度 ,当工作电压为4.8V时
脉冲宽度范围:500~2400µs
死频带宽度(dead band width):10µs
从中我们可知,可允许的脉冲范围是500~2400µs,也就是0.5~2.4ms,比刚刚说的一般范围还要宽,也就代表这个舵机能旋转的角度更大。另外有项值得一提的数据是死频带宽度,意思是说,因为信号可能不稳定而上下起伏,当这一次脉冲宽度与上一次相差不超过死频带宽度时,舵机便不会动作。
servo.h控制舵机
本次试验,我们直接用Arduino的5V脚为舵机供电。若使用超过两个舵机,则应该使用独立的电源为舵机供电,记得共地。信号脚使用Arduino的D9。 Arduino内建操控舵机的标准库,使用方法非常简单。在如何使用Arduino舵机库servo.h一文中,我们也进行了相关函数的介绍。下面以操控舵机的旋转角度为例,来看看servo.h如何控制舵机。本实验使用此servo.h代码库时,D9与D10无法输出PWM信号,于是我们将舵机的信号线接在数位脚位9或10。 代码如下:
#include <Servo.h> Servo myservo; // 建立Servo实例,控制舵机 void setup() { myservo.attach(9); // 连接D9,舵机的信号线 } void loop() { for(int i = 0; i <= 180; i+=1){ myservo.write(i); // 使用write,传入角度值,从0度转到180度 delay(20); } for(int i = 180; i >= 0; i-=1){ myservo.write(i);// 使用write,传入角度值,从180度转到0度 delay(20); } }
不过Servo.h预设的脉冲宽度范围是544到2400µs,跟SG90舵机的500到2400差了一些些,我们可修正此点。
#include <Servo.h> Servo myservo; void setup() { myservo.attach(9, 500, 2400); // 修正脉冲宽度范围 myservo.write(90); // 开始先置中90度 delay(3000); } void loop() { for(int i = 500; i <= 2400; i+=100){ myservo.writeMicroseconds(i); // 直接以脉冲宽度控制 delay(300); } for(int i = 2400; i >= 500; i-=100){ myservo.writeMicroseconds(i); delay(300); } }
这里需要注意的,使用舵机前必须查询舵机的规格参数表,查到正确的脉冲宽度范围,如果与servo.h的预设范围有偏差,需要采用“myservo.attach(9, 500, 2400)”的方式进行修正。使用writeMicroseconds函数时也要注意,不能传入超出范围的值,否则可能会损坏舵机。