LinkedIn YouTube Facebook
Szukaj

Newsletter

Proszę czekać.

Dziękujemy za zgłoszenie!

Wstecz
SoM / SBC

[PROJEKT] KAmodWS2812 + KAmduinoUNO

kamodws2812

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.

kamodws2812-8-modul-z-osmioma-diodami-rgb-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).

Rys. 1. Menu menedżera bibliotek

Rys. 1. Menu menedżera bibliotek

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.

Rys. 2. Menedżer bibliotek

Rys. 2. Menedżer bibliotek

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

Autor: Jakub Kuryło