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 Ом стоят дешевле самого светодиода.
Один резистор поставлен на общий вывод
Так делать нельзя: ток делится между зажжёнными кристаллами, и цвет поплывёт в зависимости от того, сколько каналов включено. Резистор нужен каждому каналу свой.
Что понадобится
- RGB-светодиод с общим катодом
- Три резистора 220 Ом
- Arduino UNO
- Макетная плата и провода