伺服电机和步进电机是常用到的2种模块,它们都可以看作是由马达派生出来的专门模块。

伺服电机利用马达的转动,加上一些辅助零部件,实现指定角度的转动-也就是说使用者告诉这个模块转动到哪个角度,伺服电机就会驱动转子,转动到指定的角度。它通常用于航空模型、汽车转向的角度控制;而且是来回的转动。

第8节 伺服电机(舵机)和步进电机 - 图1

步进电机也是利用马达的转动原理,加上一些辅助部件,实现电机较为精确的转动(和之前直接驱动马达转动相比),比如控制转动的速度。

第8节 伺服电机(舵机)和步进电机 - 图2

为了实现精确的转动,步进电机的每一圈被分成了很多小的步子,每走一步,就是转动一点点。通过控制走每一步的间隔时间来实现转动速度的精确控制。具体的物理原理就是改变马达中的磁力线圈极性来实现,这里搞不懂也没有关系。只要知道步进电机能实现转动速度的精确控制即可。

第8节 伺服电机(舵机)和步进电机 - 图3

这两种电机,和之前认识的马达都可以实现转动,但是它们使用的场景是不太一样的:

  • 马达:只负责转动,转动的快慢虽然说可以由电压大小调节,但是控制并不精确,转动的速度偏差可能很大;可以用来驱动玩具汽车;
  • 伺服电机:可以根据设定的目标角度来实现转动,这个角度的控制是有反馈控制的,所以转动位置精确、细致,也就是说“从道理上讲,你应该转动过去了,并且实际上你也一定有转动到指定的位置,有检查手段来保证这点”;可以用来精确的控制方向转向;
  • 步进电机:实现马达那样的持续转动,但是能更准确的实现对转动速度的控制。不过这种控制没有确认的机制,也就是说“从道理上讲,你应该转动过去了,但实际有没有转动到指定的位置,我就不确定了”;可以用来控制机器人的运动;

8.1 伺服电机

开发学习使用的伺服电机被称作SG90,它只有9g的重量,是使用最广泛的伺服电机。也有的说法将它称为舵机,并认为伺服电机和舵机是两种不同类型的模块。这里我们就忽略它们的不同,当作是同一类型的模块。

这个伺服电机有3根引脚,黄色的数据引脚,接了Arduino开发板的D9引脚。

引脚颜色 引脚说明
黄色 数据引脚D9,连接开发板PWM接口
红色 VCC,接电源正极
黑色(褐色) GND,接电源负极

将它与开发板连接如下图,

第8节 伺服电机(舵机)和步进电机 - 图4

伺服电机的控制代码,如下:

  1. //使用Arduino IDE集成的伺服电机核心库
  2. #include <Servo.h>
  3. int SERVO_PIN = 9;
  4. //创建伺服电机
  5. Servo myServo;
  6. void setup() {
  7. //初始化控制伺服电机转动角度的引脚
  8. myServo.attach(SERVO_PIN);
  9. }
  10. void loop() {
  11. int pos = 0;
  12. // 伺服电机从0度逐渐转动到180度
  13. for (pos = 0; pos < 180; pos++) {
  14. // 输入伺服电机转动到的角度值
  15. myServo.write(pos);
  16. delay(15);
  17. }
  18. // 伺服电机从180度逐渐转动到0度
  19. for (pos = 180; pos >= 1; pos--) {
  20. myServo.write(pos);
  21. delay(15);
  22. }
  23. }

在以上代码中要注意:

  1. myServo.attach(SERVO_PIN)用来设定控制转动角度大小的引脚;
  2. myServo.write(pos)设定的是目的角度,而不是在当前状态下还要继续转动的角度;

8.2 步进电机

步进电机的原理就是马达转动的原理:

第8节 伺服电机(舵机)和步进电机 - 图5

根据驱动转子极性的数量,有2相、4相、5相之分。

第8节 伺服电机(舵机)和步进电机 - 图6

因此,要控制步进电机的转动,本质就是控制连接着这些转子引脚的电压方向。

步进电机需要使用额外的电机驱动板,比如我们之前介绍过的L298N电机驱动板。这一次,因为我们采用的步进电机不需要外接电源,Arduino开发板上的电源就够用了,所以选择另外一种电机驱动板,

第8节 伺服电机(舵机)和步进电机 - 图7

电机驱动板和步进电机按照如下方式连接,

第8节 伺服电机(舵机)和步进电机 - 图8

驱动板和Arduino板按照如下图方式连接。

第8节 伺服电机(舵机)和步进电机 - 图9

电机驱动板引脚颜色 开发板引脚
黑色 数据引脚8
红色 数据引脚9
黄色 数据引脚10
蓝色 数据引脚11
紫色 VCC,接电源正极
灰色 GND,接电源负极

步进电机的控制代码,如下:

  1. //使用Arduino IDE集成的步进电机核心库
  2. #include <Stepper.h>
  3. //步进电机每转一圈,走多少步
  4. const int stepsPerRevolution = 200;
  5. //初始化步进电机
  6. //我们使用的是4相步进电机,有4个输出控制
  7. //指定控制马达转子的4个引脚
  8. //指定步进电机的步伐解析度
  9. Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11);
  10. void setup() {
  11. //为步进电机的转动速度设置一个量,数值越大,每2步间隔的时间就越短
  12. //它的计算基准为:一分钟转一圈,每步的等待时间
  13. //这样的等待时间再除以设置的速度值,就是每一步的间隔时间
  14. myStepper.setSpeed(60);
  15. }
  16. void loop() {
  17. //步进电机移动一步
  18. //整数为正向转动
  19. //负数为反向转动
  20. myStepper.step(1);
  21. }

在以上代码中要注意:

  1. 初始化步进电机时Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11);,第一个参数是旋转一圈要走多少步,这完全由开发者确定;后面的引脚分别连接的就是马达每个相位对应的引脚。我们的例子中采用的是四相位步进电机,如果采用五相位电机,初始化就可能是Stepper myStepper(stepsPerRevolution, 8, 10, 9, 12);
  2. Arduino这个步进电机的实现库,只支持到5相位步进电机;
  3. myStepper.setSpeed(60);设置的数值越大,转动越快,但也不是能设置无限大,如果速度超出了硬件的能力范围,电机可能就会打滑不转了。另外,如果设置的值为1,那么电机的速度就是60秒刚好走完一圈的速度。因此以后设置这个参数的时候,可以把这个速度作为一个考虑的基准。