路板、无核心马达、齿轮与位置检测器所构成。其工作原理是由控制器发出PWM(脉冲宽度调制)信号给舵机,经电路板上的IC处理后计算出转动方向,再驱动
无核心马达转动,透过减速齿轮将动力传至摆臂,同时由位置检测器(电位器)返回位置信号,判断是否已经到达设定位置,一般舵机只能旋转180度。
舵机有3根线,棕色为地,红色为电源正,橙色为信号线,但不同牌子的舵机,线的颜色可能不同,请大家注意。
舵机的转动位置是靠控制PWM(脉冲宽度调制)信号的占空比来实现的,标准PWM(脉冲宽度调制)信号的周期固定为20ms,占空比0.5~2.5ms 的正脉冲宽度和舵机的转角-90°~90°相对应。注意,由于舵机牌子不同,其控制器解析出的脉冲宽度也不同,所以对于同一信号,不同牌子的舵机旋转的角度也不同。
下面我们用Arduino控制配合扩展板控制3个不同牌子的舵机。首先了解一下扩展板的一些特性。
本实验需要扩展板一个,舵机3只。由于只是做演示用,舵机5v电源就暂时使用Arduino上的,但不可长时间使用,因为多个舵机转动时电流比较
大,Arduino上的电源芯片可能会因过热而保护甚至损坏,电源选择跳线需要接到外部供电,不可使用USB供电。
Arduino官方网站给我们提供了一个很好的舵机调用函数库(舵机函数库下载地址),可以让Arduino任意IO口控制舵机,下列代码使用Arduino的编译环境中的串口监视器发送数据来控制舵机旋转角度。
实验代码如下:
#i nclude <Servo.h>
Servo servo1;
Servo servo2;
Servo servo3;
void setup()
{
servo1.attach(8);//定义舵机控制口
servo1.setMaximumPulse(2200);//定义旋转的时间
servo2.attach(9);
servo2.setMaximumPulse(2200);
servo3.attach(10);
servo3.setMaximumPulse(2200);
Serial.begin(19200);//设置波特率
Serial.print("Ready");
}
void loop()
{
static int v = 0;
if ( Serial.available()) {
char ch = Serial.read();//读取串口数据
switch(ch) {
case '0'...'9':
v = v * 10 + ch - '0';//字符换算成10进制
break;
case 'a'://如果数据后带a,则表示是servo1的数据,比如串口发送85a
servo1.write(v);
v = 0;
break;
case 'b'://如果数据后带b,则表示是servo2的数据,比如串口发送90b
servo2.write(v);
v = 0;
break;
case 'c'://如果数据后带c ,则表示是servo3的数据,比如串口发送180c
servo3.write(v);
v = 0;
break;
}
}
Servo::refresh();//刷新
}
本实验代码在Arduino 0011版编译环境中编译通过,在Arduino 0012版编译环境中没有编译通过,不知何故?
沒有留言:
張貼留言