Skip to content

第 11 章:看懂舵机控制代码

本章任务

看懂 SG90 舵机来回摆动的代码。舵机常用在道闸、机械臂、小车上,是"PWM 调光"的亲戚——都是用 PWM 信号,只是含义不同。

接线回顾

SG90 舵机Pico说明
红线(VCC)VBUS (Pin 40)5V 供电(不能接 3.3V)
棕线(GND)GND共地
橙线(信号)GP15PWM 信号

Mind+ 生成的典型代码

python
from machine import Pin, PWM    # 拿出 Pin 和 PWM 工具
import time                     # 拿出时间工具

servo = PWM(Pin(15))            # GP15 接舵机信号线,开 PWM
servo.freq(50)                  # 频率 50Hz——舵机的"行业标准",周期 20ms

def set_angle(angle):           # 定义"转到某个角度"的函数
    # 舵机听懂的暗号是脉宽:0.5ms≈0°,1.5ms≈90°,2.5ms≈180°
    pulse_ms = 0.5 + (angle / 180) * 2.0    # 把角度换算成脉宽(毫秒)
    duty = int(pulse_ms / 20 * 65535)       # 再把脉宽换算成占空比数值
    servo.duty_u16(duty)                    # 发给舵机

while True:                     # 一直重复
    for a in [0, 90, 180, 90]:  # 依次取 0°、90°、180°、90°
        set_angle(a)            # 转到这个角度
        time.sleep(0.5)         # 等 0.5 秒,让舵机有时间转到位

代码讲解

舵机和 LED 调光都用 PWM,但含义完全不同:

  • LED 调光:占空比直接决定亮度
  • 舵机:占空比(脉宽)是一个暗号,告诉舵机"转到多少度"

换算链条是这样的:

角度 0°~180°  →  脉宽 0.5ms~2.5ms  →  占空比 1638~8191

set_angle() 函数就把这条换算链打包好了。主循环里的列表 [0, 90, 180, 90] 是"动作表":舵机依次转到这几个角度,每转一个停半秒。

运行效果

舵机按 0° → 90° → 180° → 90° 的顺序来回摆动,每 0.5 秒换一个位置,像在摇头。

常见坑

  • 舵机不转或发抖:先查供电——必须接 VBUS 5V,接 3V3 会带不动
  • 舵机转到头"咔咔"响:角度超出机械极限了,把范围收窄到 10°~170°
  • 不同批次的 SG90 暗号略有差异:角度差一点是正常的,微调 0.52.0 两个数即可

想一想

  1. 列表 [0, 90, 180, 90] 改成 [0, 180],舵机的动作会有什么变化?

    💡 查看答案

    舵机只在 0° 和 180° 两个极端之间来回摆,不再经过中间的 90°,动作变得更生硬、幅度更大。

  2. 如果把 time.sleep(0.5) 改成 time.sleep(0.1),可能会看到什么现象?(提示:舵机转动需要时间)

    💡 查看答案

    舵机很可能还没来得及转到位,就收到了下一个角度命令,看起来会抖动、动作不到位,甚至像"卡住不走"。舵机不是瞬间转动的,等它的时间是必需的。

不积跬步,无以至千里;万里之行,始于当下。