sobota, 25 czerwca 2016

[25] Arduino - Moduł Neopixel WS2812B 8xLED RGB

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.

Rys. 1. Neopixel 8x LED RGB WS2812 [1]

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:

  1. #include <Adafruit_NeoPixel.h>
  2. #define Polaczenie  6
  3. #define Liczba   8
  4. Adafruit_NeoPixel diod = Adafruit_NeoPixel(Liczba, Polaczenie, NEO_GRB + NEO_KHZ800);
  5. int czas = 1000;
  6. void setup()
  7. {
  8.   diod.begin();
  9. }
  10. void loop()
  11. {
  12.   for(int i=0; i<Liczba; i++)
  13.   {
  14.     diod.setPixelColor(i, diod.Color(50,150,100));
  15.     diod.show();
  16.     delay(czas);
  17.   }
  18. }

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