SantyagoSantyago
YouTube RSS Google+ Facebook GitHub

Newsletter Arduino

Zapisz się do Newslettera, aby otrzymać informację o nowych wpsiach w dziale Arduino!

Arduino poradnik

Wstęp

Teoria

Biblioteki

Komponenty

Czujniki i sensory

Rozwiązania i algorytmy

Narzędzia

Mikrokontrolery i Arduino IDE

Arduino i klony

Poradniki wideo

Sprzęt dostarczają

Reklama na Blogu

Najnowsze poradniki

Ostatnie komentarze

Popularne wpisy

Facebook

Google+

Ostatnie fotografie

polskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorywieliczka-szyb-danilowicza

Diody LED ze sterownikem WS2811/WS2812

Tytuł tego wpisu może być odrobinę mylący, ale za kilka chwil powinienem wszystko wyjaśnić. Będąc bardzo dokładnym,  WS2812 jest inteligentnym sterownikiem LED z wbudowanym źródłem światła - tak przynajmniej nazywa to producent. Jednak jeśli spojrzymy na to z drugiej strony, to jest nic innego jak dioda RGB 5050 z wbudowanym już sterownikiem WS2811 :) Trochę zakręcone prawda? Ale tak właśnie jest.

Jakiś czas temu były dostępne różnego taśmy LED ze sterownikiem WS2801. Składały się one oddzielnie z diody RGB oraz małego układu SMD WS8201 pełniącego rolę sterownika. Tak więc można śmiało powiedzieć, że WS2812 jest kontynuacją tego produktu, jako krok w stronę miniaturyzacji sterowanego oświetlenia LED.

Czym zatem jest sterownik WS2811 i co nam daje?

Ogromną zaletą tego układu jest jego zdolność szeregowego łączenia, a także możliwość sterowania praktycznie dowolną ilością diod RGB tylko za pomocą pojedynczego pinu cyfrowego mikrokontrolera za pośrednictwem magistrali 1-Wire. Sposób połączenia diody RGB z takim układem wygląda następująco:

Tak więc widzisz już, że WS2812 to tak naprwdę sterownik WS2811 zamknięty w obudowie diody RGB:

Dwie wersje - WS2812 i WS2812B

Na rynku dostępna jest niezliczona ilość modułów, taśm, linijek i shieldów wyposażonych w WS2182 - jednak to na co powinieneś zwrócić uwagę, to czy jest to odświeżona wersja oznaczona literą "B". Jeśli nie jest to nigdzie napisane, bez problemu rozpoznasz ją ilości "nóżek". Standardowa wersja WS2812 posiada sześć nóżek, natomiast wersja "B" tylko cztery. Odmienna jest również struktura samej diody:

Po lewo WS2812 / Po prawo WS2812B

Dlaczego warto wybrać wersję WS2812B? Po pierwsze - mniej lutowania :) Przy ilości 100 diod na pewno to docenisz. Ale na poważnie - różnic jest znacznie więcej. Najważniejszą z nich jest zabezpieczenie przed odwrotnym podłączeniem zasilania diody, gdzie w przypadku standardowej wersji kończyło się to upaleniem elementu.

Nie bez znaczenia jest również fakt, że WS2812B są jaśniejsze i zapewniają lepszą powtarzalność kolorów - innymi słowy, przy większej ilości diod, które świecą tą samą ustawioną barwą, nie będą od siebie odbiegać. Udoskonaleniu uległa również sama struktura diody, którą doskonale widać na zdjęciach powyżej - sterownik został oddzielony i odseparowany od części z diodami składowymi, zapewniając chociażby lepsze odprowadzanie ciepła, co przełoży się na dłuższą żywotność.

Sposób łączenia WS2812B

Łączenie ze sobą WS2812B nie może być już bardziej proste. Wszystkie diody podłączamy do zasilania +5V i masy, gdzie dodatkowo równolegle dodajemy kondensator o pojemności 100nF. Na pin DIN pierwszej diody podajemy sygnał z mikokontrolera, a wyjście DOUT łączymy z wejściem DIN kolejnej diody.

To jednak nie wszystko :) Pomimo tego, że schemat aplikacyjny przewiduje tylko kondensator na zasilaniu, to bezwzględnie należy pamiętać o kilku rzeczach, które pozwolą uniknąć Ci sytuacji usmażenia pierwszej diody w łańcuchu, gdzie nie pozostanie nic innego jak jej wymiana lub skrócenie taśmy. Dioda może być zasilana napięciem z dość szerokiego przedziału 3.5 ÷ 5.3V, to należy pamiętać, że wejście sterujące DIN jest już mało toleranycjne - wtrzyma tylko 0.5V więcej niż zasilanie. Dlatego zadbać należy o kilka spraw:

  • Nie przekraczaj napięcia zasilania powyżej 5V,
  • Dodaj kondensator elektrolityczny o pojemności od 100µF do 1000µF (np.: 6.3V lub wyższy) przy zasilaniu pierwszej diody,
  • Dodaj rezystor o wartości od 300Ω do 1kΩ pomiędzy mikrokontrolerem, a pierwszym pinem DIN. Rezystor ten umieść jak najbliżej diody,
  • Postaraj się możliwie skrócić odległość pomiędzy mikrokontrolerem, a pierwszą diodą,
  • Nie podłączaj diod przy włączonym zasilaniu. Jeśli już musisz, rób to w kolejności: masa, zasilanie, linia sterująca, a odłączaj w odwrotnej kolejności
  • Jeśli diody zasilasz z oddzielnego źródła zasilania, najpierw doprowadź zasilanie do diod, potem do mikrokontrolera,
  • Pamiętaj o zabezpieczeniu antystatycznym :) swetry, polary i inne ubiory łatwo gromadzące ładunek nie są wskazane

Te kilka punktów sprawi, że będziesz spał spokojnie i unikniesz frustracji np. przy konieczności wycięcia diody z taśmy i przelutowania wtyczek - tym bardziej, jeśli taśma jest w wodoszczelnej otulinie.

Gotowe moduły i taśmy z WS2812B

Szeorką ofertę z wszelkimi modułami i taśmami wyposażonymi w diody WS2812/B znajdziecie w sklepie elty.pl, gdzie ceny są bardzo atrakcyjne. Poniżej przedstawię tylko niektóre z nich, które osobiście posiadam:

Wodoszczelna taśma 30 diod / 1 metr

Matryca 4 x 8 x 8

Shield dla Arduino

Diody SMD 5050

W sklepie Botland dostaniemy również moduły z pojedynczą diodą lub w formie pierścieni, a także w "tradycyjnej" formie 5mm diody:

Program sterujący

Aby nasze diody ożyły, polecam bardzo dobrą bibliotekę od Adafruit - NeoPixel Library, gdzie wystarczą nam praktycznie trzy funkcje:

  • begin() - do inicjalizacji biblioteki NeoPixel,
  • setPixelColor() - do ustawienia koloru świecenia wybranej diody w łańcuchu,
  • show() - do wysłania danych do naszego łańcucha z diodami

Nasz program będzie wyglądał następująco:

  1. #include <Adafruit_NeoPixel.h>
  2.  
  3. #define PIN 6
  4. #define LICZBADIOD 16
  5.  
  6. Adafruit_NeoPixel pixels = Adafruit_NeoPixel(LICZBADIOD, PIN, NEO_GRB + NEO_KHZ800);
  7.  
  8. void setup()
  9. {
  10.   pixels.begin(); // Inicjalizacja biblioteki
  11. }
  12.  
  13. void loop()
  14. {
  15.   for(int i=0; i<LICZBADIOD; i++)
  16.   {
  17.     pixels.setPixelColor(i, 255, 0, 0); // Dioda "i" oraz skladowe R=255 G=0 B=0
  18.     pixels.show(); // Wysylamy dane do lancucha
  19.     delay(500); // Opoznienie 500ms przed zaswieceniem kolejnej diody
  20.   }
  21. }

W funkcji setPixelColor() oprócz numeru diody i składowych RGB, możemy podać również podać wartość koloru za zwracany przez funkcję Color(). Dzięki temu możemy przechować wartość koloru w jednej zmiennej uint32.

  1. pixels.setPixelColor(i, pixels.Color(255, 0, 0));

Biblioteka NeoPixels oferuje jeszcze szereg innych przydatnych funkcji:

  • setPin() - zmiana pinu sterującego,
  • setBrightness() - ustawienie jasności świecenia,
  • clear() - wygaszenie całego łańcucha,
  • getPixels() - pobranie wkaznika 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, jesli mozliwe jest wyslanie danych

Uruchomienie

Materiał filmowy

Polub ten wpis na Facebook i Google+

http://www.jarzebski.pl/arduino/komponenty/diody-led-ze-sterownikem-ws2811-ws2812.html

Reklama

Komentarze Komentarze
Avatar 1
Sławek Windows 7 / Mozilla Firefox 35.0
04 luty 2015 - 22:32 Brak informacji

Świetna sprawa te diody.Własnie zobaczyłem i zrobiłem na wzór innej lampkę na tych diodach.Jedynie to sam wlutowywałem 10szt. diod na płytkę.
link: .be

Avatar 1
Kamil Windows 7 / Safari 537.36
11 luty 2015 - 18:50 Warszawa

Witaj :)
a czy jednym kodem mozna sterować diodami ws2812 i ws2812b ?

Avatar 2
Korneliusz Linux x86_64 / Mozilla Firefox 34.0
11 luty 2015 - 22:43 Bytom

Pewnie można, transmisja jest ta sama, prędkości też te same (jeśli chcesz w szeregu).

Avatar 1
Sławek Windows 7 / Mozilla Firefox 35.0
13 luty 2015 - 22:02 Brak informacji

Nie tylko jednym kodem,ale jednym przewodem możesz sterować każdą diodę z osobna bez względu na ilość w szeregu.
Zasilanie i przewód sterujący.

Avatar 1
Kamil Windows 7 / Safari 537.36
23 marzec 2015 - 21:22 Warszawa

Witaj :)
wiesz moze czy ten kod uda się uruchomić na ws2812B ?
http://www.instructables.com/id/A-Multicolor-LED-Lamp/

szukam porównuję, i jeśli korzysta z tej samej biblioteki to raczej powinno się udać. prawda ?

Avatar 1
Efekt Fire w oknie zasłoniętym żaluzjami Windows 7 / Mozilla Firefox 36.0
31 marzec 2015 - 22:01 Brak informacji

Pasek 1m. led 2812B pionowo ustawiony z boku okna za żaluzjami.
Słaby film ,gdyż aparat ze starego telefonu.

Avatar 2
Korneliusz Linux x86_64 / Mozilla Firefox 34.0
01 kwiecień 2015 - 20:44 Bytom

Bardzo ładnie ;) gratuluję efektu!

Avatar 1
Mariusz M. Windows / Safari 537.36
14 maj 2015 - 15:42 Brak informacji

Świetna robota!
Gratuluję kreatywności.
Skąd wziąłeś program (bibliotekę), który działa na Arduino z shield\'em oraz ten imitujący ogień?

Avatar 1
Sławek Windows 7 / Mozilla Firefox 38.0
21 maj 2015 - 18:09 Brak informacji

#include

To jest biblioteka i program [fire] w sumie już starszy, ale lepszy niż:

#include

Właśnie robię Big Lampę z tego paska metrowego i mam już napisany program na ponad 13minut efektów.Lampa ma 1.20cm i 60szt.kostek plexi.
Programować nie umiem ,ale z nudów się trochę nauczyłem dla zrobienia kilku urządzeń i tych lamp.

Avatar 1
Sławek Windows 7 / Mozilla Firefox 38.0
21 maj 2015 - 18:17 Brak informacji

Podaje bibliotekę ,gdyż poprzednio nie weszła.Nie pamiętam teraz, gdzie można ja znaleźć i ten program.Trzeba wpisać i szukać w internecie:

include FastLED.h

Adafruit jest słabszy ,jeżeli chodzi o efekt Fire.

Avatar 1
Sławek Windows 7 / Mozilla Firefox 39.0
13 lipiec 2015 - 09:29 Brak informacji

Panie Korneliuszu chcę zapytać, gdzie i jak należy wpisać polecenie zmiany pinu sterującego setPin() na podstawie np: wyżej napisanego programu.Chcę np: sterować dwa komplety WS2812B z jednego programu tak ,aby jeden wykonywał program ,a następnie drugi wąż lub równocześnie.

Tam mamy #define PIN 6 ,więc dodamy #define PIN 5 ,czyli sterowanie jest na 2 węże równocześnie ,ale jak zrobić ,aby najpierw Pin 6 był sterowany ,a później to samo lub inne polecenie wykonał PIN 5.

Avatar 2
Korneliusz Linux Ubuntu / Mozilla Firefox 30.0
13 lipiec 2015 - 13:51 Katowice

Trzeba wykorzystać dwie instancje

Adafruit_NeoPixel pixels1 = Adafruit_NeoPixel(LICZBADIOD1, PIN1, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixels2 = Adafruit_NeoPixel(LICZBADIOD2, PIN2, NEO_GRB + NEO_KHZ800);

i analogicznie wywoływać np.: pixels1.begin() / pixels2.begin() i dla reszty funkcji to samo

Avatar 1
Sławek Windows 7 / Mozilla Firefox 39.0
13 lipiec 2015 - 18:22 Brak informacji

Dziękuje za podpowiedź na razie nie mam na czym sprawdzić.
Filmu do Big lampy niestety nie mogę zrobić ,aby pokazać efekt pracy.
Lampa ma 120cm.wysokości 60 płytek plexi na diodach WS2812B[wąż].
Problem jest z oświetleniem,gdyż muszę daleko oddalić się od lampy aby ująć całą i wtedy jest zbyt mało światła do efektownego nagrania.Tu potrzebna dobra kamera,a światło ledów dałem na ok. 20% mocy i tak na zewnątrz widać jak mocną latarnię.Niestety telefon kamerka mam stary zbyt słaby.Efekty mam też dynamiczne na ponad 10\' np: biegnąca Flaga Polska w różnych kierunkach.

Właśnie myślałem na Cube 3D 8x8x8 ,ale wykorzystać te ledy :
http://allegro.pl/dioda-rgb-apa106-f5-jak-ws2812-neopixel-arduino-i5500394202.html

oraz Arduino Mega ,gdyż jest tam w sumie 69 wyjść i wtedy postawić 64 słupki ledów po 8szt.w pionie.Nie trzeba by było tych układów sterujących co poniżej link do zwykłych RGB:
http://www.instructables.com/id/8x8x8-RGB-LED-Cube-1/?ALLSTEPS

Jak Pan myśli, czy jest to możliwe? Na razie taki wpadł mi pomysł bo na tych WS mam gotowe programy[na zwykłych RGB zbyt dużo pracy z układami i na WS bardziej rozumiem kod i umiem coś tam sam zrobić lub zmienić] tylko trochę wprowadzić efektów w boki lewo i prawo,gdyż do góry i w dół te węże WS2812B pracują.

Avatar 1
Mateusz Mac OS X / Safari 600.1.4
20 lipiec 2015 - 16:03 Brak informacji

Super poradnik :) może się ktoś orientuje jak spiąć diody 6 pinowe
Posiada ona dodatkowo pin VCC nie mam pojęcia po co.

Avatar 1
Sławek Windows 7 / Mozilla Firefox 39.0
03 sierpień 2015 - 00:50 Brak informacji

Lampa na pasku led WS2812B 60 led.

-upload_owner

Avatar 1
Problem panel 60x5 Windows 7 / Mozilla Firefox 39.0
07 sierpień 2015 - 13:34 Brak informacji

Witam, mam panel 60x5 zrobiony z 5m paska z led ws2812b i!
Chciał bym wyświetlić na tym napisy, ale kożystając z biblioteki :
#include
#include
#include

ucina mi literki gdyż powinno być minimum 7-8 lini.
Czy macie jakieś rozwiązanie inne niż dokupienie dodatkowych lini? Mniejsza czcionka itp?
Napisy mogą się wyświetlać w poziomie lub w pionie, bez różnicy.
aktualnie robię napisy wyświetlając pojedyńcze piksele ale jest do żenujące przy pierwszej lepszej zmianie napisu...(jedna litera to min. 15min klepania..)

Avatar 1
Ryszard Windows / Safari 537.36
10 sierpień 2015 - 23:10 Brak informacji

Czy jest do wykonania w warunkach domowych taka kurtyna ? powiedzmy 20X20 rurek, w sumie 400 rurek no i w każdej z 20-30 diod. 12 tys diod razy 4 luty na każdej diodzie 48 tys lutów.

Avatar 1
Sławek Windows 7 / Mozilla Firefox 39.0
12 sierpień 2015 - 11:02 Brak informacji

Wszystko jest do wykonania.Kasa robi swoje.Nic za darmo nie ma.
Takimi większymi projektami ręcznie ciężko zrobic program.Zbyt czasochłonne i wiedza oraz wyobraźnia potrzebna.

Tutaj z pomocą idą sterowniki fabryczne działające z programem do obsługi i to wszystko co sobie wymyślisz w programie na ekranie zapisujesz na kartę SD i już masz.Na przykład na matrycy WS2812B twoje zdjęcie i co sobie zapragniesz dowolne efekty.Podstawa to kasa ,bo tanie to nie jest nawet kupując w Chinach.Przykład działania sterowników:

Avatar 1
Sławek Windows 7 / Mozilla Firefox 39.0
11 sierpień 2015 - 21:28 Brak informacji

Ciekawy efekt plonącej wieży.

.be

Avatar 1
Mateusz Windows 7 / Mozilla Firefox 39.0
13 sierpień 2015 - 15:17 Warszawa

A jak zgrać projekt z jinx do arduino aby nie trzeba było na bierzącu wysyłać sygnału z komputera?

Avatar 1
Zdzisiek Windows 7 / Safari 537.36
20 październik 2015 - 23:08 Warszawa

A jaki prąd pobiera jedna dioda ze sterownikiem ws2812B, w jaki sposób to określić/wyliczyć? W datasheecie nie ma, jest w datasheecie ws2812 że pobór jest 18mA.

Dziękuję za odpowiedź.

Avatar 2
Korneliusz Linux Ubuntu / Mozilla Firefox 41.0
24 październik 2015 - 02:38 Bytom

To zależy :) zakładając że kanał w maksymalnej jasności pobiera 20mA, to zapalając dany piksel na biały kolor wyjdzie x3 = 60mA. 60mA * ilość diod.

Trzeba jednak założyć maksymalny próg, pomimo tego, gdy nie planujemy świecić wszystkimi jednocześnie na biało

Avatar 1
B3ta30k Android 4.4 / Safari 534.30
31 grudzień 2015 - 13:45 Brak informacji

Witam

Takie pytanie jak by się wziąć za budowę układy który działa by podobnie ale pod dźwięk, bo powiem szczerze ogrania em trochę temat ale raczej spalił na panewce.
Dziękuję za jakiekolwiek info.

Avatar 1
zen Mac OS X / Safari 537.36
03 luty 2016 - 23:03 Nowy Tomyśl

Ciekawy artykuł, ale "po lewo" i "po prawo" to się nie godzi ;)

Avatar 1
Kuba Windows / Mozilla Firefox 43.0
07 luty 2016 - 06:29 Brak informacji

Witam serdecznie.
Zakupilem niedawno arduino nano ( a raczej jego klon ) oraz diody w tradycyjnej formie 8mm. chcę zbudować coś takiego jak tu . Jednak na początek w celu nauki połączyłem jedynie pięć takich diodek, po włączeniu zasilania wszystko prawidłowoświeci jednostajnym kolorem niebieskim, co niby ma oznaczać ze podłączenie jest prawidłowe. Problemy zaczynają się na etapie jakiego kolwiek zaprogramowania tego wszystkiego, nic z tego nie rozumiem, jak się do tego zabrać ? często mi wyskakuję błąd kopiowania , kompilacji. jak ożywić moje diody ???

Avatar 1
gro Windows 7 / Safari 537.36
10 kwiecień 2016 - 12:13 Brak informacji

Polaryzacja. pewnie już sobie z tym poradziłeś, ale być może ktoś nowy będzie czytać wątek. Prosta sprawa - obróć +5V i GND na wejściu i od razu zacznie działać jak trzeba

Avatar 1
Stef Mac OS X / Safari 537.86.4
10 kwiecień 2016 - 21:54 Warszawa

Witam. Mam problem, posiadam diody APA106 i przy starcie zanim zacznie dzialać program na arduino wszystkie swiaca na niebiesko bardzo jasno, dopiero po sekundzie, dwoch, diody gasna gdy w kodzie wywalana zostanie komenda pixels.begin(). czy mozna cos z tym zrobic?

Avatar 1
art Mac OS X / Safari 601.1.46
08 maj 2016 - 15:03 Poznań

A jak radzicie sobie z zasilaniem - taki 5m pasek to 10A - 50W.. i przy 5V prądy spore są.. jakieś pomysły?

Avatar 1
Xennon Windows XP / Mozilla Firefox 45.0
21 maj 2016 - 14:27 Brak informacji

No właśnie, również jestem ciekaw z racji tego, że sam potrzebuję zasilić prawie 60m diód (4500szt) WS2812B, i w sumie nie wiem jak się za to zabrać, a do tego sterowanie sam arduino pewnie sobie z tym nie poradzi.

Avatar 1
DJ First Aid Mac OS X / Safari 601.7.7
18 sierpień 2016 - 19:35 Brak informacji

Witam,
w zależności od fizycznej konfiguracji i budowy punktów świetlnych ( paski led, ledy osobne) podzielić na sekcje, paski zasilić w kilku miejscach aby poradzić sobie ze spadkami napięć na odcinkach, w przypadku kilku zasilaczy wszystkie obwody obwody połączyć wraz ze sterownikiem wspólnym minusem ( powinno to wyeliminować zakłócenie). NIE ZASILAĆ 1-go OBWODU 2-ma ZASILACZAMI !!!

Avatar 1
DJ First Aid Mac OS X / Safari 601.7.7
18 sierpień 2016 - 19:39 Brak informacji

Witam,
Pytanie programowe - kodowanie.
Jak napisać kod:
Aby po przyciśnięciu (impuls) start programu nr 1,
po kolejnym naciśnięciu ( impuls) start program 2?
Ktoś podpowie.
Sterownik - Andurino Nano
Led WS2812B szt 30 - 144

Skomentuj wpis