ELECTRONICS

RGB-светодиод и Arduino: схема подключения, общий катод и скетч смешивания цветов

СветодиодыСкетч проверен компиляцией

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

Яркость задают широтно-импульсной модуляцией, поэтому все три вывода должны сидеть на пинах со значком «~». На Arduino UNO это выводы 3, 5, 6, 9, 10 и 11.

Схема подключения

Наведите курсор на провод — расскажу, зачем он нужен.

Распиновка

ПроводКуда и зачем
RКрасный кристалл. На ШИМ-вывод через резистор 220 Ом.
GЗелёный кристалл. Тоже через резистор.
BСиний кристалл. Тоже через резистор.
COMОбщий вывод. Самая длинная ножка. На землю у общего катода, на питание у общего анода.

Характеристики

Количество кристаллов
3 — красный, зелёный, синий
Прямое напряжение
около 2 В у красного, 3 В у зелёного и синего
Ток на канал
около 20 мА
Резисторы
220 Ом на каждый канал
Занимает выводов
3 с ШИМ
Количество оттенков
256 градаций на канал, около 16,7 млн сочетаний

Как определить тип и найти общий вывод

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

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

В скетче разница в одну строку: для общего анода значения инвертируют, вычитая из двухсот пятидесяти пяти.

Библиотека

не нужнаХватает analogWrite для каждого из трёх каналов. Библиотеки нужны разве что для готовых цветовых переходов и палитр.

Готовый скетч

const int PIN_R = 9;
const int PIN_G = 10;
const int PIN_B = 11;

// для светодиода с общим анодом поставьте true
const bool COMMON_ANODE = false;

void setColor(int r, int g, int b) {
  if (COMMON_ANODE) {
    r = 255 - r;
    g = 255 - g;
    b = 255 - b;
  }
  analogWrite(PIN_R, r);
  analogWrite(PIN_G, g);
  analogWrite(PIN_B, b);
}

void setup() {
  pinMode(PIN_R, OUTPUT);
  pinMode(PIN_G, OUTPUT);
  pinMode(PIN_B, OUTPUT);
}

void loop() {
  // плавный переход по кругу цветов
  for (int i = 0; i < 256; i++) {
    setColor(255 - i, i, 0);      // красный к зелёному
    delay(10);
  }
  for (int i = 0; i < 256; i++) {
    setColor(0, 255 - i, i);      // зелёный к синему
    delay(10);
  }
  for (int i = 0; i < 256; i++) {
    setColor(i, 0, 255 - i);      // синий к красному
    delay(10);
  }
}

Скетч собирается arduino-cli под Arduino UNO

Переменная COMMON_ANODE — единственное, что нужно поменять при другом типе светодиода. Ни схему, ни остальной код трогать не придётся.

Частые ошибки

Цвета работают наоборот: 0 — ярко, 255 — темно

У вас светодиод с общим анодом, а скетч написан под общий катод. Поменяйте COMMON_ANODE на true.

Цвет меняется рывками, промежуточных оттенков нет

Один или несколько каналов сидят на выводе без ШИМ. На UNO плавную яркость дают только выводы 3, 5, 6, 9, 10 и 11.

Белый получается розоватым или голубоватым

Кристаллы имеют разную яркость при одинаковом токе: синий заметно тусклее красного. Для честного белого резисторы подбирают разные — красному больше, синему меньше — или корректируют значения в коде.

Светодиод подключён без резисторов

Работать будет, но кристаллы деградируют, а вывод платы работает за пределом допустимого тока. Три резистора по 220 Ом стоят дешевле самого светодиода.

Один резистор поставлен на общий вывод

Так делать нельзя: ток делится между зажжёнными кристаллами, и цвет поплывёт в зависимости от того, сколько каналов включено. Резистор нужен каждому каналу свой.

Что понадобится