舵机控制基础
舵机的伺服系统由可变宽度的脉冲来进行控制,控制线是用来传送脉冲的。脉冲的参数有最小值,最大值,和频率。一般而言,舵机的基准信号都是周期为20ms,宽度为1.5ms。这个基准信号定义的位置为中间位置。舵机有最大转动角度,中间位置的定义就是从这个位置到最大角度与最小角度的量完全一样。最重要的一点是,不同舵机的最大转动角度可能不相同,但是其中间位置的脉冲宽度是一定的,那就是1.5ms。如下图:
角度是由来自控制线的持续的脉冲所产生。这种控制方法叫做脉冲调制。脉冲的长短决定舵机转动多大角度。例如:1.5毫秒脉冲会到转动到中间位置(对于180°舵机来说,就是90°位置,对于270°舵机来说,就是135°位置)。当控制系统发出指令,让舵机移动到某一位置,并让他保持这个角度,这时外力的影响不会让他角度产生变化,但是这个是由上限的,上限就是他的最大扭力。除非控制系统不停的发出脉冲稳定舵机的角度,舵机的角度不会一直不变。
当舵机接收到一个小于1.5ms的脉冲,输出轴会以中间位置为标准,逆时针旋转一定角度。接收到的脉冲大于1.5ms情况相反。不同品牌,甚至同一品牌的不同舵机,都会有不同的最大值和最小值。一般而言,最小脉冲为1ms,最大脉冲为2ms。如下图:
大多数规格的舵机都会引出三根线,常见的是红棕橙三个颜色,也有红白黑三色的。红色为5v电源线,黑色或棕色线为接地线,橙色或白色线为信号线。
我直接买的是Arduino舵机控制板,和一般的Arduino相比就是舵机控制引脚不同而已,移植的时候改一改即可。
单个舵机控制程序
#include <Servo.h>
/*----------------------------------------------------------------------------
相关函数:
1.servo类成员函数
attach() 设定舵机的接口,只有9或10接口可利用
write() 用于设定舵机旋转角度的语句,可设定的角度范围是0°到180°
writeMicroseconds() 用于设定舵机PWM的语句,直接用微秒作为参数
read() 用于读取舵机角度的语句,可理解为读取最后一条write()命令中的值
attach() 判断舵机参数是否已发送到舵机所在接口
detach() 使舵机与其接口分离,该接口(9或10)可继续被用作PWM接口
----------------------------------------------------------------------------*/
#include <Servo.h> // 声明调用Servo.h库
Servo myservo; //创建一个舵机类,命名为myservo
#define SERVO_PIN 10 //宏定义舵机控制引脚
unsigned int PWM = 0; //变量pwm用来存储舵机角度位置,PWM的500对应0度,2500对应舵机的最大角度
//(180度舵机2500对应180度,270度舵机2500对应270度)
void singleServoControl(){
for(PWM = 50; PWM <2450; PWM += 5){ //舵机从50状态转到2450,每次增加5
myservo.writeMicroseconds(PWM); //给舵机写入PWM
delay(10); //延时10ms让舵机转到指定位置
}
for(PWM = 2450; PWM>50; PWM-=5){
myservo.writeMicroseconds(PWM);
delay(10);
}
}
void setup(){
//put your setup code here, to run once:
myservo.attach(SERVO_PIN); // 将10引脚与声明的舵机对象连接起来
}
void loop(){
//put your main code here, to run repeatedly:
singleServoControl();
}