Подключение RGB светодиода

RGB светодиод (от английского Red, Green, Blue) представляет из себя сборку из трех светодиодов разных цветов: красного, зеленого и синего.

Внешний вид RGB светодиода.

С точки зрения схемотехники, в зависимости от способа соединения диодов внутри корпуса, RGB светодиоды бывают двух типов: с общим катодом (OK) и с общим анодом (OA).

 

Схемотехника RGB светодиода.

RGB светодиод, построенный по схеме с общим катодом (ОК), подключается катодом к «земле» (0В), а каждый из анодов подключается к управляющим портам контроллера. Напротив, схема с общим анодом (ОА), подключается анодом к положительной шине питания, а катоды подключаются к портам контроллера, каждый из которых играют роль «земли».
Если управлять RGB светодиодом дискретно, подавая напряжение на его ножки и отключая их, можно получить лишь три цвета. Но подавая на его выводы ШИМ сигнал различной скважности и комбинируя три цвета, можно получить практически любые оттенки. Лучше всего это иллюстрирует изображение, представленное ниже:

Получение оттенков с помощью комбинации трех цветов.

Для демонстрации управления RGB светодиодом с помощью ШИМ сигнала соберем макет согласно схеме и напишем программу, моделирующую поведение лампочки из разноцветной гирлянды. Светодиод должен с интервалом в 1 секунду изменять цвета в следующей последовательности: красный (255,0,0), оранжевый (255,102,0), желтый (255,212,42), аквамарин (0,255,255), фиолетовый (102,0,255), розовый (255,42,127).
В процессе написания программы будем работать с каждым из внутренних светодиодов так, как будто это отдельные одноцветные светодиоды.

//Красный светодиод
#define RED_PIN 11
//Зеленый светодиод
#define GREEN_PIN 10
//Синий светодиод
#define BLUE_PIN 9
void setColor(char r, char g, char b);
void setup() {
  pinMode(RED_PIN, OUTPUT);
  pinMode(GREEN_PIN, OUTPUT);
  pinMode(BLUE_PIN, OUTPUT);
} void loop() { //Задаем цвет: красный (255,0,0) setColor(255, 0, 0); //Ждем 1сек delay(1000); //Задаем цвет: оранжевый (255,102,0) setColor(255, 102, 0); //Ждем 1сек delay(1000); //Задаем цвет: желтый (255,212,42) setColor(255, 212, 42); //Ждем 1сек delay(1000); //Задаем цвет: аквамарин (0,255,255) setColor(0, 255, 255); //Ждем 1сек delay(1000); //Задаем цвет: фиолетовый (102,255,255) setColor(102, 255, 255); //Ждем 1сек delay(1000); //Задаем цвет: розовый (255,42,127) setColor(255, 42, 127); //Ждем 1сек delay(1000); } void setColor(char r, char g, char b) { //Задаем ШИМ на выводе RED_PIN analogWrite(RED_PIN, r); //Задаем ШИМ на выводе GREEN_PIN analogWrite(GREEN_PIN, g); //Задаем ШИМ на выводе BLUE_PIN analogWrite(BLUE_PIN, b); }

В ходе составления программы был применен прием, позволяющий упростить код и сделать его более наглядным и читаемым. Вместо того, чтобы каждый раз в момент изменения цвета вызывать команду analogWrite для каждого светодиода, мы вынесли эту часть кода в отдельную функцию setColor. Она объявлена в начале программы - void setColor(char r, char g, char b), Само тело функции, при этом, описано в конце программы.
Теперь, когда нужно изменить цвет, достаточно вызвать функцию setColor, передав ей три аргумента — значения цветов в следующем порядке (красный, зеленый, синий). Тип аргументов объявлен как char.
char — целочисленный (символьный) тип данных, хранит число от 0 до 255.