Arduino İle Kızılötesi IR Alıcı Sensörü Kullanımı

Merhaba bu yazımızda Kızılötesi IR Alıcı sensörü hakkında genel bir bilgi vereceğiz. Ayrıca sensörümüzün nasıl kullanıldığını da anlatacağız. Kızılötesi (IR) iletişim, birçok yararlı uygulamaya sahip, yaygın olarak kullanılan ve uygulanması kolay bir kablosuz teknolojidir. Günlük hayatta en belirgin örnekler TV/video uzaktan kumandaları, hareket sensörleri ve kızılötesi termometrelerdir.

IR iletişimini de kullanan birçok ilginç Arduino projesi var. Basit bir IR verici ve alıcı ile uzaktan kumandalı robotlar, mesafe sensörleri, kalp atış hızı monitörleri, DSLR kamera uzaktan kumandaları, TV uzaktan kumandaları ve çok daha fazlasını yapabilirsiniz.

Bu derste önce kızılötesinin ne olduğunu ve nasıl çalıştığını açıklayacağım. Sonra size bir Arduino’da bir IR alıcısını ve uzaktan kumandayı nasıl kuracağınızı göstereceğim. Arduino’ya bağlı şeyleri kontrol etmek için hemen hemen her IR uzaktan kumandayı (TV’nizinki gibi) nasıl kullanacağınızı da göstereceğim.

Kızılötesi Nedir?

Kızılötesi radyasyon, etrafımızda gördüğümüz ışığa benzer bir ışık şeklidir. IR ışığı ile görünür ışık arasındaki tek fark, frekans ve dalga boyudur. Kızılötesi radyasyon, görünür ışık aralığının dışındadır, bu nedenle insanlar onu göremez:

Işık Spektrumu

IR bir tür ışık olduğundan, IR iletişimi alıcıdan vericiye doğrudan bir görüş hattı gerektirir. Duvarlardan veya WiFi veya Bluetooth gibi diğer materyallerden iletemez.

IR Uzaktan Kumanda ve Alıcılar Nasıl Çalışıyor?

Tipik bir kızılötesi iletişim sistemi, bir IR vericisi ve bir IR alıcısı gerektirir. Verici, görünür spektrum yerine IR spektrumunda ışık üretmesi dışında standart bir LED’e benziyor. Bir TV uzaktan kumandasının önüne bakarsanız, IR verici LED’ini görürsünüz.

IR Kumanda

Arduino için IR verici devre kartlarında aynı tip LED kullanılır. Bunu IR vericisinin önünde görebilirsiniz:

IR Verici

IR alıcısı, IR ışığını elektrik sinyaline dönüştüren bir fotodiyot ve ön yükselticidir. IR alıcı diyotları tipik olarak şöyle görünür:

IR Alıcı

Bazı alıcılar kartlar modül olarak gelmektedir:

Kızılötesi IR Alıcı Modül
Kızılötesi IR Alıcı Modül

IR Sinyal Modülasyonu

IR ışığı güneş, ampuller ve ısı üreten diğer her şey tarafından yayılır. Bu, etrafımızda çok fazla IR ışık gürültüsü olduğu anlamına gelir. Bu gürültünün IR sinyaline karışmasını önlemek için bir sinyal modülasyon tekniği kullanılır.

IR sinyal modülasyonunda, IR uzaktan kumanda üzerindeki bir kodlayıcı, ikili sinyali modüle edilmiş bir elektrik sinyaline dönüştürür. Bu elektrik sinyali verici LED’e gönderilir. Verici LED, modüle edilmiş elektrik sinyalini modüle edilmiş bir IR ışık sinyaline dönüştürür. IR alıcısı daha sonra IR ışık sinyalini demodüle eder ve bilgiyi bir mikro denetleyiciye aktarmadan önce onu tekrar ikiliye dönüştürür:

IR Sinyal Modülasyon

Modüle edilmiş IR sinyali, taşıyıcı frekansı olarak bilinen yüksek bir frekansta açılıp kapatılan bir dizi IR ışık darbesidir. Çoğu verici tarafından kullanılan taşıyıcı frekansı 38 kHz’dir, çünkü doğada nadirdir ve bu nedenle ortam gürültüsünden ayırt edilebilir. Bu şekilde IR alıcısı, 38 kHz sinyalinin vericiden gönderildiğini ve çevredeki ortamdan alınmadığını bilecektir.

Alıcı diyot, IR ışığının tüm frekanslarını algılar, ancak bir bant geçiren filtreye sahiptir ve yalnızca 38 kHz’de IR’ye izin verir. Daha sonra modüle edilmiş sinyali bir ön yükseltici ile yükseltir ve bir mikro denetleyiciye göndermeden önce onu ikili bir sinyale dönüştürür.

IR İletim Protokolleri

Modüle edilmiş IR sinyalinin ikiliye dönüştürüldüğü model, bir iletim protokolü ile tanımlanır. Birçok IR iletim protokolü vardır. Sony, Matsushita, NEC ve RC5 daha yaygın protokollerden bazılarıdır.

NEC protokolü aynı zamanda Arduino projelerinde en yaygın türdür, bu yüzden alıcının modüle edilmiş IR sinyalini ikiliye nasıl dönüştürdüğünü size göstermek için bir örnek olarak kullanacağım.

Mantıksal ‘1’, 38 kHz IR’lik 562,5 µs uzunluğundaki YÜKSEK darbe ile başlar ve bunu 1,687,5 µs uzunluğundaki DÜŞÜK darbe izler. Mantıksal “0”, 562,5 µs uzunluğunda bir YÜKSEK darbe ve ardından 562,5 µs uzunluğunda DÜŞÜK darbe ile iletilir:

Nec Protokolü

NEC protokolü, ikili verileri modüle edilmiş bir sinyale bu şekilde kodlar ve çözer. Diğer protokoller, yalnızca bireysel YÜKSEK ve DÜŞÜK darbelerin süresinde farklılık gösterir.

IR Kodları

Uzaktan kumandadaki bir düğmeye her bastığınızda, benzersiz bir onaltılık kod oluşturulur. Modüle edilen ve IR üzerinden alıcıya gönderilen bilgidir. Hangi tuşa basıldığını deşifre etmek için alıcı mikrodenetleyicinin uzaktan kumandadaki her bir tuşa hangi kodun karşılık geldiğini bilmesi gerekir.

Farklı uzaktan kumandalar, tuşlara basmak için farklı kodlar gönderir, bu nedenle kendi uzaktan kumandanızdaki her bir tuş için oluşturulan kodu belirlemeniz gerekir. Veri sayfasını bulabilirseniz, IR anahtar kodları listelenmelidir. Olmazsa, popüler uzaktan kumandaların çoğunu okuyacak ve bir tuşa bastığınızda onaltılık kodları seri monitöre yazdıracak basit bir Arduino çizimi var. Bunu nasıl kuracağınızı birazdan göstereceğim, ancak önce alıcıyı Arduino’ya bağlamamız gerekiyor.

Arduino İle Kızılötesi IR Alıcı Bağlantı Şeması

Birkaç farklı IR alıcı türü vardır, bazıları bağımsızdır ve bazıları bir devre kartına monte edilmiştir. Pinler, burada kullandığım HX1838 IR alıcısı ve uzaktan kumanda setinden farklı düzenlenebileceğinden, özel IR alıcınızın veri sayfasını kontrol edin. Ancak, tüm IR alıcılarının üç pimi olacaktır: sinyal, toprak ve Vcc.

Çoğu sensör bağlantısı aşağıdaki gibidir.

Kızılötesi IR Alıcı Modül Pinleri
Kızılötesi IR Alıcı Modül Pinleri

Çoğu bağımsız diyotun pin çıkışı şöyledir:

IR Alıcı Sensörü
IR Alıcı Sensörü

Modülün bağlantı şeması aşağıdaki gibidir.

IR Alıcı Modülü Bağlantı Şeması

IR sensörün bağlantı şeması aşağıdaki gibidir.

IR Alıcı Sensörü Bağlantı Şeması

IR Uzaktan Kontrol Kütüphanesi Kurulması

Aşağıdaki tüm kod örnekleri için IRremote kütüphanesini kullanacağız. Kütüphanenin ZIP dosyasını buradan indirebilirsiniz.

ZIP dosyasından kütüphaneyi kurmak için Arduino IDE’yi açın, ardından Taslak > library ekle > .ZIP Kitaplığı Ekle’ye gidin, ardından yukarıdaki bağlantıdan indirdiğiniz IRremote ZIP dosyasını seçin.

Arduinoya Kütüphane Ekleme

Kumandanızın Kodlarını Bulma

Uzaktan kumandanızın anahtar kodlarını bulmak için bu kodu Arduino’nuza yükleyin ve seri monitörü açın:

#include <IRremote.h>

const int RECV_PIN = 7;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup(){
  Serial.begin(9600);
  irrecv.enableIRIn();
  irrecv.blink13(true);
}

void loop(){
  if (irrecv.decode(&results)){
        Serial.println(results.value, HEX);
        irrecv.resume();
  }
}

Şimdi uzaktan kumandanızdaki her tuşa basın ve her tuşa basıldığında yazdırılan onaltılık kodu kaydedin.

Seri Monitör Çıktısı

Yukarıdaki programı kullanarak, HX1838 IR alıcım ve uzaktan kumanda setimle birlikte gelen uzaktan kumandadan bir anahtar tablosu ve bunlara karşılık gelen kodlar elde ettim. Bir tuşa sürekli bastığınızda bir 0XFFFFFFFF kodu alacağınızı unutmayın.

 Tuş Kod
 CH- 0xFFA25D
 CH 0xFF629D
 CH+ 0xFFE21D
 << 0xFF22DD
 >> 0xFF02FD
 >|| 0xFFC23D
 – 0xFFE01F
 + 0xFFA857
 EQ 0xFF906F
 100+ 0xFF9867
 200+ 0xFFB04F
 0 0XFF6897
 1 0xFF30CF
 2 0xFF18E7
 3 0xFF7A85
 4 0xFF10EF
 5 0xFF38C7
 6 0xFF5AA5
 7 0xFF42BD
 8 0xFF4AB5
 9 0xFF52AD
Bazı Tuşlar ve Kodları

Kumanda Tarafından Kullanılan Protokolün Bulunması

Daha gelişmiş projeler üzerinde çalışmak istiyorsanız, uzaktan kumandanızın hangi protokolü kullandığını bilmek faydalı olabilir. Ya da sadece merak ediyor olabilirsiniz. Aşağıdaki kod, uzaktan kumandanız tarafından kullanılan protokolü tanıyacaktır. Evinizin etrafındaki uzaktan kumandaların çoğunda çalışmalıdır.

#include <IRremote.h>

const int RECV_PIN = 7;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup(){
  Serial.begin(9600);
  irrecv.enableIRIn();
  irrecv.blink13(true);
}

void loop(){
  if (irrecv.decode(&results)){
        Serial.println(results.value, HEX);
        switch (results.decode_type){
            case NEC: Serial.println("NEC"); break ;
            case SONY: Serial.println("SONY"); break ;
            case RC5: Serial.println("RC5"); break ;
            case RC6: Serial.println("RC6"); break ;
            case DISH: Serial.println("DISH"); break ;
            case SHARP: Serial.println("SHARP"); break ;
            case JVC: Serial.println("JVC"); break ;
            case SANYO: Serial.println("SANYO"); break ;
            case MITSUBISHI: Serial.println("MITSUBISHI"); break ;
            case SAMSUNG: Serial.println("SAMSUNG"); break ;
            case LG: Serial.println("LG"); break ;
            case WHYNTER: Serial.println("WHYNTER"); break ;
            case AIWA_RC_T501: Serial.println("AIWA_RC_T501"); break ;
            case PANASONIC: Serial.println("PANASONIC"); break ;
            case DENON: Serial.println("DENON"); break ;
          default:
            case UNKNOWN: Serial.println("UNKNOWN"); break ;
          }
        irrecv.resume();
 }
}

Basılan Tuşu Tanıma ve Seri Monitöre Yazdırma

Onaltılık(hexademical) kod yerine anahtar değeri yazdırmak için aşağıdaki kodu geliştirebilirsiniz:

#include <IRremote.h>

const int RECV_PIN = 7;
IRrecv irrecv(RECV_PIN);
decode_results results;
unsigned long key_value = 0;

void setup(){
  Serial.begin(9600);
  irrecv.enableIRIn();
  irrecv.blink13(true);
}

void loop(){
  if (irrecv.decode(&results)){
 
        if (results.value == 0XFFFFFFFF)
          results.value = key_value;

        switch(results.value){
          case 0xFFA25D:
          Serial.println("CH-");
          break;
          case 0xFF629D:
          Serial.println("CH");
          break;
          case 0xFFE21D:
          Serial.println("CH+");
          break;
          case 0xFF22DD:
          Serial.println("|<<");
          break;
          case 0xFF02FD:
          Serial.println(">>|");
          break ;  
          case 0xFFC23D:
          Serial.println(">|");
          break ;               
          case 0xFFE01F:
          Serial.println("-");
          break ;  
          case 0xFFA857:
          Serial.println("+");
          break ;  
          case 0xFF906F:
          Serial.println("EQ");
          break ;  
          case 0xFF6897:
          Serial.println("0");
          break ;  
          case 0xFF9867:
          Serial.println("100+");
          break ;
          case 0xFFB04F:
          Serial.println("200+");
          break ;
          case 0xFF30CF:
          Serial.println("1");
          break ;
          case 0xFF18E7:
          Serial.println("2");
          break ;
          case 0xFF7A85:
          Serial.println("3");
          break ;
          case 0xFF10EF:
          Serial.println("4");
          break ;
          case 0xFF38C7:
          Serial.println("5");
          break ;
          case 0xFF5AA5:
          Serial.println("6");
          break ;
          case 0xFF42BD:
          Serial.println("7");
          break ;
          case 0xFF4AB5:
          Serial.println("8");
          break ;
          case 0xFF52AD:
          Serial.println("9");
          break ;      
        }
        key_value = results.value;
        irrecv.resume(); 
  }
}

Uzaktan kumandanız yukarıdaki tablodakilerden farklı kodlar gönderiyorsa, her satırda yazan hex kodunu değiştirin:

case 0xFFA25D:
Serial.println(“CH-“);

Bu satırlarda 0xFFA25D hex kodu alındığında Arduino “CH-” yazdırır.

IR Alıcı Kodlarının Açıklaması

IRremote kitaplığını kullanan herhangi bir IR iletişimi için, önce recv adlı bir nesne oluşturmamız ve IR alıcısının bağlı olduğu pin numarasını belirtmemiz gerekiyor (satır 3). Bu nesne, alıcıdan gelen bilgilerin protokolü ve işlenmesiyle ilgilenecektir.

Sonraki adım, decode_results sınıfından, results adlı bir nesne oluşturmaktır. kodu çözülen bilgileri uygulamamızla paylaşmak için irrecv nesnesi tarafından kullanılacaktır (satır 5).

void setup() bloğunda, önce seri monitör baud hızını yapılandırıyoruz. Ardından, IRrecv üye işlevi enableIRIn() (satır 10) öğesini çağırarak IR alıcısını başlatırız.

satırdaki irrecv.blink13(true) işlevi, alıcı uzaktan kumandadan her sinyal aldığında Arduino’nun yerleşik LED’ini yanıp sönecektir, bu da hata ayıklama için kullanışlıdır.

void loop() bloğunda, bir kod alınırsa irrecv.decode işlevi true değerini döndürür ve program if ifadesindeki kodu yürütür. Alınan kod, result.value içinde saklanır. Sonra her bir IR kodunu işlemek ve karşılık gelen anahtar değerini yazdırmak için bir anahtar kullandım.

Anahtar bloğu başlamadan önce bir koşullu blok vardır:

if (results.value == 0XFFFFFFFF)
results.value = key_value;

Kumandadan 0XFFFFFFFF alırsak bir önceki anahtarın tekrarı anlamına gelir. Bu nedenle, tekrarlama anahtarı modelini işlemek için, her kod alındığında onaltılı(hexademical) kodu global bir key_value değişkeninde saklıyorum:

key_value = results.value;

void loop() bölümünün sonunda, alıcıyı sıfırlamak ve bir sonraki kodu almaya hazırlamak için irrecv.resume() öğesini çağırırız.