В интеренте достаточно много различных проектов по изготовлению гирлянд и экранов на базе недорогих адресуемых светодиодов WS2812b. Не обошла эта мания и меня - тем более, скоро Новый год, а это значит - надо создавать праздничную атмосферу и красоваться перед соседями.
Кратко о том, что же за зверь такой - WS2812b. Это - адресуемы RGB-светодиоды, т.е. если собрать их в последовательную цепочку - можно управлять цветом каждого отдельного светодиода. Всего таких цветов может быть чуть больше 16 миллионов - каждому из трех базовых цветов доступно 256 уровней яркости. Управляются эти светодиоды по последовтельной шине - выход данных одного диода является входом для следующего. Управление у этих диодов идет по однопроводной шине - никаких дополнительных сигналов тактовой частоты не требуется, но это так же накладывает высокие требования точность временных сигналов, кодирующих нули и единицы в сигнале. Со всеми техническими подробностями работы можно ознакомиться в даташите на эти светодиоды, не буду подробно на этом останавливаться. Тем более, в моем решении используются уже готовые библиотеки NodeMCU, так что задачу формирования управляющего сигнала уже решили за нас.
Большинство проектов, которые я встречал в интернете - реализовывали управление светодиодами с помощью Arduino, и были полностью автономны - то есть крутили несколько эффектов, жестко запрограмиированных в коде контроллера. Такой подход вполне имеет право на жизнь, но я выбрал чуть более сложный путь - возможность управления гирляндой прямо с компьютера. Это дает много интересных возможностей - вплоть до проигрывания видео! Совсем как светодиодные экраны на сценах. А управлять этим всем будем через Wi-Fi - что обеспечивает некоторую гибкость в плане установки гирлянды и расположения управляющего компьютера.
В общем, хватит предисловий, переходим к реализации.
Для начала нам потребуется приобрести сами светодиоды. Здесь помогут китайские интернет магазины - ищем там WS2812b. Мне удобнее всего показалось брать их напаянными на небольшие круглые платы, которые надо выломать из одной побольше, по сто штук.

Этот вариант на мой взгляд оказался лучше всего по отношению цена-затрачиваемые усилия на дальнейшую сборку. Однако, есть и другие варианты - например уже собранные цепочки диодов прямо на проводе. Это удобнее, но и дороже. Также можно использовать ленту с этими диодами - все на ваше усмотрение. Я заказал себе 300 штук - то есть три таких платы. Этого количества как раз хватит для прямоугольной матрицы 20 на 15. Можно заказать побольше, чтобы был запас(у меня был некоторый резерв этих диодов с других проектов), либо поменьше - если не нужна такая большая матрица. Но тогда надо не забыть внести соответсвующие правки в программу!
Для сборки гирлядны также потребуется трёхжильный провод - его тоже можно достать в Китае. Например такой.

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

Чтобы удобней было подводить питание к гирлянде я решил использовать мощные модельные разъемы XT-60. Они легко пропускают большой ток и удобны в коммунтации.

Также можно добавить к списку компонентов еще и пару коннекторов JST SM на 3 вывода - в Китае их продают уже с кусочком провода. С помощью такого проводка удобно подключать контроллер к гирлянде.

Мозгом гирлянды я выбрал плату Lolin v3 на базе esp8266. Это удобная отладочная плата, содержащая на себе все необходимое, и при этом имеющая приятную стоимость.

Питать всю нашу конструкцию нужно напряжением 5В, и для нее потребуется достаточно большой ток. Рассчитать его несложно - каждый светодиод ws2821b максимально потребляет до 60мА, соответственно умножив этот ток на число диодов получим необходимый для работы ток. В моем случае получается 60мА*300=18А. Это достаточно большой ток. Взяв небольшой запас я приобрел похожий блок питания 5В 20А.

В принципе, это все, что нам нужно. Ну, за исключением паяльника с припоем, кусачек, тестера, линейки и прочей мелочи, которые должны быть по умолчанию у человека, который начал ваять что-то электронное.
Начнем сборку. Делать ее будем в соответствии с данной упрощенной схемой. На ней диодов значительно меньше, но принцип соединения должен быть ясен. Также я не показал подключение сетевого провода к блоку питания - оно должно осуществляться к клеммам L и N.

Не буду сильно вдаваться в подробности, но получиться должно что-то такое. Контроллер подключается выводом D4 к входу данных ленты, выводом Vin к плюсу питания, GND - к минусу. Перепроверив все соединения можно переходить к проверке корректности работы. Для этого нам потребуется еще пара вещей - прошивка NodeMCU и среда ESPlorer. Начнем с прошивки - добыть ее можно здесь. Указываем почту куда хотим получить прошивку, ветку кода выбираем master, в разделе Modules отмечаем галочкой WS2812. Жмем ‘Start your build’ и ждем, когда свежесобранная прошивка прилетит к нам на почту. Далее нужно установить прошивку. Для этого нужно сначала установить интерпритатор языка Python. После этого нужно проделать действия, описанные в этой инструкции.
А именно:
- Открыть консоль и ввести там команду
pip install esptool - Подключить плату LoLin к компьютеру через шнур USB и, если нужно, установить драйвер последовательного порта (на Windows 10 должен встать автоматически).
- Выяснить в диспетчере устройств какой COM-порт появился после подключения контроллера и запомнить его.
- перевести контроллер в режим прошивки - для этого нужно зажать кнопку
flashи потом нажатьreset. - перейти в консоли в каталог, где лежит полученная поп почте посылка и выполнить команду
python -m esptool --port COM<номер_нового_порта> write_flash 0x00000 <название_файла_с_прошивкой>.bin
После завершения этого процесса можно приступать к програмированию контроллера. Для этого скачиваем среду ESPlorer, распаковываем ее куда-нибудь и запускаем. Возможно, для запуска придется доустановить Java.

В открывшемся окне программы в правом верхнем выпадающем списке выбираем COM-порт, который появился после подключения контроллера, удостоверяемся, что скорость соединения в выпадающем списке рядом с кнопкой Donate установлена в 115200, после чего жмем кнопку Open в программе, и reset на контроллере. В правой части окна должны побежать сообщения.
Для проверки корректности сборки гирлянды я написал такую программу.
ws2812.init()
buffer = ws2812.newBuffer(300, 3)
cycle = 0
repeat
if cycle == 0 then
buffer:fill(125, 0, 0)
cycle = 1
elseif cycle == 1 then
buffer:fill(0, 125, 0)
cycle = 2
elseif cycle == 2 then
buffer:fill(0,0, 125)
cycle = 0
end
ws2812.write(buffer)
tmr.delay(1000000)
until false
Она циклически переключает цвета и позволяет убедиться, что все собрано правильно и нигде нет непропаев или же поврежденных светодиодов. Копируем ее в левое окно ESPlorer и нажимаем кнопку Save to ESP. После чего программа выполнится сразу же, либо потребуется еще раз нажать кнопку reset. Все светодиоды должны засветиться и циклически менять цвет.
Переходим к самому интересному - управлению гирляндой с компьютера. Для этого я использовал протокол Art-Net.
Протокол Art-Net - это специальный протокол для управления сценическим светом, идейное продолжение DMX512. Он также оперирует понятием “вселенная” - 512 каналов управления яркостью, однако он работает по стадартным сетевым протоколам TCP\IP и не требует особенных проводов и приемопередатчиков. В одной вселенной 512 каналов яркости, которые кодируются одним байтом. Так как светодиоды - RGB, то для кодирования цвета одного диода потребуется 3 байта. Значит, одна “вселенная” будет управлять максимум 170 диодами. Диодов у меня три сотни - значит задействовать придется две “вселенных”. Я решил не усложнять и в каждой вселенной задействовать ровно половину моей матрицы - то есть 150 диодов. Подробней о протоколе и составе его пакетов можно почитать в официальном описании протокола Art-Net.
C учетом всего вышескащанного я написал небольшую программу на lua, которая будет извлекать из сообщений Art-Net, формируемых управляющей программой, нужную информацию и зажигать светодиоды.
wifi.setmode(wifi.STATION)
--connect to Access Point (DO save config to flash)
station_cfg={}
station_cfg.ssid="Acces point name"
station_cfg.pwd="password"
station_cfg.save=true
wifi.sta.config(station_cfg)
ip_cfg={}
ip_cfg.ip="192.168.0.254"
ip_cfg.netmask="255.255.255.0"
ip_cfg.gateway="192.168.0.1"
wifi.sta.setip(ip_cfg)
tmr.delay(1000000) -- wait 1,000,000 us = 1 second
ws2812.init()
buffer1 = ws2812.newBuffer(150, 3)
buffer2 = ws2812.newBuffer(150, 3)
tmr.delay(1000000)
function artnet(s,c)
if string.byte(c,15)==0 then
buffer1:replace(string.sub(c, 19, 469))
else
buffer2:replace(string.sub(c, 19, 469))
ws2812.write(buffer1 .. buffer2)
end
end
s=net.createUDPSocket()
s:on("receive",artnet)
s:listen(6454)
В поле station_cfg.ssid вносим название точки доступа, к которой будет подключаться контроллер, а в station_cfg.pwd - пароль для сети. Загружаем эту программу в контроллер и подключаем все. Теперь осталось сформировать управляющий сигнал. Для этого используем программу Jinx! Скачав ее с официального сайта распакуем архив и запустим программу.

Потребуется произвести небольшие настройки для того, чтобы программа работала с нашей матрицей. Для начала выберем в меню пункт Setup-Output devices. Откроется окно настройки устройст-приемников.

Для начала, нам потребуется создать два устройства. Нажимаем кнопку Add и вводим настройки как на картинке.

После чего жмем OK и добавляем еще одно устройство. Настройки будут точно такие же, как у предыдущего, кроме поля Universe - его ставим равным единице. С добавлением устройств закончено. Жмем кнопку Close и переходим в меню настройки матрицы Setup-Matrix options.

Здесь устанавливаем размеры светодиодного экрана по ширине и высоте. Остальные поля не трогаем и жмем Ok.
После этого требуется настроить соответствие пикселей гирлянды пикселям экрана. Для этого заходим Setup-Output patch.

На этом экране сначала нажимаем кнопку Clear Patch, после чего жмем в верхнюю левую ячейку и нажимаем на кнопку Fast patch. Появится окно быстрой настройки пикселей. Вводим настройки со скриншота, после чего жмем. Ok.

Половина пикселей станет зелеными - жмем в верхний правый краcный пиксель и еще раз жмем кнопку Fast patch. Вводим такие же настройки как в прошлый раз, но устройство выбираем второе. Жмем Ok

Натройка закончена. Закрываем окно настройки матрицы, запускаем вывод с помощью пункта меню Setup-Start output и выбираем какой-нибудь эффект в выпадающем списке Channel 1. Если все было сделано правильно - гирлянда должна засветиться, если нет - разбираемся и ищем ошибку.

Убедившись, что все хорошо, монтируем гирлянду и ждем вечера. :)
