Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

PIC18F45K50 jako sterownik paska LED WS2812 (teoria+biblioteka)

p.kaczmarek2 17 Cze 2019 10:52 1551 5
  • PIC18F45K50 jako sterownik paska LED WS2812 (teoria+biblioteka)
    Witajcie moi drodzy
    Dziś tematem będzie sterownik LED WS2812. Najpierw opiszę jego działanie od strony teoretycznej, a potem zaprezentuję moją bibliotekę do jego obsługi przeznaczoną dla PIC18F45K50.

    Co to jest WS2812?
    WS2812 jest to inteligentny sterownik LED połączony z diodą RGB. Pozwala on na sterowanie dużą liczbę LEDów z pomocą zasadniczo jednego pinu, ale o tym potem. Zaczniemy od tego co widać na pierwszy rzut oka, od obudowy. Całość znajduje się w jednej obudowie SMD 5050 - czyli ma wymiary 5mm na 5mm!
    PIC18F45K50 jako sterownik paska LED WS2812 (teoria+biblioteka)
    PIC18F45K50 jako sterownik paska LED WS2812 (teoria+biblioteka)
    PIC18F45K50 jako sterownik paska LED WS2812 (teoria+biblioteka)
    Jak widzimy całość przypomina zwykłą diodę LED. Tutaj pojawia się pytanie, gdzie jest cała inteligencja sterownika? Wystarczy spojrzeć na piny by to zrozumieć:
    PIC18F45K50 jako sterownik paska LED WS2812 (teoria+biblioteka)
    Dioda LED WS2812 ma tylko cztery piny, kolejno:
    Nr. Symbol Opis
    1 VDD Zasilanie
    2 DOUT Wyjście sygnału kontrolnego
    3 VSS Masa
    4 DIN Wejście sygnału kontrolnego

    Nas zapewne najbardziej zainteresują piny związane z sygnałem kontrolnym. Są tylko dwa - wejście i wyjście. Co to oznacza?
    Oznacza to, że WS2812 steruje się cyfrowo, a co więcej sygnał podany na jedną diodę może zostać przesłany na następną diodę poprzez połączenie ich pinami DIN i DOUT - pozwala to sterować wieloma tak połączonymi diodami za pomocą jednego pinu!
    Takie połączenie diod WS2812 wygląda następująco:
    PIC18F45K50 jako sterownik paska LED WS2812 (teoria+biblioteka)
    Oczywiście, trzeba też do każdej doprowadzić GND i VDD, tego na schemacie powyżej nie ma. W ten sposób można połączyć naprawdę dużą liczbę LEDów, jednakże do sterowania tym potrzebny będzie mikroprocesor z opracowanym odpowiednim protokołem.
    Podsumowując, w praktyce całość wygląda tak:
    PIC18F45K50 jako sterownik paska LED WS2812 (teoria+biblioteka)

    Protokół sterowania WS2812
    Całe sterowanie odbywa się poprzez jeden sygnał cyfrowy który podajemy na pin DIN pierwszego z LEDów. Sygnałem wysyłamy kolejno bity kolorów (odpowiednio kodowane). Na każdą diodę przypadają 24 bity (3 bajty - bajt Red, bajt Green, bajt Blue). Oznacza to, że możemy wyświetlić szeroką gamę kolorów, teoretycznie aż 2^24 czyli 16777216 różnych odcieni! Podane bity odpowiednio przechodzą dalej dopóki nie zamrozimy sygnału wyjściowego w stanie niskim na co najmniej 50us.
    Same bity kodowane są z pomocą podania stanu wysokiego i niskiego na pinie poprzez odpowiedni czas.

    Podsumowując, zgodnie z obrazkiem (z noty katalogowej WS2812):
    PIC18F45K50 jako sterownik paska LED WS2812 (teoria+biblioteka)
    - jeśli chcemy przesłać bitowe 0, to ustawiamy pin komunikacji na stan wysoki na czas T0H, a potem na stan niski na czas T0L
    - jeśli chcemy przesłać bitowe 1, to ustawiamy pin komunikacji na stan wysoki na czas T1H, a potem na stan niski na czas T1L
    - jeśli chcemy zakomunikować, że kończymy przesył danych (tzn. po tej przerwie możemy od nowa sterować diodami od początku) to ustalamy pin na stan niski na co najmniej czas Treset
    Czasy podane są w tabelce:
    PIC18F45K50 jako sterownik paska LED WS2812 (teoria+biblioteka)
    Kodowanie kolorów wygląda następująco:
    G7G6G5G4G3G2G1G0R7R6R5R4R3R2R1R0B7B6B5B4B3B2B1B0

    Tak, to jest GRB, a nie RGB. Najpierw przesyłane jest 8 bitów koloru zielonego, następnie czerwonego, a na końcu niebieskiego. Przesył zaczynamy od najstarszych bitów.
    Pomiędzy przesyłaniem kolorów dla kolejnych diod LED nie ma żadnego odstępu - po prostu kontynuujemy transmisje a WS2812 o wszystko sam zadba.
    Po wysłaniu wszystkich bitów (dla wszystkich LEDów jakie chcemy obsłużyć) odczekujemy czas Treset (stan niski na pinie) i możemy wysyłać bity od nowa.

    Użyta płytka z PIC
    Do projektu użyłem jednej z moich starszych płytek z PIC18F45K50 (tu pasowałby też PIC18F4550, gdyż oba te mikrokontrolery są niemalże identyczne, chociaż wersja 45K50 ma przykładowo oscylator wewnętrzny lepszej precyzji niż 4550). Ta płytka ma oscylator kwarcowy 20MHz. Oprócz tego zawiera tylko dość podstawowe elementy takie jak rezystor od RESET, kondensatory, złączę USB (tutaj używane tylko do zasilania), itp.
    PIC18F45K50 jako sterownik paska LED WS2812 (teoria+biblioteka) PIC18F45K50 jako sterownik paska LED WS2812 (teoria+biblioteka)
    Wiem, że ta płytka wygląda jak wygląda, ale to jedna z moich pierwszych konstrukcji jeszcze sprzed paru lat. Pozostałe były już zajęte. Ostatnio używam aż tyle PICów, że chyba niedługo wykonam sam dla siebie jakąś dobrą płytkę z PIC18F4550, ale już w pełni w SMD.

    Schemat mojej płytki (to jest schemat Pinguino, ale płytkę programowałem w MikroC):
    PIC18F45K50 jako sterownik paska LED WS2812 (teoria+biblioteka)

    Opracowana biblioteka
    W sieci znajduje się bardzo dużo gotowych animacji LEDów dla WS2812 i głupotą byłoby z nich nie skorzystać - dlatego swoją bibliotekę opracowałem tak, by móc bez problemu docelowo do niej podpiąć gotowe kody z sieci. Samą komunikację zrealizowałem w kodzie C z drobną pomocą wstawek __asm nop, by móc odczekać chociaż trochę precyzyjniej wymagane czasy T0H, T0L, T1H, T0L. Precyzja nie była idealna, ale mimo wszystko całość ruszyła z miejsca.
    Bibliotekę napisałem w środowisku MikroC PRO for PIC, ale jest ona tak prosta, że jej przeniesienie do innego kompilatora nie byłoby raczej dużym problemem. Całość programowałem za pomocą mojego prostego klona PICKIT2.
    Zrzut ekranu z MikroC PRO For PIC:
    PIC18F45K50 jako sterownik paska LED WS2812 (teoria+biblioteka)
    Zrzut ekranu z PICKIT2 w trakcie programowania:
    PIC18F45K50 jako sterownik paska LED WS2812 (teoria+biblioteka)
    Zdjęcie całości w trakcie opracowywania biblioteki:
    PIC18F45K50 jako sterownik paska LED WS2812 (teoria+biblioteka)
    Sama biblioteka jest bardzo prosta, natomiast portowanie jej pod inne mikrokontrolery obejmować będzie zapewne tylko zmianę obsługi odczekiwania odpowiednich czasów. Warto pamiętać, że w bieżącej wersji używa ona nop do oczekiwania, więc przy zmianie taktowania mikroprocesora też należy te oczekiwanie poprawić.
    Konfiguracja mojej biblioteki obejmuje zasadniczo tylko ustawienie trzech zmiennych z pliku WS2812.h:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Dwie pierwsze zmienne określają na którym porcie jest pasek LED, a trzecia ilość LEDów w pasku.
    Biblioteka w tej chwili nie jest zrobiona z myślą o wsparciu kilku osobnych pasków LED na raz, ale ogólnie jest to bez problemu możliwe. Pewnie dodam tego wsparcie w przyszłości (jak kupię kolejne paski) i zaktualizuję wtedy ten temat.
    Bibliotekę można by w paru miejscach zoptymalizować, np. poprzez odwinięcie pętli for, itp.

    Efekty
    Zgodnie z założeniami opracowałem swoją biblioteczkę tak, by móc potem do niej bezboleśnie podpiąć gotowe efekty świetlne z różnych bibliotek. Na cel wziąłem zwłaszcza:
    https://github.com/adafruit/Adafruit_NeoPixel
    oraz
    https://www.tweaking4all.com/hardware/arduino/adruino-led-strip-effects/
    Filmiki przedstawiają PIC18F45K50 z moją biblioteczką odgrywający różne efekty:





    A tutaj główny kod funkcji main() użyty w powyższych filmikach:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Sam kod poszczególnych animacji jest przekopiowany ze źródeł powyżej, jedynie wywołania funkcji sterowania WS2812 są podmienione na moje.


    Podsumowanie
    Sterownik LED WS2812 bardzo mi się spodobał. Jest prosty w obsłudze i tani. W sieci można dostać dużo różnorodnych pasków LED i nie tylko opartych o WS2812.
    Myślę, że nawet same informacje zawarte w tym temacie pozwoliłyby każdemu samodzielnie napisać kod obsługi WS2812, ale mimo wszystko pokuszę się o zamieszenie tutaj mojej biblioteki:
    ws2812_pi..8f.zip Download (1.17 kB)Punkty: 4 dla użytkownika
    Oraz przykładu jej użycia (same efekty są od Adafruit, przeportowane do C):
    PIC18F45K5...edRing.zip Download (130.57 kB)Punkty: 1 dla użytkownika
    Załączam również datasheet WS2812 (źródło obrazków z opisu komunikacji WS2812):
    WS2812.pdf Download (271.75 kB)
    Oraz zrzuty bibliotek WS2812 z sieci których używałem jako wzoru i źródła animacji:
    light_ws28...master.zip Download (3.59 MB)
    Adafruit_N...er (1).zip Download (55.98 kB)
    WS2812Seri...master.zip Download (129.22 kB)

    Fajne! Ranking DIY
    Potrafisz napisać podobny artykuł? Wyślij do mnie a otrzymasz kartę SD 64GB.
  • #2
    fotomh-s
    Poziom 20  
    Ja ostatnio kontroluję te ledy przez ARTNET. Zorbiłem sobie sterownik z modułu ESP-32.
    Niestety biblioteka ARTNET na ESP ma pewnego buga, czasami całość się zawiesza jeśli jest duży ruch w sieci WIFI. Jeśli nie ma ruchu całość działa bez problemów.
    Należy korzystać z aktualnej wersji biblioteki fastled, standardowa biblioteka neopixel oraz jeszcze jakaś inna (nie pamiętam dokładnie) nie współpracuje dobrze z ESP-32 i pojawiają się losowo migające ledy (ponoć jakiś problem z timingiem, przerwaniami/obsługą timera).

    Do kontroli polecam Chamsys MagicqPC oraz GrandMA2 onPC (stara wersja z bugiem który umożliwia wypuszczenie sygnału bez hardware od MA), wreszcie bug się na coś przydaje można by powiedzieć ;-)

    Co ciekawe na Allegro taśma 74led/m kosztowała chyba 36zł za metr (czyli za 74 ledy). Cena przyzwoita jak za coś takiego. Na ALI nie było wcale dużo taniej (a może źle szukałem?).
  • #3
    p.kaczmarek2
    Poziom 23  
    fotomh-s napisał:

    Co ciekawe na Allegro taśma 74led/m kosztowała chyba 36zł za metr (czyli za 74 ledy). Cena przyzwoita jak za coś takiego. Na ALI nie było wcale dużo taniej (a może źle szukałem?).

    Właśnie mam zamówione z ALI taśmę 1-metrową 60led/m za niecałe 15 zł.
    PIC18F45K50 jako sterownik paska LED WS2812 (teoria+biblioteka)
    Nazwy sprzedawcy od którego kupiłem nie pokazuję, kto chce to sobie znajdzie.
    Te 'black' w parametrach produktu to oczywiście kolor samej taśmy, nie LEDów.
  • #4
    radiosimon
    Poziom 28  
    Problemem przy sterowaniu programowym jest np. obsługa enkodera czy innych przerwań. Wtedy efekty już ciężej zrobić bez "mignięć i przycięć". Ale ogólnie cena/jakości i możliwości wymiata.
  • #5
    fotomh-s
    Poziom 20  
    Jedyne co mi się nie do końca podoba to minimalna jasność diod (przy 0x01 na kanał), mogła być nieco mniejsza. Ogólnie jednak rzecz biorąc nie ma już sensu stosować zwykłych LEDów RGB, nie opłaca się biorąc pod uwagę wygodę sterowania WS2812 (jedna linia, daisychain). U Chińczyka te WSy są tańsze niż zwykły LED (nie RGB) w sklepach stacjonarnych u nas.