Управление двумя rgb светодиодом на ардуино. RGB светодиод и Arduino

  • 3 резистора по 220 Ом (вот отличный набор резисторов самых распространённых номиналов);
  • соединительные провода (рекомендую вот такой набор);
  • макетная плата (breadboard);
  • персональный компьютер со средой разработки Arduino IDE.
  • 1 Отличие RGB светодиодов с общим анодом и с общим катодом

    RGB светодиоды бывают двух типов: с общим анодом («плюсом») и общим катодом («минусом») . На рисунке приведены принципиальные схемы эти двух типов светодиодов. Длинная ножка светодиода - это всегда общий вывод питания. Отдельно расположен вывод красного светодиода (R ), зелёный (G ) и синий (B ) располагаются по другую сторону от общего вывода, как показано на рисунке. В данной статье мы рассмотрим подключение RGB светодиода как с общим анодом, так и с общим катодом.

    2 Подключение RGB светодиода с общим анодом к Arduino

    Схема подключения RGB светодиода с общим анодом показана на рисунке. Анод подключаем к "+5 В" на плате Arduino, три другие вывода - к произвольным цифровым пинам.


    Обратите внимание, что мы подключаем каждый из светодиодов через свой резистор, а не используем один общий. Желательно делать именно так, потому что каждый из светодиодов имеет свой КПД. И если подключить их все через один резистор, светодиоды будут светиться с разной яркостью.

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

    3 Управление RGB светодиодами с помощью Arduino

    Перепишем классический скетч blink . Будем включать и отключать по очереди каждый из трёх цветов. Обратите внимание, что светодиод загорается, когда мы подаём низкий уровень (LOW) на соответствующий вывод Arduino.

    // задаём номера выводов: const int pinR = 12; const int pinG = 10; const int pinB = 9; void setup() { // задаём назначение выводов: pinMode(pinR, OUTPUT); pinMode(pinG, OUTPUT); pinMode(pinB, OUTPUT); } void loop() { digitalWrite(pinR, LOW); //зажигаем канал Red delay(100); digitalWrite(pinR, HIGH); //выключаем Red delay(200); digitalWrite(pinG, LOW); //зажигаем канал Green delay(100); digitalWrite(pinG, HIGH); //выключаем Green delay(200); digitalWrite(pinB, LOW); //зажигаем канал Blue delay(100); digitalWrite(pinB, HIGH); //выключаем Blue delay(200); }

    4 Собрать схему на макетной плате

    Посмотрим в действии на мигание RGB светодиодом. Светодиод по очереди зажигается красным, зелёным и синим цветами. Каждый цвет горит 0,1 секунду, а затем гаснет на 0,2 секунды, и включается следующий. Можно зажигать каждый канал отдельно, можно все одновременно, тогда цвет свечения будет меняться.


    RGB светодиод подключён к Arduino. Схема собрана на макетной плате

    5 к Arduino

    Если вы используете RGB светодиод с общим катодом , то подключите длинный вывод светодиода к GND платы Arduino, а каналы R, G и B - к цифровым портам Arduino. При этом нужно помнить, что светодиоды загораются при подаче на каналы R, G, B высокого уровня (HIGH), в отличие от светодиода с общим анодом.


    Схема подключения RGB светодиода с общим катодом к Arduino

    Если не менять вышеприведённый скетч, то каждый цвет светодиода в этом случае будет гореть 0,2 секунды, а пауза между ними составит 0,1 секунду.

    Если вы хотите управлять яркостью светодиода, то подключайте RGB светодиод к цифровым выводам Arduino, которые имеют функцию ШИМ (PWM). Такие выводы на плате Arduino обычно помечены знаком тильда (волнистая линия), звёздочкой или обведены кружочками.

    Во многих приложениях, как любительских, так и профессиональных, иногда бывает необходимым генерировать цвета различных оттенков. Использование отдельных одноцветных светодиодов в таких случаях неоправданно конструктивно и экономически. Поэтому для таких целей были разработаны RGB-светодиоды.



    RGB-светодиод (аббревиатура означает RED, GREEN, BLUE) является сочетанием кристаллов, способных генерировать красный, зеленый и синий цвета. Благодаря такому сочетанию данные светодиоды могут воспроизводить 16 миллионов оттенков света. Управлять RGB-светодиодами несложно, и они без проблем могут использоваться в проектах с Arduino. В данном материале будет показан пример управления RGB-светодиодом с помощью Arduino.


    Поскольку RGB-светодиод, как было отмечено выше, является сочетанием кристаллов трех разных базовых цветов, то схемотехнически он изображается как три светодиода. Конструктивно такой светодиод имеет один общий вывод и три вывода для каждого цвета. Ниже показана схема подключения RGB-светодиода к Arduino. Также на схеме имеется буквенно-числовой ЖК-дисплей 16×2, потенциометры и последовательно соединенные с линиями RGB-светодиода резисторы. Эти резисторы (R1 = 100 Ом, R2 = 270 Ом, R3 = 330 Ом) ограничивают ток светодиодов, чтобы они не вышли из строя. Переменные резисторы (потенциометры) VR1-VR3 сопротивлением 10 КОм используются для управления интенсивностью свечения RGB-светодиода, то есть с помощью них можно задавать цвет светодиода, меняя интенсивность красного, зеленого и синего кристаллов. Потенциометр VR1 соединен с аналоговым входом A0, VR2 с аналоговым входом A1, а VR3 с аналоговым входом A2.



    ЖК-дисплей в данном случае используется для отображения значения цвета и шестнадцатеричного значения цветового кода. Значение цветового кода отображается в 1-й строке ЖК-дисплея (в виде Rxxx Gxxx Bxxx, где xxx представляет собой числовое значение), а шестнадцатеричный код отображается во 2-й строке ЖК-дисплея (в виде HEXxxxxxx). Резистор R4 сопротивлением 100 Ом применяется для ограничения тока, прикладываемого к подсветке ЖК-дисплея, а для регулировки контрастности ЖК-дисплея используется переменный резистор VR4 сопротивлением 10 КОм.


    Ниже приведен код (скетч), позволяющий управлять изменением цвета RGB-светодиода с помощью платы Arduino и подключенными к ней потенциометрами.


    #include // библиотека для ЖК-дисплея LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // линии Arduino для подключения ЖК-дисплея int Radj; int Gadj; int Badj; int Rval=0; int Gval=0; int Bval=0; int R = 9; int G = 10; int B = 11; void setup() { pinMode(R, OUTPUT); // Линия 9 направлена на выход pinMode(G, OUTPUT); // Линия 10 направлена на выход pinMode(B, OUTPUT); // Линия 11 направлена на выход lcd.begin(16,2); // Инициализация дисплея delay(1); lcd.setCursor(0,0); lcd.print("RGB COLOUR"); lcd.setCursor(4,1); lcd.print("GENERATOR"); delay(2000); lcd.setCursor(0, 0); lcd.print(" R G B "); lcd.setCursor(3,1); lcd.print("HEX= "); } void loop() { Radj = analogRead(0); Gadj = analogRead(1); Badj = analogRead(2); Rval=Radj/4; // Convert the range from (0-1023) to (0-255) Gval=Gadj/4; // Convert the range from (0-1023) to (0-255) Bval=Badj/4; // Convert the range from (0-1023) to (0-255) lcd.setCursor(2,0); if (Rval<10) { lcd.setCursor(2,0); lcd.print("00"); lcd.print(Rval); } else if(Rval<100) { lcd.setCursor(2,0); lcd.print("0"); lcd.print(Rval); } else { lcd.setCursor(2,0); lcd.print(Rval); } lcd.setCursor(8,1); if (Rval<16) { lcd.print("0"); lcd.print(Rval, 16); } else { lcd.print(Rval, 16); } lcd.setCursor(7,0); if (Gval<10) { lcd.setCursor(7,0); lcd.print("00"); lcd.print(Gval); } else if(Gval<100) { lcd.setCursor(7,0); lcd.print("0"); lcd.print(Gval); } else { lcd.setCursor(7,0); lcd.print(Gval); } lcd.setCursor(10,1); if (Gval<16) { lcd.print("0"); lcd.print(Gval, 16); } else { lcd.print(Gval, 16); } lcd.setCursor(12,0); if (Bval<10) { lcd.setCursor(12,0); lcd.print("00"); lcd.print(Bval); } else if(Bval<100) { lcd.setCursor(12,0); lcd.print("0"); lcd.print(Bval); } else { lcd.setCursor(12,0); lcd.print(Bval); } lcd.setCursor(12,1); if (Bval<16) { lcd.print("0"); lcd.print(Bval, 16); } else { lcd.print(Bval, 16); } analogWrite(R, Rval); // ШИМ-выход для красного цвета analogWrite(G, Gval); // ШИМ-выход для зеленого цвета analogWrite(B, Bval); // ШИМ-выход для синего цвета }

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

    RGB — это аббревиатура, которая расшифровывается как: Red — красный, Green — зеленый, Blue — синий. То есть внутри этого устройства размещается сразу три отдельных светодиода. В зависимости от типа, RGB-светодиод может иметь общий катод или общий анод.

    Смешение цветов

    Чем RGB-светодиод, лучше трех обычных? Всё дело в свойстве нашего зрения смешивать свет от разных источников, размещенных близко друг к другу. Например, если мы поставим рядом синий и красный светодиоды, то на расстоянии несколько метров их свечение сольется, и глаз увидит одну фиолетовую точку. А если добавим еще и зеленый, то точка покажется нам белой. Именно так работают мониторы компьютеров, телевизоры и уличные экраны.

    Матрица телевизора состоит из отдельно стоящих точек разных цветов. Если взять лупу и посмотреть через нее на включенный монитор, то эти точки можно легко увидеть. А вот на уличном экране точки размещаются не очень плотно, так что их можно различить невооруженным глазом. Но с расстояния несколько десятков метров эти точки неразличимы.

    Получается, что чем плотнее друг к другу стоят разноцветные точки, тем меньшее расстояние требуется глазу чтобы смешивать эти цвета. Отсюда вывод: в отличие от трех отдельностоящих светодиодов, смешение цветов RGB-светодиода заметно уже на расстоянии 30-70 см. Кстати, еще лучше себя показывает RGB-светодиод с матовой линзой.

    В прошлый раз был рассмотрен способ подключения светодиодной ленты к ардуино через драйвер L298. Управление цветом осуществлялось программно - функция Random. Теперь пришла пора разобраться, как управлять цветом светодиодной ленты на основании показаний датчика температуры и влажности DHT 11.

    За основу взят пример подключения светодиодной ленты через драйвер L298. Плюсом ко всему в пример добавлен дисплей LCD 1602, который будет отображать показания датчика DHT 11.

    Для проекта понадобятся следующие элементы Ардуино:

    1. Плата Ардуино УНО.
    2. Дисплей LCD 1602 + I2C.
    3. Датчик температуры и влажности DHT
    4. Светодиодная лента.
    5. Драйвер L298.
    6. Блок питания 9-12В.
    7. Корпус для ардуино и дисплея (по желанию).

    Первым делом посмотрим на принципиальную схему (рис. 1). На ней можно увидеть, как нужно подключить все вышеперечисленные элементы. В сборке схемы и подключении ничего сложного нет, однако стоит упомянуть об одном нюансе, о котором большинство людей забывают, и в итоге получают неправильные результаты работы LED – ленты с Ардуино.

    Рисунок 1. Принципиальная схема подключения Arduino и светодиодной ленты с датчиком DHT 11

    Во избежание некорректной работы светодиодной ленты (мерцание, несоответствие цветов, неполное свечение и т.д.), питание всей схемы необходимо сделать общим, т.е. объединить контакты GND (земля) контроллера Ардуино и драйвера L298 (светодиодной ленты). Как это сделать, можно посмотреть на схеме.

    Пару слов о подключении датчика влажности. Если покупать голый DHT 11, без обвязки, то между первым и вторым контактами, 5В и Data, соответственно, нужно впаять резистор номиналом 5-10 кОм. Диапазон измерения температуры и влажности написан на обратной стороне корпуса датчика DHT 11. Температура: 0-50 градусов по Цельсию. Влажность: 0-80%.


    Рисунок 2. Правильное подключение датчика влажности DHT 11

    После сборки всех элементов проекта по схеме, необходимо написать программный код, который заставит все это работать так, как нам нужно. А нужно нам, чтобы светодиодная лента изменяла цвет в зависимости от показаний датчика DHT 11 (влажности).

    Для программирования датчика DHT 11 понадобится дополнительная библиотека.

    Код программы Arduino и RGB – лента. Изменение цвета ленты в зависимости от влажности.

    #include #include //библиотека для работы с дисплеем LCD 1602 #include //библиотека для работы с датчиком влажности и температуры DHT 11 int chk; //переменная будет хранить все данные с датчика DHT11 int hum; //переменная будет хранить показания влажности с датчика DHT11 dht11 DHT; //объект типа DHT #define DHT11_PIN 4 //контакт Data датчика DHT11 подключен на вход 4 #define LED_R 9 // пин для канала R #define LED_G 10 // пин для канала G #define LED_B 11 // пин для канала B //переменные будут хранить значения цветов //при смешивании всех трех цветов будет получаться необходимый цвет int led_r=0, led_g=0, led_b=0; //объявление объекта дисплея с адресом 0х27 //не забываем использовать в проекте дисплей через плату I2C LiquidCrystal_I2C lcd(0x27,16,2); void setup() { //создание дисплея lcd.init(); lcd.backlight(); // объявляем пины выходами pinMode(LED_R, OUTPUT); pinMode(LED_G, OUTPUT); pinMode(LED_B, OUTPUT); } void loop() { chk = DHT.read(DHT11_PIN);//читаем данные с датчика DHT11 //вывод данных на дисплей lcd.print("Temp: "); lcd.print(DHT.temperature, 1); lcd.print(" C"); lcd.setCursor(0,1); lcd.print("Hum: "); lcd.print(DHT.humidity, 1); lcd.print(" %"); delay(1500); //для корректной работы датчика нужна задержка на опрос lcd.clear(); hum = DHT.humidity; //берем показания влажности //в диапозоне от 19 до 30% влажности выдать зеленый цвет if ((hum >= 19) && (hum <= 30)) { led_r = 1; led_g = 255; led_b = 1; } //в диапозоне от 31 до 40% влажности выдать красный цвет if ((hum >= 31) && (hum <= 40)) { led_r = 255; led_g = 1; led_b = 1; } //в диапозоне от 41 до 49% влажности выдать синий цвет if ((hum >= 41) && (hum <= 49)) { led_r = 1; led_g = 1; led_b = 255; } // подача сигналов цвета на выхода analogWrite(LED_R, led_r); analogWrite(LED_G, led_g); analogWrite(LED_B, led_b); }

    Метки: Метки

    Широтно-импульсная модуляция (ШИМ, PWM) - веселая штука, и особенно прикольно с ее помощью управлять сервомоторами, однако сегодня мы применим ее к трехцветному светодиоду. Это позволит нам управлять его цветом и получить некое подобие красоты.

    ШИМ

    Гениально определение ШИМ сформулировано в Википедии , поэтому я просто скопипащу его оттуда: "ШИМ - приближение желаемого сигнала (многоуровневого или непрерывного) к действительным бинарным сигналам (с двумя уровнями - вкл / выкл ), так, что, в среднем, за некоторый отрезок времени, их значения равны. <...> ШИМ есть импульсный сигнал постоянной частоты и переменной скважности, то есть отношения периода следования импульса к его длительности. С помощью задания скважности (длительности импульсов) можно менять среднее напряжение на выходе ШИМ . "


    Теперь разберемся, что это значит. Пусть есть обычный такой прямоугольный сигнал:




    Он имеет фиксированную частоту и скважность 50%. Это означает, что половину периода напряжение максимально, а другую половину оно равно нулю. Проинтегрировав этот сигнал за период, мы увидим, что его энергия равна половине максимальной. Это будет эквивалентно тому, как если бы мы все время подавали половину напряжения.


    Если у нас максимальное напряжение равно 5 В, то напряжение, получаемое на выходе ШИМ равно скважность умножить на 5 В (и делить на 100% чтобы формал-nazi не привязывались):


    Arduino позволяет записать на ШИМ-выход значение от 0 до 255, а это значит, что мы можем получить напряжение с дискретностью примерно 20 мВ.


    Трехцветный светодиод

    Вот он, четырехногий красавец:


    Самая длинная нога - это общий анод, а все остальные - это катоды, каждый отвечает за свой цвет: (смотрим на рисунок) самая нижняя - красный, вторая сверху - зеленый, самая верхняя - синий.

    Если подать на длинную ногу +5В, а на все остальные 0В, то получится белый свет (умоляю, предохраняйтесь - ставьте ограничивающие резисторы!). Насколько он белый, можно судить по следующему видео:


    Но получать белый цвет на нем как раз-таки неинтересно. Посмотрим, как заставить его переливаться разными цветами.

    ШИМ на Arduino

    Частота ШИМ на Arduino - примерно 490 Гц. На плате Arduino UNO выводы, которые могут быть использованы для ШИМ - 3,5,6, 9, 10 и 11. На плате к этому есть подсказка - шелкографией перед номерами ШИМ-выводов есть тильда или диез.

    Нет ничего проще, чем управлять ШИМ на Arduino! Для этого используется одна единственная функция analogWrite(pin, value) , где pin - номер вывода, а value - значение от 0 до 255. При этом ничего не надо писать в void setup() !

    Подробнее про это на английском языке можно почитать и .

    Совсем немного работаем

    Сделаем так, чтобы светодиод переливался разными цветами. Пусть один цвет плавно гаснет, в то время как другой разгорается. Поочередно будем менять пару цветов, и цвет будет переходить по кругу из красного в зеленый, из зеленого в синий, из синего в красный.

    Соберем незамысловатую схему:


    И напишем незамысловатый код:

    //обзываем выводы соответственно цвету
    int REDpin = 9;
    int GREENpin = 10;
    int BLUEpin = 11;

    void setup (){}

    void loop (){
    for (int value = 0 ; value <= 255; value +=1) {
    //яркость красного уменьшается
    analogWrite (REDpin, value);
    //яркость зеленого увеличивается
    analogWrite (GREENpin, 255-value);
    //синий не горит
    analogWrite (BLUEpin, 255);
    //пауза
    delay (30);
    }

    for (int value = 0 ; value <= 255; value +=1) {
    //красный не горит
    analogWrite (REDpin, 255);
    //яркость зеленого уменьшается
    analogWrite (GREENpin, value);
    //яркость синего увеличивается
    analogWrite (BLUEpin, 255-value);
    //пауза
    delay (30);
    }

    for (int value = 0 ; value <= 255; value +=1) {
    //яркость красного увеличивается
    analogWrite (REDpin, 255-value);
    //зеленый не горит
    analogWrite (GREENpin, 255);
    //яркость синего уменьшается
    analogWrite (BLUEpin, value);
    //пауза
    delay (30);
    }
    }