راه اندازی ماژول SRF05 (فاصله سنج،صوتی)

در اين بخش مي‌توانيد آموزش و مثال‌های مرتبط با میکروکنترلرهای AVR را مشاهده بفرمایید

مدیران انجمن: SAMAN, sinaset, شوراي نظارت

ارسال پست
Colonel II
Colonel II
نمایه کاربر
پست: 7129
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9209 بار
سپاس‌های دریافتی: 21261 بار
تماس:

راه اندازی ماژول SRF05 (فاصله سنج،صوتی)

پست توسط sinaset » یک شنبه 2 خرداد 1395, 9:47 am

بنام خدا
با سلام

راه اندازی ماژول SRF05 (فاصله سنج،دیجیتال)
تصویر
ماژول فاصله صوتی SRF05 ، از دو عدد فرستنده و گیرنده 40 کیلوهرتزی آلتراسونیک و چند عدد ایسی راه اندازه فرستنده و گیرنده تشکیل شده است .

عملکرد این ماژول بدین صورت می باشد که،یک موج صوتی به کمک فرستنده به سمت شی یا اشیا یا جسم می فرستد،سپس وقتی موج به جسم می خورد به سمت گیرنده بر می گردد، حال با محاسبه زمان رفت و برگشت (به ارسال سرعت صوت) می توان فاصله را تشخص داد

تصویر
برخورد فرکانس صوت به به شی و بازگشت ان ،به سمت گیرنده آلترا سونیک
--
تصویر
برد و زوایه قابل تشخص ماژول
----
نکته! جسم و اشیا باید کمی بزرگ باشد و باید فرکانس صوت به درستی به انها بازتاب کند،وگرنه محاسبه مسافت به درستی انجام نمی شود:
تصویر
همانجور که می ببینید،به دلیل کج بودن شی سمت راستی،بازتاب صوت به سمت دیگر می رود!
 SRF05 ارتقاء یافته SRF04 می باشد و برد ان حدود 1 متر افزایش پیدا کرد و به حدود 4 متر رسیده است . 
تصویر
  ماژول جمعا 5 پایه دارد، پایه VCC و GND تغذیه ماژول، پایه OUT پایه که استفاده نمی شود! و باید به GND وصل شود،می ماند پایه TRIG و ECHO !  
  نحویه عملکرد    برای فعال سازی این ماژول باید حدود 10 میکرو ثانیه پایه TRIG را فعال کنیم، سپس ماژول کارها زیر را انجام میدهد: 
تصویر
  که در تصویر ، خط 1 می ببینید، بعد از اینکه ما حدود 10 میکرو ثانیه پایه TRIG را فعال کردیم،ایسی ماژول 8 بار پشت سرهم یک فرکانس 40 کیلوهرتزی درست می کند و به فرستنده التراسونیک می دهد،و ان را به سمت روبرو پخش می کند . به محض اینکه اخرین فرکانس فرستاده شد، پایه اکو ، 1 میشود ! و تا زمانی که انعکاس فرکانس به سمت گیرنده ماژول برنگردد،همانطور 1 باقی می ماند، به دریافت سگینال (یا همان بازتاب) به وضعیت 0 بر می گردد... حال ما با محاسه زمان 1 و 0 شدن پایه اکو و با فرمول سرعت صوت،می توانیم فاصله را پیدا کنیم .  در پست بعدی به کدها و شبیه ساز مدار،معرفی خواهد شد....  . 
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

Colonel II
Colonel II
نمایه کاربر
پست: 7129
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9209 بار
سپاس‌های دریافتی: 21261 بار
تماس:

Re: راه اندازی ماژول SRF05 (فاصله سنج،صوتی)

پست توسط sinaset » دو شنبه 3 خرداد 1395, 9:44 am

بنام خدا
با سلام


ادامه مبحث..

 تصویر   که در تصویر بالا می ببینید آزمایشی با ماژول انجام داده ام و یک فاصله 30 سانتی را با خط کش(30 سانتی) و ماژول اندازه گرفته ام . همانجور که می بینید دقت ماژول خوب می باشد  
معرفی کدها و شبیه ساز مدار:

نقشه مدار :
 تصویر 

همانطور که می ببینید مدار بسیار ساده می باشد . PORTD.2 (که این پایه ،اینتراپت و یا همان وقفه 0 میکروکنترولر هم می باشد)به پایه ECHO ماژول وصل شده (پایه ی که سیگنال برگشتی را برای میکرو می فرستد) . و پایه PORTD.3 که به TRIG ماژول وصل شده (پایه که ما بدید برایش یک سیگنال بفرستیم تا ماژول شروع به کار کند)

همانطور که می ببینید، برای راحتی کار و جنبه آموزشی بهتره. میزان فاصله با اجسام، به میلی متر و سانتی متر و متر بر روی LCD نمایش داده میشود.

اما کدها.


ما باید محاسبه زمان دقیقی انجام دهیم تا بتوانیم فاصله تا جسم را با دقت بالا اندازه بگیریم برای این منظور از تایمر 1 استفاده می کنیم

تایمر 1 راه اندازی می کنیم

کد: انتخاب همه

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 1000,000 kHz
// 60 ميلي ثانيه
TCCR1A=0x00;    //استفاده از تايمر 1 براي اندازه گيري دقيق فاصله
TCCR1B=0x02;   
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

در برنامه ما باید از وقفه صفر استفاده کنیم،تا به محض دریافت سیگنال اکو، متوجه بشویم و بعد به کمک تایمر 1 شروع به شمارش کنیم ،
پس وقفه 0 را فعال و ان را در وضعیت any change قرار می دهیم(در این وضعیت، هر تغییر صورت بگیرد، وقفه فعال می شود،یعنی اگر پایه 0 باشد،یک دفعه 1 شود،یک وقفه صورت می گیرد و اگر باز دوباره 0 شود یک وقفه دیگر صورت می گیرد و ...)

کد: انتخاب همه

// External Interrupt(s) initialization
// INT0: On   Mode: Any change
GICR|=0x40;      //فعال سازي وقفه،براي اگاهي سازي سيگنال اکو ماژول
MCUCR=0x01;
GIFR=0x40;


ما باید برای فعال سازی ماژول ،کار زیر را انجام دهیم.

کد: انتخاب همه

      status = 0;  //متغير وضعيت 0
      PORTD.3 = 1;  //پايه فرستادن يک سيگنال 10 ميکرو ثانيه براي اندازي گيري فاصله
      delay_us( 20 ); //ده ميکرو ثانيه
      PORTD.3 = 0;   //سپس سيگنال را قطع کن
      


سپس باید منتظر باشیم،تا ماژول سیگنال اکو را برای ما ارسال کند! و ما شروع به محاسبه به کمک تایمر 1 کنیم. برای همین منظور باید کاری کنیم،که میکرو صبر کند،برای همین ان را در یک حلقه قرار می دهیم

کد: انتخاب همه

   while( status != 1 ){if (TCNT1 == 30000)status=1;}   //در اين حلقه باش،تا ماژول از طريق وقفه به ما خبر دهد 


حال به محض فعال سازی وقفه اتفاق زیر می افتد:(یا دریافت سینگال اکو)

کد: انتخاب همه

interrupt [EXT_INT0] void ext_int0_isr(void)
{    
    if(PIND.2 == 1 ) {    //در صورتي که پايه اکو 1 بود
      TCNT1 = 0;      //صفر کردن شمارش
      status = 1;     //وضعيت 1
    }
    else         //درغير اين صورت شمارش روشن
    {
      tim = TCNT1;   //تايمر 1 شروع به شمارش کند و مقدار ان را درون متغير بريزد
      status = 2;    //وضيت 2
    }    
}


در ابتدا که وقفه فعال میشود و پایه 1 میشود،تایمر 1 ، صفر میشود،تا شمارش صحیح و بدرستی اغاز شود و در انتها وقتی سیگنال اکو قطع شد و وقفه فعال شد،اخرین شمارش به درون متغیر tim ریخته میشود و سپس شرط حله نقض میشود. و ما با یک فرمول ساده،میزان فاصله تا جسم را بدست می اوریم

فرمول محاسبه.

فاصله جسم در کمترین میزان و بیشتر میزان در ماژول(بر اساس زمان طی شده)، بین 100 میکروثانیه تا 25 میلی ثانیه می باشد(می توانید در تصور اخر پست قبلی ببینید) . حال ما با تقسیم کردن این زمان ، بر عدد 58 ، می توانیم فاصله ان را با (سانتی متر) بدست آوریم (برای میلی متر باید 58 را ضربدر 10 کنیم و برای متر تقسیم بر 100 کنیم)

به عنوان مثال ، اگر فاصله جسمی تا ماژول 15 میلی ثانیه (که میشود 15000 میکرو ثانیه) شود ، اگر آن را تقسیم بر 58 کنیم: 258 سانتی متر ، یا 2.58 متر می شود

کل کدهایی برنامه:

کد: انتخاب همه

/*
//فاصله سنج صوتي
// hy-SRF05
فرکانس ميکرو 8 مگاهرتز
edit:sinaset
centralclubs.com

*/
#include <mega8.h>
#include <delay.h>
#include <stdio.h>
#include <alcd.h>
volatile unsigned char status;
volatile float tim  = 0;
unsigned char str[16],str2[16],str3[16];
// External Interrupt    //هر وضعيت رخ دهد وقفه فعال ميشود
interrupt [EXT_INT0] void ext_int0_isr(void)
{    
    if(PIND.2 == 1 ) {    //در صورتي که پايه اکو 1 بود
      TCNT1 = 0;      //صفر کردن شمارش
      status = 1;     //وضعيت 1
    }
    else         //درغير اين صورت شمارش روشن
    {
      tim = TCNT1;   //تايمر 1 شروع به شمارش کند و مقدار ان را درون متغير بريزد
      status = 2;    //وضيت 2
    }    
}
void main(void)
{
PORTD=0x00;
DDRD=0x08;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 1000,000 kHz
// 60 ميلي ثانيه
TCCR1A=0x00;    //استفاده از تايمر 1 براي اندازه گيري دقيق فاصله
TCCR1B=0x02;   
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// External Interrupt(s) initialization
// INT0: On   Mode: Any change
GICR|=0x40;      //فعال سازي وقفه،براي اگاهي سازي سيگنال اکو ماژول
MCUCR=0x01;
GIFR=0x40;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
lcd_init(16);
#asm("sei")
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("hello");
delay_ms(1000);   
lcd_clear();
    while (1)
    {
      status = 0;  //متغير وضعيت 0
      PORTD.3 = 1;  //پايه فرستادن يک سيگنال 10 ميکرو ثانيه براي اندازي گيري فاصله
      delay_us( 20 ); //ده ميکرو ثانيه
      PORTD.3 = 0;   //سپس سيگنال را قطع کن
      
      while( status != 1 ){if (TCNT1 == 30000)status=1;}   //در اين حلقه باش،تا ماژول از طريق وقفه به ما خبر دهد
      sprintf(str,"MM: %4.2f",tim/58*10);    //نمايش به ميلي متر
      lcd_clear();
      lcd_gotoxy(0,0);
      lcd_puts(str);
      sprintf(str2,"SM: %0.2f",tim/58);  //نمايش به سانتي متر   
      lcd_gotoxy(0,1);
      lcd_puts(str2); 
      sprintf(str3,"M:%0.1f",tim/58/100);  //نمايش به متر   
      lcd_gotoxy(11,1);
      lcd_puts(str3);
      delay_ms(300);    // تاخير 
    }
}


[لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید]شبیه ساز و برنامه (برای نمایشگر LCD)
[لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید]شبیه ساز و برنامه( برای USART)

باتشکر.
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

Colonel II
Colonel II
نمایه کاربر
پست: 7129
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9209 بار
سپاس‌های دریافتی: 21261 بار
تماس:

Re: راه اندازی ماژول SRF05 (فاصله سنج،صوتی)

پست توسط sinaset » شنبه 8 خرداد 1395, 9:14 am

با سلام

ویدئو آزمایش ماژول در [لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید].
باتشکر.
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

Rookie Poster
Rookie Poster
پست: 38
تاریخ عضویت: جمعه 25 دی 1394, 11:22 pm
سپاس‌های دریافتی: 14 بار

Re: راه اندازی ماژول SRF05 (فاصله سنج،صوتی)

پست توسط ahmadsolgi243 » چهار شنبه 27 اردیبهشت 1396, 10:24 pm

با سلام خدمت دوستان گرامی.
این مدار خیلی به درد بخوره من امروز روش کار کردم دقیق بود و گفتم pcb شو برای دوستان ک خودم طراحی کردم قرار بدم.خودم جواب گرفتم ازش فقط دوتا نکته اینجا هست ک باید بگم اول اینکه میکرو روی 8 مگا پروگرام کنین دوم اینکه اگه از srf05 استفاده بشه بهتره چون هم بردش بیشتره هم اینکه با این فیبر سازگاره البته srf04 هم به راحتی میشه جای srf05 زد.
با تشکرتصویرتصویر

Rookie Poster
Rookie Poster
پست: 38
تاریخ عضویت: جمعه 25 دی 1394, 11:22 pm
سپاس‌های دریافتی: 14 بار

Re: راه اندازی ماژول SRF05 (فاصله سنج،صوتی)

پست توسط ahmadsolgi243 » چهار شنبه 27 اردیبهشت 1396, 10:34 pm

[لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید]

پی سی بی

جای قطعات
[لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید]

Colonel II
Colonel II
نمایه کاربر
پست: 7129
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9209 بار
سپاس‌های دریافتی: 21261 بار
تماس:

Re: راه اندازی ماژول SRF05 (فاصله سنج،صوتی)

پست توسط sinaset » جمعه 13 بهمن 1396, 1:51 pm

با سلام

نسخه 1.5

در نسخه کمی جدیدتر،کمی تغییرات به کد ها و اندکی به مدار داده شده،تا افزایش دقت مدار بیشتر شود!

*باید به پایه میکروکنترولر پورت بی 6 و 7 یک کریستال خارجی 8 مگاهرتزی اتصال دهید!

در ورژن جدید، ابتدا 25 نمونه ( با فاصله زمانی 15 میلی ثانیه!) گرفته میشود،سپس ان نمونه که بیشتر از همه تکرار شده است،به عنوان فاصله درست تر ! شناسایی میشود!
در حالت عادی، فاصله سنج،بسیار عدد های نامعقول روی LCD نمایش میداد! با کمک این کدها،مقداری پایداری بهتره شده است ...

کدها:

کد: انتخاب همه

/*
فاصله سنج صوتي
نسخه 1.5
فرکانس ميکرو 8 مگاهرتز
با کريستال 8 مگاهرتز خارجي
edit:sinaset
centralclubs.com
*/
#include <mega8.h>
#include <delay.h>
#include <stdio.h>
#include <alcd.h>
#include <math.h>

#define  ECHO  PIND.2    //پايه اکو
#define  TRIG  PORTD.3   //پايه تريگر
#define  TIME_READ_ECHO  30000          //زمان صبر کردن براي خواندن اکو به ميکرو ثانيه
#define  Time_check    15           //مدت زمان نمونه گيري
//مقدار تابع زير نبايد خيلي زياد شود،وگرنه حجم زيادي از رم گرفته ميشود
#define  Sample_check    25           //تعداد نمونه ها گرفته شدده

volatile unsigned char status;
unsigned char str[16],str2[16],x,Val=0,op=0,Ch[Sample_check];
float Check[Sample_check];
float MM=0.0,SM=0.0,M=0.0;
volatile float tim  = 0;


interrupt [EXT_INT0] void ext_int0_isr(void)// External Interrupt    //هر وضعيت رخ دهد وقفه فعال ميشود
{    
    if(ECHO == 1 ) {    //در صورتي که پايه اکو 1 بود
      TCNT1 = 0;      //صفر کردن شمارش
     // status = 2;     //وضعيت 1
    }
    else if ( ECHO == 0)         //درغير اين صورت شمارش روشن
    {
      tim = TCNT1;   //تايمر 1 شروع به شمارش کند و مقدار ان را درون متغير بريزد
      status = 1;    //وضيت 2
    }    
}

void SRF_SEND_DATA(void) //تابع فعال سازي ماژول براي ارسال اطلاعات
{
      status = 0;  //متغير وضعيت 0
      TRIG = 1,  //پايه فرستادن يک سيگنال 10 ميکرو ثانيه براي اندازي گيري فاصله
      delay_us( 10 ), //ده ميکرو ثانيه
      TRIG = 0;   //سپس سيگنال را قطع کن

}

void SRF_DATA_RECEIVE(void)
{
       while( status != 1 )  //در اين حلقه باش،تا ماژول از طريق وقفه به ما خبر دهد
      {
      if (TCNT1 >= TIME_READ_ECHO)status=1; //به کمک اين دستور اگر،وقفه بيش از انداز طول بکشد!وضعيت 1 ميشود
      }   
}

void METER_Accuracy()  //اندازه گيري فاصله براساس نمونه ي که بيشتر تکرار شده است
{
unsigned char i;

      for(i=0;i<Sample_check;i++)
      {
      SRF_SEND_DATA();
      SRF_DATA_RECEIVE(); 
      Check[I]=tim;
      delay_ms(Time_check);
      }
      
     for(i=0;i<Sample_check;i++)Ch[I]=0;
     for(i=0;i<Sample_check;i++)
     {
       for(i=0;i<Sample_check;i++)
       {
      if(Check[x]==Check[I])Ch[x]++;
      
      
       }
       if(Ch[x]>=Val)op=x,Val=Ch[x];
     } 
      MM =Check[op]/58*10;
      SM=Check[op]/58;
      M=(Check[op]/58)/100;
   
      sprintf(str,"MM: %4.1f",MM); 
      sprintf(str2,"SM: %0.2f M:%0.1f",SM,M);  //نمايش به سانتي متر   
}
void Meter(void)   //تابع اندازگيري فاصله به روش معمولي
{
      SRF_SEND_DATA();
      SRF_DATA_RECEIVE();
      
      MM =tim/58*10;
      SM=tim/58;
      M=(tim/58)/100;
   
      sprintf(str,"MM: %4.1f",MM); 
      sprintf(str2,"SM: %0.2f M:%0.1f",SM,M);  //نمايش به سانتي متر   
}
void main(void)
{


PORTD=0x00;
DDRD=0x08;
// Timer/Counter 1 initialization
// Clock value: 1000,000 kHz
// 60 ميلي ثانيه
TCCR1A=0x00;    //استفاده از تايمر 1 براي اندازه گيري دقيق فاصله
TCCR1B=0x02;   
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// INT0: On   Mode: Any change
GICR|=0x40;      //فعال سازي وقفه،براي اگاهي سازي سيگنال اکو ماژول
MCUCR=0x01;
GIFR=0x40;

lcd_init(16);
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Be Name KHODA");
delay_ms(1500);   
lcd_clear();

#asm("sei")
    while (1)
    {
      METER_Accuracy();    //با دقت بيشتر محاسبه شود
     // Meter();       //فقط متر محاسبه شود
      lcd_clear(); 
      lcd_gotoxy(0,0);
      lcd_puts(str);
      
      lcd_gotoxy(0,1);
      lcd_puts(str2);
   //   delay_ms(800);
    }
}





[لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید]کد و شبیه ساز
باتشکر.[/I][/I][/I]
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

ارسال پست

بازگشت به “آموزش و مثال‌ها AVR”