Sterownie Arduino za pomocą pilota od TV
Pilota na podczerwień można spotkać dzisiaj w każdym domu. Czy to pilot od telewizora, wieży, rolet czy innego urządzenia – wszystkie z nich nadają określone kody mrugając diodą podczerwoną. Dziś nauczymy nasze Arduino reagować na takie kody za pomocą biblioteki IRremote dostępnej na GitHubie.
Potrzebne części
- Arduino
- Odbiornik podczerwieni (ja użyłem VS1838B)
- Dwie kolorowe diody i rezystory 220R
Podłączenie
Odbiornik podłączamy zgodnie z tym co pokazuje datasheet. W moim przypadku wyprowadzenia są w takiej kolejności:
Pin SIGNAL podłączyłem do pinu 11 w Arduino. Napięcie zasilania dla VS1838B wynosi 5V.
Dodatkowo aby zasygnalizować, że Arduino rzeczywiście rozpoznaje wciśnięcia przycisków na pilocie dodałem dwie diody, które przełączam poprzez wciśnięcie odpowiedniego przycisku. Diody podłączyłem do pinów 2 i 3.
Odczytanie kodów
Aby nasz kod kompilował się poprawnie należy ściągnąć bibliotekę IRremote z GitHuba i wgrać ją do naszego katalogu libraries.
Teraz możemy przystąpić do wgrania na Arduino kodu, który wypisze na port szeregowy kody wciśniętych przycisków.
#include <IRremote.h> const int receiverPin = 11; IRrecv irrecv(receiverPin); decode_results results; void setup() { Serial.begin(115200); irrecv.enableIRIn(); } void loop() { if(irrecv.decode(&results)) { Serial.print("0x"); Serial.println(results.value, HEX); delay(250); irrecv.resume(); } }
Kiedy już wgramy program na płytkę możemy uruchomić monitor portu szeregowego i odczytać z niego kodu interesujących nas przycisków:
Reagowanie na kody
Jak można łatwo zauważyć odebrany kod jest formatowany przez bibliotekę jako liczba. Z tego też powodu najprostszą metodą zareagowania na wciśnięcie przycisku będzie użycie instrukcji switch. Zamieńmy więc w kodzie, który mamy aktualnie fragment odpowiedzialny za wypisanie liczby szesnastkowej na taki, który wykona odpowiednie czynności jeżeli kod będzie pasował do któregoś case’a.
void loop() { if(irrecv.decode(&results)) { switch(results.value) { case 0x20DF8E71: digitalWrite(greenPin, !digitalRead(greenPin)); break; case 0x20DFC639: digitalWrite(yellowPin, !digitalRead(yellowPin)); break; } irrecv.resume(); } }
Jak widać po odebraniu któregoś z kodów odpowiednia dioda zmieni swój stan na przeciwny do aktualnego. Aby wszystko ładne się skompilowało i działało musimy dodać 2 stałe oznaczające numery pinów dla diod oraz ustawić te piny jako wyjścia.
const int yellowPin = 2; const int greenPin = 3;
void setup() { pinMode(yellowPin, OUTPUT); pinMode(greenPin, OUTPUT); irrecv.enableIRIn(); }
Ostatecznie cały kod powinien wyglądać w ten sposób:
#include <IRremote.h> const int receiverPin = 11; const int yellowPin = 2; const int greenPin = 3; IRrecv irrecv(receiverPin); decode_results results; void setup() { pinMode(yellowPin, OUTPUT); pinMode(greenPin, OUTPUT); irrecv.enableIRIn(); } void loop() { if(irrecv.decode(&results)) { switch(results.value) { case 0x20DF8E71: digitalWrite(greenPin, !digitalRead(greenPin)); break; case 0x20DFC639: digitalWrite(yellowPin, !digitalRead(yellowPin)); break; } irrecv.resume(); } }
Po skompilowaniu i wgraniu na płytkę możemy przetestować wszystko w praktyce :)
Jak widać obsługa pilotów na podczerwień przez Arduino jest banalnie prosta, a także tania (potrzebujemy jedynie odbiornika za kilka złotych oraz pilota, który znajdziemy w każdym domu). Możliwości takiego układu są ogromne – od sterowania przekaźnikami (np. włączenie / wyłączenie światła) aż do sterowania komputerem (poprzez napisanie dodatkowej aplikacji, która przez np. port szeregowy odbierze odpowiednie komendy i wykona pewne akcje w systemie).
W pierwszym sketch’u jest BŁĄD i to POWAŻNY uniemożliwiający wyświetlanie danych w Serial.
W sekcji „setup” brak jest aktywacji Serial, która powinna wygladać jak poniżej:
Serial.begin(9600);
Słuszna uwaga. I dlatego poprawiliśmy, ale że szybciej to lepiej, to preferujemy 115200 a nie 9600.