W tym artykule przedstawię działanie odbiornika IR który będzie sterował pierścieniem Led za pomocą pilota. Pokażę również efekty jakie można wyświetlić korzystając z pierścienia LED. W artykule będą również zamieszczone wszystkie informacje dotyczące bibliotek oraz specyfikacji modułów.
Spis treści
- Krótki opis
- Specyfikacja (Odbiornik IR + pierścień LED)
- Przykład
- Pliki do pobrania
Krótki opis
Pierścień LED, który ja wykorzystałem składa się z 24 diod połączonych szeregowo. Mogą one wyświetlać dowolny kolor zdefiniowany w wartościach RGB. Natomiast jeśli chodzi o odbiornik to może on odbierać sygnał z pilota na odległość 1,3m.
Specyfikacja
Pierścień 24 Diod LED WS2812B 5050 RGB
- Napięcie zasilania: 5 V
- Pobór prądu: 18 mA dla jednej diody
- Zastosowane diody: LED RGB WS2812
- Ilość diod: 24
- Średnica zewnętrzna okręgu: 66,0 mm
Odbiornika na podczerwień IR cyfrowy 38khz do Arduino
- Nazwa marki:TZT
- Pochodzenie:CN (pochodzenie)
- Typ:REGULATOR NAPIĘCIA
- Numer/Liczba modelu: Infrared Transmitter module
- Zastosowanie:do komputera
- Temperatura pracy:-40-+85
- Napięcie zasilania:5V
- Rozpraszanie mocy:new
- Pakiet:DIY
- KITIs_customized:Tak
Przykład
Elementy
- Arduino Uno lub Mega
- Pierścień led
- IR
- 6x kabel stykowy (mes-żeń)
Połączenie
- Arduino -> odbiornik IR
- GND – GND
- 5V – VCC
- pin9 – DAT
- Arduino -> pierścień LED
- 5V – VCC
- GND – GND
- pin8 – DI(*jeżeli układ nie będzie się świecił, po wgraniu programu podłącz do DO)
Program
Zaczynamy od załączenia dwóch bibliotek które będziemy wykorzystywać. Pierwsza z nich to IRremote.hpp odpowiadająca za odbiornik oraz druga, czyli AdaFruit_NeoPixel odpowiadająca za kierowanie pierścieniem LED. Po tym definiujemy jeszcze pin 9 pod nazwą RECIVER_PIN jako pin odbiornika. W strip-ie obiekcie klasy AdaFruit_NeoPixel musimy zdefiniować 3 rzeczy pierwsza to nr pin-u DI druga to całkowita ilość LED-ów z jakich będziemy korzystać oraz 3 to model naszego pierścienia.(Tu nie radzę niczego zmieniać chyba że korzystamy z zupełnie innego typu pierścienii.)
#include <Adafruit_NeoPixel.h> #include <IRremote.hpp> int RECEIVE_PIN = 9; Adafruit_NeoPixel strip = Adafruit_NeoPixel(24, 8, NEO_GRB + NEO_KHZ800); IRrecv receiver(RECEIVE_PIN);
Następnie zajmijmy się funkcją void setup(). Aktywujemy w niej port szeregowy, pasmo odbiornika oraz pasmo przesyłu danych pierścienia. Dla portu szeregowego ustawiam baundrate na 9600. Dla IRremote(czyli obiektu klasy odbiornika) ustawiamy z do jakiego pin-u jest podłączone wyjście danych odbiornika oraz wartość ENABLE_LED_FEEDBACK która umożliwi odbiór danych wysyłanych przez diodę w pilocie. Ostatnim krokiem w setupie jest ustawienia pinu 8 w tryb wyjściowy oraz w stan wysoki.
void setup() { Serial.begin(9600); pinMode(8, OUTPUT); digitalWrite(8, HIGH); IrReceiver.begin(RECEIVE_PIN, ENABLE_LED_FEEDBACK); strip.begin(); }
Nie będę poszczególno omawiał jak wygląda przebieg każdej z funkcji wyświetlającej na LED, dlatego zamierzam tylko przedstawić działanie funkcji void loop(). Jeżeli chcesz dowiedzieć się jak wyświetlać ciekaw animacje na pierścieniu LED zachęcam do sprawdzenia strony – LED Strip Effects generator (adrianotiger.github.io).
Funkcja void loop() składa się w zasadzie z jednego if którego warunkiem jest pojawienie się danych na pinie odbiornika. W zależności od tego komunikat w postaci 16 został wysłany zostanie wykonany odpowiedni case funkcji switch. Przyciski na pilocie które wykorzystałem to CH+, CH-, 0, 200+. Po wykonaniu się jednego z warunków switcha wartość danych if zresetuje się i zacznie odbierać na nowo sygnał.
void loop() { if(IrReceiver.decode()) { IrReceiver.printIRResultShort(&Serial); switch(IrReceiver.decodedIRData.command) { case 0x45: colorWipe(strip.Color(0, 0, 0), 50); digitalWrite(8, LOW); break; case 0x47: digitalWrite(8, HIGH); colorWipe(strip.Color(255, 255, 255), 50); break; case 0x16 : theaterChase(strip.Color(0, 255, 0), 50); theaterChase(strip.Color(255, 0, 0), 50); theaterChase(strip.Color(0, 0, 255), 50); colorWipe(strip.Color(0,0,0), 50); break; case 0xD: rainbowCycle(1); break; } IrReceiver.resume(); } }