2008年10月29日 星期三

Arduino扩展板使用之舵机篇

舵机,又称伺服马达,是一种具有闭环控制系统的机电结构。舵机主要是由外壳、电
路板、无核心马达、齿轮与位置检测器所构成。其工作原理是由控制器发出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版编译环境中没有编译通过,不知何故?

沒有留言: