Ten post chciałbym poświęcić obsłudze modułu Neopixel WS2812B zawierającego 8 diod świecących.
Opis
WS2812B jest to sterownik LED-ów zintegrowany z diodą RGB w obudowie 5050
Parametry modułu są następujące:
Temperatura pracy od 0 do 60 st. C
Zasilanie 5V
Sterowanie odbywa się za pomocą jednego przewodu
Każda dioda posiada 3X PWM 8bit.
Diody stosowane przeze mnie mają 4 wyprowadzenia opisane poniżej:
Pomiędzy masę a zasilanie, tuż przy diodzie, dołączony jest kondensator 100nF, służący do filtracji zasilania. Poniżej przedstawiam schemat łączenia ze sobą diod, zaczerpniętych z dokumentacji [1]:
Dopuszczalne zakresy napięć oraz temperatur [1]:
Programowanie
Do zaprogramowania warto się posłużyć biblioteką NeoPixel. Posiada ona następujące funkcje:
Biblioteka oferuje 4 przykłady, buttoncycle, simple, standtest oraz RGWStandtest.
Programowanie należy rozpocząć od definicji elementu biblioteki. Wygląda ona następująco:
Pierwszy parametr NUMPIXELS określa ile diod jest ze sobą połączonych w szeregu. Drugim elementem jest PIN czyli numer wyprowadzenia do którego zostały podłączone diody. Ostatnim parametrem jest typ flag oraz definiuje sposób podłączenia. Można wybrać następujące parametry:
NEO_RGB - diody są podłączone w szeregu w kolorach RGB
NEO_GRB - diody podłączone w szeregu GRB
NEO_KHZ400 - wybranie częstotliwości pracy 400kHz,
NEO_KHZ800 - wybranie częstotliwości 800kHz, Działa bardzo dobrze dla diod o dużym zagęszczeniu
Inicjalizację pracy biblioteki wykonuje się poprzez jej włączenie w części programu setup(), wykonuje się to następującą komendą:
W celu wybrania diody oraz ustawienia odpowiedniego koloru świecenia wykorzystuje się funkcje setPixelsColor();. Jako parametry podaje się numer diody która ma otrzymać daną wartość koloru, drugi parametr natomiast wywołuje się funkcją Color(), gdzie podaje się wartości RGB jako liczby z przedziału od 0 do 255. Przykładowe wywołanie funkcji może wyglądać następująco:
Następnie po wybraniu diody oraz koloru świecenia należy włączyć ustawienia:
Spowoduje to wyświetlenie wgranych ustawień. Jeśli jej wywołanie nastąpi po włączeniu biblioteki to wszystkie diody będą inicjowane jako wyłączone.
Poniżej przedstawiam krótki program przygotowany dla modułu zawierającego 8 takich diod:
Następną funkcją jaką można wykorzystać jest setBrightness(), pozwala ona zdefiniowanie jasności świecenia. Można jej użyć w następujący sposób:
Należy ją wywołać przed inicjalizacją biblioteki za pomocą funkcji begin().
[1] https://cdn-shop.adafruit.com/datasheets/WS2812B.pdf
Parametry modułu są następujące:
Temperatura pracy od 0 do 60 st. C
Zasilanie 5V
Sterowanie odbywa się za pomocą jednego przewodu
Każda dioda posiada 3X PWM 8bit.
Diody stosowane przeze mnie mają 4 wyprowadzenia opisane poniżej:
- VDD - zasilanie 5V
- DOUT - wyjście sygnału, podawane na kolejną diodę na pin DIN
- DIN - wejście sygnału sterującego
- VSS - czyli GND
Pomiędzy masę a zasilanie, tuż przy diodzie, dołączony jest kondensator 100nF, służący do filtracji zasilania. Poniżej przedstawiam schemat łączenia ze sobą diod, zaczerpniętych z dokumentacji [1]:
Rys. 2. Schemat podłączania diod w szeregu.
Dopuszczalne zakresy napięć oraz temperatur [1]:
- Napięcie zasilania (VDD) 3,5 do 5,3 V
- Napięcie sygnału sterującego (DIN) do +/- 0,5*VDD
- Temperatura pracy (Topt) od -25 do 80 st. C
- Temperatura przechowywania (Tstg) od -40 do 105 st. C
Programowanie
Do zaprogramowania warto się posłużyć biblioteką NeoPixel. Posiada ona następujące funkcje:
- begin() - pozwala na inicjalizację dołączonej biblioteki
- setPixelColor() - daje możliwość ustawienia koloru świecenia wybranej diody w łańcuchu
- show() - pozwala na przesłanie danych do diod RGB
- setPin() - zmiana pinu sterującego
- setBrightness() - wybranie jasności świecenia
- clear() - wygaszenie diod
- getPixels() - pobranie wskaźnika do danych
- getBrightness() - pobranie wybranej wcześniej jasności świecenia diod
- numPixels() - liczba diod jakie są ze sobą połączone
- getPixelColor() - pozwala na pobranie koloru wybranej diody
- canShow() - sprawdza czy jest możliwe wysłanie danych jeśli tak to zwróci wartość true
Biblioteka oferuje 4 przykłady, buttoncycle, simple, standtest oraz RGWStandtest.
Programowanie należy rozpocząć od definicji elementu biblioteki. Wygląda ona następująco:
Adafruit_NeoPixel dioda = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
Pierwszy parametr NUMPIXELS określa ile diod jest ze sobą połączonych w szeregu. Drugim elementem jest PIN czyli numer wyprowadzenia do którego zostały podłączone diody. Ostatnim parametrem jest typ flag oraz definiuje sposób podłączenia. Można wybrać następujące parametry:
NEO_RGB - diody są podłączone w szeregu w kolorach RGB
NEO_GRB - diody podłączone w szeregu GRB
NEO_KHZ400 - wybranie częstotliwości pracy 400kHz,
NEO_KHZ800 - wybranie częstotliwości 800kHz, Działa bardzo dobrze dla diod o dużym zagęszczeniu
Inicjalizację pracy biblioteki wykonuje się poprzez jej włączenie w części programu setup(), wykonuje się to następującą komendą:
dioda.begin();
W celu wybrania diody oraz ustawienia odpowiedniego koloru świecenia wykorzystuje się funkcje setPixelsColor();. Jako parametry podaje się numer diody która ma otrzymać daną wartość koloru, drugi parametr natomiast wywołuje się funkcją Color(), gdzie podaje się wartości RGB jako liczby z przedziału od 0 do 255. Przykładowe wywołanie funkcji może wyglądać następująco:
dioda.setPixelColor(4, dioda.Color(50,150,100));
Następnie po wybraniu diody oraz koloru świecenia należy włączyć ustawienia:
dioda.show();
Spowoduje to wyświetlenie wgranych ustawień. Jeśli jej wywołanie nastąpi po włączeniu biblioteki to wszystkie diody będą inicjowane jako wyłączone.
Poniżej przedstawiam krótki program przygotowany dla modułu zawierającego 8 takich diod:
- #include <Adafruit_NeoPixel.h>
- #define Polaczenie 6
- #define Liczba 8
- Adafruit_NeoPixel diod = Adafruit_NeoPixel(Liczba, Polaczenie, NEO_GRB + NEO_KHZ800);
- int czas = 1000;
- void setup()
- {
- diod.begin();
- }
- void loop()
- {
- for(int i=0; i<Liczba; i++)
- {
- diod.setPixelColor(i, diod.Color(50,150,100));
- diod.show();
- delay(czas);
- }
- }
Następną funkcją jaką można wykorzystać jest setBrightness(), pozwala ona zdefiniowanie jasności świecenia. Można jej użyć w następujący sposób:
diod.setBrightness(100);
Należy ją wywołać przed inicjalizacją biblioteki za pomocą funkcji begin().
Bibliografia
[1] https://cdn-shop.adafruit.com/datasheets/WS2812B.pdf