RGB LED

罗大富 BigRich大约 4 分钟ESP32Python

本节课我们来学习使用 MicroPython 控制 RGB LED 模块。

实验原理

之前我们已经学习过 LED 了,并且实现过控制 LED 亮灭以及呼吸灯的实验,但是 LED 只能发出一种颜色的光,而 RGB LED 是一种集成红(R)、绿(G)、蓝(B)三种颜色 LED 芯片的复合发光器件,通过 PWM(脉宽调制)控制各颜色通道的亮度比例。

这里,先简单了解 RGB 加色模型,我们可以通过红、绿、蓝三种颜色就可以模拟出其他颜色,每个通道的颜色强度范围是 0-255 ,任何一个数值的变化都会有一种颜色对应,可以实现 256*256*256 种颜色的混合输出,除了使用 3 个 0-255 范围的数值表示颜色之外,还可以将三个数值转换成 16 进制数,前面加上 # 来表示颜色,这就是我们常见的 16 进制颜色编码。比如下图是不同颜色对应的 RGB 值

颜色对应的 RGB 值16 进制颜色码
红色RGB(255, 0, 0)#FF0000
橙色RGB(255, 127, 0)#FF7F00
湖蓝RGB(0, 128, 255)#0080FF
玫瑰红RGB(255, 0, 128)#FF0080
202504281045117

了解了 RGB 加色原理之后,我们就可以来学习 RGB LED 了,RGB LED 通常有 4 个引脚,分为共阳和共阴两种类型。它们的核心区别在于 公共端(COM)的极性和驱动方式。以下是两者的详细对比:

类型公共端(COM)LED 连接方式点亮条件
共阴极阴极(GND)三个 LED 的阴极短接,阳极独立向 R/G/B 引脚输出 高电平(+3.3V 或 +5V),电流从控制端流向公共端(GND),LED 点亮
共阳极阳极(+VCC)三个 LED 的阳极短接,阴极独立向 R/G/B 引脚输出 低电平(GND),电流从公共端(VCC)流向控制端,LED 点亮

本套教程,我们使用的是共阳极 RGB 模块。

硬件电路设计

物料清单(BOM 表):

材料名称数量
共阳极 RGB LED 模块1
杜邦线(跳线)若干

软件程序设计

第一步,我们先使用 GPIO 控制 RGB LED 输出最基础的几种颜色,代码如下:

from machine import Pin
import time

# 定义引脚对象,并初始化引脚为高电平
r_pin = Pin(15, Pin.OUT, value=1)
b_pin = Pin(2, Pin.OUT, value=1)
g_pin = Pin(4, Pin.OUT, value=1)

while True:
    # 红色
    r_pin.value(0)
    g_pin.value(1)
    b_pin.value(1)
    time.sleep(1)

    # 绿色
    r_pin.value(1)
    g_pin.value(0)
    b_pin.value(1)
    time.sleep(1)

    # 蓝色
    r_pin.value(1)
    g_pin.value(1)
    b_pin.value(0)
    time.sleep(1)

    # 红 + 绿
    r_pin.value(0)
    g_pin.value(0)
    b_pin.value(1)
    time.sleep(1)

    # 红 + 蓝
    r_pin.value(0)
    g_pin.value(1)
    b_pin.value(0)
    time.sleep(1)

    # 蓝 + 绿
    r_pin.value(1)
    g_pin.value(0)
    b_pin.value(0)
    time.sleep(1)

    # 红 + 绿 + 蓝
    r_pin.value(0)
    g_pin.value(0)
    b_pin.value(0)
    time.sleep(1)

由于 MicroPython 中 PWM 的占空比的分辨率是固定的,范围为 0~1023,而 RGB 值的范围为 0~255,因此,还需要将颜色值转换成对应的占空比,256 为 2 的 8 次方,1024 为 2 的 10 次方,转换时只需要将 RGB 值乘以 4 即可获得对应的占空比

但是,这样获取到的占空比是共阴型 RGB LED 的占空比输入方式,我们知道共阴与共阳点亮 LED 的方式是完全相反的,因此,在对共阳极 RGB 进行 PWM 调光时需要注意,要传递的 RGB 的值为 255 - 当前值 才可以获得,因此,我们想通过 PWM 输出各种不同颜色光的代码如下:

from machine import Pin, PWM
import time


# 定义 PWM 引脚,初始占空比为 100%(熄灭)
pwm_r = PWM(Pin(15), freq=2000, duty=1023)
pwm_g = PWM(Pin(4), freq=2000, duty=1023)
pwm_b = PWM(Pin(2), freq=2000, duty=1023)


# 将 RGB 颜色值转换为共阳型 RGB LED 的占空比
def set_color(r, g, b):
    pwm_r.duty(1023 - r * 4)
    pwm_g.duty(1023 - g * 4)
    pwm_b.duty(1023 - b * 4)

while True:
    # 玫瑰红
    set_color(255, 0, 128)
    time.sleep(1)
    
    # 橙色
    set_color(255, 127, 0)
    time.sleep(1)
    # 湖蓝
    set_color(0, 128, 255)
    time.sleep(1)

这里是一些常用的 RGB 颜色,大家可以用这些 RGB 值测试一下代码显示的颜色是否正确:

上次编辑于:
贡献者: 罗大富BigRich