Istnieje kilka rodzajów pasków/układów LED, ale można użyć tego opartego na sterowniku WS2811. Jednakże jego odpowiedniki WS2812, WS2812b, oraz WS2813 mogą być również użyte. Magistrala protokołu szeregowego używana do adresowania i sterowania diodami LED może być nieco skomplikowana i trudna, ponieważ sterowniki mogą generować całkiem sporo efektów świetlnych i wzorów, takich jak zig zag, tryb random, 7-segmentowy zegar cyfrowy, przewijanie komunikatów, itp. Prototyp opracowany przez autora pokazano na fotografii powyżej.
Oświetlenie LED NeoPixel dostępne na rynku jest zazwyczaj drogie. Zastosowanie w tym projekcie sterownika WS2811 pozwala na obniżenie kosztów. Diody NeoPixel LED występują w wielu różnych gęstościach pikseli i formach, poza tradycyjną taśmą LED, takich jak pierścienie, matryce i kilka innych typów pojedynczych pikseli, jak pokazano na fotografii 1.
Sterowanie urządzeniem WS2811 poprzez jego szeregową magistralę sterującą nie jest prostym zadaniem. Wykorzystuje ona połączoną linię zegara i danych do przesyłania instrukcji dla każdej diody LED w dół szeregowej magistrali łańcuchowej, która biegnie od jednego piksela do następnego (rysunek 2).
Oznacza to, że piksele nie mogą być adresowane indywidualnie. Tak więc każda zmiana w jednym z pikseli wymaga odświeżenia instrukcji załadowanych do wszystkich pikseli znajdujących się wyżej. Schematy pinów diod LED RGB pokazane są na rysunku 3.
Sterowanie diodami NeoPixel LED
Wygenerowanie instrukcji dla ciągu sterowników diod WS2811 wymaga bardzo specyficznego i skomplikowanego taktowania, które może sprawić, że kod sterownika będzie nieco kłopotliwy do napisania od podstaw.
Na szczęście, większość ciężkiej pracy została już wykonana i istnieją biblioteki (FastLed.h, NeoPixel.h) dla sterowników pasków LED oraz aplikacje dostępne dla Arduino, Raspberry Pi, LaunchPad i innych popularnych platform. Dla produktów opartych na WS2811 dostępne są nawet procedury sterujące w języku asemblera dla niektórych mikrokontrolerów (MCU), w tym popularnych 8-bitowych układów scalonych firmy Atmel, serii TMS430 firmy TI oraz urządzeń PIC16F15xx firmy Microchip.
Modulacja szerokości impulsu (PWM) jest używana do sterowania diodami LED NeoPixel. Po zresetowaniu kontrolera łańcucha diod LED poprzez przytrzymanie wejścia w stanie niskim przez 50 µs, program MCU rozpoczyna wysyłanie strumienia 24-bitowych kodów kolorów (po 8 bitów dla diod R, G i B) w dół linii. Pierwszy zestaw 24-bitowych wartości RGB jest zapamiętywany i wyświetlany przez pierwszy piksel LED, który następnie pozwala pozostałemu strumieniowi bitów przejść w dół łańcucha. Drugi piksel LED przechwytuje sekwencję bitów RGB, wyświetla ją i tak dalej, aż do osiągnięcia końca łańcucha. Impulsy PWM są zróżnicowane w celu uzyskania wielu kolorów dzięki kombinacji diod LED RGB.
Obwód i działanie
Schemat podłączenia adresowalnych diod LED NeoPixel za pomocą Arduino jest pokazany na rysunku 4. Podłączyć zasilanie 5 V DC do Arduino i taśmy LED NeoPixel. Podłączyć pin +5 V taśmy LED do dodatniego bieguna zasilacza. Nie należy podłączać pinu 5 V Arduino do taśmy LED. Połącz piny DIN i GND taśmy LED odpowiednio z pinem cyfrowym 6 i pinem GND Arduino. Upewnij się, że piny GND taśmy LED, Arduino i zasilacza 5 V DC są ze sobą połączone.
Ten projekt wykorzystuje taśmę LED NeoPixel kompatybilną z 50-RGB i zasilanie 5 V, 5 A z zasilacza DC. Jest to spowodowane tym, że każdy NeoPixel składa się z trzech diod LED (czerwonej, zielonej i niebieskiej), a każda dioda pobiera maksymalny prąd 20 mA. Oznacza to, że dla każdej diody LED NeoPixel wymagane jest natężenie 60 mA (20 mA × 3), jak pokazano na rysunku 2. Całkowite zapotrzebowanie na prąd dla pięćdziesięciu diod LED wynosi więc 50×60 mA=3000 mA, czyli trzy ampery. Tak więc, zasilacz DC powinien mieć co najmniej 3 A lub więcej prądu znamionowego.
Podczas korzystania z zasilacza DC, lub dużego źródła baterii, 1000 µF, 16 V lub wyższy kondensator powinien być dodany przez plus (+) i minus (-) zacisków. Zapobiega to uszkodzeniu diod LED przez początkowy prąd rozruchowy. Dodanie 470-omowego rezystora pomiędzy pinami danych Arduino i NeoPixel LED może pomóc w zapobieganiu skokom na linii danych, które mogą uszkodzić pierwszą diodę LED.
Oprogramowanie
Działanie układu jest kontrolowane przez program załadowany do wewnętrznej pamięci Arduino Uno. Program (main1.ino) jest napisany w języku programowania Arduino. Do kompilacji i wgrania programu użyto Arduino IDE.
ATmega328P na płytce Arduino Uno posiada fabrycznie zaprogramowany bootloader, który pozwala na wgranie do niego nowego kodu bez użycia zewnętrznego programatora sprzętowego. Podłącz płytkę Arduino do komputera i wybierz odpowiedni port COM w Arduino IDE.
Wraz z programem/szkicem Arduino (main1.ino), potrzebny jest również plik nagłówkowy (FastLED.h) do implementacji wielu efektów świetlnych i animacji. Niektóre z głównych funkcji i operacji używanych w kodzie programu to:
#define LED_TYPE WS2812
Jest to funkcja wbudowana w FastLED.h do zadeklarowania konkretnego typu pakietów pikseli LED jak WS2811,WS2812,WS2812b, i WS2813.
#define COLOR_ORDER GRB
W tej funkcji należy określić kolejność sekwencji kolorów zielonego, czerwonego i niebieskiego.
#define BRIGHTNESS 64
W tej funkcji można zmieniać jasność diod LED, której zakres wynosi od 0 do 255 poziomów.
#define NUM_LEDS 50
W tej funkcji określasz ilość użytych diod LED (w tym projekcie 50).
Plik nagłówkowy jest zawarty w pliku FastLed-master.zip. Przed skompilowaniem szkicu należy dołączyć FastLed-master.zip do biblioteki Arduino.
Testowanie
Po wykonaniu połączeń jak pokazano na rysunku 4, załaduj kod źródłowy na płytkę Arduino Uno. Podłącz płytkę Arduino do źródła 5 V DC poprzez kabel USB podłączając ją do komputera PC/laptopa. Następnie podłącz zasilacz 5 V, 5 A DC do paska LED NeoPixel. Zobaczysz różne efekty świetlne LED i wzory na pasku LED.
Uwaga. Podczas podłączania paska LED NeoPixel do źródła zasilania poprzez zasilacz AC/DC, należy najpierw podłączyć zacisk uziemienia (-) przed podłączeniem innych pinów. I odwrotnie, odłączając taśmę od źródła zasilania należy odłączyć zacisk uziemienia jako ostatni.