Przedstawię tu indywidualnie adresowalną taśmę LED RGBW (czerwony, zielony, niebieski i biały) opartą o układ TM512C4 i pracującą na napięciu 24V. Pokażę tu, jak działa jej protokół komunikacji DMX512 i jak można prosto wysterować ją z poziomu RS485 ESP32. Do demonstracji użyję płytki ESP32 LilyGO T-CAN485, gdyż ona nieco ułatwia sprawę i ma już wbudowany transceiver UART->RS485.
Zacznijmy od parametrów taśmy. Taśma posiada 60 LED SMD5050 na 1 metr i dostępna jest w odcinkach po 5 metrów. Kolory są cztery - oprócz standardowego RGB mamy też biel o temperaturze 4000K (neutralne światło dzienne) co pozwala uzyskać różnorodne i naturalne efekty. Pełny model taśmy to HR00-C24RGBW512AC4-60.
Użyty kontroler to zewnętrzny układ i przypada tu jeden na sześć LEDów, więc nie możemy kontrolować ich całkowicie indywidualnie.
Producent proponuje do tego dedykowane kontrolery K-8000C, ale my wykombinujemy coś sami:
Zobaczmy jak taśma wygląda w praktyce.
Mamy tutaj 5 linii, kolejno:
- +24V - zasilanie
- ADi - używane do adresowania
- A - linie RS485
- B - linie RS485
- GND - masa
Zasilanie jest dodatkowo wyprowadzone. Taśmy kończą się wtyczkami, co ułatwia montaż.
Taśma podzielona jest na fragmenty - jeden układ scalony na sześć diod:
Ten układ to TM512:
TM512 to precyzyjny sterownik LED DMX512 z 16-bitową skalą szarości, korekcją gamma i adaptacyjnym dekodowaniem do 4096 kanałów, obsługujący tryb stałoprądowy i PWM do sterowania zewnętrznymi tranzystorami. Jest przeznaczony do oświetlenia LED i animowanych efektów scenicznych
DMX512 to popularny protokół wykorzystywany w oświetleniu scenicznym, który definiuje stałą szybkość transmisji i pakiet danych złożony z 512 kanałów. DMX512 może wydawać się dość tajemniczy, ale w zasadzie sprowadza się on do wysyłania poszczególnych wartości przez RS485, czyli przez UART + transceiver RS485 zapewniający odpowiednie poziomy. RS485 jest standardem transmisji szeregowej, który pozwala na przesyłanie danych na większe odległości i w trudniejszych warunkach niż zwykły UART. Umożliwia pracę w trybie różnicowym, co oznacza, że sygnał jest przesyłany jako różnica napięć między dwiema liniami (A i B), co znacząco zwiększa odporność na zakłócenia. Wystarczy podłączyć odpowiedni konwerter na UART i mamy RS485 - przykładowo MAX485:
Można też użyć gotowca - np. moduł ESP32 LilyGo T-CAN485:
RS485 z poziomu kodu obsługujemy tak jak UART - po prostu trzeba zainicjować port, ustawić baud i już można wysyłać bajty.
Teraz pytanie - jak wysyłać te bajty? Opisuje to sekcja "Communication Protocol" z noty katalogowej TM512:
Szybkość transferu (baud) to 250 000 bitów na sekundę. Wysyłane jest 513 bajtów (prawie jak w nazwie - DMX512), przy czym pierwszy bajt nie jest używany. Zazwyczaj jeden bajt przypada na jeden kanał, więc w przypadku paska RGBW mamy 4 bajty na jeden odbiornik. W ten sposób można obsłużyć do 128 takich pikseli.
Dodatkowo DMX wymaga odpowiedniej procedury startu pakietu, dopiero potem wysyłane są dane. Domyślny stan linii (idle) to stan wysoki, potem ustawiamy stan niski na co najmniej 88µs, potem stan wysoki na 8 µs i rozpoczynamy transfer. Warunek startu zrealizujemy "ręcznie" poprzez operację na pinach, a wysyłanie danych wykona za nas obiekt Serial.
Przykład uruchomiłem w PlatformIO pod ESP32 z Arduino SDK. Zacznijmy od najważniejszego - wysyłanie danych DMX:
Kod: C / C++
Flush służy do wysłania oczekujących danych z portu szeregowego, potem sztucznie generujące warunek startu a następnie ponownie uruchamiam port i przesyłam nim dane.
Ten konkretny pasek oczekuje danych w formacie RGBW - po bajcie na wartość. A więc można dodać pomocnicze funkcje, powiedzmy:
- do ustawiania wszystkich kolorów na jedną wartość
- do czyszczenia bufora
- do ustawienia danego piksela na wybrany kolor
Kod: C / C++
Pora przetestować. Na koniec omówię podłączenie - 24V na zasilanie oraz RS485 na linie A i B. Nie potrzeba wspólnej masy, bo RS485 jest sygnałem różnicowym.
Czerwony:
Kod: C / C++
Zielony:
Kod: C / C++
I tak dalej. Zielony - ciemny:
Kod: C / C++
Różne kolory:
Teraz sprawdźmy łączenie kolorów. Żółty (czerwony + zielony):
Kod: C / C++
Test poziomów jasności:
Kod: C / C++
Prosta animacja:
Kod: C / C++
Zbadajmy pobór prądu dla pięciometrowego fragmentu tego paska.
Wszystkie zgaszone piksele - 0.46A przy 24.3V:
Wszystkie zapalone - 1.94A przy 24.3V:
Wniosek narzuca się sam. 12W standby (!!!) i 48W w trakcie pracy. Czyli 36W światła i 12W przepalone... na właśnie, co? Wygląda na to, że na zasilanie TM512AC. Potrzebny jest też do tego dzielnik rezystorowy, na którym troszkę się traci mocy:
Nie analizowałem tego jednak głębiej. Zdecydowanie wygląda na to, że docelowy układ musi wykrywać wyłączenie paska i odłączać VDD...
Podsumowując, protokół DMX512 opiera się o RS485 i składa się z prostego sygnału startowego oraz z danych wysyłanych w postaci poszczególnych bajtów. Ilość bajtów przypadających na odbiornik może się różnić, w przypadku paska LED z tematu mieliśmy 4 bajty na jeden kontroler (6 LEDów). Całość można łatwo wysłać z własnego programu na platformie ESP32, choć potrzebny jest też transceiver RS485, przykładowo MAX485. Może być on zintegrowany z naszą płytką - np. w przypadku użycia Lilygo T-Can485.
Jedyny problem jaki napotkałem to pobór mocy paska przy zgaszonych diodach - wygląda na to, że potrzebny będzie tranzystor wyłączający całość gdy nie jest zapalona żadna dioda. Troszkę mnie to początkowo zaskoczyło, nie mam na ten moment drugiego egzemplarza by sprawdzić, czy tak jest w każdym przypadku.
To była podstawowa prezentacja i udało mi się tu osiągnąć zamierzony efekt, choć to nie koniec przygód z tym paskiem. Planuję jeszcze co najmniej:
- uruchomić go w moim firmware open source, wraz z dodatkowym pinem i tranzystorem odłączającym zasilanie (szkoda tych 12W...)
- uruchomić go z WLED (obawiam się, że potrzebna będzie samodzielna kompilacja wsadu)
- zbadać i opisać rolę nieomówionego jeszcze pinu od adresowania
To na razie tyle, sam pasek wygląda obiecująco, ciekawe jak wyjdzie po montażu. Bardzo podoba mi się w nim obecność bieli, a te 6 diod na jeden kontroler można przeboleć, nie jest to stricte "per pixel" ale da się animować.
Czy korzystaliście z pasków LED bądź z innych urządzeń sterowanych przez DMX512?
[i]Pełen kod użyty do prezentacji zamieszczam w załączniku (projekt PlatformIO)
Fajne? Ranking DIY Pomogłem? Kup mi kawę.