IR Oddajnik, IR sprejemnik. Krmiljenje naprav z IR oddajnikom

Infrardeče sevanje označuje elektromagnetno valovanje z valovnimi dolžinami, daljšimi od valovnih dolžin vidne svetlobe. Infra (lat. pod) pomeni, da je frekvenca infrardečega valovanja pod frekvenco rdeče svetlobe. Naš sistem deluje na frekvenci 38 kHz.

Infrardeči (IR) prenos podatkov uporabljamo v komunikaciji na kratke razdalje. Daljinski upravljalec uporablja infrardečo diodo za oddajanje infrardečega valovanja, ki ga leča fokusira v ozek žarek. Žarek je moduliran, tako da lahko prenaša podatke. Te podatke prejema IR sprejemni modul.

Ljudje infrardeče svetlobe ne vidimo, saj je izven vidnega spektra, lahko jo pa zazna video kamera ali digitalni fotoaparat na prenosnem telefonu. Če daljinski upravljalnik usmerimo v takšno napravo in pritisnemo na katerikoli gumb daljinskega upravljalnika, vidimo utripanje IR LED diode.

Slika 1: IR daljinski upravljalnik in IR sprejemni modul (vir: http://www.geeetech.com/wiki/index.php/File:Remote_control.jpg)

S tem, ko IR LED dioda za kratek čas utripa, pošlje kodirani signal na priključek (pin) razvojne plošče Arduino, ki ta signal demodulira. Za IR sprejemni modul bomo uporabili AX-1838HS, IR daljinski upravljalnik pa lahko uporabimo katerikoli, uporabimo pač tistega, ki ga imamo pri roki in deluje pri frekvenci 38 kHz.

Potrebovali bomo knjižnico IRremote.h, ki jo najdemo na spletu ali pa spodaj v prilogi. Ko vstavimo knjižnico v ustrezno mapo, zaženemo okolje Arduino in odpremo primer: Datoteka > Primeri > IRremote > IRrecvDemo. Program, ki ga zapišemo v Arduino Uno (ali Mega), avtomatsko dekodira vrsto daljinskega upravljalnika, ki ga uporabljamo in ugotovi, na katero tipko smo pritisnili. Odpremo serijski monitor in pritisnemo na različne tipke IR daljinskega upravljalnika. Za vsako tipko, ki jo pritisnemo, se nam izpiše ustrezna koda v šestnajstiški (hex) obliki (Serial.println(results.value, HEX);).

Slika 2: Izpis kod na serijskem monitorju

Spremenimo sedaj ta program tako, da bomo lahko z IR daljinskim upravljalnikom krmilili razsvetljavo (dve LED diodi) in zapornico (servomotor). Preberimo najprej kode, ki se izpišejo na serijskem monitorju, ko pritisnemo na določeno tipko IR daljinskega upravljalnika:

Program naj deluje po naslednjih zahtevah:

Slika 3: IR sprejemnik AX-1838HS z oznakami priključkov (vir: http://www.instructables.com/file/FI7J3VXHD7TZXAS)

Priključitev elementov na razvojno ploščo Arduino:

Program po podanih zahtevah z uporabo stavka if:

/*

 IR daljinski upravljalnik, IR sprejemni modul AX-1838HS, Arduino mega

 Krmiljenje naprav z IR daljinskim upravljalnikom

 Milan Ivič

 Avgust 2015

 */

 //Knjižnici za servomotor in IR:

 #include <Servo.h>

 #include <IRremote.h>

 #define LED_pin 2

 #define LED_pin 3

 int Sprejem_kode_pin = 11;

 IRrecv irrecv(Sprejem_kode_pin);

 decode_results results;

 Servo servo;

 int Zapornica_spodaj = 0;     //Inicializacija za servo motorček, zapornica je spodaj (0°).

 int Zapornica_zgoraj = 90;    //Inicializacija za servo motorček, zapornica je zgoraj (90°).

 void setup()

 {

   pinMode(2, OUTPUT);

   pinMode(3, OUTPUT);

   servo.attach(7);

   servo.write(Zapornica_spodaj);  

   Serial.begin(9600);

   irrecv.enableIRIn();             //Sprejemanje kode, ki jo zazna IR sprejemnik.

 }

 void loop()

 {

   if (irrecv.decode(&results))

   {

       if(results.value == 0xFF30CF)     //Ali je pritisnjen gumb, ki "pošlje" hex kodo 0xFF30CF?

       {

         digitalWrite(2, HIGH);               //Vklopi LED diodo, priključeno na pin 2.

       }

       if(results.value == 0xFF18E7)     //Ali je pritisnjen gumb, ki "pošlje" hex kodo 0xFF18E7?

       {

         digitalWrite(2, LOW);               //Izklopi LED diodo, priključeno na pin 2.

       }

       if(results.value == 0xFF7A85)     //Ali je pritisnjen gumb, ki "pošlje" hex kodo 0xFF7A85?

       {

         digitalWrite(3, HIGH);               //Vklopi LED diodo, priključeno na pin 3.

       }

       if(results.value == 0xFF10EF)     //Ali je pritisnjen gumb, ki "pošlje" hex kodo 0xFF10FE?

       {

         digitalWrite(3, LOW);               //Izklopi LED diodo, priključeno na pin 3.

       }

       if(results.value == 0xFF38C7)     //Ali je pritisnjen gumb, ki "pošlje" hex kodo 0xFF38C7?

       {

         //Dvigni zapornico:

         for(int i = 0; i < 90; i++)            //Zanka for se izvede 90 krat od 0 do 70 po koraku 1.

         {            

           servo.write(i);                      //Ob vsakem obhodu zanke for se zavrti servo motor za 1°.

           delay(15);                           //Za počasnejše dvigivanje zapornice.

         }

         delay(2000);

         //Spusti zapornico:

         for(int j = 90; j>0; j--)              //Zanka for se izvaja po korakih 1 od 85 do 0.

         {

          servo.write(j);

          delay(15);             

         }

       }

      if(results.value == 0xFF5AA5)     //Ali je pritisnjen gumb, ki "pošlje" hex kodo 0xFF5AA5?

      {

        //Vklopi obe LED diodi:

        digitalWrite(2, HIGH);

        digitalWrite(3, HIGH);

      }

      if(results.value == 0xFF6897)      //Ali je pritisnjen gumb, ki "pošlje" hex kodo 0xFF6897?

      {

        //Izklopi obe LED diodi:

        digitalWrite(2, LOW);

        digitalWrite(3, LOW);        

      }

    

    Serial.println(results.value, HEX);    //Izpiši kodo v šestnajstiščem št. sistemu (hex).

    irrecv.resume();                            //IR sprejemanje naslednje kode.

  }

}

Program po podanih zahtevah z uporabo stavka switch case:

/*

 IR daljinski upravljalnik, IR sprejemni modul AX-1838HS, Arduino mega

 Krmiljenje naprav z IR daljinskim upravljalnikom

 Milan Ivič

 Avgust 2015

 */

 //Knjižnici za servomotor in IR:

 #include <Servo.h>

 #include <IRremote.h>

 #define LED_pin 2

 #define LED_pin 3

 int Sprejem_kode_pin = 11;

 IRrecv irrecv(Sprejem_kode_pin);

 decode_results results;

 Servo servo;

 int Zapornica_spodaj = 0;     //Inicializacija za servo motorček, zapornica je spodaj (0°).

 int Zapornica_zgoraj = 90;    //Inicializacija za servo motorček, zapornica je zgoraj (90°).

 void setup()

 {

   pinMode(2, OUTPUT);

   pinMode(3, OUTPUT);

   servo.attach(7);

   servo.write(Zapornica_spodaj);  

   Serial.begin(9600);

   irrecv.enableIRIn();             //Sprejemanje kode, ki jo zazna IR sprejemnik.

 }

 void loop()

 {

   if (irrecv.decode(&results))

   {

     switch(results.value)

     {

     case 0xFF30CF:               //Pritisnjena je tipka 1 na daljinskem upravljalniku.

       digitalWrite(2, HIGH);     //Vklopi LED diodo, priključeno na pin 2.

       break;

     

     case 0xFF18E7:               //Pritisnjena je tipka 2 na daljinskem upravljalniku.

       digitalWrite(2, LOW);      //Izklopi LED diodo, priključeno na pin 2.

       break;

     

     case 0xFF7A85:               //Pritisnjena je tipka 3 na daljinskem upravljalniku.

       digitalWrite(3, HIGH);     //Vklopi LED diodo, priključeno na pin 3.

       break;

     

     case 0xFF10EF:               //Pritisnjena je tipka 4 na daljinskem upravljalniku.

       digitalWrite(3, LOW);      //Izklopi LED diodo, priključeno na pin 3.

       break;

     

     case 0xFF38C7:               //Pritisnjena je tipka 5 na daljinskem upravljalniku.

       //Dvigni zapornico:

       for(int i = 0; i < 90; i++)    //Zanka for se izvede 90 krat od 0 do 70 po koraku 1.

       {           

         servo.write(i);                //Ob vsakem obhodu zanke for se zavrti servo motor za 1°.

         delay(15);                     //Za počasnejše dvigivanje zapornice.

       }

       delay(2000);

        //Spusti zapornico:

       for(int j = 90; j>0; j--)        //Zanka for se izvaja po korakih 1 od 85 do 0.

       {

         servo.write(j);

         delay(15);            

       }

       break;

     

     case 0xFF5AA5:                //Pritisnjena je tipka 6 na daljinskem upravljalniku.

       //Vklopi obe LED diodi:

       digitalWrite(2, HIGH);

       digitalWrite(3, HIGH);

       break;

     

     case 0xFF6897:                  //Pritisnjena je tipka 0 na daljinskem upravljalniku.

       //Izklopi obe LED diodi:

       digitalWrite(2, LOW);

       digitalWrite(3, LOW);       

       break;

     }

     Serial.println(results.value, HEX);    //Izpiši kodo v šestnajstiščem št. sistemu (hex).

     irrecv.resume();                       //IR sprejemanje naslednje kode.

   }

 }