SG90 舵机工作原理
SG90 是一款 9g 微型舵机,广泛应用于机器人和小型机械项目中。它通过 PWM(脉冲宽度调制)信号控制角度。
内部结构
SG90 内部包含三个部分:
- 直流电机:提供旋转动力
- 减速齿轮组:将高速旋转降低为大力矩输出
- 电位器 + 控制电路:检测当前角度,形成闭环控制
控制电路持续比较目标角度和当前角度,驱动电机转动直到两者一致。所以你不需要自己写 PID 控制代码,只需发送正确的 PWM 信号。
信号时序
SG90 的 PWM 信号周期为 20ms(50Hz)。脉冲宽度决定角度:
| 角度 | 脉冲宽度 |
|---|---|
| 0 度 | 0.5ms(占空比 2.5%) |
| 90 度 | 1.5ms(占空比 7.5%) |
| 180 度 | 2.4ms(占空比 12%) |
不同品牌的舵机可能有细微差异。建议用示波器或先写一段扫描程序确定实际范围。
周期 20ms (50Hz)
┌───┐
│ │ 脉冲宽度 0.5ms → 0 度
│ │
│ │
──┐ │ │ 脉冲宽度 1.5ms → 90 度
│ └───┘
└──────────────────────┘
舵机选型注意
- 180 度版本:角度范围 0-180°,适合机械爪开合
- 360 度连续旋转版本:控制的是转速和方向,不适合机械爪
- 购买时请确认是 180 度版本
机械爪组装
机械爪由 3D 打印件和舵机组装而成。典型的 STL 文件清单:
espclaw-print/
├── claw-left.stl # 左爪臂
├── claw-right.stl # 右爪臂
├── base.stl # 底座
├── servo-mount.stl # 舵机支架
├── linkage-left.stl # 左连杆
├── linkage-right.stl # 右连杆
└── gear.stl # 传动齿轮(可选)
组装步骤
-
安装舵机到支架:用附带的小螺丝把 SG90 固定在舵机支架上,注意舵机输出轴朝外。
-
安装传动齿轮:将齿轮套在舵机输出轴上,用舵机附带的十字螺丝拧紧。没有齿轮的版本直接使用舵机摇臂。
-
连接爪臂:用 M2 螺丝将左右爪臂分别固定在底座的两个转轴上。确保爪臂可以自由转动,不能太紧。
-
连接连杆:用连杆连接爪臂和舵机摇臂。这时机械爪应该能随舵机转动而张合。如果方向反了,把摇臂拆下换 180 度再装。
-
固定底座:将底座用 M3 螺丝固定在项目底板或桌面上。
接线图
ESP32-S3 开发板和 SG90 舵机的接线如下:
SG90 舵机
┌──────┐
│ 红 线 │──── 5V(外部电源)
│ 棕 线 │──── GND(与开发板共地)
│ 橙 线 │──── GPIO 4(PWM 信号)
└──────┘
ESP32-S3
┌──────────────┐
│ GPIO 4 │──── 舵机橙线(PWM)
│ 5V │────(舵机红线从外部供电!)
│ GND │──── 舵机棕线
│ GPIO 2 │──── 板载 LED(可选)
└──────────────┘
外部 5V 电源
┌──────────────┐
│ 5V 正极 │──── 舵机红线
│ GND │──── 舵机棕线 + 开发板 GND
└──────────────┘
引脚说明
| 舵机引脚 | 连接目标 | 备注 |
|---|---|---|
| 橙色(信号) | GPIO 4 | PWM 输出,可在代码中修改 |
| 红色(电源) | 5V 外部电源 | 千万不能用开发板 3.3V |
| 棕色(地线) | GND(共地) | 必须和开发板共地 |
电源注意事项
SG90 正常工作电流约 200mA,堵转时可达 700mA。这对供电有几个重要要求:
不要从开发板 5V 引脚取电。ESP32-S3 开发板的 5V 引脚通常来自 USB,只能提供约 500mA 电流。舵机启动瞬间的大电流会导致电压跌落,使开发板重启。
正确的供电方案:
- 舵机红线接外部 5V 电源(如单独的 5V 2A USB 电源)
- 舵机棕线和开发板 GND 接在一起(共地)
- 在舵机电源正负极之间并联一个 1000µF 电解电容(正极接 5V,负极接 GND)
┌──── 1000µF ────┐
+ -
│ │
5V ───┴────────────────┼─── 舵机红线
电源 │
GND ───────────────────┼─── 舵机棕线
│
┌────┴────┐
│ 开发板 │
│ GND ───┘
└─────────┘
电容的作用是吸收瞬时大电流,防止电压波动影响开发板。
验证硬件
完成接线后,不用急着写固件。先用 ESP-IDF 的示例程序测试舵机。
// 测试代码片段:让舵机在 0 度和 180 度之间摆动
// 完整代码见下一篇固件开发教程
#include "driver/ledc.h"
#define SERVO_PIN 4
#define SERVO_FREQ 50 // 50Hz
#define SERVO_TIMER LEDC_TIMER_0
#define SERVO_CHANNEL LEDC_CHANNEL_0
void servo_test(void)
{
// 配置 LEDC
ledc_timer_config_t timer = {
.speed_mode = LEDC_LOW_SPEED_MODE,
.timer_num = SERVO_TIMER,
.duty_resolution = LEDC_TIMER_10_BIT, // 10 位分辨率
.freq_hz = SERVO_FREQ,
.clk_cfg = LEDC_AUTO_CLK
};
ledc_timer_config(&timer);
ledc_channel_config_t channel = {
.speed_mode = LEDC_LOW_SPEED_MODE,
.channel = SERVO_CHANNEL,
.timer_sel = SERVO_TIMER,
.gpio_num = SERVO_PIN,
.duty = 0
};
ledc_channel_config(&channel);
// 0 度:占空比 2.5% → 1024 * 0.025 = 26
ledc_set_duty(LEDC_LOW_SPEED_MODE, SERVO_CHANNEL, 26);
ledc_update_duty(LEDC_LOW_SPEED_MODE, SERVO_CHANNEL);
vTaskDelay(pdMS_TO_TICKS(1000));
// 180 度:占空比 12% → 1024 * 0.12 = 123
ledc_set_duty(LEDC_LOW_SPEED_MODE, SERVO_CHANNEL, 123);
ledc_update_duty(LEDC_LOW_SPEED_MODE, SERVO_CHANNEL);
vTaskDelay(pdMS_TO_TICKS(1000));
}
如果舵机在两个位置之间来回摆动,说明硬件连接正常。如果不动,检查电源和共地。
3D 打印说明
打印参数推荐:
| 参数 | 建议值 |
|---|---|
| 材料 | PLA 或 PETG |
| 层高 | 0.2mm |
| 填充 | 20-30% |
| 支撑 | 不需要 |
| 壁厚 | 1.2mm(3 层) |
| 热床 | PLA 50°C,PETG 70°C |
打印完需要打磨转轴孔位,确保爪臂能顺畅转动。如果太紧,用 2mm 钻头稍微扩一下。
下一步
硬件组装完成并通过测试后,进入固件开发,编写完整的控制程序。