舵机是一种位置伺服的驱动器,主要是由外壳、电路板、无核心马达、齿轮与位置检测器所构成。一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。目前在高档遥控玩具,如航模,包括飞机模型,潜艇模型;遥控机器人中已经使用得比较普遍。舵机是一种俗称,其实是一种伺服马达。
1. 舵机的工作原理:
原理是由接收机或者单片机发出信号给舵机,其内部有一个基准电路,产生周期为20ms,宽度为1.5ms 的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。经由电路板上的IC 判断转动方向,再驱动无核心马达开始转动,透过减速齿轮将动力传至摆臂,同时由位置检测器送回信号,判断是否已经到达定位。适用于那些需要角度不断变化并可以保持的控制系统。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。一般舵机旋转的角度范围是0 度到180 度。
2. 舵机的电线介绍:
舵机有很多规格,但所有的舵机都有外接三根线,分别用棕、红、橙三种颜色进行区分,由于舵机品牌不同,颜色也会有所差异,棕色为接地线,红色为电源正极线,橙色为信号线。
舵机线 | 棕色 | 红色 | 橙色 |
---|---|---|---|
功能 | 接地 | 正极 | 信号线 |
3. 舵机的控制:
舵机的转动的角度是通过调节PWM(脉冲宽度调制)信号的占空比来实现的,标准PWM(脉冲宽度调制)信号的周期固定为20ms(50Hz),理论上脉宽分布应在1ms
到2ms
之间,但是,事实上脉宽可由0.5ms
到2.5ms
之间,脉宽和舵机的转角0°~180°相对应。
旋转的角度数对应着相应的脉冲的宽度。
舵机的控制方式有两种:
- 通过Arduino 的普通数字传感器接口产生占空比不同的方波,模拟产生PWM 信号进行舵机定位;
- 直接利用Arduino 自带的Servo 函数进行舵机的控制,这种控制方法的优点在于程序编写,缺点是只能控制2 路舵机,
注意:
由于舵机牌子不同,对于同一信号,不同牌子的舵机旋转的角度也会有所不同。
4. 例程:
-
舵机转动
#include <Servo.h> //此程序的功能是将舵机从0到180度然后从180到0度不停的旋转
Servo myservo; //创建一个舵机控制对象
// 使用Servo类最多可以控制8个舵机
int pos = 0; // 该变量用与存储舵机角度位置
void setup()
{
myservo.attach(9); // 该舵机由arduino第九脚控制
}
void loop()
{
for(pos = 0; pos < 180; pos += 1) // 从0度到180度运动
{ // 每次步进一度
myservo.write(pos); // 指定舵机转向的角度
delay(15); // 等待15ms让舵机到达指定位置
}
for(pos = 180; pos>=1; pos-=1) //从180度到0度运动
{
myservo.write(pos); // 指定舵机转向的角度
delay(15); // 等待15ms让舵机到达指定位置
}
}
-
电位计控制舵机
#include <Servo.h> //此程序是用电位计来控制舵机的旋转的。
Servo myservo; //创建一个舵机控制对象
int potpin = 0; //该变量用于存储用电位器读出的模拟值
int val; // 该变量用与存储舵机角度位置
void setup()
{
myservo.attach(9); // 该舵机由arduino第九脚控制
}
void loop()
{
val = analogRead(potpin); //读取电位器控制的模拟值 (范围在0-1023)
val = map(val, 0, 1023, 0, 179); // map函数是arduino自带的
函数,不是需要引用库。意思是把0-1023与0-179缩小范围对应起来 ;
myservo.write(val); // 指定舵机转向的角度
delay(15); // 等待15ms让舵机到达指定位置
}
-
串口通信控制舵机
int sp1=10;//定义舵机接口数字接口10
int pulsewidth;//定义脉宽变量
int val;
int val1;
int myangle1;
//下面是servopulse函数部分
void servopulse(int sp1,int val1)//定义一个脉冲函数
{
myangle1=map(val1,0,180,500,2480);
digitalWrite(sp1,HIGH);//将舵机接口电平至高
delayMicroseconds(myangle1);//延时脉宽值的微秒数
digitalWrite(sp1,LOW);//将舵机接口电平至低
delay(20-myangle1/1000); //原文是val1,不知道为什么也执行正确
}
//servopulse函数部分到此结束
void setup()
{
pinMode(sp1,OUTPUT);//设定舵机接口为输出接口
//设置两组串口波特率
Serial.begin(9600);
delay(500);
Serial.println("servu=o_seral_simple ready" ) ;
}
void loop()//将0到9的数转化为0到180角度,并让LED闪烁相应数的次数
{
val=Serial.read();//读取串行端口的值
if(val>'0'&&val<='9')
{
val1=val-'0';//将特征量转化为数值变量
val1=map(val1,0,9,0,180);//将角度转化为500-2480的脉宽值
Serial.print("moving servo to ");
Serial.print(val1,DEC); //DEC是十进制的意思。
Serial.println();
for(int i=0;i<=50;i++)//给予舵机足够的时间让它转到指定角度
{
servopulse(sp1,val1);//引用脉冲函数
}
}
}
舵机的控制有些bug(奇怪),用非pwm的端口也能控制。
5. 舵机的实际应用。
- 高档遥控仿真车,至少得包括左转和右转功能,高精度的角度控制,必然给你最真实的驾车体验.
- 多自由度机器人设计,为什么日本人设计的机器人可以上万RMB的出售,而国内设计的一些两三千块也卖不出去呢,还是一个品质的问题。
- 多路伺服航模控制,电动遥控飞机,油动遥控飞机,航海模型等。