Merhaba arkadaşlar.Bu yazımızda HC-SR04 ultrasonic sensörünü tanıyıp cisim algılama ve mesafe ölçümü yapacagız.Öncelikle ultrasonic sensör nedir? nasıl çalışır? nerelerde kullanılır gibi sorualara yanıt arayalım.Ses dalgaları sınıflandırılmasında 20Khz-1Ghz aralıgındaki ses sinyalleri ultrasonic ses olarak tanımlanmıştır.Bizim sensörümüz ve bir çok ultrasonic sensör 40Khz frekansında ultrasonic ses üretmektedir.Burada önemli olan sesin yüksekliğinde belirleyici olan etken frekanstır.Ses yüksekse frekansta yüksektir.Ultrasonic ses sinyallerini insan kulağı algılayamaz.

Şimdi sensörün nasıl çalıştığına bakalım.

Transdüser ultrasonik darbeyi iletir.Darbe sehimden yansır ve transdüser  tarafından alınır.Darbenin gidiş geliş zamanı sensörle sehimin mesafesine göre orantılıdır.

Ultrasonik darbe t=0 zamanında transdüser tarafından iletiliyor. X pozisyonundaki hedef tarafından yansıtıldıktan sonra t= tx. zamanında darbe alınıyor. tx ;  X  mesafesi ile orantılıdır.

T=0 zamanında darbe iletilir(ultrasonic ses sinyali), cisimden yansır, transdüser tarafından algılanır ve tekrar gönderilir.Sonraki darbe ilk darbenin ultrasonik enerjisinin hepsi absorbe edildiğinde iletilmelidir.Bu yüzden sensöre bir pals gönderilir sensör okunur ve sensörün datasheetinde yazan süre kadar sensöre tekrar pals gönderilmez.Eğer bekleme yapmaksak sensör saçma değerler döndürür.Çünkü ilk yolladıgımız sinyal bir yerden yansıyarak sensöre geri dönmeye devam eder.

Tüm katı ve sıvı cisimler ultrasonik dalgayı cok iyi oranda yansıtırlar.Hem katı hemde sıvı cisimlerden ultrasonik enerjinin %99u yansıtılır.Çok ufak oranlardaki enerji miktarı cisim tarafından emilir. Bundan dolayı sensörü çok çeşitli uygulamarlda sorunsuz kullanabilmemiz mümkündür.Ayrıca robotlarda da sıkça kullanımlaktadır.Aşağıdaki resim bu tarz uygulamara güzel bir örnek.

Genel hatlarıyla ultrasonic sensörü tanıdıktan sonra yazımıza konu olan HC-SR04 sensörünü tanıyalım.Uzun zamandır bu tarz bir sensörle bir uygulama yapmak istiyordum.Ebay da bu sensörün fiyatının kargo dahil 10usd oldugunu görünce hemen aldım.Piyasada sadece alıcı verici transdüserin fiyatının yaklaşık 10 lira oldugunu düşünürsek cazip bir fiyat.


Sensör üzerinde 4 adet pin mevcut.Bunlar;vcc,gnd,trig,echo pinleri.Sensörü kullanmak için trig pininden yaklaşık 10us’lik bir pals gönderiyoruz.Sensör kendi içerisinde 40khz frekansında bir sinyal üretip  8 pals verici transdüsere gönderiyor.Bu ses dalgası  havada, deniz seviyesinde ve 15 °C sıcaklıkta 340 m/s bir hızla yol alır.Bir cisme çarpar ve geri sensöre yansır.Cismin sensörden uzaklıgı ile doğru orantılı olarak echo pini bir süre lojik 1 seviyesinde kalır ve tekrar lojik 0 olur.Bizim bu mesafeyi ölçmekiçin tek yapmamız gereken echo pininin ne kadar lojik1 oldugunun süresini bulmaktır.Bu yapı aşağıdaki resimden daha iyi görülebilir.

Şimdi echo pindeki sinyal ile nasıl mesafeyi bulacagımıza gelelim.Echo pinin lojik1 de kalma süresini mikrodenetleyici timerı ile ölçelim. Mikrodenetleyiciyi 4mhz kristal ile  kullanırsak, timer 1us çözünürlügünde pinin durumunu tutmuş olur.Klasik yol=hız*zaman dan ve sesim 340m/sn lk hızınıda 34000cm/1000000us (340000/1000000=1/29) olarak düzenlersek  formül x=t/29 olarak bulunur.Fakat burada önemli bir nokta sensörün bize döndürdügü süre ses sinyalinin gönderilmesi ile alınması ile oluşan süre.Yani yol=zaman/29 ile aradaki mesafeyi iki ile çarpmış oluyoruz.Çünkü ses hem gitti hem geldi.Bu yüzden x=t/58 formulüyle aradaki mesafeyi ölçmüş olacagız.(29*2=58).Şimdi kodlarımıza geçelim.Ben elimde pic geliştirme kartı oldugu için pic16f877a mikrodenetleyicisi ile yaptım.En kısa zamanda msp4302231 mikrodenetleyicisi ile de uygulamayı gerçekleştirip kodlarını koyacagım.Zaten giriş çıkış ve timer satırlanını değiştirmek yeterli.

#include<htc.h>
#include"delay.h"
#include"lcd.h"
 
__CONFIG(0x3B31);//konfigirayon ayarla yapılıyor.
//4mhz kristal
#define trig RC0     //pin tanımları
#define ECHO RC1 
 
void main(){
int  sure,uzaklik;
TRISB=0x00;	   //port giriş çıkış işlemleri
TRISC=0b0000010;
PORTB=0x00;
PORTC=0x00;
T1CON=0b00000101; //TIMER1 ayarları yapılıp çalıştırılıyor
 
	lcd_init();
	DelayMs(100);
	lcd_clear();
 
for(;;){ //trig pinine 15us lojik 1 yapılıyor
	trig=1;
	DelayUs(15);
	trig=0;
		while(!(ECHO)); //echo pini bekle
	TMR1=0; //echo pini 1 se timeri 0 la ve saymaya başla
 
		while((ECHO));
	sure=TMR1;
	 //echo pini 0 olunca timer değerini süreye eşitle
	uzaklik=(sure/58);//mesafeyi hesapla
	if(uzaklik>15)//cisim 15cm den uzaktaysa RC7 yi 1 yap
		RC7=1;
	else
		RC7=0;
 
	lcd_goto(0x00);//uzaklık ve sure lcdye yazdırılıyor
	lcd_puts("uzaklik:");
	lcd_write_int(uzaklik);
	lcd_goto(S1_13);
	lcd_puts("cm");
	lcd_goto(0x40);
	lcd_puts("sure:");
	lcd_write_int(sure);
	lcd_goto(S2_12);
	lcd_puts("us");
 
	DelayMs(100);//yeni ölçüm için bekle.
 
}
}

Yazılımda;

if(uzaklik>15)//cisim 15cm den uzaktaysa RC7 yi 1 yap
		RC7=1;
	else
		RC7=0;

kod satırlarıyla cisim algılamsı yapılmıştır.uzaklik değişkeni sürekli değiştigi için bu değişken referans alınrark istenilen uygulama yapılabilir.
Ben örnek olması açısından eğer mesafe 15cm den büyükse led yaktım.Burada bir robot için yön tayinide yapılabilir.Uygulama dosyalarına buradan ulaşabilirsiniz

F.Ü Fatih ÖZCAN

Devrenin Prensip  Şeması:

iletişim için: fatihozcan(oişaret)gmail com

kodlar

derlenmiş hex dosyası(pic16f877a için ):ultra

Uygulamaya ait resimler;