hc-sr04 sensör ölçüm degişmesi

Başlatan bbs2006, 07 Mayıs 2015, 11:59:19

bbs2006

Merhaba
okulumuzda  akıllı bastonda kullanmak üzere mesafe ölçmek istiyorum. devreyi kurum ama sensör çok fazla değişim gösteriyor.kristal 4 mhz kullandım. şuan 16f877 de deniyorum olursa . LCD ekranda  sanki sensör rastgele üreiyormuş gibi görünüyor. Yardımcı olursanız sevinirim.
#include <16f877.h>
#fuses xt,nowdt,noprotect
#use delay(clock=4000000)
#include <lcd420.c>
#define echo  pin_c1
#define trig  pin_c0
#define ledsag pin_a0
#define ledsol pin_a1
#define motor pin_a2
#define buzer pin_b3
unsigned int16 mesafe,zaman;

void main(){
setup_ccp1(ccp_pwm);
setup_timer_1(t1_internal|t1_div_by_8);
//setup_timer_2(t2_div_by_16,170,1);
lcd_init();

lcd_gotoxy(1,1);

printf(lcd_putc,"sistem baslatildi");
delay_ms(1000);


while(true){
output_high(trig);
delay_us(20);
output_low(trig);

while(!input(echo)){}
set_timer1(0);
while(input(trig)){

      zaman=get_timer1();
      mesafe=zaman*0.028+1.093;
      printf(lcd_putc,"\fzaman:%lu\n mesafe=%lu",zaman,mesafe); 
      delay_ms(500);}
if(mesafe<15){
     output_high(ledsag);
     output_high(ledsol);
     delay_ms(500);
     output_low(ledsag);
     output_low(ledsol);
     delay_ms(500);}}}

selimkoc

Blogumda bu sensörle ilgili uygulamalar mevcut.

bbs2006

benim kodlarıma bakabilrmisiniz. müsait olursanız sevinirim.

Faruk53

Timer Ayarlarından Bölme oranını 1 yapıp zamanı da 58'e bölmeyi dener misiniz. Bende bu sensörü kullandım ayarlarım bu şekilde ve bir sorun yaşamıyorum.

Ek olarak sonsuz döngüye girmeden önce biraz bekleme süresi koymanızı tavsiye ederim. Denemelerimde bazen sensör kilitleniyordu. Kolay gelsin

setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);    //Timer1 ayarları yapılıyor dahili clock kaynağı ve bölme oranı 1
 mesafe=zaman/58;   

bbs2006

#4
merhaba
LCD ekranda zaman ve süre sabit kalıyor hiç değişmiyor acaba sensör mü arızalandı nasıl kontrol edebiliriz.

mesaj birleştirme:: 11 Mayıs 2015, 16:23:23

Ayrıca sensörü devreden çıkardığım zaman aynı değerde kalıyor. enerjiyi  kapatıp açtığım zamanda aynı değer geliyor. örnek zaman 41268   mesafe 711 yazıyor
  
#include <16f877.h>
#fuses hs,nowdt,noprotect
#use delay(clock=20000000)
#define  use_port_b lcd_true
#include <lcd420.c>
#define echo  pin_c1
#define trig  pin_c0
#define ledsag pin_a0
#define ledsol pin_a1
#define motor pin_a2
#define buzer pin_b3
unsigned int16 mesafe,zaman;


void main() {
      lcd_init();
      lcd_putc("Basla");
      setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); 
      delay_ms(200);
 while (true){
    output_high(trig);                        
    delay_us(20);                              
    output_low(trig);  
   // set_timer1(0);  
    while(!input(ECHO))                         
    {}  
    set_timer1(0);                          
    
    while(input(ECHO))
    { 
    delay_ms(100);
    zaman=get_timer1();

    mesafe= zaman/58;           
     
   printf(LCD_PUTC, "\f Zaman:%lu \n Mesafe = %lu",zaman,mesafe);
   delay_ms(10);  

   if (Mesafe < 70) 
   { 
   output_high(pin_A0); 
   } 
   else  
   { 
   output_low(pin_a1); 

    } 

    } 

    } }

Faruk53

#5
#include <16f877.h>
#fuses NOWDT,NOPUT,NOCPD,NOPROTECT,XT

#use delay (clock=4000000)

#define trigger pin_c0
#define echo pin_c1
#define ledsag pin_a0
#define ledsol pin_a1
#define motor pin_a2
#define buzer pin_b3

unsigned long int zaman;             //16 bit lik işaretsiz süre değişkeni
float mesafe;                         //Ondalıklı mesafe değişkeni

void main()
{
   
   
  
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);    //Timer1 ayarları yapılıyor dahili clock kaynağı ve bölme oranı 1
   setup_timer_2(T2_DISABLED,0,1);
   setup_CCP1(CCP_OFF); // CCP OFF olarak belirleniyor.
   
   
   set_tris_c(0C00000000);
   output_low(trigger);     //Sensörün trigger ucunu pasif yapıyoruz
   mesafe=0;                    //Değişkenler sıfırlanıyor
   zaman=0;
   
   
   delay_ms(1000); // Sonsuz Döngüye girmeden önce 1sn gibi bir bekleme süresi koyuyoruz. Sensör bazen kitleniyordu denemelerimde.
   while(true)                //Sonsuz döngü
   {
      output_high(trigger); //Trigger ucu aktif
      delay_us(15);        //15us bekleme
      output_low(trigger);  //Trigger ucu pasif
      
      
      while(!(input(echo))) //Echo ucu 1 olana kadar hiçbir işlem yapma
      {
      }
      set_timer1(0);          //Echo ucu 1 olduğu zaman timer1'i sıfırla
      
      while((input(echo)))  //Echo ucu 0 olana kadar hiçbir işlem yapma
      {
      }
      zaman=get_timer1();         //Echo ucu 0 olduğu an timer1 değerini zaman değişkenimize at.
      mesafe=zaman/58;                 //Mesafeyi cm olarak elde etmek için süre değişkenini 58'e böl.
      
      
      if (mesafe<10)
   {
  komutlar

}
 else
 {
 komutlar
 } 
 }
 

}


Bu şekilde dener misin. Direk sensörden şüphelenmeyelim. Kolay gelsin hocam.

mesaj birleştirme:: 11 Mayıs 2015, 22:29:41

Hocam Bir kaç yeri atlamışım kusura bakmayın.

#include <16f877.h>
#fuses NOWDT,NOPUT,NOCPD,NOPROTECT,XT

#use delay (clock=4000000)

#define use_portb_lcd TRUE // LCD B portuna bağlı
#include <lcd.c> // lcd.c dosyası tanıtılıyor

#define trigger pin_c0
#define echo pin_c1
#define ledsag pin_a0
#define ledsol pin_a1
#define motor pin_a2
#define buzer pin_b3

unsigned long int zaman;             //16 bit lik işaretsiz süre değişkeni
float mesafe;                         //Ondalıklı mesafe değişkeni

void main()
{
   
   
  
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);    //Timer1 ayarları yapılıyor dahili clock kaynağı ve bölme oranı 1
   setup_timer_2(T2_DISABLED,0,1);
   setup_CCP1(CCP_OFF); // CCP OFF olarak belirleniyor.
   
   
   set_tris_c(0b00000000);
   output_low(trigger);     //Sensörün trigger ucunu pasif yapıyoruz
   mesafe=0;                    //Değişkenler sıfırlanıyor
   zaman=0;
   
   lcd_init();   

   delay_ms(1000); // Sonsuz Döngüye girmeden önce 1sn gibi bir bekleme süresi koyuyoruz. Sensör bazen kitleniyordu denemelerimde.
 
  while(true)                //Sonsuz döngü
   {
      output_high(trigger); //Trigger ucu aktif
      delay_us(15);        //15us bekleme
      output_low(trigger);  //Trigger ucu pasif
      
      
      while(!(input(echo))) //Echo ucu 1 olana kadar hiçbir işlem yapma
      {
      }
      set_timer1(0);          //Echo ucu 1 olduğu zaman timer1'i sıfırla
      
      while((input(echo)))  //Echo ucu 0 olana kadar hiçbir işlem yapma
      {
      }
      zaman=get_timer1();         //Echo ucu 0 olduğu an timer1 değerini zaman değişkenimize at.
      mesafe=zaman/58;                 //Mesafeyi cm olarak elde etmek için süre değişkenini 58'e böl.
      
      
      if (mesafe<10)
   {
  komutlar

}
 else
 {
 komutlar
 } 
 LCD' ye yazdırma işlemlerini bu kısımda yapabilirsiniz hocam.
 }
}


NOT: Bu program forumda dogi_1905 hocamızın anlatımlarıyla yazılmıştır.

Ekte benim yaptığım eklemeler var. Belirlediğimiz mesafe değerinden küçük olduğu taktirde buzzer belli notalarda ses çıkışı veriyor.

http://s4.dosya.tc/server3/eip9pi/mesafe_olcum.rar.html

Umarım faydalı olur hocam tekrak kolay gelsin..

bbs2006

Merhaba
Yukardaki verdiğim yazılımda  devreyi çalıştırdığım zaman lcd_putc("Basla");  komutundaki "Basla" ifadesinde program takılıyor. diğer kısımları çalıştırmıyor. bir türlü problemi çözemedim yardımcı olursanız sevinirim.

Faruk53

Merhaba hocam. öncelikle kodunuzu inceledim.program sonsuz döngüye girmeden zaman ve mesafe değişkenlerinizi sıfırlamanız gerekmektedir.Dediğim düzenlemeler aşağıdaki gibi. Similasyonda da denemeyi şu şekilde yapabilirsiniz. işlemcinin timer uçlarına birer tane logic state bağlayıp sırasıyla 0-1 yaptığınızda ekranda süre ve mesafe değişkenlerinin değiştiğini gözlemleyeceksiniz. Değerler biraz garip çıkabilir çünkü o zaman aralıklarını manuel yakalayamazsınız. Sensör zaten bu mantıkla çalışıyor. Bu değişimleri gözlemlediğiniz halde devreniz hala çalışmıyorsa sensör bozulmuştur.

#include <16f877.h>

#fuses NOWDT,NOPUT,NOCPD,NOPROTECT,XT

#use delay (clock=4M)

#define use_portb_lcd TRUE
#include <lcd.c>

#define trigger pin_c0
#define echo pin_c1
#define ledsag pin_a0
#define ledsol pin_a1
#define motor pin_a2
#define buzer pin_b3

unsigned long int zaman;             //16 bit lik işaretsiz süre değişkeni
float mesafe;                         //Ondalıklı mesafe değişkeni

void main()
{
   
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);    //Timer1 ayarları yapılıyor dahili clock kaynağı ve bölme oranı 1
   setup_timer_2(T2_DISABLED,0,1);
   
   
   
   set_tris_c(0b00000000);
   
  
   
   output_low(trigger);     //Sensörün trigger ucu pasif yapılıyor
   mesafe=0;                    //Değişkenler sıfırlanıyor
   zaman=0;
   
    lcd_init();
   printf ( lcd_putc, "\fBasla");

   delay_ms (1000);

   while(true)                //Sonsuz döngü
   {
      output_high(trigger); //Trigger ucu aktif
      delay_us(15);        //15us bekleme
      output_low(trigger);  //Trigger ucu pasif
      
     
      while(!(input(echo))) //Echo ucu 1 olana kadar hiçbir işlem yapma
      {
      }
      set_timer1(0);          //Echo ucu 1 olduğu zaman timer1'i sıfırla
      
      while((input(echo)))  //Echo ucu 0 olana kadar hiçbir işlem yapma
      {
      }
      zaman=get_timer1();          
      mesafe=zaman/58;                 //Mesafeyi cm olarak ölçmek için süre değişkenini 58'e bölüyorum
      
      
      if (mesafe<10)
      
      { 
     komutlar
      }
     
      else
      {
      komutlar
      }
      //Sonuçlar ekrana yazılıyor
  
   lcd_init ();
  
   lcd_gotoxy ( 1,1 );
   printf ( lcd_putc, "Sure=%lu",zaman );
   lcd_gotoxy(1,2);
   printf ( lcd_putc, "Mesafe=%.2f",mesafe );
   Delay_ms(100);
   }
}

bbs2006

merhaba
devrem için yeni semsör aldım. çalışırken lcd ekran görüntüsü kısılıyor  ve birşeyler ölçüyor. belli bir süre sonra ekran görünütü atm okunacak şekile geliyor. ölçüm yapmıyor. böyle bir sıkıntı yaşayan va rmı. yardımcı oursanız s evinirim.