作者:Leonardo
舵机(Servo):它由直流电机、减速齿轮组、电位器和控制电路组成的一套自动控制系统。通过发送信号,指定输出轴旋转角度。舵机一般而言都有最大旋转角度(比如180度。)与普通直流电机的区别主要在,直流电机是一圈圈转动的,舵机只能在一定角度内转动,不能一圈圈转(数字舵机可以在舵机模式和电机模式中切换,没有这个问题)。普通直流电机无法反馈转动的角度信息,而舵机可以。用途也不同,普通直流电机一般是整圈转动做动力用,舵机是控制某物体转动一定角度用,如机器人的关节。

舵机的伺服系统由可变宽度的脉冲来进行控制,控制线是用来传送脉冲的。脉冲的参数有最小值,最大值,和频率。一般而言,舵机的基准信号都是周期为20ms,宽度为1.5ms。这个基准信号定义的位置为中间位置。舵机有最大转动角度,中间位置的定义就是从这个位置到最大角度与最小角度的量完全一样。最重要的一点是,不同舵机的最大转动角度可能不相同,但是其中间位置的脉冲宽度是一定的,那就是1.5ms。
而在Arduino IDE中,提供了Servo.h库文件提供的函数可以直接给定一个0-180的角度去控制舵机,使其更控制更为简单,而Servo.h库是如何实现舵机控制,我们在后面的章节会详细介绍。
在Arduino IDE中,提供了两个测试用的舵机示例,可在文件-示例-Servo中看到。

我们打开Sweep示例,可以看到一个新的窗口弹出

#include
Servo myservo; // 创建一个名为myservode的舵机工程
int pos = 0; // 定义一个变量作为舵机控制参数
void setup() {
myservo.attach(9); // 定义我的舵机连接的端口为数字9
}
void loop() {
for (pos = 0; pos = 180; pos += 1) { // 让pos的值从0开始增加到180
myservo.write(pos); // 每增加1把参数传递给舵机控制转动角度
delay(15); // 等待15ms让舵机转到预设角度
}
for (pos = 180; pos >= 0; pos -= 1) { // 让pos的值从180减少到0
myservo.write(pos); // 每减少1把参数传递给舵机控制转动角度
delay(15); // 等待15ms让舵机转到预设角度
}
}
舵机链接线一般有三根不同颜色的线并在一起


分别为GND;VCC;信号,在101入门开发套件中,我们提供了了扩展版可以很方便的连接舵机。

下载代码后,等待5秒左右,可以看到舵机从0-180度来回运动,需要注意的是,舵机的信号端口应该对应白色的端口,GND对应黑色的端口,插反会导致信号无法正常输出到舵机从而无法工作。
舵机可以从程序中直接赋予角度值进行控制,也可以通过使用外部的传感器去控制,下面就介绍如何通过旋转电位器去控制舵机的转动,在Arduino IDE中,另外一个示例就实现了这个功能,我们可以在文件-示例-Servo-Knob中找到,打开之后可以看到下面的代码,已增加中文注释。
#include
Servo myservo; // 创建一个名为myservo的舵机工程
int potpin = 0; // 定义读取模拟值的端口为0号口
int val; // 定义一个存放读取到的模拟量的值
void setup() {
myservo.attach(9); // 定义舵机连接到数字9号口
}
void loop() {
val = analogRead(potpin); //把读取到的模拟值赋给val
val = map(val, 0, 1023, 0, 180); // 将val的值从0-1023缩放到0-180
myservo.write(val); // 将val的值输出给舵机
delay(15); // 等待15ms让舵机转到相应的角度
}
硬件部分中,我们提供了3p杜邦线可以直接将旋转电位器连接至模拟信号口,如图。

下载代码后,等待5秒左右,此时旋转电位器可以看到舵机与电位器同步运动。需要注意的是,电位器的接线同样要对应到扩展板上对应颜色的地方,否则会导致系统不正常工作。
文章来源:Aduino中文社区