Bezdrátové ovládání pomocí IR ovladače
Doposud jsme se nezabývali možností ovládat Arduino projekt bezdrátově na dálku, proto si nyní představíme sadu pro infračervené dálkové ovládání. Proč právě IR (Infrared) bezdrátový přenos a IR ovládání? Je dostupné, spolehlivé a nenáročné na implementaci do Arduino projektu. Naprogramovat vlastní ovladač není vůbec složité. Ukážeme si pár příkladů, kde vše názorně vysvětlíme. A vy si pak můžete bastlit s IR ovladačem dle své libosti!
komunikace pomocí infrared
Abychom mohli naplno využít infrared modul, musíme nejdříve proniknout do teorie. Ovládání pomocí „drátů“ je zde nahrazeno tzv. IR ovládáním, které je bezdrátové. Co to tedy to IR je? IR je zkratka pro infrared (infračervené) záření – tento druh záření je neviditelný pro lidské oko, protože má větší vlnovou délku, než viditelné světlo. Zjednodušeně by se dalo říct, že IR světlo je zdrojem tepla. Mezi zdroje IR záření patří např. žárovky, nebo naše Slunce.
Lidstvo usoudilo, že je výhodné IR záření použít i pro komunikaci na kratší vzdálenosti. Začalo jej využívat v technických aplikacích (dálkové ovladače u TV, nebo si např. vzpomenete na infraport u starých mobilních telefonů). IR záření nejde vidět a výroba IR komponentů není nákladná. Nabízí se ale otázka, jak tyto zařízení mohou fungovat, když je celá Země osvícená IR zářením ze Slunce? Tady už nadešel čas, kdy se konečně vrhneme přímo do naší problematiky.
Pro naše povídání si určíme IR diodu jako náš zdroj IR záření. Celá pointa spočívá v modulování signálu, který bude naše IR dioda emitovat – jednoduše řečeno: naše dioda bude blikat a bude vytvářet určitý vzor (pattern) na který bude IR přijímač reagovat. Tím, že zvolíme správnou frekvenci (nejčastěji se používá 38 kHz) zamezíme „rušení“ od okolního IR záření.
Pokud tedy například mačkáte různá tlačítka na ovladači, IR LED pokaždé „vyblikává“ jiný signál.
Princip IR komunikace (děkujeme www.sbprojects.net za pěkný GIF)
zapojení IR senzoru
K ovladači dostanete v sáčku také přijímač, IR diodu a vodiče. Do ovladače je potřeba nejprve vložit baterii CR2025, IR diodu si schováme na další příklad a přijímač zapojíme podle schématu. K zapojení přijímače budete potřebovat pouze 3 vodiče. Ale abychom měli co ovládat, připojíme si k Arduinu ještě kontrolní LEDku.
Co budeme potřebovat?
- řídící Arduino deska (v našem případě Arduino UNO)
- Sada pro infračervené dálkové ovládání
- LED
- 220 Ω rezistor
- Arduino propojovací kit
Pokud máme vše nachystané, vrhneme se do zapojování!
Pokud si nejste se zapojením podle schématu úplně jistí, najděte na IR přijímači u pinů mínus, tam zapojte GND. Pak najděte „S“, jako signál, tam zapojte vodič, který vede do D2 na Arduinu. A do zbylého (prostředního) zapojte napětí 5 V.
Program pro IR ovladač
Předtím, než začneme používat IR ovladač pro ovládání Arduina, musíme zjistit vzory signálů, které vydávají jednotlivá tlačítka ovladače. Každé tlačítko má hodnotu jinou (tak je od sebe program rozliší). Hodnota je číslo. Pokud jste zkušenější programátor, doporučuji použít HEX soustavu. My si to ale nebudeme komplikovat a v příkladech použijeme DEC soustavu.
Jako první krok tedy nahrajeme program, který nám vypíše "hodnoty" jednotlivých tlačítek.
Nezapomeňte naimportovat knihovnu! Knihovna je v sekci „ke stažení“. Pokud nevíte jak na to, tady je návod, jak knihovnu správně naimportovat.
// importování knihovny #include <IRremote.h> // definování pinu přijímače int const IRpin = 2; IRrecv irrecv(IRpin); // uložení signálu do proměné "results" decode_results results; void setup() { // zapnutí komunikace Serial.begin(9600); // start přijímače irrecv.enableIRIn(); } void loop() { // pokud obdržíš signál, tak jeho hodnotu vypiš v DEC soustavě (desítková) if (irrecv.decode(&results)) { Serial.println(results.value, DEC); // obdrž další hodnotu irrecv.resume(); // počkej 1s delay(1000); } }
Pokud otevřete Serial monitor (nastavte rychlost 9600 baudů) a budete mačkat postupně tlačítka 1, 2, 3, uvidíte toto:
Čísla v červeném rámečku jsou hodnoty tlačítek. Číslo, které se opakuje a v rámečku není, pro nás není důležité. Stačí nám vědět, že se objeví tehdy, když nějaké tlačítko držíme delší dobu.
Na následující ukázku budeme potřebovat dvě tlačítka 1 a 2. Podle našeho prvního pokusu mají tlačítka tyto hodnoty:
Pro tlačítko "1" je hodnota = 16753245
Pro tlačítko "2" je hodnota = 16736925
Teď se vrhneme k tomu nejdůležitějšímu, pomocí 2 tlačítek budeme ovládat LEDku.
Tlačítko "1" LEDku zapne a tlačítko "2" LEDku vypne.
// imporotování knihovny #include <IRremote.h> // definování pinu přijímače int const receiver = 2; IRrecv irrecv(receiver); // definování pinu LEDky int const ledPin = 3; // uložení signálu do proměné "results" decode_results results; void setup() { // zapnutí komunikace Serial.begin(9600); // start přijímače irrecv.enableIRIn(); // definování digitálního ledPinu jako výstup pinMode(ledPin, OUTPUT); // nastavení digitálního ledPinu na LOW (vypnutí diody) digitalWrite(ledPin, LOW); } void loop() { // pokud obdržíš signál, tak if (irrecv.decode(&results)) { // pokud je hodnota signálu "16753245", tak if (results.value == 16753245) { // zapni LEDku digitalWrite(ledPin, HIGH); // počkej 1s delay(1000); } // pokud je hodnota signálu "16736925", tak else if (results.value == 16736925) { // vypni LEDku digitalWrite(ledPin, LOW); // počkej 1s delay(1000); } // obdrž další hodnotu (pokračuj) irrecv.resume(); } }
Pro zájemce přikládám i program, kde ovládáme LEDku tlačítkem 1. Po prvním stisku se LEDka zapne a při dalším stisku zase vypne.
// imporotování knihovny #include <IRremote.h> // definování pinu přijímače int const receiver = 2; IRrecv irrecv(receiver); // definování pinu LEDky int const ledPin = 3; // uložení signálu do proměné "results" decode_results results; void setup() { // zapnutí komunikace Serial.begin(9600); // start přijímače irrecv.enableIRIn(); // definování digitálního ledPinu jako výstup pinMode(ledPin, OUTPUT); // nastavení digitálního ledPinu na LOW (vypnutí diody) digitalWrite(ledPin, LOW); } void loop() { // pokud obdržíš signál, tak if (irrecv.decode(&results)) { // pokud je hodnota signálu "16753245" a LEDka nesvítí, tak if (results.value == 16753245 && digitalRead(ledPin) == LOW) { // zapni LEDku digitalWrite(ledPin, HIGH); // počkej 1s delay(1000); } // pokud je hodnota signálu "16753245" a LEDka svití, tak else if (results.value == 16753245 && digitalRead(ledPin) == HIGH) { // vypni LEDku digitalWrite(ledPin, LOW); // počkej 1s delay(1000); } // obdrž další hodnotu (pokračuj) irrecv.resume(); } }
Jak s arduinem ovládat TV?
Jak jsem již zmínil, IR technologie se využívá např. u různých ovladačů. My se teď podíváme na ovládání TV pomocí přiložené IR diody. Návod samozřejmě funguje na všechny druhy IR ovládání. Náš plán zní následovně:
- Zjistíme vzor signálu z TV ovladače tak, že jej namíříme na IR přijímač a zmáčkneme požadované tlačítko
- Tento signál uložíme pro další reprodukci
- Po zmáčknutí tlačítka IR dioda vyšle uložený signál
vlastní IR ovladač? není problém!
Ke stavbě našeho vlastního IR ovladače potřebujeme jen IR diodu, která bude vysílat signál a tlačítko, kterým budeme IR diodu aktivovat. My si navíc přidáme i IR přijímač, abychom mohli zjistit vzor signálu originálního ovladače.
- Řídící Arduino deska (v našem případě Arduino UNO)
- Sada pro infračervené dálkové ovládání
- 100 Ω rezistor
- Tlačítko + 10 kΩ rezistor
- Arduino propojovací kit
Náš IR ovladač zapojíme podle následujícího schématu.
programování IR ovladače
Funkci zařízení (ovladače) jsme stanovili na začátku, zbývá napsat samotný program. Pro zjednodušení tentokrát sáhneme do příkladů, které jsou k importované knihovně. Proklikáme se tedy skrz
File -> Examples -> IRremote -> IRrecord
Otevře se nám program, který stačí nahrát a vše bude fungovat. Otevřete si serial monitor, uvidíte po načtení signálu náš vzor. Vidíme, že každé tlačítko má vlastní vzor signálu.
Vysvětlíme si tady alespoň zajímavý příkaz, který je v programu uveden. Jedná se o řádek 138, tedy:
irsend.sendRaw(rawCodes, codeLen, 38);
Tento příkaz slouží k poslání našeho zjištěného vzoru signálu, kde rawCodes je údaj, který se vypisuje v serial monitoru, codeLen je jeho délka a 38 značí frekvenci. Pokud si vzpomínáte na teorii uvedenou na začátku návodu, tam se o frekvenci 38 kHz zmiňuji.
Velikosti kódu se nelekejte, je to z důvodu univerzálnosti. Pokud máte nějaký komerční ovladač od Sony, nebo Panasonic, tak si v examples můžete najít kódy, které jsou kratší. Je to z toho důvodu, že se k IR komunikaci používá více protokolů – v našem kódu z examples kontrolujeme všechny, avšak v kódech od Sony, nebo Panasonic je protokol znám a tak se nemusí již nic víc řešit.
Shrnutí návodu pro IR ovládání
Naučili jsme se na jednoduchých příkladech ovládat IR ovladač a také si postavit vlastní řešení. U složitějších aplikací bych osobně preferoval stavět rozpoznávání tlačítek pomocí konstrukce switch nebo napsal vlastní funkci. To vše je ale už na vás a vaší kreativitě. Další návody nebo projekty jsou na stránce www.hwkitchen.cz/arduino-navody/.
Bastlení ZDAR!