Matryca RGB WS2812B – Najłatwiejszy sposób na kontrolowanie RGB

Diody RGB od kiedy istnieją pomagają elektronikom tworzyć ciekawie wyglądające układy. Jakiś czas temu najłatwiejszym sposobem na użycie ich było sterowanie każdym kolorem za pomocą osobnego pinu.

 Gdy powstał chip WS2812B pozwolił na sterowanie diodami RGB za pomocą  jednego pinu elektronicy błyskawicznie dostrzegli ułatwienie w tej konstrukcji. Dzisiaj zajmiemy się wysterowaniem matrycy która składa się z 64 diod led. Niech stanie się światłość!

Czym jest układ WS2812B?

Układ ten wykorzystany jest do możliwie najłatwiejszego wysterowania diod RGB. Ze względu na małe rozmiary często wlutowany jest w samą diodę SMD. Chip poza samym wyborem koloru pozwala na sterowanie jasnością świecenia diody oraz odróżnienie każdej diody.

Podłączenie matrycy do Arduino

Matryca pobiera sporo prądu, w końcu jedna dioda to około 30mA przy pełnej jasności, posiadając 64 diody musimy zasilić matrycę prądem o wartościach 5V i 2.1 A aby móc bezpiecznie korzystać z urządzenia. Dlaczego bezpiecznie? Ponieważ Arduino ma zbyt małą wydajność prądową i podłączenie urządzenia o tak dużym apetycie na prąd mogłoby się zakończyć uszkodzeniem płytki. Aby umożliwić łatwe podłączenie matrycy do zasilania i płytki sterującej skorzystamy z modułu zasilającego do płytek stykowych do którego podłączony będzie zasilacz 12V 2.5A. Przed montażem układu musimy przylutować goldpiny do matrycy. Cały układ powinien wyglądać jak poniżej, podłączenie jest proste, DIN podłączamy do pinu 6 Arduino, a GND i VCC do listwy zasilającej płytki stykowej.

Gdy mamy już zbudowany układ możemy przejść do kwestii programowych, zaczniemy od wybrania biblioteki. Wybierzemy bibliotekę dostarczoną przez firmę Adafruit, czyli NeoPixel. Gdy zaimportujemy bibliotekę do IDE możemy zająć się pisaniem pierwszego kodu. Nasz pierwszy program będzie miał za zadanie włączać po kolei po jednym ledzie. Dodatkową funkcją będzie wyświetlanie każdej diody w innym kolorze. Jako kolor bazowy wybierzemy czerwony, może być też zielony albo niebieski. Ze względu na to, że kolor ustawiamy tutaj przy pomocy palety RGB(RED, GREEN, BLUE) warto aby był to jeden z tych kolorów, tak będzie najłatwiej! 

Jak wiemy kolor czerwony w palecie RGB to (255,0,0), aby zmiany koloru były bardziej widoczne z każdą diodą w przypadku koloru zielonego wartość zwiększy się dwukrotnie, a w przypadku koloru niebieskiego trzykrotnie. Czyli pierwsza dioda będzie miała wartość(255,0,0), 10 dioda (255, 20, 30), a ostatnia czyli 64 (255, 128, 192).  

Program powinien wyglądać jak poniżej.

#include <Adafruit_NeoPixel.h>
#define PIN 9 //Pin sterujący podpięty do DIN w matrycy
#define DIODY 64 //Liczba diod
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(DIODY, PIN, NEO_GRB + NEO_KHZ800);
void setup()
{
  pixels.begin(); // Inicjalizacja biblioteki
}
void loop()
{
  for(int i=0; i<DIODY; i++)
  {
    pixels.setPixelColor(i, 255, i*2, i*3); // Dioda "i" oraz kolor(stałe 255, i*2, i*3)
    pixels.show(); // Wysylamy dane do lancucha
    delay(500); //przerwa 0.5 sek do zaświecenia kolejnej diody
  }
}

Jeśli poprzedni kod zadziałał możemy przejść do następnego programu, tym razem postaramy się wyświetlić obiekt, który po kliknięciu przycisku zmieni kolor i wielkość. 

Układ za bardzo się nie zmieni, dodamy tylko przycisk z rezystorem 10KOhm i paroma przewodami, tak aby układ wyglądał jak na grafice poniżej. 

Jeśli chodzi o program to następuje tutaj delikatnie większa zmiana. Dodaliśmy tablicę w której zapisane są numery poszczególnych diod. Podświetlenie tych ledów spowoduje wyświetlenie obiektu. Oczywiście zamiast tworzyć bibliotekę możemy wypisywać kolejno numery diod i przypisywać pojedynczo wartości, ale po co sobie utrudniać? Kod powinien wyglądać jak poniżej.

#include <Adafruit_NeoPixel.h>
#define PIN 6 //Pin sterujący podpięty do DIN w matrycy
#define DIODY 64 //Liczba diod
#define piksele 24//liczba diod które mają się zaświecić
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(DIODY, PIN, NEO_GRB + NEO_KHZ800);
byte ledy[]={3,4,5,6,10,15,17,19,22,24,25,28,29,32,33,36,37,40,42,47,51,52,53,54};//w tablicy umieszczamy numery diod które chcemy zapalić
void setup()
{
  pixels.begin(); // Inicjalizacja biblioteki
  pinMode(7, INPUT);
}
void loop()
{
  if(digitalRead(7==HIGH))//jeśli przycisk jest wciśnięty
  {
    for(int i=0; i<piksele; i++)//podaje kolejno wartości z tablicy
  {
    pixels.setPixelColor(ledy[i], 255, 0, 0);//ledy 
    pixels.show(); // Wysylamy dane do lancucha
    delay(50);
  }
  }
  else
  {
     for(int i=0; i<piksele; i++)
  {
    pixels.setPixelColor(ledy[i], 0, 255, 0); 
    pixels.show(); // Wysylamy dane do lancucha
    delay(50);
  }
  }
  delay(500);
}

To co zostanie wyświetlone zobaczą tylko osoby które wgrają program u siebie! Jak widać obsługa matrycy LED opartej na diodach RGB ze sterownikiem WS2812B jest łatwa i przyjemna. Z pewnością jest to dużo lepsze rozwiązanie niż sterowanie pojedynczymi diodami RBG.

Programy i biblioteki:

Materiały użyte w artykule:

W Nettigo znajdziesz też inne tego typu panele z WS2812. Zasada podłączenia jest analogiczna: