Kurs Arduino II – #2 – diody RGB (tradycyjne oraz WS2812)

Kurs Arduino II – #2 – diody RGB (tradycyjne oraz WS2812)

Diody świecące znajdują zastosowanie w każdym projekcie. Często oprócz prostej sygnalizacji stanu urządzenia zależy nam na efektach wizualnych.

Wtedy przydają się diody RGB, czyli takie, które mogą świecić w praktycznie dowolnym kolorze. Na przestrzeni ostatnich lat nastąpił tutaj przełom. Prosty test pokaże jaką przewagę mają w sobie diody programowalne (WS2812).

Czym są diody programowalne?

Diody programowalne, nazywane czasem inteligentnymi, mogą być elementami zagadkowymi dla wielu początkujących. Jak objawia się ich inteligencja? Czy potrzebny jest specjalny programator? Aby nie trzymać Was dłużej w niepewności zacznę od krótkiej odpowiedzi na powyższe pytania.

Oczywiście diody nie wymagają żadnego programatora, ich programowalność polega na tym, że każda dioda ma wbudowany układ, z którym będziemy się komunikować. Wewnętrzny sterownik ustawi wszystkie parametry i dioda będzie od tego momentu świeciła na wybrany kolor.

Czarny prostokąt to sterownik znajdujący się wewnątrz diody programowalnej.

Zbliżenie na diodę, średnica okręgu ze zdjęcia w rzeczywistości wynosi około 3 mm. Czarny prostokąt, to sterownik znajdujący się wewnątrz diody programowalnej.

W tej chwili jeszcze nie dla wszystkich jest jasne gdzie jest ta przewaga nad tradycyjnymi diodami, dojdziemy do tego krok, po kroku. Na zachętę efekt świetlny jaki można otrzymać używając właśnie takich nowoczesnych LEDów. Wszystko z użyciem tylko jednego pinu Arduino!

Przykład użycia diod WS2812.

Przykład użycia diod WS2812.

Najpierw pora omówić jednak w praktyce zwykłe diody RGB!

Zestaw elementów do kursu

 999+ pozytywnych opinii  Gwarancja pomocy  Wysyłka w 24h

Części do wykonania ćwiczeć z kursu Arduino (poziom 2) dostępne są w formie gotowych zestawów! W komplecie m.in. diody programowalne, termometry analogowe i cyfrowe, wyświetlacze 7-segmentowe oraz czujnik ruchu (PIR).

Zamów w Botland.com.pl »

Przygotowanie stanowiska do kursu Arduino

Na początku dwie sprawy techniczne. Część czytelników przećwiczyła już materiał z pierwszego poziomu kursu Arduino. Inni dołączyli dopiero teraz. Wierzę jednak, że zgodnie z moimi zaleceniami z poprzedniego artykułu wszyscy są na zbliżonym poziomie. Dlatego pora zadbać o porządek.

Porządek w projektach - podstawka

Im bardziej zaawansowane projekty, tym więcej pojawia się połączeń między płytką stykową, a Arduino. Prowadzi to często do bałaganu i błędów. Dlatego do zestawu elementów dołączona jest uniwersalna podstawka Forbota, która pozwoli nam uporządkować projekty.

Drewniana podstawka pod Arduino dołączona do zestawów,

Drewniana podstawka pod Arduino dołączona do zestawu.

Na spodzie płytki przyklejamy gumowe nóżki, proponuje tak, jak poniżej. Nie zaklejamy żadnych otworów. Przydadzą się, jeśli będziemy dołączać do podstawki dodatkowe moduły lub mocować całość gdzieś na stałe.

Gumowe nóżki przyklejone do podstawki.

Gumowe nóżki przyklejone do podstawki.

Następnie przyklejamy płytkę stykową (na jej spodzie znajduje się samoprzylepna gąbka). Na sam koniec przykręcamy Arduino. Między płytką, a podstawką koniecznie umieszczamy plastikowe dystanse. Nie trzeba korzystać z wszystkich otworów montażowych, wystarczą 2 po przekątnej:

Arduino i płytka stykowa zamontowana na podstawce.

Arduino i płytka stykowa zamontowana na podstawce.

Zewnętrzny zasilacz dla Arduino

Podczas tego kursu stworzymy projekty, które będą mogły normalnie funkcjonować - nie będą to jedynie chwilowe dema. Dlatego zasilanie z USB lub małej baterii nie byłoby wygodne. Aby uniknąć problemów w zestawach znajduje się również zasilacz, który należy podpiąć do Arduino. Tak, jak jest to widoczne na powyższym zdjęciu.

Podłączenie zasilacza, oprócz stabilnego napięcia, daje nam również jedną, bardzo ważna zaletę. Na pinie VIN będziemy mieli dostęp do napięcia 12V, co wykorzystamy już w kolejnym artykule!

Diody RGB w praktyce - podejście tradycyjne

Podczas poprzedniego poziomu kursu Arduino wykorzystywaliśmy zwykłe diody świecące. Każda miała dwa wyprowadzenia (katodę i anodę) i świeciła na jeden kolor. Dodatkowo dzięki PWM była możliwa zmiana ich jasności.

Zwykłe diody świecące (LED).

Zwykłe diody świecące (LED).

Dużo większe możliwości dają diody RGB (ang. Red, Green, Blue) w ich wnętrzu producenci umieszczają trzy struktury świecące. Czerwoną, zieloną oraz niebieską - możemy sterować każdą z osobna. Dzięki czemu, po pierwsze dioda taka może świecić na 3 podstawowe kolory, po drugie możliwe jest oczywiście mieszanie kolorów.


W zestawie znajdują się dwie diody RGB z matowymi soczewkami. Takie LEDy nie świecą tak jasno, jak te umieszczane w przezroczystych obudowach, jednak znacznie lepiej sprawdzają się, gdy chcemy uzyskać ładne mieszanie kolorów.

Dioda RGB z matową soczewką.

Dioda RGB z matową soczewką.

Diody RGB występują w wersji ze wspólną katodą oraz anodą. Po więcej szczegółów odsyłam do kursu elektroniki, konkretnie do 3 części drugiego poziomu. W naszym przypadku używamy wersji ze wspólną katodą. Oznacza to, że najdłuższą nóżkę podłączamy do masy, a pozostałe przez rezystory zasilamy napięciem dodatnim.

Pierwsze użycie diody RGB

W celu przetestowania diody podłączamy ją zgodnie z poniższą rozpiską:

  1. Kolor czerwony, przez rezystor 1k, do pinu 3.
  2. Wspólna katoda, bezpośrednio do masy.
  3. Kolor zielony, przez rezystor 1k, do pinu 5.
  4. Kolor niebieski, przez rezystor 1k, do pinu 6.
Dioda RGB podłączona do Arduino.

Dioda RGB podłączona do Arduino.

Pora na pierwszy prosty program. Tym razem chcemy przetestować świecenie każdego z kolorów osobno, a na końcu połączyć wszystkie barwy.

W praktyce, będzie dokładnie, tak jak się spodziewamy:

Oczywiście jednoczesne włączenie wszystkich kolorów dało biały. Korzystając z poznanego już wcześniej PWM możemy regulować poziom każdego koloru osobno. Dzięki temu możliwe będzie wygenerowanie dowolnych barw. Zanim przejdziemy do takiego przykładu podłączmy drugą diodę.

Podłączanie wielu (tradycyjnych) diod RGB

Aby korzystać w pełni z drugiej diody RGB najwygodniej będzie skorzystać z kolejnych trzech kanałów PWM. Akurat nie wykorzystujemy ich w inny sposób, więc nie jest to problematyczne.

Tym razem będzie to:

  1. Kolor czerwony, przez rezystor 1k, do pinu 9.
  2. Wspólna katoda, bezpośrednio do masy.
  3. Kolor zielony, przez rezystor 1k, do pinu 10.
  4. Kolor niebieski, przez rezystor 1k, do pinu 11.
Druga dioda podłączona do Arduino.

Druga dioda podłączona do Arduino.

Dla formalności prosty program testujący działanie obu diod:

Efekt działania programu to miganie diodami w różnych kolorach:

Tradycyjne diody RGB - mieszanie kolorów

Teraz możemy przejść do ciekawszej części, czyli wykorzystania faktu, że dzięki takim diodom możemy uzyskać dowolne kolory. Wystarczy odpowiednio generować sygnał PWM. Wierzę, że każdy rozumie już ideę, dlatego ograniczę się jedynie do prostego przykładu. Dzięki temu szybciej przejdziemy do diod programowalnych.

Na początek program w najprostszej wersji. Sterowanie PWM odbywa się poprzez wykorzystanie funkcji analogWrite(pin, wypelnienie), gdzie wypełnienie jest wartością od 0 do 255, co przekłada się na jego regulację w zakresie 0-100%.

Napiszmy program, który będzie płynnie regulował dwa kolory każdej diody, w przypadku trzeciego zdamy się na ślepy los. Zacznijmy od prostej pętli for:

Pętla wykonuje się 255 razy. Przy każdym jej obiegu zmienna zmiana jest zwiększana o jeden. Następnie wartość ta jest ustawiana jako wypełnienie jednego z kolorów diody oraz odejmowana od wypełnienia drugiego koloru, które domyślnie wynosi 100%.

Aby wykorzystać trzeci kolor skorzystamy z funkcji zwracającej losową liczbę, którą omawialiśmy w 10 części kursu Arduino, poziom I. Dla większej płynności efektów będziemy ją generować przed każdym obiegiem pętli. Poniższy kod powinien dać nam dwie, losowo zmieniające kolor diody.

Jest dobrze, ale mogłoby być lepiej - po wykonaniu pętli for wracamy gwałtownie do początku, co powoduje brzydki przeskok kolorów.  Aby to poprawić należałoby równie płynnie zmieniać kolory w drugą stronę.


Tym razem zaproponuję mało wyrafinowane rozwiązanie - skopiowałem pętlę i zmieniłem warunek tak, aby drugi raz wykonała się "od tyłu". Oczywiście nie jest to zbyt ładne rozwiązanie, jednak w tej chwili program ma realizować tylko to miganie, więc można sobie pozwolić na taką realizację.

Ostateczny kod przykładu wygląda następująco:

Efekt działania w praktyce jest widoczny na poniższej animacji:

lsoowe_rgb

Losowe kolory RGB.

Uzyskaliśmy losowy gadżet świecący, który mógłby być całkiem ciekawym efektem wizualnym, gdyby diod było więcej. Tutaj pojawia się problem, ponieważ do tej pory dodanie każdego kolejnego LEDa wymagało trzech nowych kanałów PWM. Podłączając dwie diody RGB wykorzystaliśmy już możliwości naszego Arduino UNO (6 kanałów).

A gdyby, wszystkie diody można było sterować mniejszą ilością wyprowadzeń? Tutaj oczywiście zastosowanie znajdą LEDy programowalne, które od teraz zaczniemy używać.

Czym jest dioda programowalna?

Technologia LEDów zyskuje na popularności w niesamowitym tempie. Jednokolorowe podświetlenie na diodach nie jest już niczym nadzwyczajnym. We wszelkich gadżetach i świecących reklamach chętnie używano taśm składających się z diod RGB. Sterowanie każdą diodą byłoby jednak trudne.

Dlatego powstały dedykowane układy, które montowano obok diod. Pozwalały one na sterowanie kolorem i jasnością wielu LEDów w prosty sposób. Popularność tego rozwiązania doprowadziła do sytuacji, w której powstały układy WS2812. Czyli połączenie sterownika diody RGB z... diodą RGB. Wszystko w jednej obudowie - najczęściej w SMD (do montażu powierzchniowego).

Dalej zakładam, że korzystasz z gotowego modułu RGB, dlatego pomijam sprawy ważne przy używaniu pojedynczych diod.  W zestawach elementów znajduje się linijka 8 takich diod. Każda z nich pobiera prąd do 30 mA, co daje łączną wartość ok. 240 mA. Listwę można zasilać napięciem od 4 V do 7 V.

Moduł 8 diod programowalnych WS2812.

Moduł 8 diod programowalnych WS2812.

Patrząc gołym okiem diody te nie wyróżniają się niczym specjalnym. Dopiero na zbliżeniu widać, to co najciekawsze. Bez problemu można zauważyć sterownik oraz poszczególne struktury.

Widok na pojedynczą diodę WS2812 z bliska.

Widok na pojedynczą diodę WS2812 z bliska.

Podłączenie diod WS2812

Niezależnie od ilości diod zawsze do modułu będziemy musieli doprowadzić trzy przewody:

  • sygnał sterujący, najczęściej oznaczany jako: DIN, Data IN,
  • dodatnią szynę zasilania (4-7V), najczęściej oznaczana jako: VIN, V lub znakiem +,
  • masę układu, najczęściej oznaczana jako GND lub znakiem -.

Na rynku dostępnych jest wiele podobnie wyglądających modułów, nie mogę zagwarantować, że zawsze wyprowadzenia będą ułożone tak samo. Dlatego dla bezpieczeństwa nie podaję żadnego schematu montażowego - operuję na nazwach sygnałów.


Moduł mocujemy w płytce stykowej. Następnie masę (jeśli występują, to dwie) łączymy z masą układu, do dodatniej szyny zasilającej doprowadzamy 5V. Równolegle z pinami zasilającymi podłączamy kondensator elektrolityczny. Przy tej ilości diod 100uF będzie wystarczające.

Następnie podłączamy sygnał sterujący. W przypadku naszych ćwiczeń będzie to pin A0. Zgodnie z zaleceniami producenta nie robimy tego bezpośrednio. Między wyprowadzenie Arduina, a linijkę diod powinniśmy wpiąć rezystor z zakresu 300-500R. W naszym wypadku wpinamy tam dwa, połączone równolegle rezystory 1k (co da 500R).

Układ na płytce stykowej wygląda następująco:

Komunikacja z diodami - gotowa biblioteka

Sama komunikacja z diodami przebiega za pomocą specjalnego interfejsu jednoprzewodowego. Jednak dzięki gotowej bibliotece nie musimy zagłębiać się w sprawy techniczne.

W tej chwili skorzystamy z popularnej biblioteki Adafruit NeoPixel. Oczywiście najpierw musimy ją zainstalować, proces ten przebiega różnie w zależności od źródła kompilatora.

W przypadku Arduino IDE pobranego z Arduino.cc

Z menu wybieramy:

Szkic > Dołącz bibliotekę > Zarządzaj bibliotekami

Następnie w polu wyszukiwarki wpisujemy Adafruit NeoPixel, na liście wybieramy odpowiednią bibliotekę, a następnie ją instalujemy:

Instalacja właściwej biblioteki.

Instalacja właściwej biblioteki.

W przypadku Arduino IDE pobranego z Arduino.org

Pobieramy bibliotekę NeoPixel z GitHuba, wystarczy skorzystać z przycisku: Clone or download:

Pobieranie biblioteki z GitHuba.

Pobieranie biblioteki z GitHuba.

Następnie w Arduino IDE wybieramy:

Szkic > Importuj bibliotekę... > Dodaj bibliotekę..

Wskazujemy pobrane przed chwilą archiwum (nie rozpakowujemy go) i klikamy Open. Biblioteka powinna po chwili dodać się do naszego IDE. Najłatwiej sprawdzić to przez wybranie:

Plik > Przykłady

Na samym dole powinna być widoczna zakładka z programami przykładowymi z NeoPixel:

Nowe przykłady po instalacji biblioteki.

Nowe przykłady po instalacji biblioteki.

Podstawowe funkcje biblioteki NeoPixel

Gdy instalacja przebiegnie poprawnie będziemy mogli pójść dalej, czyli napisać pierwszy program. Każdy program, który wykorzystuje naszą linijkę diod musi zawierać odwołanie do biblioteki oraz jej inicjalizację. W praktyce wygląda to następująco:

Podświetlona linijka jest najważniejsza. W tym miejscu tworzymy obiekt o nazwie linijka, do którego będziemy się później odwoływać. Następnie w nawiasie podajemy informacje na temat modułu.

Najważniejsze są dwa pierwsze parametry. W tym przypadku 8 oznacza ilość diod w linijce, a A0 tyczy się oczywiście pinu Arduino, do którego ją podłączyliśmy. Ostatni parametr, to informacja na temat wersji samych diod. W tej chwili nie musimy się tym przejmować.


Dla przykładu możemy nasze diody podpiąć do innego pinu, np. 3, a całość zamiast linijką nazwać np. wężem świetlnym. Wtedy konfiguracja wyglądałaby tak:

Zostańmy jednak przy pierwszej wersji incjalizacji i przejdźmy do pierwszego programu.

Pierwszy test diody programowalnej

Mamy pełną dowolność w sterowaniu diodami. Każdej możemy ustawić inny kolor i inną jasność. W tym celu należy się do niej odwołać korzystając z takiej składni:

Jako pierwszy parametr podajemy nr diody (licząc od zera). Drugim parametrem jest kolor. Jak to bywa w świecie komputerów musimy go wyrazić w formie dużej liczby.

Dla nas, jako ludzi, znacznie łatwiej będzie, gdy kolor będziemy mogli opisać trzema mniejszymi liczbami. Wtedy każda z nich będzie mogła odpowiadać za jasność jednej składowej, czyli osobno podamy jasność dla koloru czerwonego, zielonego oraz niebieskiego. Tutaj z pomocą przychodzi nam kolejna konstrukcja: linijka.Color(0, 0, 0).

W praktyce jej zastosowanie wygląda następująco:

  • linijka.setPixelColor(0, linijka.Color(255, 0, 0)) - dioda nr 1 świeci na czerwono
  • linijka.setPixelColor(0, linijka.Color(0, 255, 0)) - dioda nr 1 świeci na zielono
  • linijka.setPixelColor(0, linijka.Color(0, 0, 255)) - dioda nr 1 świeci na niebiesko
  • linijka.setPixelColor(6, linijka.Color(100, 0, 255)) - dioda nr 7 świeci maksymalnie jasno na niebiesko oraz słabiej na czerwono.

Sprawdźmy w praktyce, czy uda nam się uruchomić pierwszą diodę:

Komendę wywołałem w funkcji setup, ponieważ chciałem włączyć diodę raz. Nie było potrzeby, aby robić to w pętli. Po uruchomieniu programu... nie dzieje się jednak nic! Dlaczego?

Poprawna wersja programu, która już na 100% włączy pierwszą diodę na zielono wygląda tak:

W praktyce wygląda to następująco:

Pierwsza dioda świeci na zielono.

Pierwsza dioda świeci na zielono.

Dzięki tym kilku funkcjom będziemy mogli tworzyć od teraz ciekawe efekty wizualne. W tej chwili stworzymy dwa, które przydadzą nam się w kolejnych częściach, gdy będziemy uruchamiać prosty alarm. Będą to dwa sposoby sygnalizacji zbliżone do kogutów policyjnych.

Sygnalizator alarmowy

Pierwsza wersja sygnalizatora będzie bardzo prosta. Chcemy, aby wszystkie diody świeciły na zmianę na czerwono lub na niebiesko. Oczywiście nie będziemy każdej z nich uruchamiać ręcznie.W tym celu wykorzystamy dwie pętle for. Zadaniem pierwszej z nich będzie ustawienie wszystkich diod na kolor czerwony:

Chcę, aby diody zmieniały kolor jednocześnie. Dlatego polecenie linijka.show() zostało wywołane dopiero po wykonaniu pętli.

Aby nasz sygnalizator szybko migał musimy dodać obsługę drugiego koloru oraz małe opóźnienie. Program realizujący ten przykład wygląda następująco:

Efekt działania sygnalizatora w praktyce widoczny jest poniżej:

Sygnalizator alarmowy - wersja druga

Tym razem sygnalizator ma składać się z 4 diod czerwonych i 4 niebieskich. Co więcej nie mają one włączać się na raz, tylko jedna, po drugiej. Aby tak się stało wewnątrz pętli należy wywołać show() oraz wstawić opóźnienie.

Uruchomienie takiej pętli spowoduje kolejne włączanie każdej diody na niebiesko. Teraz należy rozbudować program w taki sposób, aby zmieniać kolor - oczywiście wystarczy do tego jeden warunek. W najprostszej formie będzie wyglądało to następująco:

Zwróć uwagę na przedostatnią linijkę programu - to nowa komenda linijka.clear(), która jest odpowiedzialna za wyczyszczenie całej linijki lub mówiąc inaczej, za wyłączenie wszystkich diod. Bez niej nasz efekt wykonałby się tylko raz. W praktyce działanie powyższego programu wygląda następująco:

Powyższe efekty były jedynie wstępem. Podczas realizacji przykładów z innych artykułów będziemy wykorzystywać diody w coraz bardziej zaawansowany sposób. W ramach zadania domowego zachęcam do eksperymentowania z własnymi efektami. Koniecznie pochwalcie się w komentarzu, jeśli stworzycie coś ciekawego.


Polecam również zapoznać się z przykładowymi programami dołączonymi do biblioteki. Należy jednak pamiętać o odpowiedniej konfiguracji! Programy te znaleźć można w zakładce:

Plik > Przykłady > Adafruit NeoPixel

Działanie jednego z nich widoczne jest na poniższym filmie:

Kiedy diody tradycyjne, a kiedy programowalne?

W głowach niektórych czytelników pojawi się zapewne pytanie, czy w takim razie należy całkiem "zapomnieć" o tradycyjnych diodach RGB? Moim zdaniem nie. Jeśli chcemy dodać do naszego urządzenia jedną kontrolkę, to lepsza może okazać się zwykła dioda.

Jeśli projekt zakłada jednak wykorzystanie większej ilości diod RGB, to wtedy bez wahania należy kierować się w stronę WS2812. Znacznie uprości to stronę sprzętową jak i programistyczną.

Przykład użycia diod WS2812.

Przykład użycia diod WS2812.

Podsumowanie

Głównym celem tego artykułu było sprawdzenie w praktyce czym różnią się tradycyjne diody od tych z wbudowanymi sterownikami. Dołączona do zestawu linijka diod będzie nam towarzyszyła podczas większości kolejnych artykułów. Posłuży m.in. za sygnalizator w alarmie, będzie również skalą dla naszych termometrów.

W kolejnym artykule do sygnalizatora świetlnego dodamy prostą syrenę alarmową, która będzie generowała odstraszający dźwięk. Jeśli nie chcecie przeoczyć kolejnych części, to skorzystajcie z poniższego formularza i zapiszcie się na powiadomienia o nowych artykułach!

Czy artykuł był pomocny? Oceń go:

Średnia ocena 4.9 / 5. Głosów łącznie: 79

Nawigacja kursu

Autor kursu: Damian (Treker) Szymański

arduino, diody, kurs, kursArduino2, led, rgb, WS2812

Trwa ładowanie komentarzy...