元器件 · 执行器

SG90 舵机

SG90 是一款 9 克重的小舵机,大多数入门机器人的关节和转向都靠它。本文讲舵机如何保持角度、能举起多重的负载,以及怎么驱动它。

它是什么

SG90 是微型舵机:自成一体的执行器,转到指令角度并保持。普通直流电机只会转,舵机是瞄准——说“90 度”它自己转到 90 度还顶住不让人掰走。所以凡要到已知位置的都用它:机械臂关节、开合夹爪、相机云台、小车转向。

九克、十几块钱,人人从它起步。劲和精度干不了正经活,但它是理解位置控制手感最快的路。

舵机控制图:50 Hz PWM 信号的脉宽定舵机角度。1 毫秒脉冲指令 0 度,1.5 毫秒指令 90 度,2 毫秒指令 180 度,量角器表盘示意。
舵机读脉宽不读电压:1 ms 是 0°,1.5 ms 居中,2 ms 到头——每秒重复 50 次。 下载 SVG

工作原理

拆开四样东西:小直流电机、拿速度换扭矩的减速齿轮组、装在输出轴上的电位器、控制电路。电位器是诀窍——实时报告轴的真实角度。电路拿实测角度和指令角度比,往补上差值的方向驱动电机。整个反馈环装进口袋,这正是逆解机械臂敢信舵机到达目标位姿的原因。

角度指令靠 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 电源给舵机供电并且共地,否则板子会欠压复位。

延伸阅读

参考资料