F FisherHub Docs

02. 硬件组装与接线

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              # 传动齿轮(可选)

组装步骤

  1. 安装舵机到支架:用附带的小螺丝把 SG90 固定在舵机支架上,注意舵机输出轴朝外。

  2. 安装传动齿轮:将齿轮套在舵机输出轴上,用舵机附带的十字螺丝拧紧。没有齿轮的版本直接使用舵机摇臂。

  3. 连接爪臂:用 M2 螺丝将左右爪臂分别固定在底座的两个转轴上。确保爪臂可以自由转动,不能太紧。

  4. 连接连杆:用连杆连接爪臂和舵机摇臂。这时机械爪应该能随舵机转动而张合。如果方向反了,把摇臂拆下换 180 度再装。

  5. 固定底座:将底座用 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 4PWM 输出,可在代码中修改
红色(电源)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 钻头稍微扩一下。

下一步

硬件组装完成并通过测试后,进入固件开发,编写完整的控制程序。