Что такое 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.