[031] Czym jest standard WS2812?

[031] Czym jest standard WS2812?

Diody RGB zrobiły ogromną karierę i można je spotkać wszędzie. Czasem są elementem przemyślanej estetyki, często też niestety – kiczu, mrugając bez opamiętania wszystkimi możliwymi kolorami. Diody te powstały w chwili, gdy technologia oferująca niebieską barwę stała się przystępna cenowo i jakościowo. Wystarczyło teraz zamknąć trzy struktury w kolorach podstawowych: niebieską i już od dawną dostępne: zieloną i czerwoną w jednej obudowie, by zmieniając proporcje mocy świecenia każdej oferować dowolną już barwę.


Teoria jednak swoje, a praktyka swoje. Okazuje się, że z tą dowolnością różnie bywa i często kolory są cukierkowe, a o dobrej bieli (która powinna mieć miejsce przy maksymalnej emisji każdej ze struktur) można zapomnieć. Producenci prześcigają się w udoskonalaniu tych diod i czasem wychodzi im to lepiej, czasem gorzej.

O klasycznych diodach RGB opowiem kiedy indziej. Dziś wspomnę tylko, że każdą ze struktur winien był zająć się mikrokontroler albo jakiś specjalizowany układ, co w przypadku systemów rozbudowanych było mało praktyczne. By to usprawnić, powstał kolejny standard, zwany tytułowym WS2812, od diod, które używały go na początku. Tutaj nie trzeba dbać o każdą ze struktur, tym zajmuje się układ znajdujący wewnątrz diody. Jest na tyle skomplikowany, by oferować dowolną barwę, nasycenie i jasność na podstawie znormalizowanego rozkazu płynącego złączem szeregowym. Wynika z tego, że każda taka dioda ma tylko wyprowadzenia zasilania i wejście danych. Mało tego, ma także wyjście do następnej diody, więc elementy te można łączyć w praktycznie nieograniczone łańcuchy, używając jedynie trzech przewodów i jednej linii danych.

Schemat połączeniowy zatem jest niezwykle prosty: wyjście z diody n łączymy z wejściem diody n+1, a wszystkie wejścia zasilające i masowe łączymy razem. Ile diod możemy użyć? Tysiące. Nie ma w zasadzie ograniczeń, acz w pewnym momencie transmisja będzie trwać już na tyle długo, że przekroczy granicę kilkudziesięciu fps i skomplikowane animacje staną się utrudnione.

Na schemacie widać kondensatory, umieszczone przy każdej diodzie. Nie ma potrzeby w rzeczywistości stosować ich tyle, lecz na dłuższych łańcuchach warto co jakiś czas użyć takiego. Na pewno trzeba je mocować na początku i na końcu każdego fragmentu łańcucha, który jest fizycznie oddalony od pozostałych. W przypadku dużej ilości diod polecam także prowadzić niezależne połączenia zasilania do poszczególnych fragmentów, by uniknąć spadku napięcia na łańcuchach długich.

Na płytce edukacyjnej TME-EDU-ARD-2 osadzono pięć takich struktur połączonych w łańcuch, z tym że użyto tutaj jeszcze rezystorów na linii danych pomiędzy poszczególnymi diodami. Ich użycie jest nie jest obligatoryjne. Producent zaleca za to stosowanie rezystora na wejściu pierwszej diody. Spróbujmy teraz opanować podstawy.

#include <Adafruit_NeoPixel.h>                                             // Dołącz bibliotekę sterującą diodami WS2812
Adafruit_NeoPixel dioda = Adafruit_NeoPixel(1, 12, NEO_GRB + NEO_KHZ800);  // Ustaw parametry zestawu: jedna dioda na dwunastym porcie.
void setup() {
  dioda.begin();                                   // Przygotuj sterowniki znajdujące się w diodach do inicjalizacji.
  dioda.show();                                    // Wykonaj powyższe polecenie.
  dioda.setPixelColor(0, dioda.Color(255, 0, 0));  // Ustaw kolor czerwony diodzie zerowej
  dioda.show();
}
void loop() {}

Jak zawsze zaczniemy od dołączenia biblioteki, tym razem o nazwie Adafruit_NeoPixel. Powinna być już w zestawie, więc prawdopodobnie nie trzeba będzie jej ściągać. Zaraz potem należy zadeklarować parametry świecącego łańcucha, a właściwie jednej diody, bo na początek zajmiemy się wyłącznie podstawami.

Adafruit_NeoPixel dioda = Adafruit_NeoPixel(1, 12, NEO_GRB + NEO_KHZ800);

dioda to nazwa naszego jednodiodowego łańcucha. Jedynka oznacza, że mamy tylko jedną diodę. Dwunastka – że linia danych podłączona jest do portu dwunastego, a pozostałe parametry dotyczą konkretnych diod i w razie potrzeby należy stosownych informacji poszukać w dokumentacji biblioteki. Typowe ledy WS2812 nie będą wymagały tutaj zmian.

Cały nasz pierwszy szkic będzie tylko testem transmisji danych między Arduino, a diodą. Współpracę należy zacząć zawsze od inicjalizacji sterowników znajdujących się w strukturach dioda.begin() – oczywiście jednorazowo. Kolejna linia dioda.show() będzie konieczna za każdym razem, gdy będziemy chcieli uzyskać efekt tego, co wykonamy w linii znajdującej się przed nią. Jest to jakby rodzaj takiego entera zatwierdzającego. W tym przypadku potwierdzamy chęć dokonania inicjalizacji.

Teraz spróbujemy zaświecić czerwoną strukturę diody. Do tego służy instrukcja dioda.setPixelColor(0, dioda.Color(255, 0, 0)). dioda – to nazwa naszego łańcucha, zadeklarowanego na początku. setPixelColor oznacza chęć ustawienia konkretnego koloru. 0 to numer diody w łańcuchu, w tym wypadku jest to jedyna dioda. Następnie mamy znowu nazwę naszego łańcucha diod oraz konkretne dane w systemie RGB, czyli trzech barw podstawowych: czerwonej, zielonej i niebieskiej. Każda z nich może przyjąć ośmiobitową wartość. Jeśli zechcemy koloru czerwonego, wystarczy wystawić 255 na pozycji pierwszej, a zera na pozostałych dwóch. Na końcu znowu musimy zatwierdzić poleceniem dioda.show() to, co wysłaliśmy wcześniej i dopiero w tym momencie dioda zaświeci się na czerwono. Kompilujemy, sprawdzamy i – działa.

W kolejnym artykule zagłębimy się w możliwości sterowania tymi diodami, bo jest ich wiele i czasem są nieoczywiste.

Płytka edukacyjna TME-EDU-ARD-2Płytka edukacyjna TME-EDU-ARD-2Sprawdź tutaj

Przeczytaj również

Nasi partnerzy

TMETech Master EventTME EducationPoweredby
Copyright © 2024 arduino.pl