Pokażę tutaj jak uruchomić pasek LED RGBW z DMX512 w oparciu o firmware WLED na płytce z wbudowaną obsługą RS485.
DMX512 to protokół komunikacyjny używany głównie w oświetleniu scenicznym umożliwiający sterowanie wieloma urządzeniami, w tym kolorowymi paskami LED, za pomocą pojedynczej magistrali RS485.
WLED to firmware open source dla mikrokontrolerów ESP8266 i ESP32, który umożliwia sterowanie adresowalnymi paskami LED (WS2812, SK6812, APA102 itp.) oraz integrację z popularnymi systemami automatyki i protokołami, takimi jak MQTT, HTTP czy Art-Net/DMX. Dzięki WLED można łatwo tworzyć i obsługiwać różne efekty świetlne z poziomu mikrokontrolera.
Po informacje odnośnie DMX512 odsyłam do poprzedniego tematu:
Taśma LED z interfejsem RS485? Protokół DMX512 - TM512C4 RGBW 24V
Do prezentacji użyję opisywanego już LilyGO z RS485:
LilyGO T-CAN485 - ESP32 do nauki łączności przemysłowej, magistrale RS485 i CAN
Plan działania
Oto kolejne cele na dzisiaj:
1. Uruchomienie zwykłej kompilacji WLED w PlatformIO
2. Zmiana ustawień projektu WLED tak, aby uruchomić sterownik DMX obecny już w tym środowisku
3. Dostosowanie istniejącego sterownika DMX tak aby działał na LilyGO T-CAN485
4. Wgranie własnej kompilacji WLED na LilyGO i końcowa konfiguracja oraz testy z paskiem
Podstawa kompilacji WLED
Przygodę zaczynamy od zapoznania się z podstawami kompilacji WLED. W zasadzie to wszystko opisane jest na ich oficjalnej stronie:
https://kno.wled.ge/advanced/compiling-wled/
Na tej samej stronie znajdują się również zalecenia co do DMX, ale niestety są bardzo niekompletne.
https://kno.wled.ge/interfaces/dmx-output/
Pobieramy repozytorium z Githuba, wykonujemy w nim npm install, a potem otwieram projekt w PlatformIO (rozszerzenie z Visual Code). Mamy już tam gotowe konfiguracje - wybrałem esp32dev. Operacje "Build" itd. powinny już działać:
Kompilacja i poprawki wsparcia DMX
Pora zmodyfikować ustawienia esp32dev. Ta konfiguracja jest zdefiniowana w platformio.ini. Tam dopisałem wsparcie DMX do build_flags:
-D WLED_ENABLE_DMX
Przełącznik -D po prostu dodaje #define WLED_ENABLE_DMX 1 do kompilacji. Niestety przy kompilacji jednak pojawiał się błąd:
usermods/audioreactive/audio_reactive.cpp:10:4: error: #error This audio reactive usermod is not compatible with DMX Out. #error This audio reactive usermod is not compatible with DMX Out. ^~~~~
Musiałem dodatkowo usunąć linijkę z:
custom_usermods = audioreactive
z tej samej sekcji konfiguracji.
Ostatecznie wyszło tak:
[env:esp32dev]
board = esp32dev
platform = ${esp32_idf_V4.platform}
build_unflags = ${common.build_unflags}
custom_usermods =
build_flags = ${common.build_flags} ${esp32_idf_V4.build_flags} -D WLED_RELEASE_NAME=\"ESP32_V4\" #-D WLED_DISABLE_BROWNOUT_DET
-DARDUINO_USB_CDC_ON_BOOT=0
-D WLED_ENABLE_DMX
lib_deps = ${esp32_idf_V4.lib_deps}
monitor_filters = esp32_exception_decoder
board_build.partitions = ${esp32.default_partitions}
board_build.flash_mode = dio
Na tym etapie kompilacja powinna działać, ale to nie wszystko... trzeba jeszcze zmienić pin i uruchomić RS485 na LilyGO.
WLED ma dwa osobne sterowniki DMX. Pierwszy znajduje się w ESPDMX.cpp i używany jest na ESP8266 oraz ESP32 C3 i S2:
Kod: C / C++
Drugi znajduje się w SparkFunDMX.cpp i to on nas dziś interesuje:
Kod: C / C++
Znajduje się tam wpisany na sztywno (!) indeks pinu z którego wysyłane są dane przez UART (a potem odpowiedni układ zamienia to na RS485):
Kod: C / C++
Zmieniłem ten blok tak, by korzystał z definicji pinów od twórców LilyGO:
Kod: C / C++
Zmiana pinu to nie wszystko - na LilyGO T-CAN485 należy jeszcze włączyć transceiver. Ostatecznie przerobiłem metodę initWrite w ten sposób:
Kod: C / C++
Konfiguracja WLED po wgraniu na ESP
Po wgraniu musiałem sparować ESP z moim WiFi. WLED tworzy swój AP - hasło to wled1234. Strona konfiguracyjna ma IP 4.3.2.1. Tam można podać nasz SSID i hasło, by urządzenie dołączyło do naszej sieci.
Potem w Config->LED Preferences należy ustawić ilość pikseli. Wiem, to jest dość dziwne, bo tu są ustawienia WS2812 i podobnych, ale tak w tej chwili to działa.
Co więcej, pasek nie działa mi stabilnie jak ustawię tu 50 LEDów - ustawiłem na razie 40.
Następnie konfigurujemy DMX w Config->DMX Output. Kolejno:
- channels per fixtures - kanały na piksel, tutaj 4, RGBW
- spacing between start channels - odstęp między pikselami, też 4
- start channel - początkowy kanał - 1
- dodatkowo ustawiamy role kanałów - kolejno RGBW
Tak jak na zrzucie ekranu:
Swoją drogą, zabawny nagłówek - "Imma firin ma lazer". Ktoś ma poczucie humoru.
Zapisujemy i można sprawdzić mapowanie wciskając przycisk DMX Map:
Od teraz WLED powinien być w stanie kontrolować pasek z DMX.
Podłączenie paska do LilyGO
Przypomnę podłączenie - zasadniczo tak jak w poprzednim temacie. Potrzebne jest:
- osobne zasilanie, tutaj 24 V DC, zgodnie z dokumentacją paska
- RS485 z LilyGO (nie potrzeba wspólnej masy)
Rezultaty
Rezultaty przedstawiłem na filmach. WLED może zarówno animować pasek jednym kolorem (tak jakby jeden piksel), jak również oczywiście jest w stanie sterować poszczególnymi pikselami (tutaj: sekcjami) paska:
Pomiary
Na koniec jeszcze na próbę sprawdziłem pobór mocy całego paska. Wymusiłem ustawienie wszystkich kanałów na 255 (pełna jasność) w ustawieniach DMX:
Rezultat:
Wychodzi na to, że pełna jasność tego paska to 43.66 W.
Niezbędne dalsze kroki
Warto tu przypomnieć problem wykryty w poprzednim temacie z serii. Ten pasek pobiera 12 W przy wszystkich diodach zgaszonych. Nie zostało to jeszcze przeze mnie rozwiązane - pewnie potrzebny będzie tranzystor oraz możliwość odcinania linii 24 V w momencie gdy wszystkie piksele są zgaszone. Nie wiem na ten moment, czy WLED ma już taki gotowy mechanizm, czy będę musiał to od 0 implementować. Zobaczę w kolejnej części.
Podsumowanie
W ten sposób udało mi się uruchomić protokół DMX z oprogramowaniem open source WLED. Pierwszym zaskoczeniem było to, w jak bardzo niedopracowanym stanie jest wsparcie tego protokołu w tym projekcie. Nie ma tam nawet mechanizmu, by wybrać pin UART. Co więcej, WLED korzysta z dwóch różnych bibliotek do wysyłania DMX (osobno dla ESP8266 i osobno dla ESP32), co również mnie nieco dziwi, nie łatwiej byłoby to zrealizować razem?
Z kompilacją też było nieco problemu, bo różne opcje kompilacji nie są ze sobą kompatybilne i z tego powodu musiałem wyłączyć efekty audio, które na szczęście nie są mi do niczego potrzebne.
Reszta poszła sprawnie, zostało jedynie dodać te wyłączanie zasilania paska przy zgaszonych LEDach.
Na razie to tyle - czy korzystacie z WLED w swoich projektach? Zapraszam też do podzielenia się efektami. U mnie jeszcze nie są gotowe...
Fajne? Ranking DIY Pomogłem? Kup mi kawę.