در این پست از سایت اِمیک, اموزش راه اندازی ماژول های فاصله سنج التراسونیک SRF05 و SRF04 با استفاده از میکروکنترلر AVR قرار داده شده است. برنامه این پروژه به زبان C و با استفاده از نرم افزار کامپایلر کدویژن (CodeVisionAVR) نوشته شده است. در ادامه با ماژول های SRF05 و SRF04 بیشتر اشنا خواهیم شد.
ماژول های فاصله سنج التراسونیک SRF05 و SRF04 :
این ماژول ها برای اندازه گیری فاصله, امواج صوتی با فرکانس بالا تولید و ارسال می کنند و موج بازتاب شده را دریافت می کنند. با اندازه گیری زمان ارسال تا دریافت امواج می توانیم فاصله مورد نظر را محاسبه کنیم. دو ماژول SRF04 و SRF05 تفاومت چندانی با هم ندارد و در واقع ماژول SRF05 ارتقاء یافته ماژول SRF04 می باشد. مسافت قابل سنجش توسط این ماژولها از 2cm تا 450cm می باشد.
این دو ماژول به گونه ای طراحی شده اند که می توان از انها بجای یکدیگر بدون نیاز به تغییر برنامه یا شماتیک پروژه استفاده کرد. در زیر تصویر این دو ماژول را مشاهده می کنید که تنها تفاوت ظاهری انها اضافه شدن یک پایه به نام OUT به ماژول SRF05 می باشد.
برای راه اندازی ماژول SRF05 دو مد وجود دارد, اما برای راه اندازی SRF04 یک مد یا روش وجود دارد که در ادامه مد یک و مد دو توضیح داده می شوند (مد یک برای راه اندازی هر دو ماژول می باشد و مد دو فقط برای SRF05 می باشد)
مد یک :
ماژول SRF05 دارای 5 پایه می باشد
- پایه VCC که باید به 5 ولت متصل شود
- پایه GND که به زمین (منفی تغذیه) متصل می شود
- پایه Trig
- پایه Echo
- پایه OUT
در ماژول SRF04 تعداد پایه ها 4 عدد می باشد و تنها تفاوت نسبت به SRF05 نداشتن پایه OUT است.
برای راه اندازی در مد یک ابتدا باید به پایه Trig ماژول یک پالس به طول حداقل 10 میکرو ثانیه اعمال کنیم. در ادامه ماژول به طور خودکار 8 پالس با فرکانس 40K هرتز به محیط ارسال می کند. بعد از ارسال پالس ها توسط ماژول پایه Echo یک می شود و تا زمانی که پالس های برگشتی (بازتاب شده) را دریافت نکرده یک باقی می ماند. زمانی که ماژول پالس های برگشت شده را دریافت کرد پایه Echo دوباره صفر می شود.
با اندازه گیری زمان رفت و برگشت پالس ها یا به عبارتی با اندازه گیری زمان یک بودن پایه Echo در ماژول با استفاده از تایمر در میکروکنترلر و قرار دادن زمان بدست امده در فرمولی که در ادامه گفته می شود می توان فاصله تا جسم را محاسبه کرد. در زیر دیاگرام زمانها را مشاهده می کنید:
همانطور که در دیاگرام بالا مشاهده می کنید طول پالس روی پایه Echo از 100 میکرو ثانیه تا 25 میلی ثانیه می باشد و در صورتی که طول پالس دریافتی از 30 میلی ثانیه بیشتر شد, یعنی ماژول هیچ جسمی را تشخیص نداده است.
همانطور که در بالا گفته شد از این روش یا مد می توان برای راه اندازی هر دو ماژول SRF05 و SRF04 استفاده کرد و در این روش به راحتی می توان از دو ماژول بجای یکدیگر بدون نیاز به تغییر برنامه یا شماتیک استفاده کرد.
توجه کنید که در این مد نیازی به استفاده از پایه OUT در ماژول SRF05 نیست و لازم نیست بجایی متصل شود.
مد دو :
در این روش از یک پایه برای تریگر (Trig) و اکو (Echo) استفاده می شود. این روش برای صرفه جویی در پایه های ورودی/خروجی(I/O) میکروکنترلر یا برد های اردوینو یا… طراحی شده است.
در این روش که فقط برای ماژول SRF05 می باشد باید پایه OUT را به زمین متصل کنیم و دیگر نیازی به پایه Echo نداریم و نیازی نیست بجایی متصل کنیم. در این مد پالس را مانند مد اول به پایه Trig اعمال می کنیم, ولی پالس برگشتی را هم از همین پایه دریافت میکنیم در صورتی که در مد اول از پایه Echo پالس برگشتی را دریافت میکردیم. در زیر دیاگرام برای مد دو را مشاهده می کنید:
پروژه AVR فاصله سنج با ماژول SRF05 و SRF04 :
در این پروژه ما با استفاده از ماژول فاصله سنج SRF05 و میکروکنترلر ATmega16 فاصله تا جسم را محاسبه می کنیم و روی یک LCD کاراکتری 2*16 نمایش می دهیم. ما از روش اول یا مد یک برای راه اندازی SRF05 استفاده می کنیم, بنابراین شما می توانید بدون نیاز به تغییر در برنامه یا شماتیک پروژه از ماژول SRF04 نیز استفاده کنید.
در زیر شماتیک این پروژه را مشاهده می کنید که بسیار ساده می باشد و نیاز به توضیح خاصی نیست. به جز قطعات گفته شده در بالا از یک پتانسیومتر نیز برای تنظیم روشنایی LCD کاراکتری (کنتراست) استفاده شده است که اجباری نیست و در صورتی که نداشتید می تونید استفاده نکنید ولی دقت کنید که حتما پین 3 ال سی دی را به زمین متصل کنید.
همانطور که در شماتیک بالا مشاهده می کنید پایه Echo در ماژول NRF05 به پین 39 میکروکنترلر (پین 1 از پورت A) و پایه Trig به پین 40 میکرو (پین 0 از پورت A) متصل شده است.
پایه های تغذیه میکروکنترلر (پایه های 10 و 11) که در تصویر بالا وجود ندارند را فراموش نکنید به تغذیه 5 ولت متصل کنید.
برنامه کدویژن :
در این پروژه فرکانس میکروکنترلر 8 مگاهرتز تنظیم شده است. در زیر برنامه نوشته شده به زبان C و کامپایلر کدویژن را مشاهده می کنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
////////// WWW.EMIC.IR ////////// #include <mega16.h> #include <alcd.h> #include <delay.h> #include <stdlib.h> //در زير تعدادي متغير براي استفاده در برنامه تعريف شده است// int overflow=0; unsigned long int Counter=0; float distance=0.0; unsigned char lcd[16]; //از خط 12 تا 16 دستورات مربوط به وقفه سرريز تايمر 0 مي باشند// interrupt [TIM0_OVF] void timer0_ovf_isr(void) { overflow++; //با هر بار اجراي وقفه يا به عبارتي ديگر با هر بار سرريز شدن شمارنده تايمر 0 يکي به متغير روبرو اضافه مي شود// TCNT0=0x00; } void main(void) { DDRA=(0<<DDA7) | (0<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (1<<DDA0); PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0); DDRD=(1<<DDD7) | (1<<DDD6) | (1<<DDD5) | (1<<DDD4) | (1<<DDD3) | (1<<DDD2) | (1<<DDD1) | (1<<DDD0); PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0); //از خط 32 تا 36 رجيسترهاي مربوط به فعالسازي تايمر/کانتر 0 مي باشند// // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 1000/000 kHz // Mode: Normal top=0xFF // OC0 output: Disconnected // Timer Period: 0/256 ms TCCR0=(0<<WGM00) | (0<<COM01) | (0<<COM00) | (0<<WGM01) | (0<<CS02) | (1<<CS01) | (0<<CS00); TCNT0=0x00; OCR0=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<OCIE0) | (1<<TOIE0); lcd_init(16); // Global enable interrupts #asm("sei") while (1) { //ايجاد مي کنند A سه خط زير يک پالس 10 ميکرو ثانيه اي روي پين 0 از پورت// PORTA.0=1; delay_us(10); PORTA.0=0; while(PINA.1==0){}; //شروع شمارش تايمر// overflow=0; TCNT0=0; TCCR0=0x02; //زير برنامه متوقف مي شود while ميکرو يک است ادامه دستورات اجرا نمي شود و درون حلقه A تا زماني که پين 1 از پورت// while(PINA.1==1){}; TCCR0=0x00; //صفر شد برنامه ادامه پيدا مي کند و طبق دستور روبرو تايمر غيرفعال مي شود A بعد از اينکه پين 1 از پورت// Counter=(overflow*256)+TCNT0; //مي ريزد Counter دستور روبرو مقدار شمارش تايمر را بدست اورده و درون متغير// distance=(Counter/2)*0.03432 ; //دستور روبرو فاصله ما را بر حسب سانتي متر باتوجه به زمان سپري شده و سرعت صوت محاسبه مي کند// //روي ال سي دي نمايش مي دهد CM در زير در صورتي که فاصله در حال اندازه گيري ما در محدوده قابل اندازه گيري توسط سنسور بود مقدار ان را به// //را نمايش مي دهد out of range در صورتي که فاصله مورد نظر بيش از محدوده قابل اندازه گيري توسط سنسور بود روي ال سي دي متن// if(Counter<30000) { lcd_clear(); lcd_gotoxy(0,0); lcd_putsf("distance="); lcd_gotoxy(9,0); ftoa(distance,1,lcd); lcd_puts(lcd); lcd_putsf("cm"); delay_ms(500); }else lcd_putsf("out of range"); } } |
همانطور که در بالا هم گفته شد ما برای اندازه گیری فاصله تا جسم باید مدت زمان رفت و برگشت سیگنال را اندازه بگیریم که این کار توسط تایمر در میکروکنترلر انجام می شود. ما در برنامه بالا توسط تایمر 0 این زمان را اندازه گیری می کنیم و بر 2 تقسیم می کنیم و در نهایت در سرعت صوت ضرب می شود تا فاصله مورد اندازه گیری ما بدست بیاید. بنابراین فرمول محاسبه فاصله بصورت زیر می شود:
نکته: از اونجایی که ما زمان رفت تا برگشت را در فرمول میذاریم باید بر 2 تقسیم کنیم تا فاصله ما دو برابر محاسبه نشود.
سرعت صوت در دمای 20 درجه سانتی گراد 343.2 متر بر ثانیه می باشد و همانطور که در فرمول مشاهده می کنید باید ان را تبدیل به سانتی متر بر میکروثانیه کنیم که بعد از تبدیل سرعت صوت برابر با 0.03432 سانتی متر بر میکروثانیه می شود و ما از این مقدار در برنامه بالا استفاده کرده ایم.
ما از تایمر 0 میکرو استفاده کرده ایم که یک تایمر 8 بیتی هست, بنابراین این تایمر می تواند از 0 تا 255 بشمارد (2 به توان 8) هر بار که تایمر از 0 شروع می کند و تا 255 می شمارد, از اونجایی که بیشتر از این نمیتواند بشمارد به اصطلاح سر ریز می کند و دوباره برمی گردد و از 0 شروع می کند و تا زمانی که فعال است این روند را ادامه می دهد. با هر بار سر ریز تایمر یک وقفه اتفاق می افتد (وقفه در خط 12 برنامه) و همانطور که دستورات درون وقفه را مشاهده می کنید با هر بار اجرای وقفه یک واحد به متغیر overflow اضافه می شود. یعنی هر بار که تایمر صفر 256 واحد می شمارد یک واحد به متغیر overflow اضافه می شود.
بنابراین ما در خط 59 برنامه برای بدست اوردن مقدار شمارش تایمر, متغیر overflow را در 256 ضرب کرده ایم و حاصل ان را با مقدار حال شمارنده (رجیستر TCNT0) نیز جمع کرده ایم تا مقدار شمارش کامل ما بدست بیاید. و از اونجایی که فرکانس کاری تایمر را 1 مگاهرتز تنظیم کرده ایم هر بار شمارش تایمر 1 میکرو ثانیه طول می کشد. در نتیجه می توانیم مقدار شمارش کامل تایمر 0 را که در خط 59 بدست اوردیم درون فرمول بالا به عنوان زمان رفت تا برگشت سیگنال قرار دهیم.
توضیحات قسمت های مهم برنامه نوشته شده, اگر سوالی داشتید می تونید در قسمت نظرات مطرح کنید.
کلیپ تست عملی پروژه :
پسورد فایل زیپ : www.emic.ir
نظر یادتون نره …
سلام
چجوری میشه التراسونیک رو جوری تنظیم کرد با lm35که، با تغییر دما در اندازه گیری مشکلی به وجود نیاد
سلام
باید تایمر برنامه هم فعال کنم؟
سلام من این کدهایی رو که همین بالا تو سایت گذاشتین رو توی نرم افزار کد ویژن تستشون میکنم دوتا وارنینگ میده که مربوط به اورفلو هستش اگه امکانش هست بفرمایید که این خطا از چیه؟
خیلی ممنون
سلام لطفا دوستان راهنمایی کنند بنده پروژه رو درست کردم ولی ال سی دی روشن نمیشه ال سی دی رو تست کردم سالمه و ولتاژ هم در همه نقاط وجود داره
سلام خسته نباشید میخوام دستگاه ضد عفونی با الترا سونیک درست کنم atmega8 لطفا راهنمایی کنید با آلترا سونیک و atmega 8 مدار هست ولی کد نیست
با سلام و عرض ادب
اگه میشه راهنمایی کنید که برای دقت بیشتر پروژه
چگونه ماژول DHT22 را به پروژه بالا اضافه کنیم
و کد برنامه چه تغییراتی می کند.
و اگر مقدور است کد برنامه که سنسور دما و رطوبت DHT22 را داره به پروژه اضافه کنید
سپاس فراوان از زحمات جنابعالی
خسته نباشید
من از این ماژول در حالتی استفاده کردم که فرستنده و گیرنده روبه روی هم باشند و در برنامه هم اون تقسیم بر 2 را برداشتم اما خروجی آن عدد درستی نیست یعنی تمامی فاصله ها را حدود 3 سانتی متر کمتر نشان میدهد
میشه لطفا راهنمایی ام کنید چیکار کنم که درست بشه
آیا خود این ماژول فقط در حالتی که فرستنده و گیرنده کنار هم باشند کارکرد داره؟
یعنی این مشکل مربوط به ذات خود ماژول هست یا قابل حله؟
البته میدونم اگر توی فرمول یک 3+ بزنم درست میشه فاصله ها اما میخوام اصولی حلش کنم
ببخشید اگه بخوایم فرکانس میکرو رو 16 مگ بزاریم چه تغییری باید اعمال شه؟
سلام خوبین مهندس
خسته نباشید خیلی ممنون از مطالب خوب تون
مهندس من این برنامه رو ریختم رو attiny13تنظیمات پورت و تایمرشم درست کردم
ولی کار نکرد و التراسونیک ویز ویز می کرد
دوست عزیز از این میکرو نمیتوانید استفاده کنید!
نیاز به میکرو 8 یا بالاتر دارید
سلام مهندس من این ساختم اما به جای مثالا ۱۴.۴ سانت میزنه ۱.۲ سانت اتصالات ماژول سالمه ؟
سلام, بررسی کنید که فرکانس میکرو را روی 8 مگ تنظیم کرده باشید. برای تست پروژه فایل هگز موجود در فایل های انتهای مطلب را روی میکرو پروگرام کنید و برنامه را هم تغییر ندهید
سلام خیلی ممنون از مطالب خوبتون
مهندس جان داستان فر مول چیه هر چی حساب کردم چیزی متوجه نشد
سلام, یه فرمول ساده هست نیاز به توضیح نداره, در مورد سرعت صوت که توضیح داده شده که دارای یک مقدار ثابت هست و زمان هم توسط تایمر میکرو محاسبه میشه
سلام خسته نباشین اگه بخوام بگم اگر فاصله کمتر از 7 سانت شد ال ای دی رو روشن کن اینجوری بنویسم درسته ؟ :
بعد از if(Counter<30000) بنویسم if ( distance7) ال ای دی روشن در غیر این صورت خاموش ؟ این درسته ؟ چون هر چی تست میکنم جواب نمیده
سلام, بعد از محاسبه distance (خط 61) یک شرط if بنویسید که اگر Counter کمتر از 410 شد (410 تقریبا میشه 7 سانت که باتوجه به فرمول موجود در خط 60 برنامه برای هر فاصله ای خودتون می تونید عددشو بدست بیارید) کار مورد نظرتون را بکنه مثلا روشن شدن یک led و اخر شرط if هم یک else اضافه کنید که در غیر این صورت مثلا led خاموش باشه
if(distance<7) {
PORTD.0=1;
}
else {PORTD.0=0;}
همینا اگه اضافه کنید میتونید کوچیک تر از 7 سانتی متر شد ال ای دی روشن بشه
یک سلام پر انرژی و تشکر از زحماتتون
خواستم برای دوستانی که میگن چرا فرکانس میکرو اول برنامه 8 مگ هست ولی بعد مگه 1 مگ
اون 1 مگ برای فرکانس تایمر هست نه میکرو
سلام واقعا ممنون از پروژه ای جالبتون.
من این دستگاه رو درست کردم اما فاصله رو درست نشون نمیده، مثلا فاصله ۵سانت باشه یه عددی حدود ۴۰ نشون میده و واحدcm هم نداره مشکل از کجا میتونه باشه؟
با تشکر
سلام, اگر برنامه را بدون تغییر روی میکرو پروگرام کردید پس نباید مشکلی باشه. دوباره میکرو را پروگرام کنید شاید درست شد
سلام ببخشید علت تنظیم کلاک بر 1000khzوبدست اوردن زمانی 0.250ms چه بوده است؟
الان شما با با فرکانس هشت مگا هرتز نوشتید
یا یک مگا ؟!!
8 مگ
سلام
اولا میخوام یه خسته نباشید پر انرژی بهتون بگم
چون واقعا سایتتون جامع هستش و توضیحاتش مختصر اما کامل و عالی
و دوما در متن سایت بالای برنامه کد ویژن نوشتید فرکانس 8 Mhz اما در برنامه 1Mhz در نظر گرفتید گفتم شاید بعضیا دچار مشکل بشن
ممنون
با سلام و تشکر, بررسی کردم و فرکانس میکرو در برنامه هم همان 8 مگ هست و اشتباه نوشته نشده
سلام من این پروژه رو پیاده سازی کردم اما روی lcd فقط مربع نمایش داده میشه و مشکل از چی میتونه باشه ؟
با تشکر از سایت خوبتون
سلام, این مشکل معمولا زمانی که lcd به درستی به میکرو متصل نشده رخ می دهد. اتصالات را بررسی کنید
با همون اتصالات برنامه دیگه ای رو تست کردم و بازم چیزی نمایش داده نمی شد روی LCD ، مربع نشون دادن بخاطر تنظیم نبودن کنتراست بود اما کلا چیزی نمایش داده نمیشه
پایه 3 ال سی دی را در صورت استفاده نکردن از پتانسیومتر حتما به منفی تغذیه متصل کنید
سلام ببخشید ممکنه کد این پروژه را با اتمگا۸ هم بزارید
سلام, خودتون تغییر بدید کار سختی نیست
سلام این پروژه با اتمگا8 کار میکنه
سلام, بله میشه با مگا 8 هم این ماژول را راه اندازی کرد ولی لازمه که کدها متناسب با میکروکنترلر تغییر داده شوند
ببخشید میشه کد با اتمگا۸ بفرستید