Виды адресной светодиодной ленты
Статья о видах адресных лент, различных чипах, разнице между ними. В этой статье мы рассмотрим такие вопросы как:
- Разница между обычной и адресной лентой.
- Разница между чипами WS2812b и WS2811
- Разница между чипами WS2812, WS2813, WS2815 и WS2818
- Принцип работы адресной светодиодной ленты,
- Как подключить адресную светодиодную ленту к Arduino?
1. Немного об обычной RGB ленте.
RGB (Red, Green, Blue) лента — это разноцветная светодиодная лента с четырьмя контактами: R, G, B и +. Для управления этой лентой используется контроллер, который «решает» какое напряжение подать на какой канал в зависимости от цвета, который вы выбрали. Если он, например, подаст питание поровну на «синий» и «зеленый» канал, мы должны увидеть желтый. В основном RGB ленты делают на основе диодов 2835 и 5050. Однако SMD 2835 — лишь симуляция RGB, в которой красный, синий и зеленый диод чередуются и якобы получается RGB. Внешне это очень напоминает обычную гирлянду (см картинку ниже).
Лента RGB 2835
5050 при включении «белого» режима.
Лента SMD 5050 более современна. Внутри каждого диода совмещены красный, зеленый и синий кристаллы. Контроллер подает большее или меньшее напряжение на соответствующий канал в зависимости от команды, и в итоге диоды могут светить не только красным-синим-зеленым, но и их смешением: розовым, оранжевым, фиолетовым и т.д.
2. Разница между обычной и адресной лентой.
Если лента 5050 такая современная, зачем нужны адресные ленты? Самая главная проблема обычной ленты в том, что у нее все диоды одинаково реагируют на сигналы контроллера. Выбрали оранжевый — контроллер подал питание на соответствующие каналы и вся лента начала светить оранжевым. Выбрали красный — вся лента загорелась красным и т.д. Никаких эффектов «бегущей волны», эквалайзера, разных бегающих друг за другом цветов не получится.
Адресная лента решает эту проблему. Она считается «умной», т.к. управляется не просто через изменение напряжения на контактах. В ней для каждого светодиода установлен свой микроконтроллер (например, чип ws2812b). Это позволяет при помощи контроллера или платы ардуино передать каждому диоду отдельную команду регулируя его цвет и яркость. В конечном итоге можно создать очень интересные эффекты, целые световые шоу и даже собственный экран!
3. Чем отличаются WS2811 и WS2812
Какая разница между адресной лентой WS2811 от WS2812b и что из них лучше? Попробуем разобраться. Визуально WS2811 от WS2812 можно отличить по размерам самого чипа (см фото ниже). У ленты WS2811 этот чип большой, размером почти с сам диод, ставится через каждые три светодиода. Чип ленты WS2812b маленький, едва различимый и выглядит он как черная точка на диоде. Устанавливается чип ws2812b в каждый светодиод (то есть их количество в три раза больше, чем на ленте WS2811, но мы к этому еще вернемся).
Помимо визуальных различий адресная лента WS2812b отличается от WS2811 и по характеристикам:
Напряжение: Как указанно выше, лента WS2812 имеет рабочее напряжение 5 вольт, а WS2811 — 12 вольт. В плане подключения 12в удобнее и проще (проще найти блоки питания), но зато рабочее напряжение 5v идеально подходит для работы с Arduino.
Кратность управления: У ленты WS2811 один пиксель равен трем диодам, это значит, что управление происходит по три диода сразу. Это смазывает анимацию, делает ее более «дерганной». Однако, если наблюдатель находится на некотором расстоянии (например не ближе чем несколько метров), то разницы практически не видно. В отличие от WS2811 WS2812 управляет каждым диодом по отдельности, что более приятно смотрится особенно вблизи.
Кратность резки: Лента WS2812b режется кратно одному диоду, а WS2811 — кратно трем. Это напрямую связанно с кратностью управления.
Скорость передачи сигнала: Чип WS2812b в несколько раз быстрее реагирует на команды, что делает анимацию более плавной. Это особенно важно, когда лента интерактивна (например, используется для цветомузыки, или для сенсорного стола как у канала Лихой топор).
Цена: Самая дорогая часть адресной ленты — это ее микроконтроллер (чип). В случае с WS2811 для работы 1 метра ленты с 60 диодами на метр требуется 20 чипов (по 1 на каждые 3 диода), а в случае с WS2812b — 60 чипов (1 диод = 1 чип). Это приводит к тому, что лента WS2812b более дорогая в пересчете на метр, чем WS2811. Примечательно, что если считать цену за 1 чип, то получится, что WS2812b даже дешевле своего предшественника.
Ws2811 (слева) и ws2812b (справа).
Благодаря дешевизне ленту WS2811 на 12v до сих пор часто ставят в клубы, на фасады зданий и сцены для масштабных световых шоу. Тем не менее, если вам важна большая четкость анимации, или расстояние от ленты до наблюдателя небольшое, то лучше использовать более совершенную модель WS2812В.
4. Разница между WS2812b, WS2813, WS2815 и WS2818
Несмотря на то, что WS2812b — одна из самых популярных адресных лент на рынке, у нее есть два существенных недостатка: низкое напряжение и один канал данных (один канал данных и у ленты WS2811). Напряжение 5V очень неудобно, когда нужно подключить больше 5 — 10 метров. Это связанно с падением и без того низкого напряжения. Один канал данных DAT приводит к тому, что при повреждении этого канала на любом отрезке ленты вся дальнейшая линия отключится. То есть если, например, ударить по светодиоду WS2812b молотком (хотя зачем это делать?), то вся лента после этого диода отключится.
Чипы WS2813, WS2815 и WS2818 предлагают решение одной или обеих этих проблем.
В отличие от WS2812b у WS2813 два канала данных: основной и дополнительный и в каждом диоде они дублируются. То есть, если у вас повредился один диод, то следующие будут продолжать работать. Это делает адресную ленту WS2813 более надежной, что очень важно, если вам в случае проблем будет не легко достать и починить / заменить ленту. Например, когда лента вмонтирована в натяжной потолок. Также WS2813 может похвастаться еще более быстрой передачей данных. Однако у ленты WS2813 все то же «неудобное» в некоторых случаях напряжение 5V.
Адресная лента WS2815 — одна из самых совершенных из представленных на рынке, ее рабочее напряжение 12V и есть дополнительный канал данных. Таким образом она решает обе основные проблемы WS2812b. Ее удобно монтировать и она почти никогда не ломается.
Однако из-за высокой стоимости WS2815 используется, в основном, для коммерческих проектов, где важна стабильность работы и где требуется подключать в линию много ленты.
Чип WS2818 также работает от напряжения 12V и обладает дополнительным каналом данных. Кроме того адресная лента WS2818 стоит дешевле, чем WS2813 или WS2815. Ее главным изъяном является то, что она управляется кратно трем диодам (как WS2811). Это сужает потенциальный круг использования. Обычно лента WS2818 применяется на улице или там, где наблюдатель не будет находиться вплотную к ленте (потому, что анимация выглядит более «смазанной»). Отсюда и меньшая стоимость: меньше чипов — дешевле лента.
5. Принцип работы адресной светодиодной ленты
Адресная лента поделена на сегменты по одному пикселю (чипу), каждый из которых имеет повышающий помехоустойчивость конденсатор. Все светодиоды питаются от сети параллельно, то есть на каждом отрезке свои +5В/+12V, в то время как передача данных осуществляется последовательно, от одного участка другому. Именно поэтому, как уже говорилось выше, если у адресной ленты ws2811 и ws2812b выходит из строя один светодиод, то все последующие перестают работать.
Еще одной важной особенностью адресной ленты является то, что проверить ее работоспособность на месте без контроллера невозможно. Без команды чип не включит диод даже если вы подадите питание. Варианта тут два: либо заказывать ленту сразу с контроллером, либо прийти проверять ее со своим. Тем не менее, брак у этой ленты встречается крайне редко (меньше, чем на 1 из 1000 метров), и в случае брака наш магазин меняет ленту без проблем (о таких случаях можно найти отзывы как у нас на сайте, так и на других площадках). Обычно адресная лента управляется при помощи готовых контроллеров, на которых записана программа либо с использованием плат Ардуино, Wemos и т.д.
Как видно на фото выше, адресная лента имеет направление, то есть начало (DIN, +5V/+12V, GND) и конец (DO, +5V/+12V, GND). Направление указано стрелками, чтобы проще было ориентироваться. Подключать необходимо начало ленты (с той стороны откуда идет стрелочка), то есть DIN, иначе лента работать не будет. Коннектор со стороны DO (Data output) используется, чтобы подключить следующий отрезок ленты. Дополнительный канал данных у ленты WS2813, WS2815, WS2818 можно не подключать к контроллеру, на работоспособность это не повлияет (т.к. начиная с первого диода данные будут дублироваться на оба канала данных).
6. Подключение адресной светодиодной ленты к Arduino.
Arduino – это плата с микроконтроллером, которая позволяет управлять светодиодами в зависимости от загруженной в нее программы. Обычно для работы с Ардуино используется лента напряжением 5V, то есть WS2812b или WS2813.
- +5V и GND параллельно подключаются к блоку питания и к Arduino, а контакт DIN — через резистор к Arduino. Сопротивление резистора должно быть 100-500 ом.
- Провода для подключения ленты лучше брать сечением 1.5 квадрата и выше. Это связанно с падением напряжения, которое весьма ощутимо при работе с низковольтным оборудованием. Особенно это актуально, если у вас расстояние от блока до ленты и контроллера больше метра. Чем длиннее расстояние — тем толще нужны провода.
- К контроллеру / плате arduino обязательно нужно подключить не только контакт данных DIN, но и GND. В противном случае лента работать не будет.
- Если у вас в линии более пяти метров ленты, рекомендуется подвести к ней питание напрямую от блока питания. Это связанно с тем же падением напряжения. Благо в начале ленты всегда выведены два дополнительных контакта питания. (см. белый и синий провод на фото выше)
Наиболее популярные библиотеки для работы с адресными лентами — FastLED и Adafruit NeoPixel, внутри которых уже есть готовые скетчи, а также на их основе можно самостоятельно создать световые эффекты. Для успешного творчества важно запомнить два параметра: NUM_LEDS — количество светодиодов в ленте и PIN – номер порта для передачи данных (к которому мы подключили контакт DIN). В Adafruit это выглядит так:
6. Сферы применения.
Адресные светодиодные ленты стоят дороже обычных LED-лент, поэтому чаще всего их устанавливают там, где обычная подсветка не справляется.
• Яркие полноцветные модули для светодиодных табло и видеовывесок.
• Светильники, управляемые по принципу soft lights, что в дословном переводе значит «мягкий свет». Это плавный переход от цвета к цвету или между режимами яркости.
• Декоративная подсветка. Яркие, насыщенные адресные светодиодные ленты создают не только необходимую иллюминацию, но и служат в качестве динамичной подсветки, например, в такт музыке или просто в определенном заданном режиме.
• Привлекающая внимание реклама или светодиодные инсталляции на концертах и выставках.
Это лишь основные сферы применения. Адресная светодиодная лента широко распространена и на бытовом уровне: в качестве подсветки автомобилей, аквариумов, новогоднего украшения и дизайна помещений. Если вы планируете реализовать проект с адресной лентой, то в нашем магазине вы можете купить адресную ленту ws2812b, ws2813, ws2815 и других видов !
Arduino и адресная светодиодная лента
Адресная светодиодная лента, в отличие от обычной RGB, позволяет управлять цветом и яркостью каждого своего светодиода. Благодаря этому на ней можно отображать различные интересные эффекты, как статические, так и динамические. Сама по себе лента ничего не может, поэтому генерацией эффектов занимается микроконтроллер (или плата на его основе, например Arduino). Более подробно про виды адресных лент можно прочитать в моей статье.
В наборе GyverKIT есть 1 метр адресной светодиодной ленты WS2812b. При желании ленту можно докупить в том же магазине, где продаётся набор – Giant4.
Подключение
- GND ленты соединяется с GND микроконтроллера, так как все сигналы ходят относительно “земли”
- У любого отрезка ленты есть вход, а есть выход: у входа средний пин называется DI, а у выхода – DO. К Arduino подключается именно вход ленты, то есть пин DI
- DI подключается на любой цифровой пин. Если лента питается отдельно от Arduino – DI нужно подключать через резистор 100-500 Ом, чтобы избежать питания ленты через пин, что приведёт к выходу из строя пина Arduino или первого светодиода в ленте. Лучше ставить резистор в любом случае, чтобы исключить такую возможность
- 5V ленты подключается к питанию. Питание может быть общим с Arduino
- Лента потребляет большой ток, поэтому питать её от Arduino, подключенной к USB – нельзя. В наборе GyverKIT есть сетевой адаптер на 5V, ленту нужно питать от него
В рассмотренных выше схемах Arduino питается от USB. Для работы от адаптера можно подключить питание с него на пин 5V платы:
При наличии на ленте штекера можно подключать управление и питание следующим образом:
Примечание:
- Ленту можно питать напрямую от Arduino (при подключении к USB), если ток потребления не будет превышать 500 мА. В библиотеке FastLED можно настроить программное ограничение тока: FastLED.setMaxPowerInVoltsAndMilliamps(5, 500); – 5V 500mA
- Ленту можно подключать без резистора, если исключена возможность наличия сигнала на ленту без подключенного питания, т.е. когда лента питается от одного источника с микроконтроллером
При работе с Wemos есть особенность: у него логический уровень 3.3V, чего не всегда хватает для передачи сигнала на ленту. При возникновении “артефактов” в эффектах можно подключить питание по следующей схеме: питать Wemos через диод (есть в наборе GyverKIT):
Библиотеки
Самой функциональной и известной библиотекой является FastLED, можно установить через диспетчер библиотек по названию FastLED. В библиотеке ОЧЕНЬ много возможностей, см. официальную вики-документацию, а также полный список модулей, классов и функций.
Примечание для esp8266: на версии ядра 3.0.x первый светодиод на ленте самопроизвольно мигает, ставьте ядро версии 2.7.4
Как работать с FastLED
Коротко рассмотрим как работать с библиотекой FastLED и самые основные инструменты.
Логика работы с адресной лентой сводится к следующему: лента представляется в виде одномерного массива, каждый элемент – светодиод, точнее его цвет. Цвет светодиода кодируется тремя байтами, то есть 256 значений на каждый канал: красный, зелёный, синий. В программе можно производить различные манипуляции с этим массивом, то есть задавать цвета светодиодам при помощи различных инструментов библиотеки. Как только построение “кадра” закончено – массив можно отправить на ленту и светодиоды включатся соответственно заданным цветам.
Для начала обозначим константами длину ленты и пин, к которому она подключена, просто чтобы проще было редактировать программу в дальнейшем:
#define LED_PIN 5 // пин #define LED_NUM 50 // количество светодиодов
#include "FastLED.h"
Создаём массив цветов, он имеет тип данных CRGB . Размер – сколько светодиодов в ленте, то есть наша константа. Пусть массив будет глобальным, чтобы доступ к нему был у всей программы:
CRGB leds[LED_NUM];
В блоке setup нам нужно передать в библиотеку информацию о подключенной ленте, а также подключить созданный выше массив. Чтобы программа знала, откуда брать информацию о цветах. По порядку указывается тип ленты, пин, порядок цветов. В круглых скобках – имя нашего массива, а также его размер – длину ленты:
void setup() < FastLED.addLeds< WS2812, LED_PIN, GRB>(leds, LED_NUM); >
Отлично! Всё настроено и готово к работе.
Общие функции
Помимо задания цветов в массиве, существуют следующие управляющие функции:
- FastLED.show() – выводит массив на ленту, т.е. обновляет её текущими цветами
- FastLED.clear() – очищает ленту, буквально обнуляет все цвета в массиве, задаёт “чёрный” цвет. Для применения нужно вызвать show()
- FastLED.setBrightness(0-255) – устанавливает яркость всей ленты. Не меняет значения в массиве светодиодов, просто “приглушает” итоговую отображаемую яркость. Для применения нужно вызвать show()
- FastLED.setMaxPowerInVoltsAndMilliamps(вольты, миллиамперы) – включает автоматическое ограничение яркости по настроенному току и напряжению. Полезно для длинных лент и/или слабых блоков питания
- FastLED.showColor(CRGB цвет) – залить всю ленту указанным цветом
Тип данных CRGB
Библиотека организована так, что переменной типа CRGB можно задать значение несколькими способами. Рассмотрим задание цвета первому светодиоду в нашей ленте, то есть элемент массива под номером ноль: leds[0]
leds[0] = 0xFF44DD; // цвет в HEX формате leds[0].setRGB(255, 68, 221); // RGB, 0-255 leds[0].setHSV(224, 187, 255); // HSV, 0-255 leds[0].setHue(224); // Hue из HSV, S и V будут 255 // готовый цвет. весь список тут https://github.com/FastLED/FastLED/wiki/Pixel-reference#colors leds[0] = CRGB::Red;
Подробнее про цветовые модели RGB и HSV можно почитать вот здесь.
Примеры
Итак, с базовыми понятиями разобрались, переходим к практике. Для начала зальём всю ленту статичной радугой. Для этого покрасим светодиоды в цикле, задав цвет от 0 до 255 от первого до последнего светодиода в ленте. Конструкция i * 255 / LED_NUM позволяет получить значения от 0 до 255 при изменении i от 0 до LED_NUM:
#define LED_PIN 5 #define LED_NUM 50 #include "FastLED.h" CRGB leds[LED_NUM]; void setup() < FastLED.addLeds(leds, LED_NUM); FastLED.setBrightness(50); for (int i = 0; i < LED_NUM; i++) < leds[i].setHue(i * 255 / LED_NUM); >FastLED.show(); > void loop()<>
Можно сделать подвижную радугу, это будет уже полноценная анимация. Для этого ленту нужно постоянно обновлять новыми цветами, например 30 раз в секунду. Чтобы плавно менять цвет – добавим к нему счётчик, который будет меняться от 0 до 255 и так по кругу.
#define LED_PIN 5 #define LED_NUM 50 #include "FastLED.h" CRGB leds[LED_NUM]; void setup() < FastLED.addLeds(leds, LED_NUM); FastLED.setBrightness(50); > byte counter; void loop() < for (int i = 0; i < LED_NUM; i++) < leds[i].setHue(counter + i * 255 / LED_NUM); >counter++; // counter меняется от 0 до 255 (тип данных byte) FastLED.show(); delay(30); // скорость движения радуги >
Можно сделать один бегающий светодиод: каждый раз очищать ленту и красить светодиод под номером, который задаётся счётчиком. Изменение счётчика закольцевать от 0 до количества светодиодов:
#define LED_PIN 5 #define LED_NUM 50 #include "FastLED.h" CRGB leds[LED_NUM]; void setup() < FastLED.addLeds(leds, LED_NUM); FastLED.setBrightness(50); > byte counter; void loop() < FastLED.clear(); leds[counter] = CRGB::Red; if (++counter >= LED_NUM) counter = 0; FastLED.show(); delay(30); >
И таких эффектов можно придумать очень много! Займёмся этим уже в блоке проектов
Домашнее задание
- Заставить светодиод бегать “туда и обратно”
- Сделать плавное изменение яркости (от 0 до 255) всей ленты с эффектом радуги
Связанные уроки
- Гайд по ленте
- Вики FastLED
- Документация FastLED
Как работает адресная светодиодная лента?
Наверное этот вопрос «как работает» очень многим покажется глупым. Ответ почти очевиден: адресная светодиодная лента состоит из множества последовательно соединенных «умных светодиодов». Это можно увидеть просто рассматривая устройство ленты. Видны отдельные микросхемы, припаянные к гибкому шлейфу, видны соединения: микросхемы соединены последовательно всего тремя проводами, при этом два из них это питание и земля. Только один провод передает данные о цвете пикселей. Как же это? Что такое «умный светодиод»?
Дальше я расскажу о протоколе передачи данных, используемом в светодиодной ленте на базе WS2812B, и, более того, я почти создам свою «микросхему светодиодной ленты» в микросхеме ПЛИС.
Итак, в ленте используется последовательная передача через один единственный сигнал данных.
Бит ноль передается, как короткий положительный импульс и пауза, которая примерно в два раза шире импульса. Бит единица передается как широкий положительный импульс и короткая пауза:
При отсутствии передачи более 50 микросекунд лента переходит в исходное состояние, готова принимать пиксели начиная с первого.
Каждые 24 бита в последовательности — это 3 байта для трех цветов RGB. Причем на самом деле последовательность будет G-R-B. Старший бит G7 идет первым.
Последовательность из первых 24х бит представляет из себя один пиксель, который получит самый первый светодиод в ленте. Пока первый светодиод не насытится он не передает данные дальше к следующему светодиоду. После того, как первый светодиод получит свою порцию из 24х бит RGB он открывает передачу следующему. Примитивно можно последовательность светодиодов представить, как каскад из кувшинов, последовательно наполняемых водой:
Заполнится первый, потом второй, потом третий и так все по очереди.
Таким образом, я считаю, что с протоколом передачи разобрались.
Можно ли попробовать самому спроектировать такой «умный светодиод»? Практического смысла в этом конечно мало, но для самообразования и расширения кругозора — задача интересная. Попробуем описать логику чипа на языке проектирования аппраратуры Verilog HDL. Конечно, это будет не настоящий дизайн микросхемы, будут ограничения. Одно из самых важных ограничений — мне для моей микросхемы будет нужен внешний тактовый генератор. В настоящем умном светодиоде такой генератор тоже есть, но он встроен уже в чип.
Модуль на Verilog начнем вот так:
module WS2812B( input wire clk, input wire in, output wire out, output reg r, output reg g, output reg b );
Здесь думаю все понятно: тактовая частота clk, входной и выходной сигналы «умного светодиода» in и out, ну и, конечно, выходные сигналы r, g, b через которые я буду управлять реальными внешними светодиодами красным, зеленым и синим.
Входной сигнал я буду захватывать в двухбитный сдвиговый регистр и по текущему состоянию в этих захваченных битах смогу определить начало положительного фронта сигнала in:
reg [1:0]r_in = 0; always @( posedge clk ) r_in ; wire in_pos_edge; assign in_pos_edge = (r_in==2'b01);
Кроме этого, важно определить состояние сброса ленты, когда управляющий контроллер выдерживает паузу перед началом новой передачи:
localparam reset_level = 3000; reg [15:0]reset_counter = 0; always @( posedge clk ) if( r_in[0] ) reset_counter
Дальше, от положительного фронта in_pos_edge нужно выдержать некоторую паузу, чтобы получить момент фиксации нового бита:
localparam fix_level = 50; reg [7:0]bit_length_cnt; always @( posedge clk ) if( in_pos_edge ) bit_length_cnt
Количество уже принятых бит в чипе считаем так:
reg pass = 0; reg [5:0]bits_captured = 0; always @( posedge clk ) if( reset ) bits_captured
Здесь вводится еще важный сигнал pass, который как раз и определяет перенаправление входного потока на выход. После принятия 24х бит пикселя сигнал pass устанавливается в единицу:
always @( posedge clk ) if( reset ) pass
На выход out мультиплексируются входные данные, когда сигнал pass_final в единице.
Ну и, конечно, нужен сдвиговый регистр, где накапливаются принятые 24 бита пикселя:
reg [23:0]shift_rgb; always @( posedge clk ) if( bit_fix ) shift_rgb ; reg [23:0]fix_rgb; always @( posedge clk ) if( bits_captured==23 && bit_fix ) fix_rgb ;
По приему всех 24х бит они переписываются в итоговый так же 24х битный регистр.
Теперь остается дело за малым. Нужно реализовать ШИМ (Широтно Импульсную Модуляцию) сигнала для передачи яркости реальным внешним светодиодам согласно принятым байтам RGB:
wire [7:0]wgreen; assign wgreen = < fix_rgb[0 ], fix_rgb[1 ], fix_rgb[2 ], fix_rgb[3 ], fix_rgb[4 ], fix_rgb[5 ], fix_rgb[6 ], fix_rgb[7 ] >; wire [7:0]wred; assign wred = < fix_rgb[8 ], fix_rgb[9 ], fix_rgb[10], fix_rgb[11], fix_rgb[12], fix_rgb[13], fix_rgb[14], fix_rgb[15] >; wire [7:0]wblue; assign wblue = < fix_rgb[16], fix_rgb[17], fix_rgb[18], fix_rgb[19], fix_rgb[20], fix_rgb[21], fix_rgb[22], fix_rgb[23] >; reg [7:0]pwm_cnt; always @( posedge clk ) begin pwm_cnt
Вот кажется и все.
Остается маленькая деталь — как это все испытать?
Я взял несколько простых плат с ПЛИС MAX II (это платы серии Марсоход) и прошил их все проектом с вот этим Verilog кодом. На платах уже было 8 светодиодов, но они были все желтые. На каждой из плат я заменил 3 светодиода на R, G, B. Платы соединил последовательно и более того подключил их к настоящей светодиодной ленте. Таким образом, я удлинил настоящую ленту своими самодельными светодиодами.
Получилось вот такое соединение:
В реальности это выглядит вот так:
Теперь, подавая на ленту некоторое изображение я вижу, что мои «умные светодиоды» ведут себе точно так же, как и настоящие из ленты:
Получается, что реализованная мною в ПЛИС логика вполне работоспособна! Я смог в первом приближении сделать нечто похожее на реальный чип «умного светодиода».
Вообще, мне нравятся светодиодные ленты. На их основе каждый может изобрести что-то свое: интеллектуальное освещение, экраны, амбилайт эффекты. Однажды я даже реализовал цветомузыку на светодионой ленте под управлением FPGA. Но это уже другая история.
- fpga
- светодиодная лента
- реверс-инжиниринг
- verilog
- FPGA
- Программирование микроконтроллеров
- Схемотехника
Гайд по адресной светодиодной ленте
Данный гайд посвящен адресной светодиодной ленте применительно к использованию с микроконтроллерами (Arduino, esp8266). Рассмотрены базовые понятия, подключение, частые ошибки и места для покупки.
Набор GyverKIT Лента есть в нашем Arduino наборе GyverKIT (1 метр), а в документации к набору есть краткий гайд по работе с адресной лентой на Arduino при помощи библиотеки FastLED × Закрыть это предупреждение.
КУПИТЬ АДРЕСНУЮ ЛЕНТУ
Лента WS2812
Гибкий профиль
Гирлянда
Полоски
Кольца
Матрицы
- Black PCB / White PCB — цвет подложки ленты, чёрная / белая
- 1m/5m — длина ленты в метрах
- 30/60/74/96/100/144 — количество светодиодов на 1 метр ленты
- IPXX – влагозащита
- IP30 лента без влагозащиты
- IP65 лента покрыта силиконом
- IP67 лента полностью в силиконовом коробе
ТИПЫ АДРЕСНЫХ ЛЕНТ
Сейчас появилось несколько разновидностей адресных светодиодных лент, они основаны на разных светодиодах. Рассмотрим линейку китайских чипов с названием WS28XX.
Чип Напряжение Светодиодов на чип Кол-во дата-входов Купить в РФ WS2811 12-24V 3 1 30 led, 60 led WS2812 3.5-5.3V 1 1 30 led, 60 led, 144 led WS2813 3.5-5.3V 1 2 (дублирующий) 30 led, 60 led WS2815 9-13.5V 1 2 (дублирующий) 30 led, 60 led WS2818 12/24V 3 2 (дублирующий) 60 led У двухпиновых лент из линейки WS28XX достаточно подключить к контроллеру только пин DI, пин BI подключать не нужно. При соединении кусков ленты нужно соединять все пины!
WS2811 (WS2818) и WS2812
Сейчас популярны два вида ленты: на чипах WS2812b и WS2811 (и новая WS2818). В чём их разница? Чип WS2812 размещён внутри светодиода, таким образом один чип управляет цветом одного диода, а питание ленты – 5 Вольт. Чип WS2811 и WS2818 размещён отдельно и от него питаются сразу 3 светодиода, таком образом можно управлять цветом только сегментами по 3 диода в каждом. А вот напряжение питания у таких лент составляет 12-24 Вольта!
ЧТО ТАКОЕ АДРЕСНАЯ ЛЕНТА
Итак, данный гайд посвящен адресной светодиодной ленте, я решил сделать его познавательным и подробным, поэтому дойдя до пункта “типичные ошибки и неисправности” вы сможете диагностировать и успешно излечить косорукость сборки даже не читая вышеупомянутого пункта. Что такое адресная лента? Рассмотрим эволюцию светодиодных лент.
Обычная светодиодная лента представляет собой ленту с напаянными светодиодами и резисторами, на питание имеет два провода: плюс и минус. Напряжение бывает разное: 5 и 12 вольт постоянки и 220 переменки. Да, в розетку. Для 5 и 12 вольтовых лент нужно использовать блоки питания. Светит такая лента одним цветом, которой зависит от светодиодов.
RGB светодиодная лента. На этой ленте стоят ргб (читай эргэбэ – Рэд Грин Блю) светодиоды. Такой светодиод имеет уже 4 выхода, один общий +12 (анод), и три минуса (катода) на каждый цвет, т.е. внутри одного светодиода находится три светодиода разных цветов. Соответственно такие же выходы имеет и лента: 12, G, R, B. Подавая питание на общий 12 и любой из цветов, мы включаем этот цвет. Подадим на все три – получим белый, зелёный и красный дадут жёлтый, и так далее. Для таких лент существуют контроллеры с пультами, типичный контроллер представляет собой три полевых транзистора на каждый цвет и микроконтроллер, который управляет транзисторами, таким образом давая возможность включить любой цвет. И, как вы уже поняли, да, управлять такой лентой с ардуино очень просто. Берем три полевика, и ШИМим их analogWrit’ом, изи бризи.
Адресная светодиодная лента, вершина эволюции лент. Представляет собой ленту из адресных диодов, один такой светодиод состоит из RGB светодиода и контроллера. Да, внутри светодиода уже находится контроллер с тремя транзисторными выходами! Внутри каждого! Ну дают китайцы блэт! Благодаря такой начинке у нас есть возможность управлять цветом (то бишь яркостью r g b) любого светодиода в ленте и создавать потрясающие эффекты. Адресная лента может иметь 3-4 контакта для подключения, два из них всегда питание (5V и GND например), и остальные (один или два) – логические, для управления.
Лента “умная” и управляется по специальному цифровому протоколу. Это означает, что если просто воткнуть в ленту питание не произойдет ровным счётом ничего, то есть проверить ленту без управляющего контроллера нельзя. Если вы потрогаете цифровой вход ленты, то скорее всего несколько светодиодов загорятся случайными цветами, потому что вы вносите случайные помехи, которые воспринимаются контроллерами диодов как команды. Для управления лентой используются готовые контроллеры, но гораздо интереснее рулить лентой вручную, используя, например, платформу ардуино, для чего ленту нужно правильно подключить. И вот тут есть несколько критических моментов:
ОСОБЕННОСТИ ПОДКЛЮЧЕНИЯ
1) Команды в ленте передаются от диода к диоду, паровозиком. У ленты есть начало и конец, направление движение команд на некоторых моделях указано стрелочками. Для примера рассмотрим ws2812b, у нее три контакта. Два на питание, а вот третий в начале ленты называется DI (digital input), а в конце – DO (digital output). Лента принимает команды в контакт DI! Контакт DO нужен для подключения дополнительных кусков ленты или соединения матриц.
2) Если в схеме возможна ситуация, при которой на ленту не будет подаваться питание 5V, но будет отправляться сигнал с микроконтроллера – лента начнёт питаться от дата-пина. В этом случае может сгореть как первый светодиод в ленте, так и пин контроллера. Не испытывайте удачу, поставьте резистор с сопротивлением 200-500 Ом. Точность резистора? Любая. Мощность резистора? Любая. Да, даже 1/4.
2.1) Если между лентой и контроллером (Arduino) большое расстояние, т.е. длинные провода (длиннее 50 см), то сигнальный провод и землю нужно скрутить в косичку для защиты от наводок, так как протокол связи у ленты достаточно скоростной (800 кГц), на него сильно влияют внешние наводки, а экранирование земляной скруткой поможет этого избежать. Без этого может наблюдаться такая картина: лента не работает до тех пор, пока не коснёшься рукой сигнального провода.
2.2) При подключении ленты к микроконтроллерам с 3.3V логикой (esp8266, ESP32, STM32) появляется проблема: лента питается от 5V, а сигнал получает 3.3V. В даташите указана максимальная разница между питанием и управляющим сигналом, если её превысить – лента не будет работать или будет работать нестабильно, с артефактами. Для исправления ситуации можно:
3) Самый важный пункт, который почему то все игнорируют: цифровой сигнал ходит по двум проводам, поэтому для его передачи одного провода от ардуины мало. Какой второй? Земля GND. Контакт ленты GND и пин GND Ардуино (любой из имеющихся) должны быть обязательно соединены. Смотрим два примера.
4) Питание. Один цвет одного светодиода при максимальной яркости кушает 12 миллиампер. В одном светодиоде три цвета, итого ~36 мА на диод. Пусть у вас есть метр ленты с плотностью 60 диод/метр, тогда 60*36 = 2.1 Ампера при максимальной яркости белого цвета, соответственно нужно брать БП, который с этим справится. Также нужно подумать, в каком режиме будет работать лента. Если это режимы типа «радуга», то мощность можно принять как половину от максимальной. Подробнее о блоках питания, а также о связанных с ними глюках читай здесь.
5) Продолжая тему питания, хочу отметить важность качества пайки силовых точек (подключение провода к ленте, подключение этого же провода к БП), а также толщину проводов. Как показывает мой опыт, брать нужно провод сечением минимум 1.5 квадрата, если нужна полная яркость. Пример: на проводе 0.75 кв.мм. на длине 1.5 метра при токе 2 Ампера падает 0.8 вольта, что критично для 5 вольт питания. Первый признак просадки напряжения: заданный программно белый цвет светит не белым, а отдаёт в жёлтый/красный. Чем краснее, тем сильнее просело напряжение!
6) Мигающая лента создаёт помехи на линию питания, а если лента и контроллер питаются от одного источника – помехи идут на микроконтроллер и могут стать причиной нестабильной работы, глюков и даже перезагрузки (если БП слабый). Для сглаживания таких помех рекомендуется ставить электролитический конденсатор 6.3V ёмкостью 470 мкФ (ставить более ёмкий нет смысла) по питанию микроконтроллера, а также более “жирный” конденсатор (1000 или 2200 мкФ) на питание ленты. Ставить их необязательно, но очень желательно. Если вы заметите зависания и глюки в работе системы (Ардуино + лента + другое железо), то причиной в 50% является как раз питание.
7) Слой меди на ленте не очень толстый (особенно на модели ECO), поэтому от точки подключения питания вдоль ленты напряжение начинает падать: чем больше яркость, тем больше просадка. Если нужно сделать большой и яркий кусок ленты, то питание нужно дублировать медным проводом 1.5 (или больше, надо экспериментировать) квадрата через каждый метр.
КАК ДЕЛАТЬ НЕЛЬЗЯ
Как мы уже поняли, для питания ленты нужен источник 5 Вольт с достаточным запасом по току, а именно: один цвет одного качественного светодиода на максимальной яркости потребляет 0.012 А (12 мА), соответственно весь светодиод – 0.036 А (36 мА) на максимальной яркости. У китайцев есть “китайские” ленты, которые потребляют меньше и светят тускло. Я всегда закупаюсь в магазине BTF lighting (ссылки в начале статьи), у них ленты качественные. Я понимаю, что порой очень хочется запитать ленту напрямую от Ардуино через USB, либо используя бортовой стабилизатор платы. Так делать нельзя. В первом случае есть риск выгорания защитного диода на плате Arduino (в худшем случае – выгорания USB порта), во втором – синий дым пойдёт из стабилизатора на плате. Если всё-таки очень хочется, есть два варианта:
- Не подключать больше количества светодиодов, при котором ток потребления будет выше 500 мА, а именно 500/32 ~ 16 штук
- Писать код на основе библиотеки FastLED, где можно ограничить ток специальной функцией. НО! В случае отключения пина Din от источника сигнала есть риск случайного включения ленты, и никакие программные ограничения не спасут от выгорания железа.
Вы наверное спросите: а как тогда прошивать проект с лентой? Ведь судя по первой картинке так подключать нельзя! Оч просто: если прошивка не включает ленту сразу после запуска – прошивайте. Если включает и есть риск перегрузки по току – подключаем внешнее питание на 5V и GND.
ПОДКЛЮЧЕНИЕ 12V ЛЕНТ
Если вы вдруг купили ленту на чипах WS2811/15/18, подключить её можно вот по этим двум схемам. Но следует помнить, что в прошивке нужно указать втрое меньшее количество светодиодов, так как каждый чип на этой ленте управляет тремя диодами, задаёт им один и тот же цвет!
ОТ ЧЕГО ПИТАТЬ ЛЕНТУ
Сетевые источники питания:
- Адаптер 12V 2A – купить в РФ
- Адаптер 12V 6A – купить в РФ
- Адаптер 5V 3A – купить в РФ
- Блок питания 5V 12A – купить в РФ
- Блок питания 5V 20A – купить в РФ
- Блок питания 5V 40A – купить в РФ
- Мощные блоки питания aliexpress, aliexpress, искать
- Блоки питания aliexpress, aliexpress, искать
Самый простой и понятный вариант – мощный блок питания на 5 Вольт. Если рядом есть источник постоянки 12 Вольт – можно взять понижайку и настроить её на 5 Вольт. Но часто возникает желание сделать “беспроводной” девайс с бортовым источником питания. Как быть в этом случае? Согласно даташиту на WS2812b светодиод будет работать от напряжения 3.5-5.5 Вольт, собственно как и сама Arduino. Помним, что при питании ленты от напряжения ниже 5 Вольт будет уменьшаться максимальная яркость. Отсюда имеем следующие варианты:
- Powerbank 5V – берём провод с USB штекером и подключаем по схемам выше. Через Ардуино не питаем, нельзя. Ёмкость паурбанков очень высокая, сами знаете. По току обычно можно снять 2 Ампера, есть паурбанки на 3 А
- Батарейки – можно взять обычные АА батарейки, 3 штуки полностью заряженных (дадут 4,5 Вольт), либо 4 штуки чуть разряженных (дадут 5.5 Вольт). Ёмкость батареек очень небольшая. По току можно снять 1-2 Ампера (алкалин, литий. Солевые сразу в помойку)
- Никелевые аккумуляторы – имеют напряжение ~1.4В после зарядки, можно смело поставить 4 штуки (~5.5 Вольт). Ёмкость сборки весьма достойная (до 2700 ма*ч), по току можно снять 2-3 Ампера
- Литиевые аккумуляторы – напряжение в процессе разряда меняется с 4.2 до 3.0 Вольт, значит ленту можно питать, но светить будет на 10-30% менее ярко. Также нельзя забывать следить за напряжением, литий боится переразряда. Ёмкость – параллельно можно поставить много банок, по току – с обычных банок можно снять 3 Ампера (если стоят в параллель – то с каждой)
Вот здесь описаны проблемы дешёвых блоков питания и как с ними бороться.
- Литиевый акум + повышайка – отличный способ сохранить полную яркость при небольшом количестве светодиодов, у китайцев есть куча повышаек с лития (3-4.2В) до 5 Вольт с максимальным током до 2 Ампер. Считай тот же powerbank, но можно более компактно разместить
ПОЧЕМУ НЕ РАБОТАЕТ?
Убедись, что земля ленты соединена с землёй ардуино КАК НА СХЕМЕ
- Убедись, что сигнальный провод идёт в начало ленты (контакт DI) КАК НА СХЕМЕ
- Убедись, что не перепутал 5в и GND. КАК НА СХЕМЕ
- Цвет отдаёт в красный? У тебя слабый БП, некачественная пайка линии питания или слишком тонкие провода питания
- Подключил без резистора и теперь не работает даже с резистором? Пин ардуино отбросил ласты, подключай в другой
- Лента глючит и иногда показывает артефакты? У вас беды с питанием, читать гайд на форуме.
УПРАВЛЕНИЕ С ARDUINO
Для управления лентой можно выделить четыре библиотеки: microLED, FastLED, Adafruit NeoPixel и LightWS2812, из всех трёх рекомендую FastLED и microLED.
- FastLED обладает гигантским набором инструментов и позволяет делать сложные эффекты, краткий гайд и частичная документация на русском языке есть на сайте набора GyverKIT.
- microLED – моя библиотека, она гораздо проще, имеет подробнейшую документацию на русском языке, занимает меньше места в памяти Ардуино, а также обновляет ленту быстрее FastLED.
Ниже привожу примеры кода с использованием разных библиотек.
Бегущая радуга (microLED)
#define STRIP_PIN 2 // пин ленты #define NUMLEDS 100 // кол-во светодиодов #include // подключаем библу microLED < NUMLEDS, STRIP_PIN, -1, LED_WS2812, ORDER_GRB >strip; void setup() < strip.setBrightness(60); // яркость >void loop() < static byte counter = 0; for (int i = 0; i < NUMLEDS; i++) < strip.set(i, mWheel8(counter + i * 255 / NUMLEDS)); // counter смещает цвет >counter += 3; // counter имеет тип byte и при достижении 255 сбросится в 0 delay(30); // 30 кадров в секунду >
Бегущая радуга (FastLED)
#define NUM_LEDS 144 #include "FastLED.h" #define PIN 6 CRGB leds[NUM_LEDS]; byte counter; void setup() < FastLED.addLeds(leds, NUM_LEDS).setCorrection( TypicalLEDStrip ); FastLED.setBrightness(50); pinMode(13, OUTPUT); > void loop() < for (int i = 0; i < NUM_LEDS; i++ ) < // от 0 до первой трети leds[i] = CHSV(counter + i * 2, 255, 255); // HSV. Увеличивать HUE (цвет) // умножение i уменьшает шаг радуги >counter++; // counter меняется от 0 до 255 (тип данных byte) FastLED.show(); delay(5); // скорость движения радуги >