Arduino 舵机控制

  舵机,又称伺服马达,是一种具有闭环控制系统的机电结构。舵机主要是由外 壳、电路板、无核心马达、齿轮与位置检测器所构成。其工作原理是由控制器发出PWM(脉冲宽度调制)信号给舵机,经电路板上的IC处理后计算出转动方向, 再驱动无核心马达转动,透过减速齿轮将动力传至摆臂,同时由位置检测器(电位器)返回位置信号,判断是否已经到达设定位置,一般舵机只能旋转180度。舵机有3根线,棕色为地,红色为电源正,橙色为信号线,但不同牌子的舵机,线的颜色可能不同,需要注意。

    舵机的转动位置是靠控制PWM(脉冲宽度调制)信号的占空比来实现的,标准PWM(脉冲宽度调制)信号的周期固定为20ms,占空比0.5~2.5ms 的正脉冲宽度和舵机的转角-90°~90°相对应。注意,由于舵机牌子不同,其控制器解析出的脉冲宽度也不同,所以对于同一信号,不同牌子的舵机旋转的角度也不同。

    如果自己做实验,舵机5v 电源就暂时使用Arduino 上的,但不可长时间使用,因为舵机转动时电流比较大,Arduino 上的电源芯片可能会因过热而保护甚至损坏,所以正常使用时需要使用外部电源给舵机供电。

    为了便于理解,下面就来具体分析一下Arduino自带的Servo函数及其语句,先来介绍一下舵机函数的几个常用语句。

     1.attach(接口)——设定舵机的接口,只有9或10接口可利用


     2.write(角度)——用于设定舵机旋转角度的语句,可设定的角度范围是0°到180°


     3.read(读取)——用于读取舵机角度的语句,可理解为读取最后一条write( )命令中的值


     4.attached( )——判断舵机参数是否已发送到舵机所在的接口


     5.detach( )——使舵机与其接口分离,该接口(9或10)可继续被用作PWM接口

    注:以上语句的书写格式均为“舵机变量名.具体语句()”例如:myservo.attach(9)。

下面就来具体分析一个小程序:
     #include <Servo.h>//定义头文件,这里有一点要注意,可以直接在Arduino软件菜单栏单击Sketch>Importlibrary>Servo,调用Servo函数,也可以直接#include <Servo.h>,但是在输入时要注意在#include 与<Servo.h>之间要有空格,否则编译时会报错。
     

Servo myservo;//定义舵机变量名   

 Servo myservo;//定义舵机变量名
     void setup()
     {
	myservo.attach(9);//定义舵机接口,9或10 
      }
     void loop()
      {
        myservo.write(90);//设置舵机旋转的角度
      }

原创部分:

以某项目为例,舵机姿态控制程序分析如下:

方案:控制底部舵机1以1度为步进值做周期性270度的四分之三圆周运动,控制上部舵机2以20度为步进值,做0-180度的半圆周运动,舵机1每完成半个周期,舵机2步进一次。

优缺点分析:

优点:程序较易实现,能基本实现较大的转动空间;

缺点:两个舵机相对独立动作,舵机1负责画四分之三圆周,且在画圆周的过程中舵机2保持在某一角度不运动;理论上存在90度的转动死角。

程序:

#include <Servo.h>

Servo myservo1,myservo2;  //创建两个舵机控制对象

                          // 使用Servo类最多可以控制8个舵机

int pos = 0, i=0;   // 该变量用与存储舵机角度位置

int t = 20;      //定义延时函数变量

/*~~~~~~~~~~~~~~~~~~~~~~~~~~华丽的分割线~~~~~~~~~~~~~~~~~~~~~~~~~~ */

void setup()

{

  myservo1.attach(9);  // 该舵机由arduino第九脚控制

  myservo2.attach(10);  // 该舵机由arduino第十脚控制

}

/*~~~~~~~~~~~~~~~~~~~~~~~~~~华丽的分割线 ~~~~~~~~~~~~~~~~~~~~~~~~~~ */

void loop()

{

   

        for(i=160;i>0;i-=20)

        {

            for(pos = 0; pos < 180; pos += 1)  // 从0度到180度运动,每次步进一度

            {                                                     

              myservo1.write(pos);        // 指定舵机1转向的角度

              myservo2.write(i);        // 指定舵机2转向的角度

              delay(t);            // 等待t ms让舵机到达指定位置

            }

            i-=20;

            for(pos = 180; pos>=1; pos-=1)   //从180度到0度运动  

            {                               

                myservo1.write(pos);         // 指定舵机转向的角度

                myservo2.write(i);        // 指定舵机转向的角度

                delay(t);                        // 等待t ms让舵机到达指定位置

             }

        }  

  }
 
 


猜你喜欢

转载自blog.csdn.net/xuw_xy/article/details/78984321