Первый RGB-светодиод я подключал по привычке от обычного: самый длинный вывод — в GND, остальные три — к пинам через резисторы. Красный послушно загорелся, и я уже предвкушал радугу, когда понял, что дальше всё не так: прошу зелёный — вижу пурпурный, прошу синий — горит всё жёлтое. Через полчаса листания даташита выяснилось, что у моего экземпляра общий анод: «минус» общим не был, а общим был «плюс», и вся логика цветов встала с ног на голову — канал включался нулём, а гас 255.
В этом уроке разберём устройство RGB-светодиода: три кристалла, четыре ножки и почему самая длинная — не всегда катод; подключение обоих вариантов, общего катода и общего анода, с резисторами 220–330 Ом на каждый канал; смешивание цветов тремя analogWrite на пинах 9, 10 и 11; функция setColor(r, g, b), которая прячет всю схемотехнику и превращает светодиод в палитру. И, разумеется, разбор того самого анодного тупика: как распознать его за минуту без даташита и исправить одной строкой математики.
Три кристалла в одном корпусе: почему ножек четыре
Внутри RGB-светодиода сидят три независимых светодиода — красный, зелёный и синий — под общей полупрозрачной линзой. У каждого по две ножки, но все три кристалла делят одну общую, поэтому выводов не шесть, а четыре: по одному на цвет плюс общий. Три канала смешиваются как лучи света: полный красный плюс полный зелёный дают жёлтый, зелёный с синим — бирюзовый, красный с синим — пурпурный, а всё вместе — белый. Такая схема называется аддитивной, и это не краски на бумаге: смешав «все цвета» красок, вы получили бы чёрный, а смешав все каналы света — белый.
Общая ножка бывает двух сортов, и в этом главный источник путаницы. Общий катод: три кристалла соединены минусами — общую ногу втыкаем в GND, цветовые выводы тянем через резисторы к пинам, и чем больше число в analogWrite, тем ярче канал; логика та же, к которой вы привыкли на одиночном светодиоде. Общий анод: кристаллы соединены плюсами — общая нога идёт на 5V, и логика переворачивается: канал включается нулём, а гаснет при 255. Снаружи корпуса неразличимы, у обоих длинная ножка — общая. Быстрый тест без даташита: подайте общий вывод на GND, а на любой цветовой через 220 Ом дайте 5 В — загорелся, перед вами общий катод; молчит — перекиньте общий вывод на 5V и замкните цветовой на GND через тот же резистор, вспышка означает общий анод.
Про напряжения и резисторы. Прямое падение у красного кристалла около 2 В, у зелёного и синего — около 3 В, поэтому резистор нужен на каждый цветовой канал, обычно 220–330 Ом; общий провод остаётся без резистора. Практическая деталь, которую я усвоил на первом же белом цвете: при одинаковых резисторах дешёвые RGB-светодиоды часто светят белым с розоватым оттенком — красный кристалл эффективнее. Лечится притушением красного канала в коде или резистором 330 Ом именно на красную ветку.
Общий анод: почему 255 гасит, а 0 зажигает
Разберём тупик из начала урока на пальцах. При общем аноде плюс питания уже подведён к трём кристаллам через общую ножку; пин Arduino подключён к катоду каждого кристалла и работает сливом: чтобы потёк ток, пин должен стать землёй — нулем. analogWrite(PIN_G, 255) держит пин всё время в единице — разницы потенциалов нет, кристалл молчит. analogWrite(PIN_G, 0) прижимает катод к земле всё время — кристалл горит в полную. Всё инвертировано: не «255 — максимум», а «0 — максимум».
Лечится не перепайкой, а одной строкой: перед отправкой инвертируйте значение — analogWrite(PIN_G, 255 - g). Хотите 80% яркости — передавайте 255 - 204 = 51; хотите 20% — 255 - 51 = 204. Я сразу завожу функцию setColor(r, g, b), внутри которой три вызова analogWrite с инверсией, и дальше весь скетч пишет цвета в человеческой логике: чем больше число, тем ярче канал. Схема не трогается, голову выворачивать не приходится на каждом шаге, а сам факт «анода» живёт в одном месте кода.
Оговорка про пины: смешивать оттенки можно только на ШИМ-пинах, из прошлого урока вы помните шестёрку 3, 5, 6, 9, 10, 11. Под RGB садим соседнюю тройку с чертами — красный на 9, зелёный на 10, синий на 11: провода ложатся ровным веером, а 3, 5 и 6 остаются свободными. На обычных цифровых пинах без ШИМ вы получите только восемь комбинаций «вкл/выкл» и ни одного оттенка — для палитры нужны именно черты. И следите за бюджетом: три канала по 15 мА — около 45 мА, пину это по силам, но добавьте сюда следующую поделку, и считать токи придётся заново.
Чтобы анод с катодом больше никогда не путались, держите в голове опору: анод — плюс, катод — минус, у обычного светодиода анод — длинная ножка. У RGB все три кристалла складывают свои катоды или свои аноды в одну общую ногу — вопрос лишь в том, что именно они сложили. У меня на рабочем столе лежит бумажка-шпаргалка на оба случая: «катод в GND — числа прямые», «анод в 5V — числа инвертированные». Две строчки, а тупик из тридцати минут превращается в проверку по бумажке на десять секунд.
setColor: три строки, из которых получается палитра
Код палитры собирается вокруг одной функции. setColor(int r, int g, int b) получает три числа 0–255 и раскладывает их по каналам; в варианте для общего катода — напрямую, в варианте для общего анода — с инверсией 255 - x. В loop() перебираем базовые цвета с секундной паузой и печатаем в Serial, что именно горит: одна строка на цвет — и отладка превращается в чтение списка. Задержка — параметр удобства: секунда для спокойного просмотра, 200 мс для быстрой проверки, ниже 100 мс цвета начнут сливаться в кашу.
Как только функция на месте, оттенки становятся вопросом одного вызова: оранжевый — 255, 100, 0; бирюзовый — 0, 150, 150; тёплый белый — 255, 150, 50. Числа подбираются глазами за пару прогонов: это нормальный рабочий процесс, а не признак плохого кода. Полезная привычка — держать свою таблицу любимых цветов в комментариях над setColor: три вызова и названия, пять минут экономии каждый раз, когда вернётесь к проекту через месяц. В симуляторе ниже схема общекатодная: каналы на пинах 9, 10, 11, названия цветов печатаются в Serial, а полосы PWM показывают duty каждого канала — по ним удобно сверять, что вы действительно отправили в светодиод.
И ещё одна привычка с макетки, которая экономит вечера: поканальная проверка перед первым смешиванием. Собрали схему — не спешите с фиолетовым, сначала прогоните три чистых канала по очереди: 255,0,0; 0,255,0; 0,0,255. Каждый кристалл обязан загореться сам по себе, своим цветом, без всяких смесей. Если на этом этапе красный светит тускло — вы ищете плохой контакт в одной ветке с одним резистором, а не гадаете, почему «смешанный цвет не тот». Любое многосветодиодное устройство я отлаживаю именно так: сначала каждый элемент поодиночке, потом взаимодействия. На шкале из следующего урока тот же приём работает один в один.
const int PIN_R = 9;const int PIN_G = 10;const int PIN_B = 11; void setup() { pinMode(PIN_R, OUTPUT); pinMode(PIN_G, OUTPUT); pinMode(PIN_B, OUTPUT); Serial.begin(9600);} void setColorAnode(int r, int g, int b) { // общий анод: канал включается нулём, поэтому инвертируем analogWrite(PIN_R, 255 - r); analogWrite(PIN_G, 255 - g); analogWrite(PIN_B, 255 - b);} void loop() { setColorAnode(255, 0, 0); // красный delay(1000); setColorAnode(0, 255, 0); // зелёный delay(1000); setColorAnode(0, 0, 255); // синий delay(1000); setColorAnode(255, 255, 0); // жёлтый delay(1000);}Три канала R/G/B смешиваются в цвет — как в скетче analogWrite().
Подгружаем интерактив…
- Найдите свой оттенок: вставьте между «белым» и «паузой» тёплый белый setColor(255, 150, 50) и оранжевый setColor(255, 100, 0). Сверьтесь по полосам PWM: duty каждого канала должен совпасть с числами в вызове.
- Урежьте паузу с 1000 до 200 мс — палитра превращается в быструю смену кадров. Найдите скорость, при которой цвета перестают успевать считываться глазом.
- Соберите фиолетовый: один вызов setColor(255, 0, 128) — красный в максимум, синий в половину. Поиграйте вторым числом и посмотрите, как оттенок ползёт от пурпурного к алому.
- Сделайте цветокоррекцию: в белом setColor(255, 255, 255) уменьшите зелёный канал до 80. Белый уедет в пурпур — так работает баланс белого в любом экране.
- На реальной плате: подключите общий вывод к GND и прогоните код-блок без инверсии — увидите «наоборот», тот самый тупик. Переставьте общий вывод на 5V и верните 255 - x — цвета встанут на место.
- RGB-светодиод — три кристалла и четыре ножки: по одной на цвет плюс общая (она же самая длинная).
- Общий катод: общий вывод в GND, больше число — ярче. Общий анод: общий вывод в 5V, логика перевёрнута — лечится инверсией 255 - канал.
- Резистор 220–330 Ом нужен на каждый цветовой канал; общий провод — без резистора.
- Для смешивания оттенков нужны три ШИМ-пина; на Uno удобно 9, 10, 11 — соседняя тройка с чертами.
- Функция setColor(r, g, b) прячет и инверсию, и распиновку — остальной код говорит человеческими цветами.
- 1. У RGB-светодиода четыре ножки. Почему не шесть?
- 2. Светодиод с общим анодом. Что сделает analogWrite(PIN_G, 0) на зелёном канале?
- 3. Какая тройка пинов Uno подойдёт для RGB-светодиода с смешиванием оттенков?
- 4. Белый цвет из setColor(255, 255, 255) выглядит розоватым. Что сделать?
Три канала, одна функция setColor — и светодиод превращается в палитру, где любое из шестнадцати с половиной миллионов сочетаний вызывается тремя числами. Общий анод больше не тупик, а просто строчка 255 - x в одном месте кода. Если duty cycle всё ещё ощущается туманным — вернитесь к уроку про analogWrite и ШИМ и прогоните дыхание светодиода ещё раз: эта механика теперь работает втрое быстрее, потому что каналов три. В следующем уроке светодиодов станет восемь: соберём светодиодную шкалу, оживим её бегущими огнями и заодно избавимся от копипасты с помощью массива пинов и одного цикла for.
Частые вопросы по теме урока
- У RGB-светодиода четыре ножки. Почему не шесть?
- Каждому кристаллу принадлежит свой цветовой вывод, а второй вывод у всех общий — поэтому 3 + 1 = 4. WS2812 тут ни при чём: у адресных лент вообще другая схема подключения. Три кристалла делят одну общую ножку: по одному выводу на цвет плюс общий
- Светодиод с общим анодом. Что сделает analogWrite(PIN_G, 0) на зелёном канале?
- При общем аноде пин работает сливом тока: 0 прижимает катод к земле всё время — кристалл горит в полную. Инверсия 255 - x возвращает привычную логику. Зажжёт зелёный в полную яркость
- Какая тройка пинов Uno подойдёт для RGB-светодиода с смешиванием оттенков?
- Нужны пины с аппаратным ШИМ: 3, 5, 6, 9, 10, 11. Соседние 9/10/11 удобнее всего физически. Без ШИМ получились бы только 8 комбинаций вкл/выкл. 9, 10, 11 — соседние ШИМ-пины с чертой
- Белый цвет из setColor(255, 255, 255) выглядит розоватым. Что сделать?
- Красный кристалл эффективнее зелёного и синего, поэтому белый уходит в розовый. Лишний канал притушивают числом в коде или резистором — duty выше 255 не существует. Притушить красный канал: 220 вместо 255 или резистор 330 Ом на красную ветку