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

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() {
  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).