Servo库可以让Arduino 主板控制各种伺服电机(舵机)。通过这个库可以轻松的控制大量的舵机。库文件底层程序使用了Arduino的硬件计时器,在 Arduino Due 上,最多可以控制 60 个舵机。首次使用这个库时,需要在 Arduino IDE 中打开“库管理器”搜索并安装此库。目前最新版本的库文件为1.1.8 (点击可直接下载)版本。
Servo 库在大多数 Arduino 板上最多支持 12 个舵机,在 Arduino Mega 上最多支持 48 个。在 Mega 以外的板上,使用该库会禁用analogWrite()引脚 9 和 10 上的 (PWM) 功能,无论这些引脚上是否有伺服。在 Arduino Mega上,最多可以使用 12 个舵机,而不会干扰 PWM 功能;若使用 超过12个舵机将会禁用引脚 11 和 12 上的 PWM功能。

伺服电机(舵机)介绍

伺服电机(舵机)有三根线:电源线地线信号线。电源线通常为红色,应连接到 Arduino 主板上的 5V 引脚。地线通常为黑色或棕色,应连接到 Arduino 主板上的接地(GND)引脚。信号引脚通常为黄色、橙色或白色,应连接到 Arduino 板上的数字引脚。请注意,伺服电机(舵机)会消耗相当大的功率,在有伺服电机的系统中需要单独的电源供电。可以从DC电源接口输入DC6-9V的电源,或者从+5V和GND引脚间外接更大功率的DC5V电源,务必将 Arduino 和外部电源的接地连接在一起。
舵机0G.jpg舵机.jpg
伺服系统具有集成齿轮和可精确控制的轴。标准伺服系统允许将轴定位在各种角度,通常在 0 到 180 度之间。根据多次测试发现,实际的舵机很难会达到0度和180度,表现在舵机上是:假如程序设置舵机角度为0度或者180度时,舵机将不会转动。所以,在实际使用时,建议设计的角度范围在1-179度之间。需要注意的是,市面上常见的舵机中,有些是可手动旋转360度的,有部分是手动也只能转180度,当转不动时,切勿强行使劲转动。
特别强调:
① 在通电的情况下,禁止强行手动转动舵机;
② 舵机在工作时,转动的力量较大,工作之前需整理连接线不要被舵机结构夹到;
③舵机在工作时,禁止触摸会转动的关节等结构,以免受伤。

servo类成员函数

函数 说明
attach() 设定舵机的接口。
write() 用于设定舵机旋转角度的语句,可设定的角度范围是0°到180°。
writeMicroseconds() 用于设定舵机旋转角度的语句,直接用微秒作为参数。
read() 用于读取舵机角度的语句,可理解为读取最后一条write()命令中的值。
attached() 判断舵机参数是否已发送到舵机所在接口。
detach() 使舵机与其接口分离

Servo类成员函数详细介绍

1. attach()
描述:
将Servo变量附加到引脚,注意:在Arduino 0016及之前的版本上,Servo库仅支持将舵机连接至第9和第10脚上。
语法:
servo.attach(pin)
servo.attach(pin, min, max)
参数说明:
servo,一个类型为servo的变量
pin,连接至舵机的引脚编号
min(可选),舵机为最小角度(0度)时的脉冲宽度,单位为微秒,默认为544
max(可选),舵机为最大角度(180度时)的脉冲宽度,单位为微秒,默认为2400
2. write()
描述:
向舵机写入一个数值,来直接控制舵机的轴。在一个标准的舵机中,这将设定齿轮的角度,将齿轮转到对应的位置。在一个连续旋转的舵机中,这将设置一个舵机的角度(0作为全速向一边,180为全速向另一边,90为停止)。
语法:
servo.write(angle)
参数说明:
servo,一个类型为servo的变量
angle,写向舵机的角度,从0到180之间
3. writeMicroseconds()
描述:
向舵机写入一个微秒的值来控制舵机的轴。在一个标准舵机中,这将设置舵机齿轮的角度。在标准舵机中,参数设置为1000为完全逆时针方向,2000完全顺时针方向,1500为在中间。
注意:一些生产厂商没有按照这个标准,以至于,舵机通常响应在700到2300之间的值。自由地增加终点值直到舵机不再增加它的范围。注意,让舵机旋转超过它的终点(通常会发出异常声响)将会产生很大的电流,并可能烧毁舵机。连续旋转舵机对该函数的响应类似于write()函数
语法:
servo.writeMicroseconds(us)
参数说明:
servo,一个类型为servo的变量
us,一个代表微秒值的整数参数
4. read()
描述:
读取舵机当前的角度(最后一次用write()函数写入的值)
语法:
servo.read()
参数说明:
servo,一个类型为servo的变量
返回值:
舵机的角度,从0至180度
5. attached
描述:
检查一个servo变量是否被附加到一个引脚
语法:
servo.attached()
参数说明:
servo,一个类型为servo的变量
返回值:
返回true,如果被附加到一个引脚,反之返回false
6. detach
描述:
将servo变量与引脚脱离,如果所有servo变量均被脱离,第9和第10教将可以用analogWrite()函数进行PWM输出。
语法:
servo.detach()
参数说明:
servo,一个类型为servo的变量

Arduino舵机实现代码

servo库有两个示例程序一个是(Knob),可以通过转动电位器控制伺服电机的的转动角度。另个是
(Sweep)让舵机来回扫动(0-180度)之间。下面将分别给出两个示例程序,也可以在Arduino IDE的“示例”中打开。要使用这个库时,需要在程序开始引用此头文件:

  1. #include <Servo.h>

示例程序 Knob:

  1. /*
  2. Controlling a servo position using a potentiometer (variable resistor)
  3. by Michal Rinott <http://people.interaction-ivrea.it/m.rinott>
  4. modified on 8 Nov 2013
  5. by Scott Fitzgerald
  6. http://arduino.cc/en/Tutorial/Knob
  7. */
  8. #include <Servo.h>
  9. Servo myservo; // 创建一个名为“myservo”的舵机对象
  10. int potpin = 0; // 创建一个变量,模拟输入引脚,外接电位器
  11. int val; // 创建一个变量,用于存储读取到的电位器的值
  12. void setup()
  13. {
  14. myservo.attach(9); // 设置舵机的连接引脚
  15. }
  16. void loop()
  17. {
  18. val = analogRead(potpin); // 读取外接电位器的电压值存于val中 (0-1023)
  19. val = map(val, 0, 1023, 0, 180); // 通过map函数把val映射在0-180之间
  20. myservo.write(val); // 根据val值,驱动舵机的转动位置
  21. delay(15); // 做简短延时,等待舵机转到指定的位置
  22. }

示例程序 Sweep:

  1. /* Sweep
  2. by BARRAGAN <http://barraganstudio.com>
  3. This example code is in the public domain.
  4. modified 8 Nov 2013
  5. by Scott Fitzgerald
  6. https://www.arduino.cc/en/Tutorial/LibraryExamples/Sweep
  7. */
  8. #include <Servo.h>
  9. Servo myservo; // 创建一个名为“myservo”的舵机对象
  10. int pos = 0; // 创建一个变量,用来存储多级的角度(位置)
  11. void setup() {
  12. myservo.attach(9); //设置舵机的连接引脚
  13. }
  14. void loop() {
  15. for (pos = 0; pos <= 180; pos += 1) { // 让舵机从0度-转到180度
  16. // in steps of 1 degree
  17. myservo.write(pos); // 让舵机转到pos这个位置(角度)
  18. delay(15); // 延时15ms,等待舵机转到位置
  19. }
  20. for (pos = 180; pos >= 0; pos -= 1) { // 让舵机从180度-转到0度
  21. myservo.write(pos);
  22. delay(15);
  23. }
  24. }

舵机和电机的区别

在微控制系统中,舵机和电机都属于大功率器件,在使用时强烈建议外接电源供电。在进行程序调试时,如若出现舵机不按照程序执行情况转动到指定位置,或者出现左右摇摆动作,或者出现“嗡嗡”的响声并且不转动,此时首先需要考虑供电是否充足,以上情况在供电不足(通过电脑USB接口直接供电)时都有可能出现。
舵机和电机最大的区别在于舵机可以精确的控制转动的角度,换句话说可以控制舵机转动到一个具体的位置,这个位置是可控的,并且和初始位置无关。比如:控制舵机转动到90度的位置,那只要这个舵机上电正常工作后,必须会转到90度的位置,如果舵机已经在90度位置,那舵机将不会动作。而电机不同,电机我们只能控制电机转动、转速和停止转动,并且电机转动的终了位置和初始位置是相关的,初始位置不同,就算控制相同的速度转动相同的时间,得到的终了位置也是不一样的,这一点在使用时需要特别注意。