关于Arduino舵机的控制

舵机是一种位置伺服的驱动器,主要是由外壳、电路板、无核心马达、齿轮与位置检测器所构成。一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。目前在高档遥控玩具,如航模,包括飞机模型,潜艇模型;遥控机器人中已经使用得比较普遍。舵机是一种俗称,其实是一种伺服马达。

1. 舵机的工作原理:

原理是由接收机或者单片机发出信号给舵机,其内部有一个基准电路,产生周期为20ms,宽度为1.5ms 的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。经由电路板上的IC 判断转动方向,再驱动无核心马达开始转动,透过减速齿轮将动力传至摆臂,同时由位置检测器送回信号,判断是否已经到达定位。适用于那些需要角度不断变化并可以保持的控制系统。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。一般舵机旋转的角度范围是0 度到180 度。


2. 舵机的电线介绍:

舵机的电线.jpg

舵机有很多规格,但所有的舵机都有外接三根线,分别用棕、红、橙三种颜色进行区分,由于舵机品牌不同,颜色也会有所差异,棕色为接地线,红色为电源正极线,橙色为信号线。

舵机线 棕色 红色 橙色
功能 接地 正极 信号线

3. 舵机的控制:

舵机的转动的角度是通过调节PWM(脉冲宽度调制)信号的占空比来实现的,标准PWM(脉冲宽度调制)信号的周期固定为20ms(50Hz),理论上脉宽分布应在1ms2ms 之间,但是,事实上脉宽可由0.5ms2.5ms 之间,脉宽和舵机的转角0°~180°相对应。

关于Arduino舵机的控制_第1张图片
控制示意图.png

旋转的角度数对应着相应的脉冲的宽度。

舵机的控制方式有两种:
  • 通过Arduino 的普通数字传感器接口产生占空比不同的方波,模拟产生PWM 信号进行舵机定位;
  • 直接利用Arduino 自带的Servo 函数进行舵机的控制,这种控制方法的优点在于程序编写,缺点是只能控制2 路舵机,

注意:

由于舵机牌子不同,对于同一信号,不同牌子的舵机旋转的角度也会有所不同。


4. 例程:

  • 舵机转动
#include  //此程序的功能是将舵机从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 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的出售,而国内设计的一些两三千块也卖不出去呢,还是一个品质的问题。
  • 多路伺服航模控制,电动遥控飞机,油动遥控飞机,航海模型等。

参考文章:

DIYer修炼:舵机知识扫盲

你可能感兴趣的:(关于Arduino舵机的控制)