Sterowanie urządzeniem przez pilota

Całkiem niedawno leżąc sobie na kanapie i leniwie przełączając kanały w telewizorze pomyślałem sobie, że skoro mogę sterować telewizorem za pomocą pilota na podczerwień, to czemu nie zastosować podobnego mechanizmu w moich projektach na Arduino. Okazało się, że podłączenie odbiornika podczerwieni do tej popularnej płytki jest bardzo proste, a wszystkie potrzebne części znajdziemy w Starter-Kicie Nettigo.

Lista potrzebnych części

Schemat podłączenia

Wszystkie powyżej wymienione komponenty musimy połączyć według zaprezentowanego na poniższym schematu. Oczywiście możemy użyć innych pinów jeżeli chcemy.

Jak widać połączenie jest proste. Dostarczamy zasilanie (5V) i podłączamy bezpośrednio do pinów wejściowych odbiornik IR oraz moduł przekaźnika.

Wgranie programu

Aby móc reagować na przyciski wciśnięte na pilocie musimy wyposażyć nasze Arduino w bibliotekę o nazwie IRremote. Znajdziemy ją w Menedżerze bibliotek. Wybieramy najnowszą wersje i klikamy instaluj.

Następnie ściągamy kod programu i wgrywamy na Ardunio. Po podłączeniu powinniśmy mieć możliwość za pomocą przycisków CH+ i CH- włączyć i wyłączyć przekaźnik.

Jak to działa

Odczyt kodów z pilota

Kiedy wciskamy przycisk na pilocie ten wysyła za pomocą diody podczerwonej specjalnie zakodowany unikalny kod przycisku. Zanim zaczniemy sterować diodami i przekaźnikiem musimy poznać te kody dla każdego przycisku na pilocie (a przynajmniej dla każdego, na który chcemy jakoś reagować). Pomoże nam w tym przykład z zaciągniętej biblioteki. Aby go uruchomić wybieramy Plik > Przykłady > IRremote > IRrecvDump i wgrywamy szkic, który nam się otworzy na płytkę. Teraz otwieramy Monitor portu szeregowego i wciskamy kolejno przyciski na pilocie. Na monitorze powinno ukazać nam się coś takiego:


Interesuje nas ta 6-znakowa liczba szesnastkowa przy każdym odczycie. Przykładowy kod zaznaczyłem na powyższym zrzucie czerwoną ramką. Każdy taki kod spisujemy np. w notatniku zaznaczając który przycisk jest do niego przypisany.

W Nettigo Starter Kicie znajduje się pilot uniwersalny, ale nic nie stoi na przeszkodzie by  korzystać z innych pilotów.

Wybrałem dwa przyciski na naszym pilocie CH+ i CH- i korzystając z tej metody odczytałem odpowiadające im kody: 0xFFE21D (CH+) i 0xFFA25D (CH-). Zapisując w programie dla Arduino liczby zaczynające się od 0x mówimy, że cała liczba zapisana jest szesnastkowo. Często taki zapis jest używany w listingach programów.
Wiemy już jaki kodów się spodziewać, teraz jak je odczytać? Przyjrzyjmy się naszemu programowi:

#include <IRremote.h>

#define IRRECV 11 // Numer pinu odbiornika IR
#define RELAY 8 // Numer pinu przekaźnika

Dyrektywa #include informuje Arduino IDE że będziemy korzystać z biblioteki IRremote. Dwie kolejne dyrektywy (#define) wprowadzają oznaczenia IRRECV i RELAY. Od teraz w kodzie programu możemy pisać IRRECV a Arduino IDE wie że chodzi o 11 a RELAY zostanie zastąpione przez 8. Po co stosować takie etykiety, skoro można napisać liczbę w kodzie programu? Nasz moduł przekaźnika jest podpięty do pinu 8. Jeśli w przyszłości będziesz chciał zmienić nr pinu dla przekaźnika, wystarczy że poprawisz liczbę w dyrektywie #define, a nie będziesz musiał szukać wszystkich miejsc gdzie użyłeś nr pinu przekaźnika.

IRrecv irrecv(IRRECV);

W kolejnej linii tworzymy obiekt irrecv. Jest on typu IRrecv (odbiornik podczerwieni), który jest zdefiniowany w bibliotece IRremote. Od teraz irrecv staje się łącznikiem między naszym programem a kodem zawartym w bibliotece IRremote. Kod ten wie jak rozszyfrować komunikaty odbierane przez odbiornik podczerwieni, dzięki temu nasz kod nie musi się tym zajmować.

void setup() {
  irrecv.enableIRIn();
  pinMode(RELAY, OUTPUT);
}

Funkcja setup przygotowuje Arduino do działania. Dwie linie – pierwsza włącza kod obsługi odbiornika IR, druga konfiguruje pin do którego podłączyliśmy przekaźnik w tryb pracy wyjścia (bo pin może pracować jako wejście lub wyjście).

Gdy jesteśmy gotowi do pracy możemy odczytywać dane z sensora. Naciskając przycisk na pilocie powodujemy wysłanie ciągu sygnałów diodą wbudowaną w pilota. Nasze Arduino uzbrojone w odpowiednik odbiornik IR oraz kod z biblioteki jest w stanie zamienić dany ciąg impulsów IR na odpowiedni kod. Gdy kod z biblioteki IRremote rozpozna pełny ciąg impulsów, zamienia go na kod do odczytu. Teraz czeka na to, by program z Arduino odczytał kod przycisku. W naszym programie używamy do tego funkcji readIRCode:

unsigned long readIRCode() {
  decode_results results;
  unsigned long resultValue = results.value;
  irrecv.resume();
  return resultValue;
}

decode_results to typ zmiennej zdefiniowany przez bibliotekę IRremote. Tworzymy zmienną o nazwie results, która przez pole value pozwala odczytać ostatnio odczytany kod przycisku. Zapamiętujemy kod w pomocniczej zmiennej resultValue i wywołujemy irrecv.resume() które powoduje, że biblioteka IRremote nasłuchuje na kolejnych impulsów.

Zostaje główna pęta. W niej mamy tylko konstrukcję if, która sprawdza czy odczytany kod to jeden z wybranych CH+ lub CH- i jeśli tak to włączamy lub wyłączamy moduł przekaźnika. Ponieważ kod może być tylko jeden w danej chwili to wykona się tylko jedno z poleceń w komendzie if. Jeśli zaś kod przycisku nie będzie odpowiadał CH+ lub CH- nie wykona się żaden kod, tylko pętla głównej funkcji wykona się ponownie.