[PROJEKT] KAmodWS2812 + KAmduinoUNO
Diody RGB są powszechnie wykorzystywane w oświetleniu pomieszczeń, reklamach świetlnych, ozdobach i wielu innych urządzeniach elektronicznych. Można je również znaleźć w systemach Ambilight niektórych producentów sprzętu RTV. Dużym postępem oraz zwiększeniem zainteresowania tematyką diod RGB, stał się moment wprowadzenia na rynek diod LED 5050 z wbudowanym sterownikiem WS2812.
Najważniejszą funkcją sterownika jest możliwość łączenia szeregowo dużej ilości diod w łańcuchy. Sterowanie odbywa się poprzez wysłanie specjalnym protokołem zestawu danych zawierających kolory składowe w formacie RGB. Wysyłane jest tyle pakietów danych ile jest diod w szeregu. Ciąg danych składający się z pakietów przechodząc przez każdy sterownik diody w łańcuchu, skraca się o pierwszy „zestaw”, który zostaje wykonany w diodzie, a następnie pozostała część ciągu zostaje przesłana dalej do kolejnych diod. W taki oto prosty sposób odbywa się sterowanie całym łańcuchem.
W przykładzie posłużymy się biblioteką od Adafruit do obsługi tych właśnie diod. Proponuję pobrać bibliotekę poprzez polecenie „Zarządzaj bibliotekami…” w menu „Szkic” -> „Dołącz bibliotekę”, programu Arduino (Rysunek 1).
Następnie w menedżerze bibliotek w prawej górnej części ekranu wpisujemy „Adafruit NeoPixel”, oraz wybieramy „Adafruit NeoPixel by Adafruit Wersja 1.0.6” i klikamy przycisk „Instaluj”. Po zakończeniu instalacji możemy przejść do nowego pliku i rozpocząć pisanie programu, Rysunek 2.
Biblioteka udostępniona przez Adafruit zawiera kilka funkcji ułatwiających korzystanie z diod podłączonych do Arduino. Poniżej przedstawiam listę funkcji oraz ich krótki opis.
- setPin() – zmiana pinu sterującego,
- setBrightness() – ustawienie jasności świecenia,
- clear() – wygaszenie całego łańcucha,
- getPixels() – pobranie wskaźnika do danych, po 3 bajty dla każdej diody,
- getBrightness() – pobranie ustawionej jasności świecenia,
- numPixels() – pobranie ilości diod w łańcuchu,
- getPixelColor() – pobranie koloru wybranej diody,
- canShow() – zwraca wartość true, jeżeli możliwe jest wysyłanie danych
Program rozpoczynamy od dołączenia biblioteki Adafruit do naszego programu
#include <Adafruit_NeoPixel.h>
Następnie definiujemy sobie dwie zmienne określające liczbę diod w łańcuchu oraz Pin GPIO, do którego podłączone jest wejście DI diod LED.
const uint8_t LICZBA_DIOD_RGB = 8; const uint8_t PIN_GPIO = 2;
Kolejnym krokiem jest utworzenie nowego obiektu Adafruit_NeoPixel o nazwie strip, jest to obiekt reprezentujący łańcuch RGB w programie. Jako argumenty funkcji tworzącej nowy obiekt podajemy wcześniej zdefiniowaną liczbę diod LED, Pin GPIO oraz format danych, w naszym przypadku NEO_GRB i częstotliwość pracy magistrali komunikacyjnej NEO_KHZ800. Ostatnie dwa parametry podajemy razem jako jeden argument, łącząc je symbolem „+”.
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LICZBA_DIOD_RGB, PIN_GPIO, NEO_GRB + NEO_KHZ800);
W funkcji konfiguracyjnej (setup) programu uruchamiamy transmisję wywołując funkcję „begin()” oraz wykonujemy funkcję „show()” w celu zgaszenia wszystkich diod.
strip.begin(); strip.show();
Poniższy program realizuje funkcje wyświetlania pojedynczo diod LED w wybranych kolorach oraz przedstawia przykład wywołania innego koloru niż 3 podstawowe składowe.
W tym celu wykorzystywana jest funkcja setPixelColor, której argumentami są: numer diody w łańcuchu, parametr jasności świecenia koloru czerwonego, parametr jasności świecenia koloru zielonego i parametr jasności świecenia koloru niebieskiego. Po każdym ustawieniu koloru należy wykonać funkcję „show” w celu wysłania danych do diody.
void loop() { // *** WSZYSTKIE DIODY CZERWONE *** for(int i=0; i<LICZBA_DIOD_RGB; i++) { strip.setPixelColor(i, 255, 0, 0); strip.show(); delay(500); } delay(3000); for(int i=0; i<LICZBA_DIOD_RGB; i++) { strip.setPixelColor(i, 0, 0, 0); strip.show(); delay(500); } // *** WSZYSTKIE DIODY ZIELONE *** for(int i=0; i<LICZBA_DIOD_RGB; i++) { strip.setPixelColor(i, 0, 255, 0); strip.show(); delay(500); } delay(3000); for(int i=0; i<LICZBA_DIOD_RGB; i++) { strip.setPixelColor(i, 0, 0, 0); strip.show(); delay(500); } // *** WSZYSTKIE DIODY NIEBIESKIE *** for(int i=0; i<LICZBA_DIOD_RGB; i++) { strip.setPixelColor(i, 0, 0, 255); strip.show(); delay(500); } delay(3000); for(int i=0; i<LICZBA_DIOD_RGB; i++) { strip.setPixelColor(i, 0, 0, 0); strip.show(); delay(500); } // *** RGB *** for(int i=0; i<255; i++) { strip.setPixelColor(0, i, (255-i), i); strip.show(); delay(50); } }
Myślę że program jest na tyle czytelny, że każdy sobie z nim poradzi. Zachęcam do eksperymentowania z kolorami diod, programowania ciekawych animacji i efektów świetlnych z wykorzystaniem wymienionych funkcji.
Działanie programu prezentuje poniższy film