伺服电机和步进电机是常用到的2种模块,它们都可以看作是由马达派生出来的专门模块。
伺服电机利用马达的转动,加上一些辅助零部件,实现指定角度的转动-也就是说使用者告诉这个模块转动到哪个角度,伺服电机就会驱动转子,转动到指定的角度。它通常用于航空模型、汽车转向的角度控制;而且是来回的转动。
步进电机也是利用马达的转动原理,加上一些辅助部件,实现电机较为精确的转动(和之前直接驱动马达转动相比),比如控制转动的速度。
为了实现精确的转动,步进电机的每一圈被分成了很多小的步子,每走一步,就是转动一点点。通过控制走每一步的间隔时间来实现转动速度的精确控制。具体的物理原理就是改变马达中的磁力线圈极性来实现,这里搞不懂也没有关系。只要知道步进电机能实现转动速度的精确控制即可。
这两种电机,和之前认识的马达都可以实现转动,但是它们使用的场景是不太一样的:
- 马达:只负责转动,转动的快慢虽然说可以由电压大小调节,但是控制并不精确,转动的速度偏差可能很大;可以用来驱动玩具汽车;
- 伺服电机:可以根据设定的目标角度来实现转动,这个角度的控制是有反馈控制的,所以转动位置精确、细致,也就是说“从道理上讲,你应该转动过去了,并且实际上你也一定有转动到指定的位置,有检查手段来保证这点”;可以用来精确的控制方向转向;
- 步进电机:实现马达那样的持续转动,但是能更准确的实现对转动速度的控制。不过这种控制没有确认的机制,也就是说“从道理上讲,你应该转动过去了,但实际有没有转动到指定的位置,我就不确定了”;可以用来控制机器人的运动;
8.1 伺服电机
开发学习使用的伺服电机被称作SG90
,它只有9g的重量,是使用最广泛的伺服电机。也有的说法将它称为舵机
,并认为伺服电机和舵机是两种不同类型的模块。这里我们就忽略它们的不同,当作是同一类型的模块。
这个伺服电机有3根引脚,黄色的数据引脚,接了Arduino开发板的D9引脚。
引脚颜色 | 引脚说明 |
---|---|
黄色 | 数据引脚D9,连接开发板PWM接口 |
红色 | VCC,接电源正极 |
黑色(褐色) | GND,接电源负极 |
将它与开发板连接如下图,
伺服电机的控制代码,如下:
//使用Arduino IDE集成的伺服电机核心库
#include <Servo.h>
int SERVO_PIN = 9;
//创建伺服电机
Servo myServo;
void setup() {
//初始化控制伺服电机转动角度的引脚
myServo.attach(SERVO_PIN);
}
void loop() {
int pos = 0;
// 伺服电机从0度逐渐转动到180度
for (pos = 0; pos < 180; pos++) {
// 输入伺服电机转动到的角度值
myServo.write(pos);
delay(15);
}
// 伺服电机从180度逐渐转动到0度
for (pos = 180; pos >= 1; pos--) {
myServo.write(pos);
delay(15);
}
}
在以上代码中要注意:
myServo.attach(SERVO_PIN)
用来设定控制转动角度大小的引脚;myServo.write(pos)
设定的是目的角度,而不是在当前状态下还要继续转动的角度;
8.2 步进电机
步进电机的原理就是马达转动的原理:
根据驱动转子极性的数量,有2相、4相、5相之分。
因此,要控制步进电机的转动,本质就是控制连接着这些转子引脚的电压方向。
步进电机需要使用额外的电机驱动板,比如我们之前介绍过的L298N电机驱动板
。这一次,因为我们采用的步进电机不需要外接电源,Arduino开发板上的电源就够用了,所以选择另外一种电机驱动板,
电机驱动板和步进电机按照如下方式连接,
驱动板和Arduino板按照如下图方式连接。
电机驱动板引脚颜色 | 开发板引脚 |
---|---|
黑色 | 数据引脚8 |
红色 | 数据引脚9 |
黄色 | 数据引脚10 |
蓝色 | 数据引脚11 |
紫色 | VCC,接电源正极 |
灰色 | GND,接电源负极 |
步进电机的控制代码,如下:
//使用Arduino IDE集成的步进电机核心库
#include <Stepper.h>
//步进电机每转一圈,走多少步
const int stepsPerRevolution = 200;
//初始化步进电机
//我们使用的是4相步进电机,有4个输出控制
//指定控制马达转子的4个引脚
//指定步进电机的步伐解析度
Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11);
void setup() {
//为步进电机的转动速度设置一个量,数值越大,每2步间隔的时间就越短
//它的计算基准为:一分钟转一圈,每步的等待时间
//这样的等待时间再除以设置的速度值,就是每一步的间隔时间
myStepper.setSpeed(60);
}
void loop() {
//步进电机移动一步
//整数为正向转动
//负数为反向转动
myStepper.step(1);
}
在以上代码中要注意:
- 初始化步进电机时
Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11);
,第一个参数是旋转一圈要走多少步,这完全由开发者确定;后面的引脚分别连接的就是马达每个相位对应的引脚。我们的例子中采用的是四相位步进电机,如果采用五相位电机,初始化就可能是Stepper myStepper(stepsPerRevolution, 8, 10, 9, 12);
; - Arduino这个步进电机的实现库,只支持到5相位步进电机;
myStepper.setSpeed(60);
设置的数值越大,转动越快,但也不是能设置无限大,如果速度超出了硬件的能力范围,电机可能就会打滑不转了。另外,如果设置的值为1,那么电机的速度就是60秒刚好走完一圈的速度。因此以后设置这个参数的时候,可以把这个速度作为一个考虑的基准。