6 Temmuz 2014 Pazar

Arduino ile IR Alıcı Verici Uygulaması

Bu yazımızda birçok uygulamada karşımıza çıkan ve ucuzluğu sayesinde heryerde kullanılabilen ir yani kızılötesi sistemler incelenecektir.

arduino ir range


Kızılötesi sistemler alıcı ve verici kısım olarak iki bölümden oluşur. Bizim inceleyeceğimiz sistemde verici yani ir sinyalin gönderildiği kısım 21 butonlu basit bir kumandadır. Tuşlara basıldığında 38Khz frekans değerinde sinyaller yollar. Aslında bu bir ışıktır. Gönderilen bu ışığı görecek şekilde yerleştirilen ir alıcımız 1838B dir. Alıcı gönderilen sinyali algılar ve sinyal bacağından dijital veri gönderir.

Basılan her butonun kodlandığı farklı bir dijital veri vardır. Bu gönderilen sinyalin sırasıyla lojik 1 yada 0 olması ile alakalıdır.Mesela örnek olarak ard arda 001100 sinyalleri gelmiş olsun bu kumandadaki 1 butonuna karşılık gelsin. Yani kodlamada böyle olduğunu varsayalım. Bu demek oluyor ki siz kumanda da 1 butonuna bastığınızda ışık söner-söner-yanar-yanar-söner-söner. Tabi burada verici ve alıcınızın kaç bitte çalıştığıda önemlidir. Çalışma mantığının anlaşılması için bu şekilde bir örnek vermeyi uygun buldum.

Örneğin bunu daha iyi anlamak için telefon kameranızı kumandanın ön kısmında bulunan ir lede tutun ve herhangi bir tuşa basın ışığın yanıp söndüğünü göreceksiniz.

Bu çalışmada kullanılan kumandanın üzerindeki tuşların hexa değerleri alttaki resimde mevcuttur. Bunların binary karşılığını görmeniz için kod içerisindeki

Serial.println(cikis.value,HEX); satırını şu şekilde değiştirmeniz yeterli olacaktır:

Serial.println(cikis.value,BIN);



Çalışma videosu : http://www.youtube.com/watch?v=LuFK1rI53yo&feature=youtu.be

Uygulama kodu:


#include <IRremote.h>  // arduino ir kütüphanesi
#include <IRremoteInt.h>
#include <LiquidCrystal.h> //okunan mesafe değerinin 16*2 lcd ekrana basıması için
//lcd ekran ktürüphanesi çağrıldı

#define backlight A3 // LCD arka aydınlatmasını kontrol etmek için A3 pini tanımlanıyor

int ir_pin = 10; //ir alıcı pinin bağlanacağı pin numarası
IRrecv irrecv(ir_pin);
decode_results cikis;

LiquidCrystal lcd(9, 8, 7, 6, 5, 4);

void setup()
{
  Serial.begin(9600);
  pinMode (backlight, OUTPUT); 
  lcd.begin(16, 2); //lcd tipi
  digitalWrite (backlight,HIGH);
  lcd.print("golmuhendis.blog");
  lcd.setCursor(0,1); //satır,sütün
  lcd.print("spot.com.tr");
  delay(3000);
  lcd.clear();
  irrecv.enableIRIn(); // ir alıcıyı aktif eder
}

void loop()
{
  
  if (irrecv.decode(&cikis)) //cikis deiskenin olduğu edresi decode eder
    {
      
      Serial.println(cikis.value,HEX);       
      translateIR();  //gelen veriyi hexadecimal olarak ifade etmek için tanımlanan fonksiyon
      irrecv.resume();
          
    }
}
     
     
void translateIR() // gelen digital veriyi hex haline donusturur
{
  switch(cikis.value)
  {
    case 0xFFA25D: // vericideki tuşların karşılık geldiği hexa değerleri
    lcd.clear(); 
    Serial.println(" CH-            "); 
    lcd.print ("Basilan tus ");
    lcd.print("CH-");
    break;
  
    case 0xFF629D: 
    lcd.clear(); 
    Serial.println(" CH             ");
    lcd.print ("Basilan tus ");
    lcd.print("CH"); 
    break;
  
    case 0xFFE21D: 
    lcd.clear();  
    Serial.println(" CH+            "); 
    lcd.print ("Basilan tus ");
    lcd.print("CH+");
    break;
  
    case 0xFF22DD:  
    lcd.clear(); 
    Serial.println(" PREV           "); 
    lcd.print ("Basilan tus ");
    lcd.print("PREV");
    break;
  
    case 0xFF02FD:  
    lcd.clear(); 
    Serial.println(" NEXT           "); 
    lcd.print ("Basilan tus ");
    lcd.print("NEXT");
    break;
  
    case 0xFFC23D:  
    lcd.clear(); 
    Serial.println(" PLAY/PAUSE     "); 
    lcd.print ("Basilan tus ");
    lcd.print("PLAY/PAUSE");
    break;
  
    case 0xFFE01F:  
    lcd.clear(); 
    Serial.println(" VOL-           "); 
    lcd.print ("Basilan tus ");
    lcd.print("VOL-");
    break;
  
    case 0xFFA857:  
    lcd.clear(); 
    Serial.println(" VOL+           "); 
    lcd.print ("Basilan tus ");
    lcd.print("VOL+");
    break;
  
    case 0xFF906F:  
    lcd.clear(); 
    Serial.println(" EQ             "); 
    lcd.print ("Basilan tus ");
    lcd.print("EQ");
    break;
  
    case 0xFF6897:  
    lcd.clear(); 
    Serial.println(" 0              "); 
    lcd.print ("Basilan tus ");
    lcd.print("0");
    break;
  
    case 0xFF9867:  
    lcd.clear(); 
    Serial.println(" 100+           "); 
    lcd.print ("Basilan tus ");
    lcd.print("100+");
    break;
  
    case 0xFFB04F:  
    lcd.clear(); 
    Serial.println(" 200+           "); 
    lcd.print ("Basilan tus ");
    lcd.print("200+");
    break;
  
    case 0xFF30CF:  
    lcd.clear(); 
    Serial.println(" 1              "); 
    lcd.print ("Basilan tus: ");
    lcd.print("1");
    break;
  
    case 0xFF18E7:  
    lcd.clear(); 
    Serial.println(" 2              "); 
    lcd.print ("Basilan tus: ");
    lcd.print("2");
    break;
  
    case 0xFF7A85:  
    lcd.clear(); 
    Serial.println(" 3              "); 
    lcd.print ("Basilan tus: ");
    lcd.print("3");
    break;
  
    case 0xFF10EF:  
    lcd.clear(); 
    Serial.println(" 4              "); 
    lcd.print ("Basilan tus: ");
    lcd.print("4");
    break;
  
    case 0xFF38C7:  
    lcd.clear(); 
    Serial.println(" 5              "); 
    lcd.print ("Basilan tus: ");
    lcd.print("5");
    break;
  
    case 0xFF5AA5:  
    lcd.clear(); 
    Serial.println(" 6              "); 
    lcd.print ("Basilan tus: ");
    lcd.print("6");
    break;
  
    case 0xFF42BD:  
    lcd.clear(); 
    Serial.println(" 7              "); 
    lcd.print ("Basilan tus: ");
    lcd.print("7");
    break;
  
    case 0xFF4AB5:  
    lcd.clear(); 
    Serial.println(" 8              "); 
    lcd.print ("Basilan tus: ");
    lcd.print("8");
    break;
  
    case 0xFF52AD:  
    lcd.clear(); 
    Serial.println(" 9              "); 
    lcd.print ("Basilan tus: ");
    lcd.print("9");
    break;
  
    default: 
    Serial.println(" Yanlis sinyal, isik etkisi olabilir   ");

  }
     

5 Temmuz 2014 Cumartesi

Arduino ile Park Sensörü

Bu yazımızda SR04 sensörü ile park sesnörü yapımına çalışacağız. Daha önceki yazımızda SR04 sensörü hakkında ve nasıl kullanılacağı hakkında detaylı bilgiyi vermiştir. Bu çalışmada sadece ek olarak 1 adet korna kullanılmıştır.

Çalışma videosu :  http://www.youtube.com/watch?v=Ft0ERHyXEuQ&feature=youtu.be



Çalışma kodu:


//ultrasonik sensör ile mesafe ölçümü

#include <LiquidCrystal.h> //okunan mesafe değerinin 16*2 lcd ekrana basıması için
//lcd ekran ktürüphanesi çağrıldı
#define backlight A3 // LCD arka aydınlatmasını kontrol etmek için A3 pini tanımlanıyor

#define trigPin 3 //sensör üzerindeki pinlerin arduino üzerine takıldığı pin numaraları
#define echoPin 2
#define korna 11

LiquidCrystal lcd(9, 8, 7, 6, 5, 4);

void setup() {
  
  pinMode (backlight, OUTPUT); 
  lcd.begin(16, 2); //lcd tipi
  Serial.begin (9600); //seri haberleşme hızı=baud rate
  pinMode(trigPin, OUTPUT); //sinyalin gönderildiği pin
  pinMode(echoPin, INPUT); //yansıyan sinyalin alındığı pin
  digitalWrite (backlight,HIGH);
  lcd.print("golmuhendis.blog");
  lcd.setCursor(0,1); //satır,sütün
  lcd.print("spot.com.tr");
  
  analogWrite(korna,0);
  delay(3000);
}

void loop() {
  
  lcd.clear();
  analogWrite(korna,0);
  long duration, distance;
  digitalWrite(trigPin, LOW);  
  delayMicroseconds(2); 
  digitalWrite(trigPin, HIGH); //SR04 sensörü için 10 us lik lojik 1 sinyali trigger a gönderilir.
  delayMicroseconds(10); 
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  Serial.println(duration);
  distance = (duration/2) / 29;  //29*2=58
  //340 m/sn yani 34000cm/1000000us = 1/29
    
  Serial.print(distance);
  Serial.println(" cm");
    
  lcd.print ("Mesafe: ");
  lcd.print(distance);
  lcd.print("  cm");
  lcd.setCursor(1,1);
  lcd.print("golmuhendis");
  
  if(distance<=20 && distance>=10)
  {
    analogWrite(korna,100);
  }
    
  if(distance<10)
  {
    analogWrite(korna,200);
  }
   
  delay(500);
}

Arduino ile Ultrasonik Sensör Kullanımı

Bu yazımızda arduino ile HC-SR04 ultrasonik sensörünü kullanmayı ve mesafe ölçmeyi öğreneceğiz. Ultrasonik sensörler ultrasonik ses dalgaları yayan ve bunların engellere çarpıp geri dönmesine kadarki geçen süreyi hesaplayıp aradaki mesafeyi bulan sensörlerdir.

arduino ultrasonic sensor


Yaydığı ses dalgalarının tüm katı ve sıvı  cisimlerden yayılması SR04 sensörünün mesafe ölçümü, cisim agılama gibi birçok uygulamada kullanılmasını sağlamaktadır. İnsan kulağı teoride 20 Hz ile 20000 Hz arasındaki frekans aralığını işitir. Ultrasonik ses dalgaları ise 20 kHz ile 500kHz frekansları arasındadır. Frekansların yüksek olması yayılan sinyallerin enerjilerinin yüksek olmasını ve yüzeylerden daha iyi yansımasını sağlamak içindir. Ayrıca bu sayede uygulamalarda insanları rahatsız etmeyecek şekilde kullanılabilir. SR04 sensörünün çalışma frekansı ise 40Khz dir. Yani 40 Khz frekans değerinde ses dalgası üretir.



SR04 sensörü üzerinde 4 pin mevcuttur. Bunlar sırasıyla VCC, Trig, Ecgo, GND . Trig üretilen sinyalin sensöre uygulanması, Echo yansıyan sinyalin işlemciye iletilmesi için kullanılır. Sinyallerin sensör tarafından iletilmesi ve algılanması transduser tarafından sağlanır. Trig bacağına sensör datasheetine göre 10 us lojik 1 uygulanır. Bu sinyal sensöre uygulandığında sensör 40 Khz lik sinyali üretir ve gönderir.

Ses sinyallerinin boşlukta yayılma hızı 340 m/sn' dir. Sensörden ilk olarak bir ses dalgası gönderilir, yansıyan ses dalgası transducer tarafından algılanır ve tekrar gönderilir ancak gönderilmeden önce biraz beklenir. Çünkü bir önceki ses dalgasının cisim yada ortam tarafından tam anlamıyla emilmiş olması gerekir. Yansıyan sinyal echo bacağından okunur ve bu sayede mesafe ölçümü yapılabilir. Önemli olan nokta echo pininin ne kadar süre lojik 1 de kaldığıdır. Ölçülmesi gereken değer budur. Çünkü mesafenin bulunması için öncelikle zamanın hesaplanması gerekir. Ses dalgası 340 m/sn de hareket ediyorsa ve biz ölçüm aralığını 1 us de yapıyorsak 34000 cm /1000000 = 1/29 yan, zaman/29 olması gerekir. Ancak sinyalin gidiş ve gelişi göz ard edilmemelidir. Yani zaman/(29*2) =zaman/58 olur. Kod içerisinde de hesap bu şekilde yapılmıştır.

Çalışma videosu : http://www.youtube.com/watch?v=sc-hUGIu2tA


Uygulama kodu:

//ultrasonik sensör ile mesafe ölçümü

#include <LiquidCrystal.h> //okunan mesafe değerinin 16*2 lcd ekrana basıması için
//lcd ekran ktürüphanesi çağrıldı
#define backlight A3 // LCD arka aydınlatmasını kontrol etmek için A3 pini tanımlanıyor

#define trigPin 13 //sensör üzerindeki pinlerin arduino üzerine takıldığı pin numaraları
#define echoPin 12

LiquidCrystal lcd(9, 8, 7, 6, 5, 4);

void setup() {

  pinMode (backlight, OUTPUT);
  lcd.begin(16, 2); //lcd tipi
  Serial.begin (9600); //seri haberleşme hızı=baud rate
  pinMode(trigPin, OUTPUT); //sinyalin gönderildiği pin
  pinMode(echoPin, INPUT); //yansıyan sinyalin alındığı pin
  digitalWrite (backlight,HIGH);
  lcd.print("golmuhendis.blog");
  lcd.setCursor(0,1); //satır,sütün
  lcd.print("spot.com.tr");
  delay(3000);
}

void loop() {

  lcd.clear();
  long duration, distance;
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH); //SR04 sensörü için 10 us lik lojik 1 sinyali trigger a gönderilir.
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  Serial.println(duration);
  distance = (duration/2) / 29.;  //29*2=58
  //340 m/sn yani 34000cm/1000000us = 1/29
 
  Serial.print(distance);
  Serial.println(" cm");
 
  lcd.print ("Mesafe: ");
  lcd.print(distance);
  lcd.print("  cm");
  lcd.setCursor(1,1);
  lcd.print("golmuhendis");
 
  delay(500); //500 ms de 1 ölçüm yapılır
}