第一次用树莓派Pico驱动舵机,很多人的代码看着没毛病,舵机却纹丝不动,或者转不到头的角度。这通常不是板子坏了,而是没搞懂舵机靠什么信号工作。今天就用MicroPython在Pico上把驱动SG90这类标准舵机这件事说透。
舵机到底吃的是什么信号
普通位置舵机内部就是一个占空比比较环路:它接收一个周期20毫秒、也就是50赫兹的PWM信号,靠信号脉宽对应的角度去转。理论上脉宽1毫秒对应0度、1.5毫秒对应90度、2毫秒对应当180度,但实际不同品牌的舵机会有点差异,范围多在0.5毫秒到2.5毫秒之间。所以驱动舵机的核心,是给它一个频率固定、脉宽可变的PWM信号,而不是单纯给高电平。
把这一点想明白,那些"转不起""停不下"的怪问题就解掉了一半。
接线:三根线别接反
标准舵机三根线,颜色基本固定:接地的通常棕色,正极红色,信号线橙色或黄色。Pico是3.3伏逻辑,但舵机一般要5伏供电,所以信号线和正极不要混。棕色接GND,红色接5V,信号线接到任意一个支持PWM的GPIO上,比如GP0或GP28。
需要特别提醒:舵机启动瞬间电流不小,很多入门教程建议给它单独接5V外部电源,别把多路舵机的电流全压在Pico的板上,否则板子容易复位。
MicroPython代码怎么写
Pico的MicroPython里用machine库的PWM模块。先创建一个PWM对象,把频率设成50赫兹,再用duty_u16设置占空比。duty_u16的取值范围是0到65535,因为周期20毫秒对应12.5%的占空比是180度,对应duty_u16就是815左右,以此类推,0度约1638、45度约3276、90度约4915,这样一级级推上去就行。
更省事的写法是封一个函数,把角度先换算成脉宽,再换算成duty_u16。先把角度从0到180映射到0.5到2.5毫秒的脉宽,再把脉宽拿到65535的满量程里换算成占空比数值,写进Duty,一个for循环就能让舵机从0度慢慢摆到180度。
两个避坑点
第一个坑是脉宽超界。舵机对超出范围的脉宽要么不理睬、要么硬顶,长期顶着容易烧舵机,转的时候要给角度留点余量,别硬塞0到180的极限。第二个坑是多路舵机供电不足,一路塞在Pico板上没事,三四路一起来,板子和舵机都吃不消,要么换专用舵机驱动板,要么多路共用一个外接电源。
把频率定在50赫兹、脉宽量准、供电管够这三件事做好,Pico驱动舵机就算真正入门了。接下来无论是给小车装个波头的眼睛,还是给机械臂调角度,你都有底子了。

供电不足我踩过,一次带三个舵机全卡住还以为是代码问题,后来单独供电全好了,这条坑必踩。
微型的S90一般没问题,但上MG90S或更大的舵机,电流明显不一样,供电这块真不能省。
用函数把角度换算成duty_u16再循环,这个封装思路很受用,改完一行就能调角度,谢谢楼主。
舵机吃的是50Hz的PWM信号这个点太关键了,我一开始当成普通高低电平输出,板子压根不明白我要干嘛。
duty_u16换算那个讲得清楚,之前一直被角度和duty数值对应关系搞晕,现在明白是脉宽在中间搭桥。