16 293
правки
Строка 1: | Строка 1: | ||
{{DISPLAYTITLE:Подключение адресной ленты WS2812B к контроллеру Wiren Board}} | |||
==Описание== | |||
{{Wbincludes:Community}} | |||
Автор статьи: [https://t.me/Paulstrong Paul Strong] | |||
В этой статье рассмотрим один из способов управления адресной лентой WS2812B из Wiren Board с использованием ESP32. | |||
* любая отладочная плата, основанная на esp32 | |||
* две bread board платы | Здесь не будут рассмотрены характеристики железной части, этому уделено очень много внимания на просторах Интернет, тут будет сугубо техническая информация по процессу достижения цели, с небольшими лирическими отступлениями. | ||
* соединительные проводки | |||
* лента ws2812b нужной длины (в моём случае бухта 5м с мощностью 14.4Вт/м) | Что нам понадобится: | ||
* блок питания 5V соответствующей мощности (в моём случае 100W) | * любая отладочная плата, основанная на esp32; | ||
* резистор 220 ом | * две bread board платы; | ||
* microUSB дата-кабель (обычный, от зарядки, может не подойти!) | * соединительные проводки; | ||
* комп/ноут для сборки и заливки прошивки | * лента ws2812b нужной длины (в моём случае бухта 5м с мощностью 14.4Вт/м); | ||
* VSCode + PlatformIO | * блок питания 5V соответствующей мощности (в моём случае 100W); | ||
* контроллер Wirenboard с wb-rules v2.x | * резистор 220 ом; | ||
* wi-fi сеть в диапазоне 2.4G | * microUSB дата-кабель (обычный, от зарядки, может не подойти!); | ||
* комп/ноут для сборки и заливки прошивки; | |||
* VSCode + PlatformIO; | |||
* контроллер Wirenboard с wb-rules v2.x; | |||
* wi-fi сеть в диапазоне 2.4G. | |||
==Сборка физической схемы== | ==Сборка физической схемы== | ||
[[Файл:Ws2812b_BB_Schema.png|thumb|right|600px| Схема сборки]] | |||
Для сборки нам нужно две bread board платы, собираем по схеме: | Для сборки нам нужно две bread board платы, собираем по схеме: | ||
* пин 5V подключаем к +5V ленты | * пин 5V подключаем к +5V ленты | ||
* пин GND | * пин GND | ||
* пинг GPIO27 подключаем через резистор 220ом к DIN ленты | * пинг GPIO27 подключаем через резистор 220ом к DIN ленты | ||
Обращаю внимание на то, что не рекомендуется тестировать конфигурацию более чем на 5 светодиодах, такого количества будет достаточно, чтобы понять как выглядит световая картинка в том или ином алгоритме. Подключение большего количества светодиодов может привести к выгоранию USB-порта на | Обращаю внимание на то, что не рекомендуется тестировать конфигурацию более чем на 5 светодиодах, такого количества будет достаточно, чтобы понять как выглядит световая картинка в том или ином алгоритме. | ||
Подключение большего количества светодиодов может привести к выгоранию USB-порта на компьютере, т.к. там обычно предельно допустимый ток 350мА, а один светодиод на такой ленте потребляет около 50мА. | |||
==Первый скетч== | ==Первый скетч== | ||
Заливаем первую прошивку. | Заливаем первую прошивку. | ||
Подразумевается что на | Подразумевается что на компьютере уже установлена среда разработки VSCode и расширение PlatformIO. Создадим новый проект. | ||
[[Файл:Pio-create-prj.jpg]] | [[Файл:Pio-create-prj.jpg]] | ||
Чтобы понимать, что esp32 работает, сделаем код, который постоянно зажигает и тушит встроенный светодиод синего цвета. Запускаем это дело в виде асинхронной функции. | |||
Файл <code>src/main.cpp</code>: | |||
<syntaxhighlight lang="c++"> | <syntaxhighlight lang="c++"> | ||
#include <Arduino.h> | #include <Arduino.h> | ||
Строка 85: | Строка 90: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Сейчас можно залить попробовать скомпилировать прошивку, для этого в нижней панели жмём кнопку [[Файл:Снимок экрана 2023-12-06 205145.jpg]] | |||
Если всё собралось, только можно шить это дело в esp32: | |||
* подключаем esp32 к компу при помощи microUSB data кабеля | * подключаем esp32 к компу при помощи microUSB data кабеля; | ||
* инициируем заливку прошивки при помощи кнопки [[Файл:Снимок экрана 2023-12-06 205336.jpg]], когда система напишет | * инициируем заливку прошивки при помощи кнопки [[Файл:Снимок экрана 2023-12-06 205336.jpg]], когда система напишет «Connecting...» — зажимаем кнопку Boot на dev-плате esp32; | ||
* если прошивка залилась успешно, перезагружаем esp32 соответствующей кнопкой, после этого у вас должен замигать синий светодиод на плате | * если прошивка залилась успешно, перезагружаем esp32 соответствующей кнопкой, после этого у вас должен замигать синий светодиод на плате. | ||
==Подключаемся к | ==Подключаемся к Wi-Fi== | ||
Приступаем к следующему этапу | Приступаем к следующему этапу — нам нужно подключить нашу esp32 к wifi (чтобы далее подключиться к modbus tcp от wirenboard) | ||
Добавим к нашему файлу main.cpp следующий код: | |||
<syntaxhighlight lang="c++"> | <syntaxhighlight lang="c++"> | ||
#include <Arduino.h> | #include <Arduino.h> | ||
Строка 136: | Строка 141: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Теперь после прошивки esp32 подключится к вашей wifi сети, IP-адрес можно будет посмотреть на роутере, либо в отладочных сообщения на Serial-порте, который связывает ваш комп с esp32, для этого нажмите кнопку [[Файл:Снимок экрана 2023-12-06 210510.jpg]] на нижней панели. | |||
==Библиотека для работы с адресной лентой== | ==Библиотека для работы с адресной лентой== | ||
Далее нам нужно подключить к проекту библиотеку для работы с лентой, они есть разные, я использовал FastLED | Далее нам нужно подключить к проекту библиотеку для работы с лентой, они есть разные, я использовал FastLED. | ||
[[Файл:Снимок экрана 2023-12-06 201634.jpg]] | [[Файл:Снимок экрана 2023-12-06 201634.jpg]] | ||
Добавляем в проект | |||
[[Файл:Снимок экрана 2023-12-06 203931.jpg]] | [[Файл:Снимок экрана 2023-12-06 203931.jpg]] | ||
Строка 347: | Строка 352: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Прошиваемся, в случае успеха у вас должна заработать лента, алгоритм будет менять каждые 5 секунд, всего 12 алгоритмов. | |||
Подробно останавливаться на коде прошивки мы не будем, в Интернете полно разных алгоритмов, их можно добавлять к нашей оснастке, переключать их реже или чаще, можно даже кнопку прикрутить под это дело на один из пинов, тут кому насколько фантазии хватит. | Подробно останавливаться на коде прошивки мы не будем, в Интернете полно разных алгоритмов, их можно добавлять к нашей оснастке, переключать их реже или чаще, можно даже кнопку прикрутить под это дело на один из пинов, тут кому насколько фантазии хватит. | ||
==Подключение к Modbus TCP== | ==Подключение к Modbus TCP== | ||
После настройки | После настройки Wi-Fi мы можем подключаться к mqtt-брокеру контроллера Wiren Board, для этого нужно установить библиотеку, как мы это делали ранее, называется она PubSubClient. | ||
Подключимся к брокеру, для этого добавим немного кода: | |||
<syntaxhighlight lang="c++"> | <syntaxhighlight lang="c++"> | ||
#include <Arduino.h> | #include <Arduino.h> | ||
Строка 428: | Строка 433: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Что мы здесь видим: мы можем создавать подписку на нужные топики либо сами публиковать какие то значения в нужные нам топики. | |||
В нашем случае понадобится управлять настройками ленты, поэтому нам надо слушать некоторые топики, изменения которых будут влиять на поведение ленты, допустим, мы хотим управлять: | |||
* яркостью | |||
* выключать (яркость 0) | |||
* включать (яркость 50%) | |||
* останавливать и запускать автоматическую смену режима | |||
==Виртуальное устройство в | ==Виртуальное устройство в Wiren Board== | ||
Создадим виртуальное устройство нашей ленты в | Создадим на [[wb-rules]] виртуальное устройство нашей ленты в контроллере Wiren Board: | ||
<syntaxhighlight lang="javascript"> | <syntaxhighlight lang="javascript"> | ||
defineVirtualDevice("ws2812b", { | defineVirtualDevice("ws2812b", { | ||
Строка 475: | Строка 480: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Теперь надо константу BRIGHTNESS переделать в переменную, ввести переменную hue_loop, а также подписаться на топики | |||
<syntaxhighlight lang="c++"> | <syntaxhighlight lang="c++"> | ||
#define BRIGHTNESS 50 | #define BRIGHTNESS 50 | ||
Строка 650: | Строка 655: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Заливаем прошивку в esp32. | |||
Осталось обновить виртуальное устройство в контроллере Wiren Board: | |||
<syntaxhighlight lang="javascript"> | <syntaxhighlight lang="javascript"> | ||
defineVirtualDevice("ws2812b", { | defineVirtualDevice("ws2812b", { | ||
Строка 685: | Строка 690: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
После применения виртуального устройства можно управлять скорость обновления светодиодов из веб-интерфейса контроллера Wiren Board. | |||
==Какие могут быть проблемы== | ==Какие могут быть проблемы== | ||
# изначально лента тестировалась на arduino nano, и на LED_TYPE==WS2812B оно работало странно, но с учетом того что какие-то отдельные светодиоды загорались, я пришёл к выводу что цифра работает, но есть какие-то проблемы с частотой, в итоге заработало на WS2811_400, то есть на частоте 400кгц, однако, в случае с esp32 всё заработало со штатным типом WS2812B | # изначально лента тестировалась на arduino nano, и на LED_TYPE==WS2812B оно работало странно, но с учетом того что какие-то отдельные светодиоды загорались, я пришёл к выводу что цифра работает, но есть какие-то проблемы с частотой, в итоге заработало на WS2811_400, то есть на частоте 400кгц, однако, в случае с esp32 всё заработало со штатным типом WS2812B; | ||
# важно учитывать тот факт, что нельзя допускать подключения ленты без стабильного плюса, то есть в случае подключения ленты к GND и DIN-пину, есть риск, что пин спалится, чтобы подстраховаться - ставится резистор на 220ом, но всё равно лучше избегать таких вот нештатных ситуаций | # важно учитывать тот факт, что нельзя допускать подключения ленты без стабильного плюса, то есть в случае подключения ленты к GND и DIN-пину, есть риск, что пин спалится, чтобы подстраховаться - ставится резистор на 220ом, но всё равно лучше избегать таких вот нештатных ситуаций; | ||
# на самом деле проблемы могут быть самые разнообразные, потому что это DIY, если что пишите в чатике - попробуем разобраться | # на самом деле проблемы могут быть самые разнообразные, потому что это DIY, если что пишите в чатике - попробуем разобраться. | ||
==Финальный код скетча== | ==Финальный код скетча== |