Почему?
Перед новым годом многие наряжают и украшают ёлки всевозможными игрушками-побрякушками и, конечно, световой гирляндой.
На Хабре уже недавно было несколько вариаций на тему самодельных гирлянд, но их меньше 100500 и поэтому я подумал, что этого явно мало. Дабы не прогневать дух Нового Года я приношу свой вариант ёлочной гирлянды в подарок этому великому духу.
Так же этот проект задумывался как часть начального обучения для своего сына в стиле «я делаю и рассказываю что, как и почему, а сын смотрит и задаёт каверзные вопросы по теме и не очень». По этой причине я старался сделать всё как можно проще и доступнее.
Из чего?
Немного порывшись в своих коробках, я обнаружил несколько лент индивидуально-адресуемых RGB светодиодов. В дикой природе они имеют разные названия — WS2801, WS2811, WS2812, Neopixels и т.п.
Главная изюминка этих лент в том, что можно управлять любым RGB светодиодом индивидуально и менять RGB цветовые составляющие и яркость.
Различия между лентами есть электрические. Если очень грубо, то их можно описать примерно так:
WS2801 — самая первая версия. Данные передаются по двум сигнальным проводам — DATA и CLOCK. Питание у них обычно 12 вольт. RGB светодиод подключен отдельно.
WS2811 — более новая версия. Данные передаются по одному проводу — DATA. Сигнала CLOCK нет, так как WS2811 контроллер сам считает временные интервалы и надо им следовать в своём коде. Обычно питание 5 вольт. RGB светодиод так же подключен отдельно.
WS2812 — то же самое как WS2811, но встроен в светодиод (например, 5050), тем делает ленту более компактной и с возможным более плотным размещением светодиодов. Обычно питание 5 вольт. Микросхема-светодиод имеет 6 выводов.
WS2812B — как WS2812, но с отличием в том, что питания для светодиодов и самой микросхемы объединено (у всех вариантов выше питание раздельное). Микросхема-светодиод имеет 4 вывода.
Любые вариации светодиодных лент можно купить на eBay, Alibaba/AliExpress и в магазинах такого типа.
С точки зрения программирования разница очень приятно сглажена использованием библиотеки FastLED @ GitHub. То есть, можно без особых хлопот комбинировать разные типы программируемых лент в одном проекте, чем я без стеснения и воспользовался. Сын, правда, не оценил папину находчивость и удобство библиотеки.
У себя я нашёл три ленты: одна на базе контроллера WS2801 (25 светодиодов) и две на базе контроллера WS2811 (20 и 15 светодиодов). Итого получается 60 светодиодов щенячей радости.
Две WS2811 я соединил вместе последовательно.
Как уже догадался пытливый ум читателя, для управление такими светодиодными лентами нужен контроллер. Изначально я задумывал использовать плату Arduino Pro Mini из-за компактности и готовности, но в своих бездонных закромах не нашёл ни одну почему-то. Зато нашёл Teensy 3.1 (Cortex-M4 @ 72MHz, 256KB Flash, 64KB RAM). Это немножко перебор, но лучше много, чем мало.
Так как у меня используются 12-ти и 5-ти вольтовые ленты вместе, то я запитал всю схему от 12В/1A блока питания с преобразованием в 5 вольт для питания второй ленты и платы микроконтроллера. Преобразовывал я импульсным DC-DC модулем KIS-3R33S на базе MP2307DN, которые даёт до 3A на выходе и почти не греется. Конечно, модуль можно заменить чем-то типа 7805, но надо будет позаботиться о правильном охлаждении (это порядка 1-1,5 ватта на каждые 10 светодиодов).
Список компонентов:
- Индивидуально-адресуемые светодиодные ленты на базе WS2801, WS2811 и т.п.
- 12В/1A блок питания. При максимальной яркости 60 светодиодов потребляли примерно 800 мА. Я включаю их на пол-яркости и получаю 400 мА потребления
- Модуль микроконтроллера Teensy 3.1. Так же подойдёт Arduino или другой подходящий модуль или микроконтроллер
- DC-DC преобразователь KIS-3R33S. Тут вариантов много и всё зависит от требований питания
Как подключить?
Схемы практически нет, так как всё подключается довольно просто:
Teensy 3.1 питается от 5 вольт. На этих 5 вольтах сидит WS2811 лента. На 12 вольтах сидит лента на базе WS2801.
Лента WS2801 подключена к Teensy 3.1 так: DATA — 11, CLOCK — 13.
Лента WS2811 подключена к Teensy 3.1 эдак: DATA — 14.
Если схема всё же нужна, то могу добавить про просьбе.
Комок проводов и деталей был удачно запихан в коробку для хранения четырёх AA элементов. Я в таких коробках обычно собираю нечто такое простое и быстрое.
В чём магия?
Магия в коде, который управляет всем этим безобразием и приводит в восторг трёх-летнего сына.
Свой код выложил на GitHub: github.com/nochkin/LightBottle (нужна библиотека github.com/FastLED/FastLED)
В коде всё достаточно просто — псевдо-случайно выбирается цвет, в который плавно переходит светодиод и текущий цвет переходит дальше по светодиодной ленте. На ёлке смотрится как будто свет падает вниз. Или наверх если, например, перевернуть ёлку (совет сына) или сами ленты повесить наоборот (моё нерациональное предложение).
В самом начале кода я вывел некоторые переменные для конфигурации:
LEDS1_NUM/LEDS1_PIN — количество светодиодов и пин подключения первой ленты
LEDS2_NUM/LEDS2_PIN — количество светодиодов и пин подключения второй ленты
LEDS_SATURATION — максимальная цветовая насыщенность
LEDS_BRIGHTNESS — максимальная яркость (на 60 светодиодах примерное потребление получилось 800 мА при яркости 255, 400 мА при 128 и 200 мА при 64)
hueStep — шаг изменения цвета за один цикл
UPDATE_DELAY — скорость «бега» цвета по ленте
В setup() конфигурируются обе ленты, поэтому если лента одна, то можно оставить только одну строчку, которая соответствует контроллеру ленты и обнулить LEDS2_NUM.
А мультик?
Прикладываю видео сей поделки. Прошу прощения за телефонное качество и портретную ориентацию.
Так же хочу передать поздравления с наступающим всемам. Ура-ура!
Автор: nochkin