ServoTimer2 库指南:解决 Timer1 冲突的舵机控制方案
背景痛点
标准 Servo.h 库占用 Arduino Timer1,与 TMRpcm(音频播放)、VirtualWire(无线通信)等库冲突,导致舵机抖动或失效。ServoTimer2 库改用 Timer2 驱动舵机,完美解决资源冲突,适合需要同时播放音频/通信与控制舵机的项目(如会说话的机器人)。
硬件清单
| 组件 | 数量 | 备注 |
|---|---|---|
| Arduino UNO | 1 | |
| 舵机 (Tower Pro MG996R / SG90 等) | 1 | 任意标准舵机 |
| 杜邦线 | 若干 |
电路连接
- 舵机红线 → Arduino 5V (VCC)
- 舵机棕/黑线 → GND
- 舵机橙/黄线 (信号) → Arduino D6 (或任意数字引脚)
注意:多舵机或大扭矩舵机建议外接电源,共地即可。
库安装步骤
- 下载库:GitHub - nabontra/ServoTimer2
- 解压后整个文件夹放入 Arduino
libraries目录,或在 IDE 中 草图 → 包含库 → 添加 .ZIP 库 选择下载的压缩包 - 重启 IDE,
#include "ServoTimer2.h"即可使用
核心 API 对比
| 功能 | Servo.h (标准库) | ServoTimer2 |
|---|---|---|
| 头文件 | #include | #include "ServoTimer2.h" |
| 对象声明 | Servo servo1; | ServoTimer2 servo1; |
| 绑定引脚 | servo1.attach(6); | servo1.attach(6); |
| 设置角度 | servo1.write(90); (0-180°) | servo1.write(1500); (脉宽微秒) |
| 脉宽范围 | 内部自动换算 | 典型 750-2250 µs (对应 0-180°) |
关键区别:角度 vs 脉宽
标准库接受角度值(0-180),内部自动换算脉宽。ServoTimer2 直接接受脉宽微秒值,需自行换算或实测标定。
- 典型值:750 µs ≈ 0°,1500 µs ≈ 90°,2250 µs ≈ 180°
- 不同舵机实际范围不同,建议实测标定(发送不同脉宽观察转角)
- 发送超出范围值通常不会损坏舵机,仅会撞击机械限位
扫描演示代码
标准 Servo.h 版本
#include
Servo servo1;
void setup() {
servo1.attach(6);
}
void loop() {
servo1.write(0); delay(1000);
servo1.write(90); delay(1000);
servo1.write(180); delay(1000);
}
ServoTimer2 版本
#include "ServoTimer2.h"
ServoTimer2 servo1;
void setup() {
servo1.attach(6);
}
void loop() {
servo1.write(750); // ~0°
delay(1000);
servo1.write(1500); // ~90°
delay(1000);
servo1.write(2250); // ~180°
delay(1000);
}
实测标定方法
- 上传仅含
servo1.write(1500);的代码,观察舵机是否指向中位(90°) - 逐步修改数值(如 700, 800... 2300),记录对应物理角度
- 建立映射表或线性公式:
pulse = map(angle, 0, 180, minPulse, maxPulse) - 封装为
writeAngle(angle)函数,后续按角度调用
多舵机扩展
ServoTimer2 支持最多 8 个舵机(受限于 Timer2 中断资源)。声明多个对象并绑定不同引脚即可:
ServoTimer2 servo1, servo2, servo3;
void setup() {
servo1.attach(6);
servo2.attach(7);
servo3.attach(8);
}
常见问题
| 问题 | 原因/解决 |
|---|---|
| 舵机抖动/不转 | 供电不足(USB 供电电流不够)、信号线干扰、脉宽超出舵机范围 |
| 编译报错 | 库未正确安装、路径包含中文/空格、IDE 未重启 |
| 与其他库仍冲突 | 检查是否还有其他库占用 Timer2(如 Tone、某些 PWM 库) |
| 角度不准 | 未标定脉宽范围,请按上述方法实测 |
项目资源
制造工艺