Posts Tagged ‘舵机’

神奇的电机们

前几天有几个小朋友给我发邮件,说是打算自己动手设计电路和机械结构来制作魔方机器人,其中提到了用步进电机来旋转魔方。

说来惭愧,电子电路和嵌入式我还真是门外汉,连步进电机都没玩过。看他们如火如荼的进展着,我也心痒痒的,迅速在淘宝上订了一个步进电机。这几天查了点资料,总算对步进电机有了一点了解。

想起给小爱选电机的时候,发现电机的种类真不少,常见的有:直流电机,舵机,步进电机和伺服电机。这是按原理分类的,如果考虑一些附件的话,又有减速电机,直线电机等等,看的我眼花缭乱。这里稍微总结一下,以供跟我一样的初学者参考。

直流电机
小时候经常拆东西的破坏大王们,最熟悉的就是这种电机了,刮胡刀玩具车里都有这个。只有两根线,通过电压来调节转速,把电池反过来接,电机就反向旋转。破坏力更强的一定也知道,里面一般会有电刷和几个转子,还有两块永磁铁,原理就不介绍了。
优点:控制简单,还没学物理的时候就知道怎么玩了
缺点:不能精确的控制旋转角度和速度

舵机
现在终于明白这种电机为什么叫舵机了。大海航行靠舵手,舵机一般用来控制角度,所以经常用来航模和船模上。这种电机内部其实也是普通的直流电机,区别在于加上了一个小电路,用一个电位器(模拟型舵机)来读取电机的当前转角,并不断的调节直流电机两端的电压来让这个转角维持在设定值。一般来说,舵机都会带一个齿轮箱,用来提高精度和扭力。
优点:可以精确控制角度
缺点:角度范围有限,一般小于180度,不能连续旋转,不能设置速度

步进电机
从名字就可以看出来,步进电机是“一步一步”旋转的。例如我买的电机步距角是1.8度,按照指定的时序发送脉冲信号,每收到一个脉冲电机就旋转1.8度。你想让电机转5度?抱歉,这是不行滴,换一个不同步距角的型号吧。另外,通过控制发脉冲的频率,就可以控制步进电机的转速了。哇,角度和速度都可以控制,这下貌似完美了。先别激动,因为步进电机是一个开环系统(简单的说就是无反馈),很可能会发生失步或者越步的现象。当脉冲发的太快或者负载太大的时候,电机还没反应过来,下一个脉冲就到了,这就失步了;当电机带动的转子惯性很大时,脉冲停止后,转子可能还会继续转动,这就是越步了。
优点:角度和速度都可以控制
缺点:失步或越步

伺服电机
完美的电机终于出现了,给步进电机加上伺服电路,检测它是否转到了指定的角度,这就是伺服电机了。一般是靠电机屁股上的一种编码器来读取角度,这玩意儿据说非常精确,当然,这个东西如果价格再便宜点就真的完美了。
优点:角度和速度都可以精确控制
缺点:价格高,控制最复杂
值得一提的是,乐高的NXT系列,用的就是伺服电机,加上开发API接口后,控制非常方便!

对于以上几种电机,如果想用程序控制的话,都需要加上控制器和驱动器。其中控制器一般可以用单片机,相当于发送时序指令给电机。对于小功率的电机,其实用控制器就可以带动了。但是对于功率较大的电机,就需要加上驱动器。驱动器可以简单理解为功率放大器,接受控制器的信号,然后输出大电流给电机。

另外两个概念:减速电机是通过齿轮箱或蜗杆给电机减速,用来提高扭矩;直线电机是通过丝杠,把电机的转动变成丝杠的平动,一般用来做推杆。

倒腾了一晚上,终于用我的Arduino开发板实现步进电机正转和反转了。之前在小爱成长记里写过直流电机舵机的控制,周末整理一下,把步进电机的控制也加上。至于伺服电机,等以后用的上的时候再研究吧 :)

Arduino开发板实验三:舵机控制

经常玩NXT的朋友肯定对NXT的电机印象深刻,使用非常方便。转速,角度和方向都可以随意控制。

在计划制作小爱的时候,我也一直希望能找到这样的电机。查了一些资料,觉得比较容易控制的有舵机和步进电机。舵机的主要玩家是船模和航模的爱好者们。大海航行靠舵手,舵机就是用来控制舵角的,它的最大特点是可以方便的控制角度,它的限制是舵角一般不超过180度。步进电机就强多了,既可以控制角度,还可以连续旋转,它的问题是输出就是一个光轴,需要加工配套的零件才能使用,另外价格好像会更贵一点。

我计划用舵机来实现小爱的机械臂,最主要的考虑原因是舵机自带很多舵角之类的配件,比较容易安装,毕竟机械加工是制作过程中最麻烦的部分。另外,一般机械臂的关节转角也不需要大于180度,用舵机就足够了。下面是使用Arduino开发板控制舵机的一个小实验。

先抄一段说明:舵机,又称伺服马达,是一种具有闭环控制系统的机电结构。舵机主要是由外壳、电路板、无核心马达、齿轮与位置检测器所构成。其工作原理是由控制器发出PWM(脉冲宽度调制)信号给舵机,经电路板上的IC处理后计算出转动方向,再驱动无核心马达转动,透过减速齿轮将动力传至摆臂,同时由位置检测器(电位器)返回位置信号,判断是否已经到达设定位置,一般舵机只能旋转180度。

舵机结构图

舵机结构图

舵机有3根线,棕色为地,红色为电源正,橙色为信号线,但不同牌子的舵机,线的颜色可能不同,请大家注意。

舵机的转动的角度是通过调节PWM(脉冲宽度调制)信号的占空比来实现的,标准PWM(脉冲宽度调制)信号的周期固定为20ms(50Hz),理论上脉宽分布应在1ms到2ms之间,但是,事实上脉宽可由0.5ms到2.5ms之间,脉宽和舵机的转角0°~180°相对应。有一点值得注意的地方,由于舵机牌子不同,对于同一信号,不同牌子的舵机旋转的角度也会有所不同。

舵机角度和占空比的关系

舵机角度和占空比的关系

 下面这个小实验的目标是用电位器控制舵机的角度,正好在前一个实验里,电位器都还没有拆掉。需要特别注意的是供电部分,舵机转动时电流会比较大,Arduino上的电源芯片可能会因过流保护到发热而损坏,电源需要接到外部供电,切不可使用USB供电。
舵机的棕色线接GND,红色线接VIN(我猜这个是直接连到外接电源的正极),黄色是数据线,接在PWM的7号管脚。电位器的连接稍微有点变换,因为管脚们施展不开,我把正极连在3.3V的接口上,这样模拟输入的范围就变成了0到660左右。前面说了,舵机分别用0.5ms到2.5ms之间的脉冲来对应0到180度左右的角度,我们可以用pulsewidth=(angle*11)+500这样的公式,把0到180度的转角映射到500到2480的脉冲时间。

接线图

接线图

下面看代码:

int readPin = 6;   //用来连接电位器
int servopin = 7;    //定义舵机接口数字接口7

void servopulse(int angle)//定义一个脉冲函数
{
  int pulsewidth=(angle*11)+500;  //将角度转化为500-2480的脉宽值
  digitalWrite(servopin,HIGH);    //将舵机接口电平至高
  delayMicroseconds(pulsewidth);  //延时脉宽值的微秒数
  digitalWrite(servopin,LOW);     //将舵机接口电平至低
  delayMicroseconds(20000-pulsewidth);
}

void setup()
{
   pinMode(servopin,OUTPUT);//设定舵机接口为输出接口
}

void loop()
{
  //读取电位器(传感器)的读数,接到3.3V,值范围从0到660左右
  int readValue = analogRead(readPin);
  //把值的范围映射到0到165左右
  int angle = readValue / 4;
  //发送50个脉冲
  for(int i=0;i<50;i++)
  {
     //引用脉冲函数
     servopulse(angle);
  }
}

实验结果:当旋转电位器的时候,舵机的角度随之改变。不过最终转角并没有达到180度,在某些范围内,电位器旋转时,舵机没有转动。网上舵机的说明也提到了这点,识别的角度范围是有限的。具体的有效角度范围,我还没有测量,等将来开始制作的时候再说。