RGB LED

罗大富 BigRich大约 4 分钟ESP32Arduino

本节课我们来学习使用 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 输出最基础的几种颜色,代码如下:

#define R_PIN   15
#define G_PIN   4
#define B_PIN   2


void setup() {
  // 初始化引脚
  pinMode(R_PIN, OUTPUT);
  pinMode(G_PIN, OUTPUT);
  pinMode(B_PIN, OUTPUT);

  // 共阳型 LED 的控制端为高电平时熄灭
  digitalWrite(R_PIN, HIGH);
  digitalWrite(G_PIN, HIGH);
  digitalWrite(B_PIN, HIGH);
}

void loop() {
  // 红色
  digitalWrite(R_PIN, 0);
  digitalWrite(G_PIN, 1);
  digitalWrite(B_PIN, 1);
  delay(1000);

  // 绿色
  digitalWrite(R_PIN, 1);
  digitalWrite(G_PIN, 0);
  digitalWrite(B_PIN, 1);
  delay(1000);

  // 蓝色
  digitalWrite(R_PIN, 1);
  digitalWrite(G_PIN, 1);
  digitalWrite(B_PIN, 0);
  delay(1000);

  // 红 + 绿
  digitalWrite(R_PIN, 0);
  digitalWrite(G_PIN, 0);
  digitalWrite(B_PIN, 1);
  delay(1000);

  // 红 + 蓝
  digitalWrite(R_PIN, 0);
  digitalWrite(G_PIN, 1);
  digitalWrite(B_PIN, 0);
  delay(1000);

  // 蓝 + 绿
  digitalWrite(R_PIN, 1);
  digitalWrite(G_PIN, 0);
  digitalWrite(B_PIN, 0);
  delay(1000);

  // 红 + 绿 + 蓝
  digitalWrite(R_PIN, 0);
  digitalWrite(G_PIN, 0);
  digitalWrite(B_PIN, 0);
  delay(1000);

}

由于 GPIO 只能控制电平高低,因此,我们可以显示的颜色是有限的,所以,我们还需要使用 PWM 调光,才能输出更多的颜色。

需要注意的是,由于共阳与共阴 LED 的输出方式是完全相反,因此,我们在使用共阳 RGB LED 时需要输出的 PWM 的占空比应该是 255 - RGB 值,这里,我们可以直接使用 analogWrite() 函数进行 PWM 输出,因为 analogWrite() 输出的占空比范围默认为 0-255,代码如下:

#define R_PIN   15
#define G_PIN   4
#define B_PIN   2

// 将 RGB 颜色值转换为共阳型 RGB LED 的占空比
void set_color(int r, int g, int b) {
  analogWrite(R_PIN, 255-r);
  analogWrite(G_PIN, 255-g);
  analogWrite(B_PIN, 255-b);
}


void setup() {
  // 初始化引脚
  pinMode(R_PIN, OUTPUT);
  pinMode(G_PIN, OUTPUT);
  pinMode(B_PIN, OUTPUT);

}

void loop() {
  // 玫瑰红
  set_color(255, 0, 128);
  delay(1000);

  // 橙色
  set_color(255, 127, 0);
  delay(1000);

  // 湖蓝
  set_color(0, 128, 255);
  delay(1000);

}

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

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