市面上常见的 RGB LED 模块,内部其实就封装了三颗灯丝——红、绿、蓝。别小看这三颗小灯,搭配树莓派 Pico,能调出上百种颜色来。
模块上分别标着 R、G、B 三个引脚,对应红、绿、蓝三通道,接 Pico 的三个 GPIO 即可。建议选支持 PWM 的引脚,后面做渐变或随机变色时才方便。本例中我们用 GP4、GP3、GP2。
需要注意的是,这类模块分两种:共阴和共阳。共阴模块上另一个引脚标着 GND,直接连 Pico 的 GND;共阳模块上另一个引脚是 VCC,得连 Pico 的 3V3。接线前务必看清,接反了灯不亮是小,烧掉模块就亏了。

先来个最直观的——让红、绿、蓝依次循环闪烁。代码如下:
import machine
import utime
r = machine.Pin(4, machine.Pin.OUT)
g = machine.Pin(3, machine.Pin.OUT)
b = machine.Pin(2, machine.Pin.OUT)
while True:
for v in [(1,0,0), (0,1,0), (0,0,1)]:
r.value(v[0])
g.value(v[1])
b.value(v[2])
utime.sleep(0.3)
这个循环只是最基础的开关控制,每次只亮一个颜色。如果想调出更多颜色——比如淡紫、橙色——就得请出 PWM 了。通过快速调节每个引脚的占空比,能模拟出不同亮度的组合,从而混出近乎无限的色彩。
下面的代码就玩得更花了:随机生成 RGB 值,每隔 0.3 秒变一次色,视觉效果非常欢乐。
import machine
import utime
import urandom
r = machine.Pin(4, machine.Pin.OUT)
g = machine.Pin(3, machine.Pin.OUT)
b = machine.Pin(2, machine.Pin.OUT)
pwm_r = machine.PWM(r)
pwm_g = machine.PWM(g)
pwm_b = machine.PWM(b)
pwm_r.freq(1000)
pwm_g.freq(1000)
pwm_b.freq(1000)
def light(red, green, blue):
pwm_r.duty_u16(65535 - red * 255)
pwm_g.duty_u16(65535 - green * 255)
pwm_b.duty_u16(65535 - blue * 255)
while True:
light(urandom.randint(0,250), urandom.randint(0,250), urandom.randint(0,250))
utime.sleep(0.3)
注意 duty_u16 的参数范围是 0~65535,我们传入了 65535 - color*255 这种写法,是因为共阴模式下引脚拉高对应更亮,而我们的颜色值 0 代表最暗,255 代表最亮。所以要用 65535 减去转换后的数值来反向映射。当然,如果用的是共阳模块,这里就得反过来处理。
实际使用中,PWM 频率设为 1000Hz 已经足够平滑,人眼不会感觉到频闪。你可以把 sleep 改小点,比如 0.1 秒,让颜色切换更丝滑;或者固定一组颜色值做呼吸灯效果,思路都是一样的。
