舵机是机器人、遥控玩具等领域不可或缺的一个控制器组件,主要用于位置、角度等方面的控制与定位。
其机构主要是由外壳、电路板、无核心马达、齿轮与位置检测器所构成。其工作原理是由接收机或者单片机发出信号给舵机,其内部有一个基准电路,产生周期为
20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。经由电路板上的IC判断转动方向,再驱动无核心马达开
始转动,透过减速齿轮将动力传至摆臂,同时由位置检测器送回信号,判断是否已经到达定位。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差
为0,电机停止转动。一般舵机旋转的角度范围是0°到180°度。
舵机有3根线,棕色为地,红色为电源正,橙色为信号线;当然有的品牌也可能是“黑红白”分别代表地、电源正、信号。如下图:
舵机的转动位置是靠控制PWM(脉冲宽度调制)信号的占空比来实现的,标准PWM(脉冲宽度调制)信号的周期固定为20ms,占空比0.5~2.5ms
的正脉冲宽度和舵机的转角-90°~90°相对应。注意,由于舵机牌子不同,其控制器解析出的脉冲宽度也不同,所以对于同一信号,不同牌子的舵机旋转的角
度也不同。
控制舵机的时候,要特别注意供电部分,因为舵机转动时电流会比较大,Arduino上的电源芯片可能会因过流保护到发热而损坏,所有电源需要接到外部供
电,切不可使用USB供电(短时间测试一下其实也还是可以的,比如烧好程序后让舵机转一个来回,也就5秒左右,然后断开供电)
直接调用Servo库对舵机进行控制无疑是最简单的方法,网络上很多文档都提及通过库控制时只能使用pin9和pin10两个数字接口(也就是说最多能同
时支持两个舵机运转),其实这些都是老黄历了,当前的库已经可以同时支持12个马达了(也就是说pin2~pin13可以任意使用;对于Arduino
Mega可以同时支持达48个)
下面是官方文档原话(arduino.cc/it/Reference/Servo):
The Servo library supports up to 12 motors on most Arduino boards and 48
on the Arduino Mega. On boards other than the Mega, use of the library
disables analogWrite() (PWM) functionality on pins 9 and 10, whether or
not there is a Servo on those pins. On the Mega, up to 12 servos can be
used without interfering with PWM functionality; use of 12 to 23 motors
will disable PWM on pins 11 and 12.
大概翻译一下:
对于大多数Arduino,Servo库可支持多达12个马达,对于Arduino
Mega是48个。对于非Mega板子,使用Servo库时会禁止通过analogWrite()函数对pin9和pin10进行操作(即禁掉了PWM功
能),无论是否有马达接入到这两个引脚;对于Mega板子,在不影响PWM功能的情况下有12个马达可用,当马达数在12~23个中间时,pin11和
pin12的PWM会被禁止掉。
通过arduino扩展板子连接最方便,没有扩展板就将三跟线分别连接到对应的引脚即可,如下图(测试程序是连接到pin9进行测试的):
测试代码:
#include <Servo.h>//需要Servo.h
Servo servo;//定义Servo
int pos = 0;
void setup()
{
servo.attach(9);//以前老的版本仅支持pin9和pin10,现在可以是2~13任何数字接口
servo.write(0);//输出舵机初始位置为0度
}
void loop()
{
for(pos = 0; pos<180; pos++){
servo.write(pos);
delay(15);
}
for(pos = 180; pos>0; pos--){
servo.write(pos);
delay(15);
}
}
关于Servo库提供的几个常用函数(用法都形如:servo.xx()):
1、attach(接口)—— 设定舵机的接口,只有9或10接口可利用。
2、write(角度)—— 用于设定舵机旋转角度的语句,可设定的角度范围是0°到180°。
3、read()—— 用于读取舵机角度的语句,可理解为读取最后一条write()命令中的值。
4、attached()—— 判断舵机参数是否已发送到舵机所在接口。
5、detach()—— 使舵机与其接口分离,该接口(9或10)可继续被用作PWM接口。
以前老版本时,如果需要同时支持超过两个舵机时,可不依赖库而自行控制,示例参见:hi.baidu.com/chbxgbin/item/ad9ed3ccd78cc316b77a243d