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
1 |
#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.
1 2 |
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 “+”.
1 |
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.
1 2 |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
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