Компоненты · 5 мин чтения

RGB-светодиод: смешивание цветов с Arduino, общий анод и общий катод

Как работает RGB-светодиод и как отличить общий катод от общего анода? Подключение к Arduino, резисторы для каждого цвета, смешивание цветов через analogWrite, радуга, код для ESP32 и Pico.

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

RGB-светодиод 5 мм с 4 ножками
RGB-светодиод 5 мм: самая длинная из четырёх ножек — общий вывод, остальные три — красный, зелёный и синий каналы.

Как работает RGB-светодиод?

Цвета света смешиваются аддитивно: красный и зелёный вместе выглядят жёлтым, зелёный и синий дают голубой, красный и синий — фиолетовый (пурпурный), а все три вместе — белый. Arduino задаёт яркость каждого канала от 0 до 255 с помощью PWM. Теоретически это 256 × 256 × 256 ≈ 16,7 миллиона сочетаний. PWM включает и выключает светодиод сотни раз в секунду; глаз не видит мерцания и воспринимает только среднюю яркость.

ЦветКрасныйЗелёныйСиний
Красный25500
Зелёный02550
Синий00255
Жёлтый2552550
Голубой0255255
Пурпурный2550255
Оранжевый255800
Белый255255255

Общий катод или общий анод?

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

ПараметрОбщий катод (CC)Общий анод (CA)
Длинная ножка подключается кGND5V
Чтобы зажечь цветПодать на пин HIGH (255)Подать на пин LOW (0)
Значение в кодеanalogWrite(pin, value)analogWrite(pin, 255 - value)
Полностью выключен0255
Чтобы узнать, какой у тебя светодиод, подключи длинную ножку к GND и коснись одной из остальных ножек 5V через резистор 220 Ω. Если цвет загорелся, светодиод с общим катодом. Если нет, сделай наоборот: длинную ножку к 5V, другую ножку через резистор к GND; если теперь горит — это общий анод.

Порядок выводов и подключение к Arduino

У распространённых RGB-светодиодов 5 мм порядок выводов такой: красный, общий (самый длинный), зелёный, синий, но у разных производителей он может отличаться, поэтому надёжнее проверить каждую ножку. Каждый цвет подключается через свой резистор к PWM-пину. На Arduino Uno PWM-пины отмечены знаком ~: 3, 5, 6, 9, 10 и 11.

НожкаПодключениеПин Arduino Uno
Красный (R)Через резисторD9
Общий (самый длинный)GND для общего катода, 5V для общего анода—
Зелёный (G)Через резисторD10
Синий (B)Через резисторD11

Номиналы резисторов: отдельный резистор на каждый цвет

Каждому цвету для свечения нужно своё напряжение (прямое падение напряжения): около 2,0 V для красного и 3,0–3,2 V для зелёного и синего. Если ориентироваться на 20 mA при 5 V, красному нужен (5 − 2.0) / 0.020 = 150 Ω, а зелёному и синему (5 − 3.2) / 0.020 ≈ 100 Ω. На практике 220 Ω на всех трёх безопасно и всё ещё достаточно ярко; цвета можно уравнять в коде. Чтобы рассчитать свои значения, воспользуйся калькулятором Резистор для светодиода, а прямое напряжение каждого цвета смотри в таблице Напряжения светодиодов.

Не ставь один резистор на общую ножку. Красный канал с самым низким прямым напряжением заберёт большую часть тока, остальные цвета будут тусклыми, и смешанные цвета получатся неправильными. Всегда давай каждому цветовому каналу свой резистор.

Смешивание цветов с Arduino

Код ниже объединяет три канала в одну функцию setColor() и по очереди показывает семь цветов. Если светодиод с общим анодом, просто поставь COMMON_ANODE в true; функция сама инвертирует значения.

C++ (Arduino IDE)
1const int R_PIN = 9;
2const int G_PIN = 10;
3const int B_PIN = 11;
4const bool COMMON_ANODE = false;   // ortak anotsa true yap / set true for common anode
5
6void setColor(int r, int g, int b) {
7  if (COMMON_ANODE) { r = 255 - r; g = 255 - g; b = 255 - b; }
8  analogWrite(R_PIN, r);
9  analogWrite(G_PIN, g);
10  analogWrite(B_PIN, b);
11}
12
13void setup() {
14  pinMode(R_PIN, OUTPUT);
15  pinMode(G_PIN, OUTPUT);
16  pinMode(B_PIN, OUTPUT);
17}
18
19void loop() {
20  setColor(255, 0, 0);     delay(1000);  // kırmızı / red
21  setColor(0, 255, 0);     delay(1000);  // yeşil / green
22  setColor(0, 0, 255);     delay(1000);  // mavi / blue
23  setColor(255, 255, 0);   delay(1000);  // sarı / yellow
24  setColor(0, 255, 255);   delay(1000);  // turkuaz / cyan
25  setColor(255, 0, 255);   delay(1000);  // mor / magenta
26  setColor(255, 255, 255); delay(1000);  // beyaz / white
27}

Плавные переходы цвета: эффект радуги

Если вместо прыжков между цветами уменьшать один канал и одновременно увеличивать другой, свет плавно перетекает из красного в зелёный, из зелёного в синий и обратно в красный. Цикл ниже использует ту же функцию setColor(); меняй значение задержки, чтобы регулировать скорость.

C++ (Arduino IDE)
1// setColor() ve pin tanımları yukarıdaki gibi / setColor() and pins as above
2void loop() {
3  for (int i = 0; i < 256; i++) { setColor(255 - i, i, 0); delay(8); }  // kırmızı → yeşil / red → green
4  for (int i = 0; i < 256; i++) { setColor(0, 255 - i, i); delay(8); }  // yeşil → mavi / green → blue
5  for (int i = 0; i < 256; i++) { setColor(i, 0, 255 - i); delay(8); }  // mavi → kırmızı / blue → red
6}
Нормально, если белый выглядит слегка голубоватым или розоватым: три светодиода светят не одинаково ярко. Если в коде уменьшить зелёный и синий каналы до 70–80%, белый станет естественнее. Шарик для пинг-понга или матовая бумага поверх светодиода рассеивают свет, и цвета смешиваются намного лучше.

Выбор цвета потенциометрами

Если подключить три потенциометра к A0, A1 и A2, каждый станет ручкой одного цветового канала. analogRead() возвращает значение от 0 до 1023; разделив его на 4, получишь диапазон 0–255, которого ждёт PWM. Подключение потенциометра объясняется в статье Что такое потенциометр?

C++ (Arduino IDE)
1// A0, A1, A2'de üç potansiyometre; setColor() yukarıdaki gibi
2// three pots on A0, A1, A2; setColor() as above
3void loop() {
4  int r = analogRead(A0) / 4;   // 0–1023 → 0–255
5  int g = analogRead(A1) / 4;
6  int b = analogRead(A2) / 4;
7  setColor(r, g, b);
8}

RGB-светодиоды с ESP32 и Raspberry Pi Pico

На ESP32 с актуальным ядром Arduino (3.x) analogWrite() работает на любом выходном пине, поэтому код выше запускается без изменений, если поменять номера пинов. Следить нужно только за напряжением: пины выдают 3,3 V, и зелёный и синий каналы с прямым напряжением около 3 V светят тусклее. При 3,3 V бери маленькие резисторы, например 47–100 Ω, а если нужна настоящая яркость, питай светодиод от 5 V через транзистор. На Pico класс PWM в MicroPython принимает значения от 0 до 65535:

MicroPython
1from machine import Pin, PWM
2import time
3
4pins = [PWM(Pin(n)) for n in (11, 12, 13)]   # GP11 R, GP12 G, GP13 B
5for p in pins:
6    p.freq(1000)
7
8def set_color(r, g, b):                       # 0–255
9    for p, v in zip(pins, (r, g, b)):
10        p.duty_u16(v * 257)                   # 0–65535 (ortak anotta 65535 - v * 257)
11
12while True:
13    set_color(255, 0, 0); time.sleep(1)       # kırmızı / red
14    set_color(0, 255, 0); time.sleep(1)       # yeşil / green
15    set_color(0, 0, 255); time.sleep(1)       # mavi / blue

Обычный RGB-светодиод или адресный (WS2812B)?

ПараметрОбычный RGB-светодиодWS2812B (NeoPixel)
Нужно пинов3 PWM-пина на светодиод1 пин данных на всю ленту
Управление цветомPWM-выходами ArduinoКрошечной микросхемой внутри каждого светодиода
БиблиотекаНе нужнаAdafruit NeoPixel или FastLED
Лучше всего для1–2 светодиодов, индикаторов состоянияЛент, колец, матриц, фоновой подсветки

Для одного-двух цветных огоньков обычный RGB-светодиод — самое простое и дешёвое решение. Если нужно раскрашивать десятки светодиодов по отдельности, 6 PWM-пинов Uno не хватит; тогда переходят на ленты WS2812B, которые управляют сотнями светодиодов по одному проводу.

Идеи проектов с RGB-светодиодом

  • Лампа настроения: помести радугу в матовую банку — получится мягкий ночник.
  • Индикатор температуры: объедини с DHT11, чтобы лампа светилась синим, когда холодно, зелёным, когда тепло, и красным, когда жарко.
  • Смеситель цветов: создавай любой цвет вручную тремя потенциометрами.
  • Выбор цвета с телефона: меняй цвет лампы палитрой на веб-странице, которую раздаёт ESP32.
  • Свет уведомлений: мигай светодиодом определённым цветом, когда приходит новое письмо или сообщение.
  • Цвета с клавиатуры: показывай разный цвет в зависимости от цифры, набранной на клавиатуре.

Частые ошибки и как их исправить

  • Цвета работают наоборот: светодиод с общим анодом управляется как с общим катодом; поставь COMMON_ANODE в true.
  • Один цвет никогда не загорается: порядок выводов может отличаться от ожидаемого; проверь каждую ножку по очереди с резистором.
  • Переходы ступенчатые, без промежуточных оттенков: светодиод на пине без PWM; на Uno такие пины могут быть только полностью включены или выключены.
  • Цвета сбоят, пока играет зуммер: на Uno функция tone() использует Timer2 и ломает PWM на пинах 3 и 11; переставь RGB-светодиод на пины вроде 5, 6, 9 и 10.
  • Без резисторов: слишком большой ток рано или поздно повредит и светодиод, и пин Arduino.
  • Очень тускло на ESP32: при 3,3 V зелёный и синий на пределе; возьми резисторы поменьше или транзистор.

Если хочешь разобраться в основах светодиодов и в том, зачем им резисторы, загляни в статьи Что такое светодиод? и Что такое резистор? В приложении BlueGrays есть проекты с RGB-светодиодом — плавная смена цветов, лампа с управлением с клавиатуры и смеситель цветов — со схемами подключения и кодом.

Частые вопросы

Как узнать, с общим анодом мой RGB-светодиод или с общим катодом?

Подключи длинную ножку к GND и коснись другой ножкой 5V через резистор 220 Ω; если загорелся — это общий катод. Если нет, подключи длинную ножку к 5V, а другую через резистор к GND; если теперь горит — общий анод. То же самое умеет режим проверки диодов в мультиметре.

Какой резистор нужен для RGB-светодиода?

При 5 V идеально около 150 Ω для красного и около 100 Ω для зелёного и синего. Для простоты можно поставить 220 Ω на все три: это безопасно и всё ещё достаточно ярко. Отдельный резистор на каждый цвет обязателен.

Сколько цветов может дать RGB-светодиод?

Каждый канал принимает 256 уровней яркости от 0 до 255, поэтому теоретически сочетаний 16,7 миллиона. На практике глаз различает меньше цветов, а разница в яркости светодиодов сближает некоторые оттенки.

Почему мой RGB-светодиод выглядит голубоватым вместо белого?

Три светодиода отличаются по яркости, а глаз к одним цветам чувствительнее, чем к другим; обычно преобладают синий и зелёный. Немного убавь эти два канала в коде или поставь на них резисторы побольше, и белый станет нейтральнее.

Что будет, если подключить RGB-светодиод к пину без PWM?

Этот канал будет только полностью включён или полностью выключен; analogWrite считает 128 и выше включением, а всё, что ниже, — выключением. Если так все три канала, получится только 8 базовых цветов без плавных переходов.

Сколькими RGB-светодиодами может управлять Arduino Uno?

У Uno 6 PWM-пинов, поэтому независимыми цветами можно управлять максимум у 2 RGB-светодиодов. Для большего числа используй 16-канальный PWM-драйвер вроде PCA9685 или ленты WS2812B, которые управляют сотнями светодиодов с одного пина.

Все проекты
Работа с RGB-светодиодом
#39Новичок
Premium

Работа с RGB-светодиодом

В одном светодиоде прячутся три цвета: RGB-светодиод загорается красным, затем зелёным, затем синим, каждый цвет горит полсекунды и полсекунды не горит, а потом цикл начинается снова. Нужны всего один

4.9(73)
98
Плавная смена цвета RGB-светодиода
#40Новичок
Premium

Плавная смена цвета RGB-светодиода

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

4.8(58)
76
Управление RGB-светодиодом на ESP32
#111Новичок

Управление RGB-светодиодом на ESP32

Бесконечное число цветов одним RGB-светодиодом вместо 3 отдельных. Как в Arduino, радужный переход получается заданием значений R/G/B через analogWrite(). Теория цвета (например, красный + зелёный = жёлтый) видна на практике.

4.6(29)
51
Смеситель цветов на ESP32 (3 потенциометра + RGB-светодиод + OLED)
#138Продвинутый
Premium

Смеситель цветов на ESP32 (3 потенциометра + RGB-светодиод + OLED)

Умная лампа для смешивания цветов на ESP32: вращая три потенциометра, можно получить любой цвет! Когда крутишь потенциометры красного, зелёного и синего, RGB-светодиод с общим катодом меняет цвет в реальном времени. OLED-дисплей SSD1306 показывает значения каждого цвета в диапазоне 0–255, полосы заполнения и веб-код цвета HEX (например, #FF8040). Мини-студия цвета, которая учит теории цвета RGB, чтению АЦП, регулировке яркости через PWM и дизайну экрана I2C.

4.7(6)
10
Смена цветов RGB-светодиода на Pico (3 канала PWM)
#161Новичок

Смена цветов RGB-светодиода на Pico (3 канала PWM)

Один светодиод — миллионы цветов! RGB-светодиод содержит 3 светодиода: красный, зелёный и синий. Если управлять каждым своим каналом PWM Pico, цвета смешиваются: красный + зелёный = жёлтый, зелёный + синий = голубой, все три = белый. Светодиод перебирает 8 цветов. Изучи несколько каналов PWM, объявление функций (def set_color(...)), смешивание RGB, перевод 8 бит → 16 бит (x257) и общий катод и общий анод.

0.0(0)
6
Управление лентой WS2812B NeoPixel на ESP32
#126Средний
Premium

Управление лентой WS2812B NeoPixel на ESP32

Адресуемые светодиоды WS2812B (NeoPixel) — умные RGB-светодиоды, которыми управляют цепочкой через один пин данных. В этом проекте лента WS2812B из 8 светодиодов управляется библиотекой Adafruit_NeoPixel и показывает плавную радужную анимацию. Логика 3,3V у ESP32 работает с большинством WS2812B, но на случай нестабильности показано решение с последовательным резистором 470Ω и конденсатором 1000µF. Анимация получается сдвигом значения оттенка.

4.9(19)
30
Работа со светодиодной лентой WS2812B
#69Средний
Premium

Работа со светодиодной лентой WS2812B

Познакомься с умной светодиодной лентой, где каждому огоньку можно задать свой цвет. Arduino сначала зажигает первые пять светодиодов красным, через секунду остальные пять — синим, затем выключает все

4.8(54)
70