基础入门:RGB LED 硬件原理与树莓派 Pico PWM 控制实战
1. RGB LED 的基础知识
RGB LED(Red, Green, Blue 发光二极管)是一种通过红、绿、蓝三种不同颜色的 LED 组合而成的发光器件,通过调节这三种颜色的亮度,可以生成各种颜色的光;RGB LED 广泛应用于显示屏、装饰照明和指示灯等场合。
RGB LED 通常集成了三个独立的 LED 芯片,每个芯片负责发出红、绿、蓝三种颜色的光。这些芯片可以独立控制,因此可以通过组合不同的亮度来混合出多种颜色:

- 红色(R):发射红色光,通常工作电压较低
- 绿色(G):发射绿色光,工作电压中等
- 蓝色(B):发射蓝色光,通常工作电压较高
RGB LED 可以通过混合红、绿、蓝三种光,来生成不同的颜色,我们可以利用脉宽调制(PWM)精确控制每个 LED 的亮度,每种颜色的亮度可以通过改变电压的占空比(0~100%)来调节,从而实现丰富的颜色变化。
RGB LED 根据其结构可以分为以下两种:

- 共阴极:所有的 LED 的阴极连接在一起,阳极分别连接到电路的不同控制端
- 共阳极:所有的 LED 的阳极连接在一起,阴极分别连接到电路的不同控制端
RGB LED 的参数反映了它的电气和光学性能,这些参数不仅决定了 LED 的发光效率、颜色、亮度,还影响了它在电路中的使用:
- 正向电压(Forward Voltage,VF):正向电压是指当 LED 正向导通时,两个电极之间的电压差;不同颜色的 LED 由于材料不同,其工作电压范围有所不同
- 最大正向电流(Maximum Forward Current,IF):最大正向电流是指 LED 在正常工作时允许通过的最大电流,常见值为 20mA;高于这个电流可能会损坏 LED,导致过热或降低 LED 的寿命
- 发光强度(Luminous Intensity,Iv):发光强度通常用毫坎德拉(mcd)表示,描述的是 LED 发出的光的亮度,发光强度取决于电流的大小,电流越大,LED 发光强度越高
- 波长(Wavelength):LED 的波长决定了它发出的光的颜色,RGB LED 的波长范围代表了它的颜色;波长的不同是由于 LED 的材料决定的,不同波长的光子能量不同,因此不同颜色的 LED 需要不同的电压来工作
- 反向电流(Reverse Current,IR):反向电流是指当 LED 反向偏置时,流过 LED 的电流。通常,LED 的反向电流非常小,典型值为微安级(例如 10μA);如果反向电流过大,可能会导致 LED 损坏
以 R6GHBHW-A01 型 RGB LED 的电气参数为例,如下图所示:

这里,我们需要给 RGB LED 二极管加限流电阻以确保 LED 不会因为电流过大而损坏,限流电阻的计算公式为:
$$
R = \frac{V_{in} - V_F}{I_F}
$$
其中,各个参数含义如下:
- Vin:电源电压,通常是 LED 电路的电源电压
- VF:LED 的正向电压(Forward Voltage),对于不同颜色的 LED,它的 VF 值不一样
- IF:LED 的工作电流,通常是 20mA(即 0.02A)
2.PWM 信号控制 RGB LED
这里,我们需要将风雅一号板-环境与存储采集板插入到风雅一号板-通用兼容扩展板上,同时打开风雅一号板-环境与存储采集板上 SWITCH2 拨码开关的 PWM_B、PWM_G 和 PWM_R 选项,实物连接图如下所示:

引脚连接情况如下表所示:

以下实验中所有代码开源在我们提供的资料包中 elegance-devkit v1\Demo\27 PWM_RGBLED 文件夹找到。
在以下代码中,我们通过 PWM 模块控制树莓派 Pico 的 GPIO 引脚输出 PWM 信号,从而驱动 RGB LED,示例代码如下:
# Python env : MicroPython v1.23.0
# -*- coding: utf-8 -*-
# @Time : 2024/9/20 下午3:18
# @Author : 李清水
# @File : main.py
# @Description : PWM类使用,驱动RGB LED产生不同颜色的光
# ======================================== 导入相关模块 =========================================
# 导入硬件相关的模块
from machine import Pin, PWM
# 导入时间相关模块
import time
# ======================================== 全局变量 ============================================
# 定义颜色RGB值到PWM占空比的映射表(常见颜色)
COLOR_PWM_VALUES = {
'red': (255, 0, 0), # 红色
'green': (0, 255, 0), # 绿色
'blue': (0, 0, 255), # 蓝色
'yellow': (255, 255, 0), # 黄色
'cyan': (0, 255, 255), # 青色
'magenta': (255, 0, 255), # 品红
'white': (255, 255, 255), # 白色
'black': (0, 0, 0), # 关闭LED
}
# ======================================== 功能函数 ============================================
# 将8位值(0-255)转换为16位PWM值(0-65535)
def map_to_pwm(value: int) -> int:
"""
将8位颜色值(0-255)映射到16位PWM占空比(0-65535)。
Args:
value (int): 0-255之间的颜色值。
Returns:
int: 映射到0-65535范围内的PWM占空比。
"""
return int(value * 65535 / 255)
# ======================================== 自定义类 ============================================
# RGB LED控制类
class RGBLed:
"""
RGB LED控制类,用于通过PWM驱动RGB LED产生不同颜色的光。
该类封装了对RGB LED的控制逻辑,支持通过PWM调节红、绿、蓝三个通道的亮度,
从而实现多种颜色的显示。此外,支持通过颜色名直接设置LED的颜色。
Attributes:
red_pwm (PWM): 红色LED的PWM实例。
green_pwm (PWM): 绿色LED的PWM实例。
blue_pwm (PWM): 蓝色LED的PWM实例。
Methods:
__init__(self, red_pin: int, green_pin: int, blue_pin: int):
初始化RGB LED类实例。
set_color(self, red_val: int, green_val: int, blue_val: int) -> None:
设置RGB LED的颜色。
set_color_by_name(self, color_name: str) -> None:
通过颜色名设置RGB LED的颜色。
"""
def __init__(self, red_pin: int, green_pin: int, blue_pin: int):
"""
初始化RGB LED。
Args:
red_pin (int): 红色LED连接的引脚编号。
green_pin (int): 绿色LED连接的引脚编号。
blue_pin (int): 蓝色LED连接的引脚编号。
"""
# 初始化红、绿、蓝三个PWM通道
self.red_pwm = PWM(Pin(red_pin))
self.green_pwm = PWM(Pin(green_pin))
self.blue_pwm = PWM(Pin(blue_pin))
# 设置PWM频率(典型值为1000Hz)
self.red_pwm.freq(1000)
self.green_pwm.freq(1000)
self.blue_pwm.freq(1000)
def set_color(self, red_val: int, green_val: int, blue_val: int) -> None:
"""
设置RGB LED的颜色。
Args:
red_val (int): 红色RGB值,取值范围为0-255。
green_val (int): 绿色RGB值,取值范围为0-255。
blue_val (int): 蓝色RGB值,取值范围为0-255。
Returns:
None
"""
# 将8位颜色值映射到16位PWM值,并设置占空比
self.red_pwm.duty_u16(map_to_pwm(red_val))
self.green_pwm.duty_u16(map_to_pwm(green_val))
self.blue_pwm.duty_u16(map_to_pwm(blue_val))
def set_color_by_name(self, color_name: str) -> None:
"""
通过颜色名设置RGB LED的颜色。
Args:
color_name (str): 颜色名,比如'red', 'green', 'blue'等。
Returns:
None
"""
# 获取颜色对应的RGB值
# 从字典中获取指定键对应的值,如果找不到指定的键,则返回默认值 (0, 0, 0)
color_values = COLOR_PWM_VALUES.get(color_name.lower(), (0, 0, 0))
# 设置RGB LED的颜色
# 使用了 Python 中的解包操作符,将元组中的三个值分别传递给
# set_color() 方法的三个参数 red_val、green_val 和 blue_val
self.set_color(*color_values)
# ======================================== 初始化配置 ==========================================
# 上电延时3s
time.sleep(3)
# 打印调试信息
print("FreakStudio : Use PWM to drive a RGB LED")
# 初始化RGB LED类:使用红色引脚为2,绿色引脚为3,蓝色引脚为4
rgb_led = RGBLed(red_pin=2, green_pin=3, blue_pin=4)
# ======================================== 主程序 ===========================================
# 设置为一个中等红、绿色最亮、蓝色较暗的颜色
rgb_led.set_color(128, 255, 64)
# 延时3s
time.sleep(3)
# 循环控制RGB LED变换颜色
while True:
# 设置为红色,并延时1s
rgb_led.set_color_by_name('red')
time.sleep(1)
# 设置为绿色,并延时1s
rgb_led.set_color_by_name('green')
time.sleep(1)
# 设置为蓝色,并延时1s
rgb_led.set_color_by_name('blue')
time.sleep(1)
# 设置为黄色,并延时1s
rgb_led.set_color_by_name('yellow')
time.sleep(1)
# 设置为青色,并延时1s
rgb_led.set_color_by_name('cyan')
time.sleep(1)
# 设置为品红,并延时1s
rgb_led.set_color_by_name('magenta')
time.sleep(1)
# 设置为白色,并延时1s
rgb_led.set_color_by_name('white')
time.sleep(1)
# 设置为黑色,并延时1s
rgb_led.set_color_by_name('black')
time.sleep(1)
这里,我们首先定义了一个全局字典,保存了常见颜色的 RGB 值,每个颜色对应一个 RGB 元组,例如红色为 (255, 0, 0),然后定义了一个 map_to_pwm 函数,将 RGB 值(范围 0-255)映射为 PWM 值(范围 0-65535)。
接着,我们定义了一个 RGB LED 控制类用于封装 RGB LED 的控制逻辑,在初始化方法中传入 RGB LED 连接到的红、绿、蓝三个引脚编号,分别初始化这些引脚为 PWM 输出模式并设置其 PWM 的频率为 1000Hz,定义了两个方法:
-
set_color_by_name() 方法:通过颜色名称来设置 RGB LED 的颜色,它从全局字典COLOR_PWM_VALUES中查找颜色名称对应的 RGB 值,如果没有找到则默认返回(0, 0, 0),即关闭 LED -
set_color() 方法:用于设置 RGB LED 的颜色,接收三个参数(红、绿、蓝的占空比,范围为 0-255),使用map_to_pwm()将 RGB 值映射到 16 位 PWM 占空比,并通过duty_u16()方法设置各个颜色通道的 PWM 值
烧录代码,可以看到板载的 RGB LED 循环发出不同颜色的光。



RGB LED(Red, Green, Blue 发光二极管)是一种通过红、绿、蓝三种不同颜色的 LED 组合而成的发光器件,通过调节这三种颜色的亮度,可以生成各种颜色的光;RGB LED 广泛应用于显示屏、装饰照明和指示灯等场合。
浙公网安备 33010602011771号