View Categories

RGB светодиоды

RGB светодиод - это три светодиода (красный, зелёный и синий), заключённые в один корпус. Это позволяет смешивать цвета и получать все возможные оттенки свечения для индикации и создания эффектов.

В наборе GyverKIT START IOT EXTRA
RGB модуль

RGB светодиод #

Чтобы не плодить лишние выводы, все аноды или катоды светодиодов объединяются и получается 4 контакта: R, G, B и общий COM. Общим может быть как минус (катод) - Common Cathode, так и плюс (анод) - Common Anode:

Также на этой картинке показана распиновка типичного RGB светодиода: самая длинная нога - общий вывод, крайняя рядом с ней - красный, с другой стороны зелёный дальняя крайняя - синий.

Подключение к Arduino #

К Arduino такой светодиод подключается точно так же, как если бы мы подключали три отдельных светодиода: на каждый цвет нужен токоограничивающий резистор, а общую ногу нужно подключать в зависимости от того, анод она или катод:

Можно управлять каждым цветом точно так же, как если бы это были отдельные светодиоды. Также не забываем про подключение: если у светодиода общий катод, то высокий сигнал digitalWrite(pin, HIGH) с управляющих пинов будет включать выбранный цвет, а если общий анод - то выключать.

Соответственно плавное управление яркостью при помощи ШИМ работает по той же логике: у общего катода analogWrite(pin, 200) включит цвет почти на полную яркость, а у общего анода - почти полностью погасит.

RGB модуль #

Для обучения удобнее всего использовать модуль RGB светодиода - на нём стоит сам светодиод и резисторы на каждый канал, сам светодиод - с общим катодом:

Подключение к Arduino #

Соответственно достаточно подключить GND к пину "-", а пины R/G/B – к любым цифровым пинам МК:

Подача высокого сигнала на пин включит соответствующий цвет.

Программирование #

  • При подключении к обычным цифровым пинам получим всего 8 цветов – чёрный (все выключены), белый (все включены) и 6 сочетаний между тремя цветами
  • При подключении к ШИМ пниам появится возможность контролировать яркость каждого канала цвета, что при стандартных настройках (8 бит) даёт 256 градаций яркости и 256*256*256 = 16.7 миллионов оттенков
Мигание основными цветами по очереди
#define R_PIN 3
#define G_PIN 5
#define B_PIN 6

void setup() {
  pinMode(R_PIN, OUTPUT);
  pinMode(G_PIN, OUTPUT);
  pinMode(B_PIN, OUTPUT);
}

void loop() {
  digitalWrite(R_PIN, 1);
  delay(500);
  digitalWrite(R_PIN, 0);

  digitalWrite(G_PIN, 1);
  delay(500);
  digitalWrite(G_PIN, 0);

  digitalWrite(B_PIN, 1);
  delay(500);
  digitalWrite(B_PIN, 0);
}
Включение одного из 8 цветов Используем enum, чтобы получить сигналы цветов в бинарном виде. Получается очень красивая и эффективная реализация всех 8 цветов:

#define R_PIN 3
#define G_PIN 5
#define B_PIN 6

enum class Colors {
  Black,    // 000
  Blue,     // 001
  Green,    // 010
  Cyan,     // 011
  Red,      // 100
  Magenta,  // 101
  Yellow,   // 110
  White,    // 111
};

void setColor(Colors color) {
  uint8_t col = (uint8_t)color;
  // берём нужный бит
  digitalWrite(R_PIN, col & 0b100);
  digitalWrite(G_PIN, col & 0b010);
  digitalWrite(B_PIN, col & 0b001);
}

void setup() {
  pinMode(R_PIN, OUTPUT);
  pinMode(G_PIN, OUTPUT);
  pinMode(B_PIN, OUTPUT);
}

void loop() {
  setColor(Colors::Black);
  delay(1000);
  setColor(Colors::Magenta);
  delay(1000);
  setColor(Colors::Blue);
  delay(1000);
  setColor(Colors::White);
  delay(1000);
  setColor(Colors::Yellow);
  delay(1000);
}
Включение 24 бит цвета в формате RGB888 Используем алгоритм распаковки байтов цвета из сборника алгоритмов. Выбрать цвет например на этом сайте:

#define R_PIN 3
#define G_PIN 5
#define B_PIN 6

void setColor(uint32_t color) {
  analogWrite(R_PIN, (color >> 16) & 0xff);
  analogWrite(G_PIN, (color >> 8)  & 0xff);
  analogWrite(B_PIN, color & 0xff);
}

void setup() {
}

void loop() {
  setColor(0xff7e62);
  delay(1000);
  setColor(0x03f471);
  delay(1000);
  setColor(0x9503f4);
  delay(1000);
  setColor(0x810031);
  delay(1000);
}

Добавим в схему потенциометр на A0 для настройки:

Цветовое колесо Настройка цвета "по радуге" потенциометром, используется алгоритм raibow8 из сборника алгоритмов. Он принимает значение 0..255 - подадим сигнал с аналогового пина, разделив его на 4:

#define R_PIN 3
#define G_PIN 5
#define B_PIN 6

#define POT_PIN 0

uint32_t raibow8(uint8_t value) {
  uint8_t shift, r, g, b;

  if (value > 170) {
    shift = (value - 170) * 3;
    r = shift;
    g = 0;
    b = 255 - shift;
  } else if (value > 85) {
    shift = (value - 85) * 3;
    r = 0;
    g = 255 - shift;
    b = shift;
  } else {
    shift = value * 3;
    r = 255 - shift;
    g = shift;
    b = 0;
  }

  analogWrite(R_PIN, r);
  analogWrite(G_PIN, g);
  analogWrite(B_PIN, b);
}

void setup() {
}

void loop() {
  // 0.. 1023 переводим в 0.. 255
  raibow8(analogRead(POT_PIN) / 4);
  delay(50);
}

Библиотеки #

Можно использовать библиотеку GRGB для включения нужного цвета, она поддерживает несколько цветовых пространств и управление яркостью:

#define R_PIN 3
#define G_PIN 5
#define B_PIN 6

#include <GRGB.h>
GRGB led(COMMON_CATHODE, R_PIN, G_PIN, B_PIN);

void setup() {
  // установить ОБЩУЮ яркость
  led.setBrightness(255);

  // установить цвет RGB [0-255]
  led.setRGB(255, 0, 0);
  //led.setRGB(255, 0, 0, 120); // + "локальная" яркость [0-255]
  delay(1000);

  // установить цвет HSV (цвет, насыщенность, яркость) [0-255]
  led.setHSV(120, 200, 250);
  delay(1000);

  // установить цвет HSV быстрый алгоритм (цвет, насыщенность, яркость) [0-255]
  led.setHSVfast(120, 200, 250);
  delay(1000);

  // установить цвет из цветового колеса [0-1530]
  led.setWheel(800);
  delay(1000);

  // установить цвет из цветового колеса [0-255]
  led.setWheel8(120);
  delay(1000);

  // установить цветовую температуру [1000-40000] Кельвинов
  led.setKelvin(5500);
  delay(1000);

  // установить HEX цвет (24 бита)
  led.setHEX(0x00FF00);
  delay(1000);
}

void loop() {
}

Полезные страницы #

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Прокрутить вверх