Arduino 舵机控制完全指南:从原理到多舵机扩展
本教程将讲解 舵机工作原理 及如何使用 Arduino 控制舵机。舵机因易用、位置控制精准,广泛应用于机器人、自动化、航模等 Arduino 项目。 我已在多个项目中使用舵机,可参考: 可观看视频或阅读图文教程。内容包含多个控制示例、接线图、代码,以及使用 PCA9685 PWM 驱动器扩展多舵机控制的指南。 舵机是一种闭环控制系统,利用位置反馈精确控制输出轴的角度。核心特征是能精准控制轴位置。 工业舵机通常用高精度编码器反馈,而模型/航模舵机多用电位器。反馈信号与目标信号在误差检测器中比较,控制器驱动电机修正误差直至归零。 本教程重点讲解模型舵机的工作原理与 Arduino 控制方法。 模型舵机体积小,用于控制遥控车、船、飞机等,也广泛用于工程原型、机械臂、仿生机器人、人形机器人等。 模型舵机内部包含四大部件:直流电机、减速齿轮组、电位器、控制电路。 控制信号为 50Hz 脉冲序列(周期 20ms)。脉冲宽度决定角度: 不同品牌范围可能略有差异(如 0.5ms–2.5ms)。 选型关键指标:扭矩、工作电压、电流、尺寸。最流行两款: 以 MG996R 为例,其堵转电流高达 2.5A,**不能直接由 Arduino 供电**,必须外接电源。 若使用 SG90 微型舵机,空载电流约 100–200mA,**可尝试直接由 Arduino 5V 引脚供电**(USB 供电约 500mA,桶形插孔供电可达 1A),但为稳定性建议始终外接供电。 Servo 库支持大多数板子同时控制 12 个舵机,Mega 支持 48 个。控制多舵机与单舵机一样简单: 每个舵机创建一个 PCA9685 通过 I2C 总线通信,内置时钟可独立驱动 16 路舵机,释放 Arduino 资源。最多可级联 62 块板卡,理论控制 992 个舵机,仅占用 Arduino 两个 I2C 引脚。 通过焊盘设置 I2C 地址(A0–A5),最多 62 个地址。 舵机仍需外接电源(如 5V 6A)。 使用 GitHub 上 关键点: 原理相同:硬件级联、设置不同地址、软件创建多对象。代码结构与单驱动器一致,仅增加多驱动器初始化。 原因:舵机启动/堵转电流大,导致 Arduino 供电电压跌落复位。尤其直接用 Arduino 5V 引脚供电时。 解决: 原因:不同舵机对应的最小/最大脉宽不同,默认库参数(544μs/2400μs)可能不匹配。 解决:在 提供两款热门舵机的 3D 模型下载(Thangs): 3D 模型:Thangs 下载 3D 模型:Thangs 下载 本教程覆盖了 Arduino 驱动舵机的核心知识。市面舵机品牌众多,参数各异,选型时务必结合扭矩、电流、电压、尺寸综合考量。舵机为机器人、自动化、航模项目提供无限可能。 希望本教程对您有帮助。欢迎评论区提问,别忘了查看我的 Arduino 项目合集! 舵机仅 3 根线:GND、VCC(电源)、信号线(接 Arduino 数字引脚)。通过 50Hz PWM 信号控制角度。 小电流舵机(如 SG90)可尝试直接供电,但电流超 500mA 会导致 Arduino 复位。**强烈建议始终使用外接电源**为舵机供电。 Servo 库:普通板 12 个,Mega 48 个。配合 PCA9685 可扩展至数百个。无论数量,**舵机必须外接供电**。
什么是舵机?




舵机内部工作原理


Arduino 项目常用舵机型号
SG90 微型舵机

堵转扭矩 1.2 kg·cm @4.8V / 1.6 kg·cm @6V 工作电压 3.5 – 6V 空载电流 100 mA 堵转电流 650 mA 最大速度 60° / 0.12s 重量 9g MG996R 舵机
堵转扭矩 11 kg·cm @4.8V / 13 kg·cm @6V 工作电压 4.8 – 7.2V 空载电流 220 mA @4.8V / 250 mA @6V 堵转电流 2.5 A(原厂) 最大速度 60° / 0.20s 重量 55g Arduino 控制舵机实战

接线图


所需元件
舵机控制代码
方法一:手动产生 50Hz 脉冲(不推荐)
/* 舵机控制 - 50Hz 脉冲发生器 by Dejan, https://howtomechatronics.com */
#define servoPin 9
void setup() {
pinMode(servoPin, OUTPUT);
}
void loop() {
// 每 20ms 一个脉冲
digitalWrite(servoPin, HIGH);
delayMicroseconds(1450); // 脉冲宽度 1.45ms → 90°
digitalWrite(servoPin, LOW);
delayMicroseconds(18550); // 补足 20ms
// 实测脉宽:0.6ms=0°,1.45ms=90°,2.3ms=180°
}方法二:使用 Arduino Servo 库(推荐)
/* 使用 Arduino Servo 库控制舵机 by Dejan, https://howtomechatronics.com */
#include attach(pin, min, max) 可针对具体舵机校准脉宽范围,write(角度) 直接设定 0–180° 位置。Arduino 同时控制多个舵机

/* 多舵机控制 by Dejan, https://howtomechatronics.com */
#include Servo 对象并指定引脚即可。我的六足蚂蚁机器人项目曾用 Mega 控制 22 个舵机。PCA9685 16路 PWM/舵机驱动器扩展


接线原理图

所需元件
PCA9685 控制代码
PCA9685-Arduino 库(NachtRaveVL 维护)。/* Arduino + PCA9685 驱动舵机 by Dejan, https://howtomechatronics.com
Library: https://github.com/NachtRaveVL/PCA9685-Arduino */
#include
ServoEvaluator 可为每个舵机单独设定脉宽范围,解决批次差异PCA9685 对象并分别 init() 不同地址多驱动器级联控制大量舵机
常见问题排查
舵机抖动/导致 Arduino 复位
舵机无法转动完整 0–180°
attach() 中自定义脉宽:myservo.attach(9, 600, 2300); // 根据实测调整 min/max 脉宽(μs)尺寸与 3D 模型
SG90 微型舵机


MG996R 舵机


结语
常见问题 (FAQ)
如何将舵机与 Arduino 配合使用?
制造工艺
- 智能存钱罐:Arduino Nano 控制硬币识别器实现余额显示
- 舵机驱动避障机器人:基于 Arduino 与 HC-SR04 构建
- Arduino + HC-05 蓝牙控制 LED:MIT App Inventor 手机 App 开发全攻略
- Arduino Nano + 摇杆控制双步进电机:Visuino 图形化教程
- Arduino + MPU6050 姿态控制舵机:SG90 与 MG996R 精准跟随实战
- ThimbleKrox:基于 Arduino Micro 与 MPU-6050 的指戴式鼠标控制器
- Arduino 合成乐音:从零实现 88 键钢琴全音域
- Arduino 连接 NMEA-0183 设备全攻略:从硬件接线到协议解析
- DIY Arduino 蟑螂控制系统 —— 30 美元以内自制指南
- 通过专用 Android App 蓝牙控制 Arduino 机械臂
- 铝焊接大师指南:专家技术与实操技巧
- 工业离合器机理深度解析:四大主流型式、故障早期识别与选型建议