深色模式
第 11 章:看懂舵机控制代码
本章任务
看懂 SG90 舵机来回摆动的代码。舵机常用在道闸、机械臂、小车上,是"PWM 调光"的亲戚——都是用 PWM 信号,只是含义不同。
接线回顾
| SG90 舵机 | Pico | 说明 |
|---|---|---|
| 红线(VCC) | VBUS (Pin 40) | 5V 供电(不能接 3.3V) |
| 棕线(GND) | GND | 共地 |
| 橙线(信号) | GP15 | PWM 信号 |
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~8191set_angle() 函数就把这条换算链打包好了。主循环里的列表 [0, 90, 180, 90] 是"动作表":舵机依次转到这几个角度,每转一个停半秒。
运行效果
舵机按 0° → 90° → 180° → 90° 的顺序来回摆动,每 0.5 秒换一个位置,像在摇头。
常见坑
- 舵机不转或发抖:先查供电——必须接 VBUS 5V,接 3V3 会带不动
- 舵机转到头"咔咔"响:角度超出机械极限了,把范围收窄到 10°~170°
- 不同批次的 SG90 暗号略有差异:角度差一点是正常的,微调
0.5和2.0两个数即可
想一想
列表
[0, 90, 180, 90]改成[0, 180],舵机的动作会有什么变化?💡 查看答案
舵机只在 0° 和 180° 两个极端之间来回摆,不再经过中间的 90°,动作变得更生硬、幅度更大。
如果把
time.sleep(0.5)改成time.sleep(0.1),可能会看到什么现象?(提示:舵机转动需要时间)💡 查看答案
舵机很可能还没来得及转到位,就收到了下一个角度命令,看起来会抖动、动作不到位,甚至像"卡住不走"。舵机不是瞬间转动的,等它的时间是必需的。
