元器件 · 执行器
SG90 舵机
SG90 是一款 9 克重的小舵机,大多数入门机器人的关节和转向都靠它。本文讲舵机如何保持角度、能举起多重的负载,以及怎么驱动它。
它是什么
SG90 是微型舵机:自成一体的执行器,转到指令角度并保持。普通直流电机只会转,舵机是瞄准——说“90 度”它自己转到 90 度还顶住不让人掰走。所以凡要到已知位置的都用它:机械臂关节、开合夹爪、相机云台、小车转向。
九克、十几块钱,人人从它起步。劲和精度干不了正经活,但它是理解位置控制手感最快的路。
工作原理
拆开四样东西:小直流电机、拿速度换扭矩的减速齿轮组、装在输出轴上的电位器、控制电路。电位器是诀窍——实时报告轴的真实角度。电路拿实测角度和指令角度比,往补上差值的方向驱动电机。整个反馈环装进口袋,这正是逆解机械臂敢信舵机到达目标位姿的原因。
角度指令靠 50 Hz PWM 信号,脉宽传话:约 1 ms 一头,1.5 ms 居中,2 ms 另一头。这是 PWM 当位置码用而不是速度码。实际 Arduino Servo 库藏起时序,你只管写角度。
什么时候用它
机器人部件需要在轻载下转到并保持某个具体角度时,就用 SG90:夹爪手指、小机械臂关节、传感器云台,或者轻量小车的转向拉杆。它约 180° 的行程加上“转到这个角度”的即时控制,很适合学习运动学、搭建动作表现力好的机构。
关节真负重(金属齿或标准舵机)、轮子要连续转(直流电机加 L298N,或连续旋转舵机)、要大角度精确大力矩(步进)时看别处。
接线与坑
- 独立供电。堵转的 SG90 能拉 500–700 mA,远超单片机 5 V 引脚能给的。用独立的 5 V 电源,并且把它的地和板子的地连在一起,否则板子会欠压复位。
- **不是连续旋转。**标准 SG90 走约 180° 到头。“永远转”没用;驱动轮要别的执行器。
- **别硬掰别堵转。**尼龙齿过载或挨一下就崩。负载放轻,或换金属齿。
- **会有一点抖动。**廉价舵机会在目标角度附近轻微来回摆动。电源干净稳定,以及在关节不需要保持时把信号断开,两者都能减轻这种现象。
接线
三根线,而玩具级舵机的颜色几乎全球统一:
| 线 | 颜色(SG90) | 是什么 |
|---|---|---|
| 1 | 棕 | 地 |
| 2 | 红 | 电源,4.8–6 V |
| 3 | 橙 | 信号——50 Hz PWM |
有些舵机用黑红白或黑红黄。永远成立的规则是:红色在中间,地线是三根里最深的那根。
| SG90 | Arduino Uno | 说明 |
|---|---|---|
| 棕 | GND | 必须和舵机电源地共地 |
| 红 | 别接 Arduino 的 5 V | 独立 5 V 供电——见下 |
| 橙 | 任一数字脚 | Servo 库任意脚都行 |
为什么不用 Arduino 的 5 V 脚
SG90 空闲约 10 mA,转动 150–250 mA,堵转 650 mA。Uno 的 USB 供电整板限 500 mA,DC 座进来的板载稳压还有热极限。
轻轻拨动一个舵机往往还能正常工作,而这恰恰就是问题所在:它在台架上好好的,一遇到舵机吃力就欠压。症状是板子在机械臂每次到达某个位置时复位——看起来像软件缺陷。
独立 5 V 供电,共地,舵机电源入口并 470 µF 电容。
脉宽与角度关系
舵机不读电压,读脉冲多长,每秒五十次。
| 脉宽 | 标称角度 | SG90 实际 |
|---|---|---|
| 1.0 ms | 0° | 经常差 10–15° 到不了头 |
| 1.5 ms | 90° | 居中,一般准 |
| 2.0 ms | 180° | 经常差 10–15° 到不了头 |
| < 0.5 ms 或 > 2.5 ms | — | 顶着限位嗡嗡叫,吃堵转电流 |
1–2 ms 是惯例不是标准。很多 SG90 真限位在 0.6 ms 和 2.4 ms 附近,所以 Arduino Servo 库 attach() 留了最小最大脉宽参数:
servo.attach(9, 600, 2400); // instead of the 544/2400 defaults
每只舵机标定这一对数,是机械臂到不到工作空间、两头各差神秘 20° 的区别。
能跑的最小代码
#include <Servo.h>
Servo joint;
const int PIN = 9;
void setup() {
joint.attach(PIN, 600, 2400); // calibrate these two numbers per servo
joint.write(90); // centre before doing anything else
delay(500);
}
// Move gently instead of jumping — a servo commanded to jump goes at full speed.
void sweepTo(int target, int stepDelayMs) {
int current = joint.read();
int step = (target > current) ? 1 : -1;
while (current != target) {
current += step;
joint.write(current);
delay(stepDelayMs);
}
}
void loop() {
sweepTo(20, 15);
delay(400);
sweepTo(160, 15);
delay(400);
}
joint.write(160) 和那段扫描最后都停在 160°,但在电气上是完全不同的两件事。跳变是以全速执行的,在一个带载的关节上就是 650 mA 的电流尖峰,外加一次穿过尼龙齿轮的机械冲击。而扫描把同样的动作摊到两秒钟里,电流只有零头。在多关节机械臂上,这就是电源扛得住和扛不住的区别。
扭矩:1.8 kg·cm 到底什么意思
标称 4.8 V 下 1.8 kg·cm——轴上 1 cm 处拿住 1.8 kg,L 厘米处拿 1.8/L kg。后半句坑人。
| 轴到负载距离 | 最大负载(堵转) | 安全工作负载(约 30%) |
|---|---|---|
| 1 cm | 1800 g | 540 g |
| 5 cm | 360 g | 108 g |
| 10 cm | 180 g | 54 g |
| 15 cm | 120 g | 36 g |
要带走两件事。第一,扭矩随伸展距离线性下降,所以一段 15 cm 的臂段在绝对堵转状态下也只能举起 120 g。第二,绝不按堵转值设计。堵转中的舵机正在拉满电流、一动不动并且发热;对于需要保持位置一段时间的关节,堵转扭矩的三分之一是合理上限。
这个数字也是在 4.8 V 下给出的。在 6 V 下,同一只舵机大约能输出 2.2 kg·cm,这是入门机器人领域少有的免费升级——前提是你的电源供得出相应更大的电流。
减小抖动
廉价舵机会在目标角度附近轻微来回摆动,这里有四个各自不同的原因值得分清楚:
- **电源噪声。**最常见。舵机和电机共电源轨,每个电流尖峰都是控制扰动。独立供电,舵机处加电容。
- 信号时序抖动。
Servo库用软件生成脉冲,主循环一忙或者别的中断一来,脉冲边沿就会漂。换成 PCA9685 能彻底解决——它用硬件生成脉冲。 - **死区。**舵机自己的控制器无视约 5 µs 脉宽以下的误差,约 1°。更细的步进它根本不理。
- **顶着负载保持。**舵机在扭矩边缘抗重力会一直嗡嗡。不保持就
detach(),或机械配平关节。
故障排查
| 现象 | 可能原因 | 解决 |
|---|---|---|
| 舵机一动板子复位 | 舵机电流走了 Arduino | 独立 5 V 供电,共地,470 µF 电容 |
| 一直嗡嗡还发热 | 指令超出限位 | attach() 里收窄脉宽范围 |
| 只走约 150° | 库默认到不了真限位 | attach(pin, 600, 2400) 再调 |
| 角度完全不对 | 舵盘装在任意旋转位置 | 每个关节都要标定偏移——可能还要反符号 |
| 静止抖 | 电源噪声或软件脉冲 | 先加电容;还抖上 PCA9685 |
| 崩齿打滑 | 尼龙齿冲击或过载坏了 | 金属齿 MG90S;减负载或减速 |
| 越用越慢越没劲 | 电池掉电压 | 扭矩随电压走——带载量电源轨 |
| 转不连续 | 它是位置舵机 | 连续旋转舵机或直流减速电机 |
SG90 还是别的?
| 零件 | 4.8 V 扭矩 | 齿轮 | 选它的时机 |
|---|---|---|---|
| SG90 | 1.8 kg·cm | 尼龙 | 学习、轻夹爪、传感器云台 |
| MG90S | 2.2 kg·cm | 金属 | 同样尺寸,耐冲击——可以直接替换的升级 |
| MG996R | 9.4 kg·cm | 金属 | 真负重的标准关节 |
| 连续旋转 SG90 | — | 尼龙 | 驱动轮,要速度不要角度 |
| NEMA 17 步进 | 约 40 N·cm | — | 精确可重复定位,无死区 |
第一行“轻夹爪”要警告一句。夹爪是 SG90 一辈子堵转的活——夹住不是运动,绕组约 0.5 A 没东西散热,这是它们最常见的死法。夹持力也是力臂定的而不是盒子上的扭矩:0.176 N·m 经 30 mm 手指堵转 5.87 N,实际能保持约 4.11 N。两件事都在舵机夹爪选型里,夹爪模拟器能按你的手指算。
说句实在话:SG90 是一个学习用的执行器。它是理解位置控制手感最快的办法,而它的强度和重复精度都不够用在真正要紧的关节上。当一个项目因为舵机不够好而做不下去时,答案通常就是 MG90S——同样的外形尺寸,同样的接线,换成金属齿轮。
探索关联图谱
用到它的搭建
包含 SG90 舵机 的项目、学习路线和模拟器。
对比
替代方案
问题
SG90 舵机 常见问题
SG90 舵机是什么?
SG90 是一款 9 克重的玩具级舵机——一种小型减速电机,它会转到指令角度并保持在那里,而不是自由地一直旋转。它是入门机器人领域最便宜、最常见的舵机,用于机械臂关节、夹爪、云台相机支架和转向机构。
舵机是怎么工作的?
舵机内部有一个直流电机、一组减速齿轮、一个电位器和一块控制电路。电位器把当前角度告诉电路;电路把它与你指令的角度进行比较,并驱动电机,直到两者一致。正是这个内置的反馈环,让舵机能保持精确的位置。
怎么用 Arduino 控制 SG90?
你发送一个 50 Hz 的 PWM 信号,由脉宽决定角度:约 1 ms 表示 0°,1.5 ms 表示 90°,2 ms 表示 180°。实际上你会使用 Arduino 的 Servo 库,只需调用 servo.write(angle)——它会替你生成时序。
SG90 能举起多重的东西?
SG90 的堵转扭矩约为 1.8 kg·cm,意思是在 1 cm 的力臂上它刚好能拿住 1.8 kg,在 10 cm 处约为 180 g。可持续使用的负载远低于这个数。更重的负载或更长的力臂,就要升级到 MG90S 这类金属齿舵机,或者标准尺寸的舵机。
SG90 和 MG90S,哪个更好?
两者尺寸相同、控制方式相同,但 MG90S 用的是金属齿轮,扭矩也略大,所以能扛住那些会让 SG90 尼龙齿轮崩齿的堵转和负载。学习和轻负载用 SG90;关节要承受真实的重量或者会受到磕碰时,选 MG90S。
SG90 要消耗多大的电流?
SG90 空闲时只消耗几毫安,但在堵转或带载运动时,电流可能冲到 500–700 mA。这对 Arduino 的 5 V 引脚来说太大了,所以要用独立的 5 V 电源给舵机供电并且共地,否则板子会欠压复位。
延伸阅读