Support http://amicus.ba with small donation

Prije nego što Arduino mikrokontroler pretvorimo u uređaj kojim se upravlja pomoću IR (Infrared) daljinskog potrebno je prvo savladati osnove prijema i obrade signala IR daljinskog.

U kompletu Arduinu komponenti dolazi i IR daljinski sa oznakom CarMP3 koji ima tipke sa brojevima kao i tipke za media upravljanje.

Na slici ispod je primjer spoja noname IR receiver-a.

IR remote

CarMP3 daljinski

Za upravljanje Arduinom pomoću IR daljinskog (bilo kojeg) potreban je Arduino, IR receiver koji služi za prijem komandi od IR daljinskog upravljača i sam IR daljinski. Na slici desno je pomenuti IR daljinski.

Različiti IR daljinski upravljači šalju različite komande (zbog raznih protokola) koje različiti IR prijemnici tumače na različite načine.

VS1838 IR receiver pinout

Na slici lijevo je VS1838 IR receiver sa obilježenim nožicama.

Prilikom spajanja treba biti vrlo pažljiv jer se IR prijemnik vrlo brzo 'spali' ako je pogrešno spojen. 

 

 

 

 

Hauppauge infrared sensor

 

 

Na slici lijevo je IR prijemnik od Hauppauge PCI TV kartice.

Budući da je vrijeme analognih PCI TV kartica davno prošlo, jednoj komponenti - IR prijemniku na kablu, sam dao novu priliku.

Na slici lje prikazan konektor tog IR senzora sa obilježenim kontaktima i žicama.

Ja sam konektor odrezao i na krajeve žica nalemio žice za spajanje na breadboard i sada imam IR prijemnik za Arduino na kablu. 

Princip korištenja primljenih signala je u svakom slučaju isti. Potrebno je detektovati koji kôd šalje koja tipka daljinskog (npr. HEX broj) i u slučaju prijema odgovarajućeg koda izvršiti željenu akciju (pomoću if ili case naredbe).

Svaki IR receiver ima tri nožice od kojih su dvije za napajanje a treća šalje signal na INPUT pin Arduino ploče.

Za utvrđivanje koji kôd šalje koja tipka daljinskog sam koristio sljedeći sketch: (kopirajte kompletan kôd ispod u Arduino IDE prozor i upload-ujte ga na Arduino) :

/*
 * ČITANJE HEX KODOVA
 * IR DALJINSKOG
 *
 * Autor: Samir Gutić
 * URL: http://amicus.ba
 * Datum: 4. II 2017.
 */
 
#include <IRremote.h>
#include <IRremoteInt.h>
int IR_Pin = 11;
IRrecv irPrimljeno(IR_Pin);
decode_results primljeno;

void setup()
{
Serial.begin(9600);
irPrimljeno.enableIRIn(); //Pokretanje IR prijemnika
}

void loop()
{
if (irPrimljeno.decode(&primljeno))
   {
       if (primljeno.value!=0xFFFFFFFF)
       {
           Serial.println(primljeno.value, HEX);
       }
       delay(2);
       irPrimljeno.resume(); //Primanje sljedeće vrijednosti
   }
}

Signalna nožica IR prijemnika je spojena na pin 11 Arduino ploče.

Za praćenje kodova koje Arduino prima od daljinskog se koristi Serial Monitor Arduino software-a. Potrebno je, nakon upload-a sketcha, Arduino zadržati spojen sa računarom putem USB kabla te izabrati Tools\Serial Monitor da se prikaže prozor Serial Monitor-a.

U sketchu za testiranje sam koristio if naredbu sa uslovom primljeno.value!=0xFFFFFFFF da bih filtrirao (blokirao) kôd FFFFFFF koji predstavlja NEC kôd ponavljanja. Zbog toga, kada pritisnem jednu tipku, dobijem kôd te tipke i još nekoliko puta FFFFFFF.

Treba obratiti pažnju da je u prozoru serial monitora prikazan kôd FFFFFFF ili FF6897 ili bilo koji kôd tipke dok je u uslovu IF naredbe navedeno taj isti kôd ispred koga je dopisano 0x (nula x).
Upload-om sketcha na Arduino i pokretanjem serial monitora i pritiskanjem na tipke daljinskog okrenutog prema IR prijemniku dobijam kôdove kao na slici ispod.

Serial monitor

Tabela HEX kodova - originalni IR daljinski

Na slici lijevo je lista svih HEX kodova koje može poslati CarMP3 IR daljinski upravljač sa slike iznad.

Arduino prima heksadecimalni kôd koji šalje daljinski i taj kôd printa na Serial monitor Arduino IDE.

U Arduino sketch-u je, pri provjeri u IF naredbi, ispred ovih kôdova potrebno dodati 0x (nula x) da bi kôdovi bili uspješno detektovani.

U suštini, za svaki IR daljinski koji će biti korišten je potrebno kreirati ovakvu tabelu da bi, u Arduino sketch-u, uvijek mogla biti izvršena prava akcija nakon pritiska na neku tipku.

Na sreću, na internetu je moguće pronaći ove tabele za veliki broj daljinskih upravljača.

U slučaju da imate neki egzotični IR daljinski koji vam je posebno pri srcu (ja imam jedan koji sam koristio još za spajanje na PC preko COM porta i upravljanje računarom pomoću programa Girder), možete koristiti sljedeći sketch koji ispisuje i protokol koji IR daljinski koristi kao i HEX kod pritisnute tipke.

 /*
 * TEST PRIJEMA SA IR DALJINSKOG (BILO KOJEG)
 *
 * Autor: Samir Gutić
 * URL: http://amicus.ba
 * Datum: 4. II 2017.
 */
 
#include <IRremote.h>
#include <IRremoteInt.h>

int IR_Pin = 6;
IRrecv irPrimljeno(IR_Pin);
decode_results primljeno;

void setup()
{
  Serial.begin(9600);
  irPrimljeno.enableIRIn(); //Pokretanje IR prijemnika
}

void loop()
{
  if (irPrimljeno.decode(&primljeno))
    {
       if (primljeno.value!=0xFFFFFFFF)
        {
           Serial.print("Protokol: ");
           Serial.print(primljeno.decode_type, DEC);
           Serial.println("");
           Serial.print(" HEX kod: ");
           Serial.println(primljeno.value, HEX);
           Serial.println("----------------");  
        }
        delay(1);
     
     irPrimljeno.resume(); //Primanje sljedeće vrijednosti
    }
}

Kada pobilježimo sve potrebne kôdove (svih potrebnih tipki) možemo kreirati sljedeći sketch koji će, na osnovu pritisnute tipke IR daljinskog na serial moinitoru ispisati oznaku pritisnute tipke.

/*
 * PRIJEM IR KODOVA SA DALJINSKOG I PRINTANJE IMENA
 * PRIMLJENE TIPKE NA SERIAL MONITOR
 * KORIŠTEN JE DALJINSKI IZ ARDUINO KOMPLETA (CarMP3)
 *
 * Autor: Samir Gutić
 * URL: http://amicus.ba
 * Datum: 3. II 2017.
 */
 
#include <IRremote.h>
#include <IRremoteInt.h>

int IR_Pin = 11;
IRrecv irPrimljeno(IR_Pin);
decode_results primljeno;

void setup()
{
  Serial.begin(9600);
  irPrimljeno.enableIRIn(); //Pokretanje IR prijemnika
}

void loop()
{
  if (irPrimljeno.decode(&primljeno))
    {
       if (primljeno.value!=0xFFFFFFFF && primljeno.value!=0X4AB0F7B6)
        {
           //Serial.println(primljeno.value, HEX);
           if (primljeno.value==0xFF6897)
            {
              Serial.println("Broj 0");
            }
            if (primljeno.value==0xFF30CF)
            {
              Serial.println("Broj 1");
            }
            if (primljeno.value==0xFF18E7)
            {
              Serial.println("Broj 2");
            }
            if (primljeno.value==0xFF7A85)
            {
              Serial.println("Broj 3");
            }
            if (primljeno.value==0xFF10EF)
            {
              Serial.println("Broj 4");
            }
            if (primljeno.value==0xFF38C7)
            {
              Serial.println("Broj 5");
            }
            if (primljeno.value==0xFF5AA5)
            {
              Serial.println("Broj 6");
            }
            if (primljeno.value==0xFF42BD)
            {
              Serial.println("Broj 7");
            }
            if (primljeno.value==0xFF4AB5)
            {
              Serial.println("Broj 8");
            }
            if (primljeno.value==0xFF52AD)
            {
              Serial.println("Broj 9");
            }
            if (primljeno.value==0xFFA25D)
            {
              Serial.println("CH-");
            }
            if (primljeno.value==0xFF629D)
            {
              Serial.println("CH");
            }
            if (primljeno.value==0xFFE21D)
            {
              Serial.println("CH+");
            }
            if (primljeno.value==0xFFE21D)
            {
              Serial.println("CH+");
            }
            if (primljeno.value==0xFF22DD)
            {
              Serial.println("II<<");
            }
            if (primljeno.value==0xFF02FD)
            {
              Serial.println(">>II");
            }
            if (primljeno.value==0xFFC23D)
            {
              Serial.println(">II");
            }
            if (primljeno.value==0xFFE01F)
            {
              Serial.println("-");
            }
            if (primljeno.value==0xFFA857)
            {
              Serial.println("+");
            }
            if (primljeno.value==0xFF906F)
            {
              Serial.println("EQ");
            }
            if (primljeno.value==0xFF9867)
            {
              Serial.println("100+");
            }
            if (primljeno.value==0xFFB04F)
            {
              Serial.println("200+");
            }
        }
        delay(2);
     
     irPrimljeno.resume(); //Primanje sljedeće vrijednosti
    }
}

Rezultat rada sketch-a iznad je na slici ispod.

Primljeni HEX kodovi

Umjesto naredbi za printanje teksta na serial monitor ( Serial.println("Broj 0");) moguće je koristiti bilo koju instrukciju koja će aktivirati izlaze, ispisivati tekst na LCD display, vršiti proračune...

Za testiranje IR prijemnika (i daljinskog u paru) i detekciju kodova pojedinih tipki daljinskog koristiti sljedeću šemu:

IR remote - breadboard

Električna šema spoja je na sljedećoj slici.

IR remote - električna šema

Potrebne komponente:

1 x Arduino UNO

1 x Breadboard (velika)

6 x LED

6 x otpornik 220Ω

1 x IR senzor (npr. haupauge IR senzor)

1 x IR daljinski (npr. CarMP3)

Žice za spajanje

9V napajanje