舵机

原理简介

舵机是一种能精确控制位置的执行器,内部有电机 + 减速齿轮 + 反馈电位器。

  • 工作原理:靠 PWM 信号的脉宽决定位置/速度,标准频率 50Hz(周期 20ms)
  • 常见型号:SG90(9g 小舵机)、MG90S、MG996R
  • 两种务必分清:
    • 180° 舵机(位置舵机,如 SG90-180):脉宽决定角度(0.5ms→0°、1.5ms→90°、2.5ms→180°)
    • 360° 舵机(连续旋转舵机,如 SG90-360):脉宽决定速度和方向,1.5ms 是停止,偏左反转、偏右正转,不是角度

典型应用

  • 机械臂关节
  • 摄像头/传感器云台
  • 机器人转向轮
  • 智能小车转向
  • 自动门、开关机构

接线图

[接线图占位,后续添加]

文字说明(具体接法见下方代码注释):

  • 舵机 信号线(橙/黄) → Pico GPIO(如 GP15)
  • 舵机 红线(VCC) → 外接 5V 电源(电池盒或 5V 适配器),不要从 Pico 的 3V3/5V 取电
  • 舵机 棕/黑线(GND) → 外接电源 GND,同时用一根线连到 Pico 的 GND(共地)
  • ⚠ 舵机堵转电流可达 1A 以上,从 Pico 取电会烧板子,外接电源和 Pico 必须共地

示例代码

基础示例:180° 舵机(位置控制)

# ============ 接线 ============
# 舵机信号线(橙/黄) → Pico GP15
# 舵机红线(VCC)     → 外接 5V 电源(别接 Pico 的 3V3/5V 引脚)
# 舵机棕/黑线(GND)  → 外接电源 GND,并连一根线到 Pico GND(共地)
# =============================
from machine import Pin, PWM
import time

pwm = PWM(Pin(15))
pwm.freq(50)  # 舵机标准 50Hz

def set_angle(angle):
    """180° 舵机:angle 取 0~180 度"""
    # 0°→0.5ms, 90°→1.5ms, 180°→2.5ms,周期 20ms
    pulse_ms = 0.5 + (angle / 180) * 2.0
    pwm.duty_u16(int((pulse_ms / 20) * 65535))

print('180° 舵机角度控制')
for angle in [0, 45, 90, 135, 180]:
    set_angle(angle)
    print('角度:', angle, '°')
    time.sleep(1)
set_angle(0)  # 回初始位置

进阶示例:360° 舵机(连续旋转 / 调速)

# ============ 接线 ============
# 与 180° 完全相同:信号线 → GP15,红线 → 外接 5V,棕/黑线 → 外接 GND 且共地
# =============================
from machine import Pin, PWM
import time

pwm = PWM(Pin(15))
pwm.freq(50)  # 同样是 50Hz

def set_speed(speed):
    """360° 舵机:speed 取 -100(全速反转)~100(全速正转),0=停止"""
    # 1.5ms 是停止;偏离 1.5ms 越远转速越快
    pulse_ms = 1.5 + (speed / 100) * 1.0
    pwm.duty_u16(int((pulse_ms / 20) * 65535))

print('360° 舵机调速')
set_speed(60);  print('正转'); time.sleep(2)
set_speed(0);   print('停止'); time.sleep(1)
set_speed(-60); print('反转'); time.sleep(2)
set_speed(0)   # 一定要回到 0 才会停

应用示例:电位器控制 180° 舵机角度

# ============ 接线 ============
# 舵机:信号线 → GP15,红线 → 外接 5V,棕/黑线 → 外接 GND 且共地
# 电位器:中间脚 → GP26(ADC0),另外两脚分别 → 3V3 和 GND
# =============================
from machine import Pin, PWM, ADC
import time

pwm = PWM(Pin(15))
pwm.freq(50)
adc = ADC(Pin(26))

def set_angle(angle):
    pulse_ms = 0.5 + (angle / 180) * 2.0
    pwm.duty_u16(int((pulse_ms / 20) * 65535))

print('舵机随电位器转动')
while True:
    value = adc.read_u16()           # 0~65535
    angle = int((value / 65535) * 180)
    set_angle(angle)
    print('电位器:', value, '角度:', angle, '°')
    time.sleep(0.1)

注意事项

  • 供电:舵机堵转电流可达 1A 以上,绝对不能从 Pico 的 3V3/5V 取电,要外接 5V 电源(电池盒/适配器)。
  • 共地:外接电源 GND 必须用一根线连到 Pico 的 GND,否则信号不识别、舵机乱转。这是最容易烧板子的地方。
  • 180° vs 360°:180° 脉宽对应角度;360° 脉宽对应速度/方向(1.5ms=停)。买之前看清型号,写法完全不同。
  • 先到中点:上电后先 set_angle(90)(180°)或 set_speed(0)(360°)再动,避免突然猛转。
  • 抖动/发热:负载太重或供电不稳会抖、会烫,减轻负载或加滤波电容。
  • 频率:舵机标准 50Hz,不要随便改 freq()。

常见问题

Q: 舵机一直猛转或只往一边转? A: 多半是 360° 舵机被当 180° 写了(或反之);或没共地。先确认型号,再检查 GND 有没有连 Pico。

Q: 舵机抖动、发热? A: 供电不稳或负载过重,换成电流足够的 5V 电源,减小负载。

Q: 角度不准? A: 不同品牌脉宽略有差异,微调 0.5 + angle/180*2.0 里的 0.5 和 2.0 两个系数校准。