Bir projemde KEYES marka uzaktan kumanda alıcı ve verici devresi ile servo motor kontrol etmem gerekiyordu. Bu yazımda servo motorun uzaktan kumanda ile kontrol edilmesini anlatacağım ama aslında burada servo motor kısmından çok uzaktan kumanda kısmı önemli. Çünkü servo motor yerine istediğiniz bir alıcıyı kullanmanız mümkün.

Keyes Uzaktan Kumanda Modülü

Yukarıda gördüğünüz bir uzaktan kumanda modülü. Solda kumanda (Transmitter – verici) var. Sağda ise Receiver (Alıcı kısmı) var.

Kısa bir google araması ile bağlantı şemasına ulaştım. (keyes remote modul pinout )

Ground yazan kısmı arduino’nun GND çıkışına bağlayın.

5V kısmını arduino’nun Vcc veya 5V kısmına bağlayın.

S yazan kısma yakın bacak “Signal Out” kısmını da arduino’nun istediğiniz bir girişine bağlayın. Aşağıdaki kodu kullanacaksanız 11 nolu pine bağlıyorsunuz.

Bağlantı kısmı bu kadar.

Öncelikle basit bir kodla bu modülün çalışıp çalışmadığına bakalım.

#include <IRemote.h>
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

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

Eğer bilgisayarınızda IRemote.h kütüphanesi kurulu değilse;

Library düzenle kısmından remote yazarak aratın. Bu kütüphane çıkacak. Kur yazan yere basın ve kurulsun.

Serial Monitor’ü açın ve kumandanın tuşlarına basın. Her basışınızda bir Hex kod çıkışı alacaksınız. Şunun gibi:

PWR       FF629D     
CH          FFE21D        
|<<          FF22DD  
>|            FFC23D              
>>|          FF02FD               
-              FFE01F 
Plus        FFA857         
EQ          FF906F          
0             FF6897            
100         FF9867           
200         FFB04F           
1             FF30CF                 
2             FF18E7                 
3             FF7A85                  
4             FF10EF                   
5             FF38C7                    
6             FF5AA5                  
7             FF42BD                  
8             FF48B5             
9             FF52AD 

Adım 2: Basit bir kodla kumandanın daha ileri seviyede kontrolü

Yukarıdaki örnekte hex kodu üretiliyordu. Aşağıdaki kodu kullanırsanız da direk rakamsal sonuç alırsınız:

//  Henry's Bench IR Remote Tutorial 1

#include <IRremote.h>

int IR_PIN = 11;

IRrecv irDetect(IR_PIN);

decode_results irIn;

void setup()
{
  Serial.begin(9600);
  irDetect.enableIRIn(); // Start the Receiver
}

void loop() {
  if (irDetect.decode(&irIn)) {
    Serial.println(irIn.value, HEX);
    irDetect.resume(); // Receive the next value
  }
}

Bu güzel kod için Henry’e teşekkür ederek devam edelim. Aldığınız çıktı şöyle olmalı:

KeyValue
Up ArrowFF629D
Left ArrowFF22DD
OKFF02FD
Right ArrowFFC23D
Down ArrowFFA857
1FF6897
2FF9867
3FFB04F
4FF30CF
5FF18E7
6FF7A85
7FF10EF
8FF38C7
9FF5AA5
*FF42BD
0FF4AB5
#FF52AD

Yukarıdaki sonucu da okuduysanız yolumuza devam edelim. Eğer serial monitörde rastgele sonuç görüyorsanız Boud Rate kısmını 9600 olarak ayarlamamış olabilirsiniz.

Adım 2: Swich Case yapısı ile uzaktan kumanda kontrolü

Asıl can alıcı kod bu olacak. Çünkü bir tuşa bastığımızda hangi eylemi yapacağını bu kodla ayarlayacağız.

//  Henry's Bench IR Remote Tutorial 2

#include <IRremote.h>

int IR_PIN = 11;

IRrecv irDetect(IR_PIN);

decode_results irIn;

void setup()
{
  Serial.begin(9600);
  
  irDetect.enableIRIn(); // Start the Receiver
}

void loop() {
  if (irDetect.decode(&irIn)) {
    decodeIR();
    irDetect.resume(); 
  }
}

void decodeIR() // Indicate what key is pressed

{

  switch(irIn.value)

  {

  case 0xFF629D:  
    Serial.println("Up Arrow"); 
    break;

  case 0xFF22DD:  
    Serial.println("Left Arrow"); 
    break;

  case 0xFF02FD:  
    Serial.println("OK"); 
    break;

  case 0xFFC23D:  
    Serial.println("Right Arrow"); 
    break;

  case 0xFFA857:  
    Serial.println("Down Arrow"); 
    break;

  case 0xFF6897:  
    Serial.println("1");
    break;

  case 0xFF9867:  
    Serial.println("2"); 
    break;

  case 0xFFB04F:  
    Serial.println("3"); 
    break;

  case 0xFF30CF:  
    Serial.println("4"); 
    break;

  case 0xFF18E7:  
    Serial.println("5"); 
    break;

  case 0xFF7A85:  
    Serial.println("6"); 
    break;

  case 0xFF10EF:  
    Serial.println("7"); 
    break;

  case 0xFF38C7:  
    Serial.println("8"); 
    break;

  case 0xFF5AA5:  
    Serial.println("9"); 
    break;

  case 0xFF42BD:  
    Serial.println("*"); 
    break;

  case 0xFF4AB5:  
    Serial.println("0"); 
    break;

  case 0xFF52AD:  
    Serial.println("#"); 
    break; 

  default: 
   break;

  }
}

Yukarıda ki kodu yüklediğinizde serial monitörde hangi tuşa bastığınızı görebilirsiniz. Örneğin sol ok tuşuna basarsanız “left arrow (sol ok)” yazacak. 1’e basarsanız 1 yazacak.

Bu kod temel kontrol kodu olarak kullanılabilir. Siz 1 tuşuna basınca led’in yanmasını istiyorsanız;

 case 0xFF6897:  
    Serial.println("1");
    digitalWrite(led, HIGH);
    break;

Kodun o kısmına eklemenizi yapacaksınız. (Tabi önce pin tanımlamaları, OUTPUT olarak gösteme işlemlerini vs.. yapmanız da gerekiyor.)

Bonus: Uzaktan kumanda ile servo motor kontrolü

Aslında aşağıdaki kodu henüz bitirme fırsatım olmadı. Sadece deneme yapıp bir servo motorda düzgün çalıştığını gördüm. Lazım olur diye buraya da ekliyorum:

#include <Servo.h>

Servo myservo;  // create servo object to control a servo


#include <IRremote.h>

int IR_PIN = 11;

IRrecv irDetect(IR_PIN);

decode_results irIn;

void setup()
{
    myservo.attach(9);  // attaches the servo on pin 9 to the servo object
  Serial.begin(9600);
  irDetect.enableIRIn(); // Start the Receiver

}

void loop() {
  if (irDetect.decode(&irIn)) {
    decodeIR();
    irDetect.resume(); 
  }
 
}

void decodeIR() // Indicate what key is pressed

{

  switch(irIn.value)

  {

  case 0xFF02FD:  
    Serial.println("OK"); 
         myservo.write(0);                  // Servo motorun açısı 0 olarak ayarlandı
  delay(15);
    break;

  case 0xFFB04F:  
    Serial.println("3"); 
     myservo.write(60);                  // Servo motorun açısı 60 olarak ayarlandı
  delay(15);  
    break;

  case 0xFF30CF:  
    Serial.println("4"); 
         myservo.write(150);                 // Servo motorun açısı 150 olarak ayarlandı
  delay(15);
    break;

  default: 
   break;

  }
}

Servo.h kütüphanesi yüklü değilse yükleyin. Servo motor bağlantısını yapın ve sinyal pinini arduino’nun 9 nolu çıkışına takın.

Servo motor bağlantısı ile ilgili şuradan yararlanabilirsiniz:

Kızıl ötesi kontrolünün mantığını öğrenmek için şu sayfayı ziyaret edebilirsiniz:

Burada LCD ekrandan çıktı alabilmeniz için gereken kodlar da var.

Evet. Şimdilik yazacaklarımız bunlar. Projemiz bitince sitemizde yayınlayacağız. Siz de sitemizde yazarlık yapmak isterseniz bana mail atmayı unutmayın. Elektronik aşkını ülkemizde yaygınlaştırmak için bize destek olun.