- Şu tarihte
Arduino ile IR Sensörü Kullanımı
Merhaba, teknik konularda uzun süredir bir şey yazmadığımı fark ettim ve hazır boşluğu bulmuşken şu sıralar uğraştığım Arduino ile ilgili bir şeyler karalamaya karar verdim. Arduino ile ir sensörü kullanımı Arduino'yu uzaktan kontrol edebilmemizi sağlayacak.
Başlıktan da anlaşılacağı üzere Arduino ile IR sensörünün aslında alıcı-verici devrelerinin kullanımını anlatacağım ve bir örnek ile uygulayacağım.
IR Nedir?
Hepimize okullarda öğretilen Işık-Optik mevzularını hatırlayalım. Bize 'Işık Tayfı' adını verdikleri bir çizelge göstermişlerdi. Hatırlayalım, kendisi şöyle bir şey idi:
Elektromanyetik spektrum vektör diyagramı (Kaynak: TÜBİTAK) / The electromagnetic spectrum vector diagram (Source: TÜBİTAK)
Bir elektromanyetik ışınım olan infrared ya da kızılötesi, teknoloji alanında bir çok alanda kullanılmaktadır. Özellikle kablosuz iletişim teknolojilerinde, güdümlü füzelerde, astronomide sıkça karşımıza çıkmaktadır.
IR sensörler ise bu tekniği kullanarak gelen ışına göre bir voltaj değeri üreten elektronik komponentlerdir.
Uygulamamızda kullanacağımız IR receiver VS1838B olarak geçmektedir. 2.7-5.5 V arası gerilim ile beslenebilir, biz uygulamamızda 5V ile besleyeceğiz. -40 ile +125 *C arası koşullarda çalışabilir. Yaptığımız testlerde 8 metreye kadar yaklaşık 60 derecelik bir alanda başarıyla çalıştı.
VS1838B IR Receiver (Alıcı)
IR alıcıları kullanabilmemiz için bir de IR vericiye ihtiyacımız var, onu da herhangi bir televizyon kumandası vs. IR ile çalışan bir kumanda olarak düşünebiliriz.
Örnekte de kullanacağım kumanda tam olarak şöyle bir şey, kumanda da bulunan butonlar bizim için önemli:
IR Verici Kumanda
Çünkü, butonların alıcı da yani Arduino da anlamlı hale getirebilmek için yarattığı sinyali işlemeliyiz. Örneğin, 1 tuşuna basıldığında bir sinyal, EQ tuşuna basıldığında başka bir sinyal verecektir. Bunu ilgili butonların HEX
(Hexadecimal, on altılı sayı sistemi) karşılıklarını kullanarak - yani sinyallerin işlenmiş hali - Arduino'da karşılık yaratacağız. Eğer kumandanız üstteki gibi değilse HEX karşılıkları farklı olabilir, bunların tespiti için farklı bir kütüphane kullanarak yine Arduino üzerinden öğrenebiliriz fakat bu başka bir yazının konusu olacaktır.
Örnek Proje
Buton konusuna birazdan geri dönmek üzere örnek projemizi kurgulayalım. Örnek senaryomuz şöyle olsun, kumandamız da 1, 2 ve 3 tuşlarını kullanarak servo motorumuzu 0-90, 90-180 ve 180-270 açılarında döndürelim.
Materyaller:
- 1 x Arduino UNO
- 1 x Servo motor
- 1 x IR alıcı sensörü
- 1 x IR verici kumanda
- 8 x Bağlantı kablosu
Projeyi kodlamaya başlamadan önce Arduino-IRremote kütüphanesini edinmemiz gerekmektedir. İndirdiğimiz dosyayı Arduino'nun libraries
klasörüne koymamız ve projeye include
ederek projeyi kodlamaya başlayabiliriz.
Projemizde IR alıcı 13. pine, servo motor 9. pine bağlıdır. Projeyi Arduino'nuza yükledikten sonra 1,2 ve 3 tuşlarına basarak tepkiyi görebilirsiniz, tuşlara bastığınızı Serial Monitor yardımıyla gözleyebilirsiniz. Arduino UNO'ya göre hazırlanmıştır.
/* Arduino ile IR Kontrolü
*
* IR alıcı 13. dijital pine bağlı
* Servo motor 9. dijital pine bağlı
*
*/
#include <boarddefs.h>
#include <ir_Lego_PF_BitStreamEncoder.h>
#include <IRremote.h>
#include <IRremoteInt.h>
#include <Servo.h>
int RECV_PIN = 13;
IRrecv irrecv(RECV_PIN);
decode_results results;
Servo motor;
// Butonlar için HEX karşılıkları
#define BUTON1 0xFF30CF
#define BUTON2 0xFF18E7
#define BUTON3 0xFF7A85
void setup() {
Serial.begin(9600);
irrecv.enableIRIn();
motor.attach(9);
}
void loop() {
if (irrecv.decode(&results))
{
if (results.value == BUTON1)
{
Serial.println("1. Kademe / Step 1");
motor.write(90); // 90 dereceye
delay(1000); // 1 saniye bekle
motor.write(0); // 0 dereceye
}
if (results.value == BUTON2)
{
Serial.println("2. Kademe / Step 2");
motor.write(90); // 90 dereceye
delay(1500); // 1.5 saniye bekle
motor.write(180); // 180 dereceye dön
}
if (results.value == BUTON3)
{
Serial.println("3. Kademe/ Step 3");
motor.write(180); // 180 dereceye git
delay(2000); // 2 saniye bekle
motor.write(270); // 279 dereceye dön
}
irrecv.resume();
}
}