HC-SR04 Sensörü ile mesafe Ölçümü Uygulaması

Başlatan selimkoc, 18 Ocak 2014, 13:30:04

selimkoc

[IMG]http://i44.tinypic.com/21mx5iv.png[/img]

Bu projede HC-SR04 ultrasonik sensör kullanarak mesafe ölçümü yapacağız. Sensör kit olarak satılmakta. Kit üzerinde 40KHz. de çalışan ultrasonik verici ve alıcı sensörü bulunmakta. Sensörün çalışması aslında yarasanın iletişim sisteminden kopyalanmış. Bilindiği gibi yarasaların gözleri yoktur. Onun yerine ses dalgaları gönderip dalgaların geliş süresine göre değerlendirme yapıp o şekilde cisimleri algılarlar.

Bu uygulamada PIC16F628A mikrodenetleyicisi ve HC-SR04 Ultrasonik sensör kullanarak mesafe ölçümü gerçekleştireceğiz.


Sensörün özellikleri datasheetinde şöyle açıklanmış;

Working Voltage (Çalışma Voltajı) = DC 5 V
Working Current (Çalışma Akımı) = 15mA
Working Frequency (Çalışma frekansı) = 40Hz
Max Range (En fazla algılama) = 4m
Min Range (En düşük mesafe) = 2cm
MeasuringAngle (Ölçüm açısı) = 15 degree (en fazla)
Trigger Input Signal (Tetikleme sinyali süresi) =10uS TTL pulse
Dimension (ebatları) 45*20*15mm

Ölçüm hassasiyeti 3mm olarak açıklanmış.

Yapılan ölçümlerde yakın mesafelerde (2-50cm) verilen değerleri sağladığı görüldü. Ancak uzak mesafe ölçümlerinde hassasiyet o kadar iyi değil.

Gelelim sensörün çalışmasına ve kullanılışına;

Sensörün çalışma mantığı şu;

Trigger(tetikleme) pininden en az 10us lik 5v pulse görderildiğinde sensör Ultrasonik verici (Tx) den 40KHz de 8 adet pulse gönderiyor ve ECHO pinini "H" a çekiyor. Gönderilen bu dalgalar Ultrasonik alıcı (Rx) sensöre ulaştığında ECHO pini "L"'a düşüyor. Ölçüm yaparken ECHO pinin "H" da kaldığı süre ölçülerek sesin havada yayılma hızına göre hesap yapılarak mesafe bulunuyor.

Aşağıda sensörün zaman diyagramı verilmiştir.
[IMG]http://i40.tinypic.com/2cenkie.png[/img]

Mesafe Hesaplama

Sesin hava yayılma hızı 340m/sn'dir. Yani ses 1,000,000us'de 340 000mm yol kat eder. O halde 1us de ne kadar yol kat edeceğini hesaplarsak;

x=340,000mm/1,000,000us

x=34/100 bulunur. Yani ses 1us de 0.34mm yol alır. O halde ses hem gidecek hem de dönecek dolayısı ile ikiye bölüyoruz. ve son haliyle formülümüz;

Mesafe(mm)=(süre(us)*34)/200

olarak bulunur.



Devre Şeması
[IMG]http://i43.tinypic.com/kdubf7.png[/img]

#define ECHO PORTB.B0
#define TRIGGER PORTB.B7

// LCD module connections
sbit LCD_RS at RA6_bit;
sbit LCD_EN at RA7_bit;
sbit LCD_D4 at RA0_bit;
sbit LCD_D5 at RA1_bit;
sbit LCD_D6 at RA2_bit;
sbit LCD_D7 at RA3_bit;

sbit LCD_RS_Direction at TRISA6_bit;
sbit LCD_EN_Direction at TRISA7_bit;
sbit LCD_D4_Direction at TRISA0_bit;
sbit LCD_D5_Direction at TRISA1_bit;
sbit LCD_D6_Direction at TRISA2_bit;
sbit LCD_D7_Direction at TRISA3_bit;
// End LCD module connections

unsigned int sayac_TMR1=0;
char txt[7];
unsigned int toplamSure=0,mesafe_mm=0,Sure_us=0;
//----------------------------
void InitTimer1()
{
  T1CON = 0;
  TMR1H = 0;
  TMR1L = 0;
}
//-------------------------------
int MesafeOlc()
{
  long toplam=0,temp=0;
  char i,sayac;
  for(i=0;i<64;i++) // 64 adet ölçüm yapılıp ortalaması alınacak
  {
    TRIGGER=1; // tetikleme palsi
    Delay_us(10);// (10us)
    TRIGGER=0; // gönder
    while(!ECHO);// ECHO "H" olana kadar bekle
    T1CON.TMR1ON=1;// Timer1'i başlat
    while(ECHO); // ECHO "L" olana kadar bekle
    T1CON.TMR1ON=0; // Timer1'i durdur.
    sayac_TMR1=(TMR1H<<8)+TMR1L;// Timer1 değerini int değişkene aktar
    toplam+=((long)sayac_TMR1*34)/200; // mesafe hesapla ve topplam değişkeninde topla
    TMR1H=0; TMR1L=0; // Timer1'i sıfırla
    sayac_TMR1=0; // Timer'i aktardığımız us sayacını sıfırla
    Delay_ms(5); // 5 ms bekle
}
return (toplam>>6); // ortalamayı fonksiyon dışına taşı
}
//-------------
void Kurulum()
{
  CMCON=7;
  TRISA=0;
  TRISB=1;
  PORTB=0;
  InitTimer1();
  Lcd_Init();
  Lcd_Cmd(_LCD_CURSOR_OFF);
}
//---------------------
void main()
{
  Kurulum();
  Lcd_Out(1,3,"Mesafe Olcer");
  Lcd_Out(2,1,"elektrokod.wordp");
  Delay_ms(2000);
  Lcd_Cmd(_LCD_CLEAR);
  Lcd_Out(1,3,"Mesafe Olcer");
  while(1)
  {
    mesafe_mm=MesafeOlc();
    WordToStr(mesafe_mm,txt);
    Lcd_Out(2,1,txt);
    Lcd_Out_CP(" mm");
  }
}

selimkoc

#1
Bu da uygulama videosu;

HC-SR04 Ultrasonik Mesafe Sensörü

F.T

Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

selimkoc

Kesme ile yapılan uygulaması da blogumda yayınlandı. Faydalı olmasını temenni ederim...

mc_hastürk

#4
bir türlü kendim devre tasarımını yapamadım. uzun yıllar oldum çoğu şeyi de unutmuşum. rica etsem devrenin uygulanabilmesi için gerekli tüm dosyları paylaşabilirmisiniz

frederic

Merhabalar bu uygulamayı yaptım değerleride doğru olarak alıyorum fakat bir sorun var. Sensörü önüne bir çok keren engel koyup çekince veya elimle yakın mesafeden sensörün önünü kapatınca echo pini sürekli lojik 0'da kalıyor ve ölçüm duruyor. Bunla karşılaşan oldumu acaba daha önce, nasıl aşılır bu sorun?

selimkoc

Sensörden kaynaklanabilir. Benim yaptığım uygulamada 3cm daha yakın mesafelerde yüksek değerler(mesafe) verdi. Ancak daha uzak mesafelerde doğru sonucu verdi.

frederic

Hocam bendeki sorun donması, donduktan sonra alet kendine gelmiyor restart yapmak gerekiyor. Elinizde varsa şayet sizde bir denermisiniz, parmağınızla bir tanesini kapattığınızda donuyormu diye. İlk seferde donmayabilir belki bir kaç kere deneyin eğer uygunsa devreniz.