4 Nisan 2014 Cuma

Arduino - Kızılötesi Kullanarak (Infared Receiver) TV Kumandası ile Led Yakma

Yavaş yavaş kablosuz düzeneklere geçmenin fayda sağlayacağını düşündüm. Bunun için de aralarından en basiti olan kızılötesi haberleşmeyi seçtim. Kısaca bahsetmek gerekirse kızılötesi bizim gözümüzle göremediğimiz ışınlar ve bu ışınları görebilen alıcı ve vericiler sayesinde 2 ayrı bağımsız devre belirli kodlamalar sayesinde haberleşebiliyor.En basitinden telefonunuzun kamerası ile televizyon kumandasının önündeki lede bakarken herhangi bir tuşa bastığınızda led'in yandığını görebilirsiniz. Fakat çıplak gözle kendimiz bu ışınları göremiyoruz.

TV kumandası seçtim çünkü hem bu kumandalardaki kodları çözümlemeyi öğrenmek hem de hazır bir verici olduğu için bizi fazla uğraştan kurtarır diye düşündüm :). 

Kısaca yapacağımız projeyi anlatmam gerekirse önce TV kumandamızdaki tuşların kodlarını arduinomuz sayesinde öğreneceğiz ve bu kodları kullanarak sayısal çıkışlara hükmedeceğiz.


Ama önce aşağıdaki linkten arduino sketch kızılötesi kütüphanesini indirmemiz gerekiyor.

http://www.pjrc.com/teensy/arduino_libraries/IRremote.zip


Bunu arduino'nun kurulu olduğu klasördeki libraries içine atıyoruz. Adını sadece IR yaparsanız iyi olur. Bu kütüphane ile kullanacağımız kodları incelememiz gerekirse;

IRrecv irrecv(receivePin) ; // Adını koyabileceğimiz bir IR alıcı oluşturuyoruz.

irrecv.enableIRIn() ;  // IR ile veri alma işlemini başlatıyoruz.

irrecv.decode(&results); // Alınan kodu çözme teşebbüsüne girer.

results.value ; // Verinin kodudur. (bu değeri kullanacağız)

irrecv.resume(); // Veri alımından sonra diğer kodu almak için başa döner.

Önce aşağıdaki kodları yazıyoruz ve kullandığımız kumandanın kullanmak istediğimiz herhangi 4 tuşunun kodlarını yazıyoruz..Tabi önce Sketch>Import Library > IR'yi tıklıyoruz ki kütüphanemiz eklensin.


#include <IRremote.h>

int RECV_PIN = 11;  //IR'nin 3.bacağını taktığımız pin
IRrecv irrecv(RECV_PIN); 
decode_results kod; // dekode sonucu

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Alma başlıyor
  
}

void loop()
{
  if (irrecv.decode(&kod))
    {
     Serial.println(kod.value, DEC); // Kodun Decimal Değeri
     irrecv.resume();} // Yeni kod alımı

}
  


Benim kumandamda bu değerler çıktı. 1 tuştan 2 farklı değer çıkabilir. Mühim değil, 2 değeri de tek bir değere indirgeyeceğiz bu sorun da ortadan kalkmış olacak. Bunu da aşağıdaki örnekteki gibi yapacağım.

if(k==1874)
return 1;  // 1874 değerim 1 oldu

3 Led kullandım, 3 tuş açmak için kullanacağım , 1 tuşu da kapatmak için kullanacağım. 



#include <IRremote.h>

int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN);

decode_results kod;

int kumanda(int k)
{

  if(k==3922)
    return 1;
  if(k==3907)
    return 2;  
  if(k==3906)
    return 3;
  if(k==3911)
    return 4;
  if(k==1874)
    return 1;
  if(k==1859)
    return 2;
  if(k==1858)
    return 3;
  if(k==1863)
    return 4;


return -1;    

}

void setup()

  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);

  Serial.begin(9600);
  irrecv.enableIRIn(); 
}

void loop() {
  if (irrecv.decode(&kod)) {

    Serial.println(kumanda(kod.value));

    if(kumanda(kod.value) == 1)
      digitalWrite(9,HIGH);

    if(kumanda(kod.value) == 2)
      digitalWrite(8,HIGH);

    if(kumanda(kod.value) == 3)
      digitalWrite(7,HIGH);

    if(kumanda(kod.value) == 4){

      digitalWrite(7,LOW);    
      digitalWrite(8,LOW);  
      digitalWrite(9,LOW);  
 }
 irrecv.resume(); 
  }
}


Videomuz ;