Этот несложный Arduino проект предназначен для управления с помощью PWM (широтно-импульсной модуляции). Она может изменить уровень каждого цвета независимо путем изменения скважности ШИМ. Таким образом можно создать любой цвет путем смешивания разных цветов в процентах. Вращение энкодера на плате позволяет пользователю выбрать нужный канал и изменить его яркость. Транзисторы с малым коммутационным сопротивлением, создают очень низкое тепловыделение даже с использованием большого количества светодиодов. Например, IRF540 транзистор имеет вполне низкое проходное RDS-сопротивление - около 70 мОм.

Схема контроллера лент

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

Основной контроллер выполнен с применением Arduino Uno. Он считывает входные данные от энкодера и согласно этой информации, происходит переключение транзисторов. Транзисторы управляются выводами 9, 10 и 11, которые имеют внутренние функции ШИМ. Направление сигналов энкодера A и B читаются с помощью элементов 2 и 3, которые подключены к модулю. Кнопка энкодера используется для выбора канала и подключена к выводу 1, что устанавливают в качестве входных данных.

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

Внутреннее устройство

На самом деле RGB-светодиод - это три одноцветных кристалла совмещенные в одном корпусе. Название RGB расшифровывается, как Red - красный, Green - зеленый, Blue - синий соответственно цветам, которые излучает каждый из кристаллов.

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

На этой картинке вы видите принцип смешивания цветов, для получения всех оттенков.

Кристаллы в RGB-светодиоды могут быть соединены по схеме:

С общим анодом;

С общим катодом;

Не соединены.

В первых двух вариантах вы увидите, что у светодиода есть 4 вывода:

Или 6-тью выводами в последнем случае:

Вы можете видеть на фотографии под линзой четко видны три кристалла.

Для таких светодиодов продаются специальные монтажные площадки, на них даже указывают назначение выводов.

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

Естественно не обошлось и без лент с такими светодиодами.

На этой картинке изображена лента с RGB-светодиодами , собранные по схеме с общим анодом, регулировка интенсивности свечения осуществляется путем управления «-» (минусом) источника питания.

Для изменения цвета RGB-ленты используются специальные RGB-контроллеры - устройства для коммутации напряжения подаваемого на ленту.

Вот цоколевка RGB SMD5050:

И ленты, особенностей работы с RGB-лентами нет, всё остается также как и с одноцветными моделями.

Для них есть и коннекторы для подсоединения светодиодной ленты без пайки.

Вот распиновка 5-ти мм РГБ-светодиода:

Как изменяется цвет свечения

Регулировка цвета осуществляется путем регулировки яркости излучения каждым из кристаллов. Мы уже рассматривали .

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

Да такого мощного устройства в корпусе размером с блок питания.

Они подключаются к ленте по такой схеме:

Так как сечение дорожек на ленте не позволяет подключать последовательно с ней следующий отрезок ленты, если длина первого превышает 5м, нужно подключать второй отрезок проводами напрямую от РГБ-контроллера.

Но можно выйти из положения, и не тянуть дополнительных 4 провода на 5 метров от контроллера и использовать RGB-усилитель. Для его работы нужно протянуть всего 2 провода (плюс и минус 12В) или запитать еще один блок питания от ближайшего источника 220В, а также 4 «информационных» провода от предыдущего отрезка (R, G и B) они нужны для получения команд от контроллера, чтобы вся конструкция светилась одинаково.

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

Регулируем RGB-led своими руками

Итак, есть два варианта для управления RGB-светодиодами:

Вот вариант схемы без использования ардуин и других микроконтроллеров, с помощью трёх драйверов CAT4101, способных выдавать ток до 1А.

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

Заключение

RGB-светодиоды позволяют сделать интересные световые эффекты используются в дизайне интерьеров, как подсветка для бытовой техники, для эффекта расширения экрана телевизора. Особых отличий при работе с ними от обычных светодиодов - нет.

Недавно я купил 2 рулона rgb светодиодной ленты по 5 метров, и сразу решил поэкспериментировать с ней. В комплекте шёл блок для управления лентой, но мне показались программы малоинтересными, а под рукой был Tinyos Uno (полный китайский аналог Arduino UNO ). Учитывая то, что ардуино работает максимум с 5в на выход, а чаще 3.3в то нужно было найти решение. В этой статье рассмотрено как подключить 12 вольтовую светодиодную ленту к ардуино с отдельным питанием для ленты и управлением с ардуинки с использованием МОСФЕТов (MOSFETs) для управления каналами RGB ленты .

Начнём со стандартной спецификации аналоговой светодиодной ленты, которая, как мне кажется, наиболее распространена.

  • 10.5mm (0.41") ширина, 3mm (0.12") толщина, 100mm (3.95") длина на каждый сегмент
  • Бывает влагозащищённые (waterproof ) и без защиты (non-waterproof )
  • Имеет клейкую ленту с обратной стороны для крепления ленты
  • Максимальное напряжение 12V и 60mA на каждый сегмент
  • 3 светодиода с общим анодом на каждом сегменте
  • Длина волн светодиодов: 630nm/530nm/475nm
  • Нет микроконтроллера или чип контроллера (чисто аналоговое управление)

Прежде чем начинать работу с Arduino и напряжением выше, чем 5 вольт очень советую прочитать про , чтобы не сжечь вашу Arduino . В ней хорошо описано использование МОСФЕТов с Ардуино . Если вы уже прочитали эту статью, то давайте двигаться дальше.
Для работы со светодиодной лентой нам понадобятся:

  1. MOSFET транзисторы, которые можно найти на том же EBay
  2. Резисторы на 10k?
  3. Макетная беспаечная плата (breadboard )
  4. Проводки для соединения ардуино с макетной платой (папа-папа)
  5. Светодиодная лента (Я брал на aliexpress вот эту ленту , и планирую заказать ещё пару у этого же продавца)

Теперь перейдём к схеме подключения, из неё станет понятно основная часть данной статьи:

Теперь обратимся к Arduino IDE , в которой напишем скетч для управления нашей лентой:

// Note that there"s some legacy code left in here which seems to do nothing // but should do no harm ... // don"t futz with these, illicit sums later #define RED 9// pin for red LED #define GREEN 10 // pin for green - never explicitly referenced #define BLUE 11 // pin for blue - never explicitly referenced #define SIZE 255 #define DELAY 20 #define HUE_MAX 6.0 #define HUE_DELTA 0.01 //long deltas = { 5, 6, 7 }; long rgb; long rgbval; // for reasons unknown, if value !=0, the LED doesn"t light. Hmm ... // and saturation seems to be inverted float hue=0.0, saturation=1, value=1; /* chosen LED SparkFun sku: COM-09264 has Max Luminosity (RGB): (2800, 6500, 1200)mcd so we normalize them all to 1200 mcd - R 250/600 = 107/256 G 250/950 = 67/256 B 250/250 = 256/256 */ long bright = { 107, 67, 256}; //long bright = { 256, 256, 256}; long k, temp_value; void setup () { randomSeed(analogRead(4)); for (k=0; k<3; k++) { pinMode(RED + k, OUTPUT); rgb[k]=0; analogWrite(RED + k, rgb[k] * bright[k]/256); } } void loop() { hue += HUE_DELTA; if (hue > HUE_MAX) { hue=0.0; } rgbval=HSV_to_RGB(hue, saturation, value); rgb = (rgbval & 0x00FF0000) >> 16; // there must be better ways rgb = (rgbval & 0x0000FF00) >> <3; k++) { // for all three colours analogWrite(RED + k, rgb[k] * bright[k]/256); } delay(DELAY); } long HSV_to_RGB(float h, float s, float v) { // H is given on . S and V are given on . // RGB is returned as a 24-bit long #rrggbb int i; float m, n, f; // not very elegant way of dealing with out of range: return black if ((s<0.0) || (s>1.0) || (v<1.0) || (v> < 0.0) || (h > 6.0)) { return long(v * 255) + long(v * 255) * 256 + long(v * 255) * 65536; } i = floor(h); f = h - i; if (!(i&1)) { f = 1 - f; // if i is even } m = v * (1 - s); n = v * (1 - s * f); switch (i) { case 6: case 0: return long(v * 255) * 65536 + long(n * 255) * 256 + long(m * 255); case 1: return long(n * 255) * 65536 + long(v * 255) * 256 + long(m * 255); case 2: return long(m * 255) * 65536 + long(v * 255) * 256 + long(n * 255); case 3: return long(m * 255) * 65536 + long(n * 255) * 256 + long(v * 255); case 4: return long(n * 255) * 65536 + long(m * 255) * 256 + long(v * 255); case 5: return long(v * 255) * 65536 + long(m * 255) * 256 + long(n * 255); } }

Заливаем скетч на ардуино и радуемся.
Есть так же вариант с использованием температурного сенсора DS18B20 , который работает по протоколу 1-Wire .

Идея состоит в том, что "холодная температура", как правило, синего цвета, а "горячая температура " получит красный цвет. Если вы взгляните на колесо HSV, которое мы использовали в первом скетче (цветовое колесо см. wiki), цвет будет составлять от 240 °, когда холодно и до 0 °, если горячая, двигаясь по часовой стрелке (проходя голубой, зеленый и желтый).

Холодная температура в данном случае имеется ввиду 18 ° C, а горячая подразумевает 30 ° C. Температура ниже холодного порога будет считаться холодной, выше горячего порога - горячей. Окончательный код на самом деле довольно прост, когда у вас есть уже готовый код HSV:

// HSV fade/bounce for Arduino // Note that there"s some legacy code left in here which seems to do nothing // but should do no harm ... #include "OneWire.h" //#include "Streaming.h" const int DS18S20_Pin = 2; //DS18S20 Signal pin on digital 2 #define MIN_TEMP 18 #define MAX_TEMP 30 //Temperature chip i/o OneWire ds(DS18S20_Pin); // on digital pin 2 // don"t futz with these, illicit sums later #define RED 9// pin for red LED #define GREEN 10 // pin for green - never explicitly referenced #define BLUE 11 // pin for blue - never explicitly referenced #define SIZE 255 #define DELAY 0 #define HUE_MAX 6.0 #define HUE_DELTA 0.01 //long deltas = { 5, 6, 7 }; long rgb; long rgbval; // for reasons unknown, if value !=0, the LED doesn"t light. Hmm ... // and saturation seems to be inverted float hue=0.0, saturation=1, value=1; /* chosen LED SparkFun sku: COM-09264 has Max Luminosity (RGB): (2800, 6500, 1200)mcd so we normalize them all to 1200 mcd - R 250/600 = 107/256 G 250/950 = 67/256 B 250/250 = 256/256 */ long bright = { 107, 67, 256}; //long bright = { 256, 256, 256}; long k, temp_value; void setup () { randomSeed(analogRead(4)); Serial.begin(57600); for (k=0; k<3; k++) { pinMode(RED + k, OUTPUT); rgb[k]=0; analogWrite(RED + k, rgb[k] * bright[k]/256); } } void loop() { float temperature = constrain(getTemp(), MIN_TEMP, MAX_TEMP); float deltaTemp = (MAX_TEMP - MIN_TEMP); float deltaHue = 4 - 0; hue = map((temperature - MIN_TEMP) * 100, 0, deltaTemp * 100, deltaHue * 100, 0) / 100.0; //Serial << "Temperature: " << temperature << endl; //Serial << "HUE: " << hue << endl; rgbval=HSV_to_RGB(hue, saturation, value); rgb = (rgbval & 0x00FF0000) >> 16; // there must be better ways rgb = (rgbval & 0x0000FF00) >> 8; rgb = rgbval & 0x000000FF; for (k=0; k<3; k++) { // for all three colours analogWrite(RED + k, rgb[k] * bright[k]/256); } //delay(DELAY); } float getTemp(){ //returns the temperature from one DS18S20 in DEG Celsius byte data; byte addr; if (!ds.search(addr)) { //no more sensors on chain, reset search ds.reset_search(); return -1000; } if (OneWire::crc8(addr, 7) != addr) { Serial.println("CRC is not valid!"); return -1000; } if (addr != 0x10 && addr != 0x28) { Serial.print("Device is not recognized"); return -1000; } ds.reset(); ds.select(addr); ds.write(0x44,1); // start conversion, with parasite power on at the end byte present = ds.reset(); ds.select(addr); ds.write(0xBE); // Read Scratchpad for (int i = 0; i < 9; i++) { // we need 9 bytes data[i] = ds.read(); } ds.reset_search(); byte MSB = data; byte LSB = data; float tempRead = ((MSB << 8) | LSB); //using two"s compliment float TemperatureSum = tempRead / 16; return TemperatureSum; } long HSV_to_RGB(float h, float s, float v) { // H is given on . S and V are given on . // RGB is returned as a 24-bit long #rrggbb int i; float m, n, f; // not very elegant way of dealing with out of range: return black if ((s<0.0) || (s>1.0) || (v<1.0) || (v>1.0)) { return 0L; } if ((h < 0.0) || (h > 6.0)) { return long(v * 255) + long(v * 255) * 256 + long(v * 255) * 65536; } i = floor(h); f = h - i; if (!(i&1)) { f = 1 - f; // if i is even } m = v * (1 - s); n = v * (1 - s * f); switch (i) { case 6: case 0: return long(v * 255) * 65536 + long(n * 255) * 256 + long(m * 255); case 1: return long(n * 255) * 65536 + long(v * 255) * 256 + long(m * 255); case 2: return long(m * 255) * 65536 + long(v * 255) * 256 + long(n * 255); case 3: return long(m * 255) * 65536 + long(n * 255) * 256 + long(v * 255); case 4: return long(n * 255) * 65536 + long(m * 255) * 256 + long(v * 255); case 5: return long(v * 255) * 65536 + long(m * 255) * 256 + long(n * 255); } }

Для управления этими устройствами используется RGB-контроллер. Но, кроме него, в последние годы применяется плата Arduino.

Ардуино – принцип действия

плата Arduino

Плата Ардуино – это устройство, на котором установлен программируемый микроконтроллер. К нему подключены различные датчики, органы управления или encoder и, по заданному скетчу (программе), плата управляет моторами, светодиодами и прочими исполнительными механизмами, в том числе и другими платами Ардуино по протоколу SPI. Контроль устройства может осуществляться через дистанционный пульт, модуль Bluetooth, HC-06, Wi-Fi, ESP или internet, и кнопками. Одни из самых популярных плат – Arduino Nano и Arduino Uno, а также Arduino Pro Mini – устройство на базе микроконтроллера ATmega 328


Внешний вид Arduino Pro Mini
Внешний вид Arduino Uno
Внешний вид Arduino micro

Программирование осуществляется в среде Ардуино с открытым исходным кодом, установленным на обычном компьютере. Программы загружаются через USB.

Принцип управления нагрузкой через Ардуино


управление Arduino

На плате есть много выходов, как цифровых, имеющих два состояния – включено и выключено, так и аналоговых, управляемых через ШИМ-controller с частотой 500 Гц.

Но выходы рассчитаны на ток 20 – 40 мА с напряжением 5 В. Этого хватит для питания индикаторного RGB-светодиода или матричного светодиодного модуля 32×32 мм. Для более мощной нагрузки это недостаточно.

Для решения подобной проблемы во многих проектах нужно подключить дополнительные устройства:

  • Реле. Кроме отдельных реле с напряжением питания 5В есть целые сборки с разным количеством контактов, а также со встроенными пускателями.
  • Усилители на биполярных транзисторах. Мощность таких устройств ограничена током управления, но можно собрать схему из нескольких элементов или использовать транзисторную сборку.
  • Полевые или MOSFET-транзисторы. Они могут управлять нагрузкой с токами в несколько ампер и напряжением до 40 – 50 В. При подключении мосфета к ШИМ и электродвигателю или к другой индуктивной нагрузке, нужен защитный диод. При подключении к светодиодам или LED-лампам в этом нет необходимости.
  • Платы расширения.

Подключение светодиодной ленты к Ардуино


подключение светодиодной ленты к Arduino

Мнение эксперта

Алексей Бартош

Специалист по ремонту, обслуживанию электрооборудования и промышленной электроники.

Задать вопрос эксперту

Arduino Nano могут управлять не только электродвигателями. Они используются также для светодиодных лент. Но так как выходные ток и напряжение платы недостаточны для прямого подключения к ней полосы со светодиодами, то между контроллером и светодиодной лентой необходимо устанавливать дополнительные приспособления.

Через реле


Подключение через реле

Реле подключается к устройству на цифровой выход. Полоса, управляемая с его помощью имеет только два состояния – включенная и выключенная. Для управления red-blue-green ленточкой необходимы три реле. Ток, который может контролировать такое устройство, ограничен мощностью катушки (маломощная катушка не в состоянии замыкать большие контакты). Для подсоединения большей мощности используются релейные сборки.

С помощью биполярного транзистора


Подключение с помощью транзистора

Для усиления выходного тока и напряжения можно использовать биполярный транзистор. Он выбирается по току и напряжению нагрузки. Ток управления не должен быть выше 20 мА, поэтому подается через токоограничивающее сопротивление 1 – 10 кОм.

Транзистор лучше применять n-p-n с общим эмиттером. Для большего коэффициента усиления используется схема с несколькими элементами или транзисторная сборка (микросхема-усилитель).

С помощью полевого транзистора

Кроме биполярных, для управления полосами используются полевые транзисторы. Другое название этих приборов – МОП или MOSFET-transistor.

Такой элемент, в отличие от биполярного, управляется не током, а напряжением на затворе. Это позволяет малому току затвора управлять большими токами нагрузки – до десятков ампер.

Подключается элемент через токоограничивающее сопротивление. Кроме того, он чувствителен к помехам, поэтому выход контроллера следует соединить с массой резистором в 10 кОм.

С помощью плат расширения


Подключение Arduino с помощью плат расширения

Кроме реле и транзисторов используются готовые блоки и платы расширения.

Это может быть Wi-Fi или Bluetooth, драйвер управления электродвигателем, например, модуль L298N или эквалайзер. Они предназначены для управления нагрузками разной мощности и напряжения. Такие устройства бывают одноканальными – могут управлять только монохромной лентой, и многоканальными – предназначены для устройств RGB и RGBW, а также лент со светодиодами WS 2812.

Пример программы


Arduino и светодиодная лента

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

Вот некоторые варианты использования подобных систем:

  • Управление освещением. С помощью датчика освещения включается свет в комнате как сразу, так и с постепенным нарастанием яркости по мере захода солнца. Включение может также производиться через wi-fi, с интеграцией в систему «умный дом» или соединением по телефону.
  • Включение света на лестнице или в длинном коридоре. Очень красиво смотрится диодная подсветка каждой ступеньки в отдельность. При подключении к плате датчика движения, его срабатывание вызовет последовательное, с задержкой времени включение подсветки ступеней или коридора, а отключение этого элемента приведет к обратному процессу.
  • Цветомузыка. Подав на аналоговые входы звуковой сигнал через фильтры, на выходе получится цветомузыкальная установка.
  • Моддинг компьютера. С помощью соответствующих датчиков и программ цвет светодиодов может зависеть от температуры или загрузки процессора или оперативной памяти. Работает такое устройство по протоколу dmx 512.
  • Управление скоростью бегущих огней при помощи энкодера. Подобные установки собираются на микросхемах WS 2811, WS 2812 и WS 2812B.

Видеоинструкция