به نام خدا
آموزش راه اندازی ماژول سنجش مسافت التراسونیک HC-SR04 و HC-SR05 با Atmel Studio
ماژول های سنج مسافت التراسونیک انواع مختلفی دارند و در رنج های وسیعی از ۲ سانتی متر تا چندصد متر بسته به نوع, برای مقاصد خاصی طراحی و استفاده می شوند. برای مشاهده انواع مختلف این نوع ماژول ها به اینجا مراجعه فرمایید.
پروژه AVR
اکثر ماژول های التراسونیک سنجش مسافت (Ultrasonic Ranging Module) از دو قسمت فرستنده و گیرنده تشکیل شده اند.قسمت فرستنده در کسری از ثانیه امواج التراسونیک را ارسال می کند این امواج پس از برخورد به جسم بازتاب داده می شوند. وظیفه قسمت گیرنده دریافت امواج بازتابی از جسم است.
گیرنده و فرستنده ماژول های HC-SR04 و HC-SR05 در کنار یکدیگر قرار دارند و می توانند جسم های در فاصله ۲ تا ۳۰۰ ساتی متر را با دقت قابل قبولی (من تا ۵ میلی متر تست کردم جواب داد ) تشخیص دهند. البته ماژول هایی نیز وجود دارند که قسمت گیرنده و فرستنده به صورت جدا از یکدیگر طراحی شده اند و می توان گیرنده و فرستنده را رویروی یکدیگر قرار داد و اکثرا برای مقاصدی همچو تشخیص مانع استفاده می شوند.
با اندازه گیری مدت زمان رفت و برگشت امواج ارسالی و با دانش بر اینکه سرعت امواج التراسونیک برابر با سرعت صوت (۳۰۰ متر بر ثانیه) است، فاصله جسم قابل محاسبه می باشد. (x = vt )
راه اندازی ماژول SRF05 و ماژول SRF04 عینا مشابه یکدیگر است و تفاوتی در نوع راه اندازی این دو ماژول وجود ندارد.فقط تفاوت در تعداد پایه هاست که در مدل ۰۵ یک پایه out وجود دارد و ما کاری به آن نداریم و آن پایه را به جایی وصل نمی کنیم.
البته باید بگم که مدل SRF05 دو مد راه اندازی داره که در اینجا ما مد ۱ رو توضیح دادیم.
برای راه اندازی این ماژول ها،باید یک پالس ۱۰ میکروثانیه ای به پایه تریگر آن اعمال کنیم، سپس منتظر می مانیم تا پایه اکو ماژول برابر یک (فعال) شود.پس از یک شدن آن، تایمر را فعال می کنیم و بعد منتطر می شویم تا پایه اکو برابر صفر (غیرفعال) شود.به محض صفر شدن اکو، تایمر را متوقف می کنیم،و برابر مدت زمان رفت و برگشت پالس می باشد.برای محاسبه فاصله جسم بازتاب کننده،کافی است این مدت زمان را بر ۲ تقسیم کنیم (فقط فاصله رفت) و سپس با استفاده از رابطه بالا فاصله جسم را به دست می آوریم.
قبل از توضیح کدها لازم است کتابخانه کاربردی زیر را تعریف کنیم که در اون ماکرو های مربوط به صفر و یک کردن بیت ها در محیط Atmel Studio رو قرار دادم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/* * BitsControl.h * To Control the IO ports value * Created: 2014-07-11 16:25:21 * Author: Astronomer */ #include <avr/io.h> #define SetBit(x,y) x |= (1 << y) /** Set PortX.Y to 1 **/ #define ClearBit(x,y) x &= ~(1 << y) /** Clear PortX.Y to 0 **/ #define Togle(x,y) (x ^=_BV(y)) /** Togle PortX.Y value **/ #define ToglePort(x) (x =~x ) /** Togle PortX value **/ #define BitVal(x,y) ( (x>>y) & 1) /** Return PinX.Y value **/ #define LoopUntilSet(x,y) do{}while( BitVal(x,y) == 0 ) /** wait to bit becomes 1 EX: LoopUntilSet(PIND,2);**/ #define LoopUntilClear(x,y) do{}while( BitVal(x,y) == 1 ) /** wait to bit becomes 0 EX: LoopUntilClear(PIND,2);**/ |
برای راه اندازی این ماژول ها یک کتابخانه نوشتم و در زیر به تشریح کدهای اون می پردازم.در این کتابخانه توابع زیر وجود دارند:
1 2 3 4 |
void HCSR04_Init();// تابع برای ست کردن پایه های اکو و تریگر میکرو int HCSR04_GetDistance()// فقط کافیه که این تابع رو صدا بزنیم تا مسافت رو بهمون بده void hcsr04_trigger(); // ارسال پالس ۱۰ میکروثانیه به پایه تریگر uint16_t hcsr04_get_pulse_width();// دریافت اکو و استارت و متوقف کردن تایمر |
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 |
void HCSR04_Init() { // PCO is output DDRC=0x01; } int HCSR04_GetDistance() { uint16_t pulseWidth; //Send a trigger pulse hcsr04_trigger(); //Measure the width of pulse pulseWidth = hcsr04_get_pulse_width(); //Handle Errors if(pulseWidth==US_ERROR) { return US_ERROR; } else if(pulseWidth == US_NO_OBSTACLE) { return US_NO_OBSTACLE; } else { int distance; distance=(pulseWidth/58.0); //Convert to cm // calibration of the result distance = distance*2; return distance; } } // private functions void hcsr04_trigger() { //Send a 10uS pulse on trigger line SetBit(PORTC,0); _delay_us(15); //wait 15uS ClearBit(PORTC,0); } uint16_t hcsr04_get_pulse_width() { uint32_t result; //Wait for the rising edge LoopUntilSet(PINC,1); //Setup Timer1 TCCR1A=0X00; TCCR1B=(1<<CS11); //Prescaler = Fcpu/8 TCNT1=0x00; //Init counter //Now wait for the falling edge LoopUntilClear(PINC,1); //Falling edge found result=TCNT1; //Stop Timer TCCR1B=0x00; if(result > 60000) { return US_NO_OBSTACLE; //No obstacle } else { return (result>>1); } } |
1 |
void HCSR04_Init(); |
1 |
int HCSR04_GetDistance() |
این هم تابع اصلی برنامه که چک میکنه اگر مقدار فاصله از یک مقدار آستانه بیشتر بود پایه ۶ پورت D رو یک می کنه.
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 |
int main(void) { SetRegisters(); // تنظیم کردن رجیسترها و وقفه ها و ال سی دی char distance_str[16] =""; lcd_clear(); lcd_puts("Ultra Sonic"); lcd_gotoxy(0,1);lcd_puts("Distance Ranging"); _delay_ms(200); lcd_clear(); while(1) { int distance = HCSR04_GetDistance(); // خواندن مقدار فاصله if(distance > Thershold) // چک کردن مقدار فاصله که از مقدار آستانه بیشتر است یا نه؟ { SetBit(PORTD,6);// ست کردن پایه ۶ پورت D } else { ClearBit(PORTD,6); } // نمایش فاصله روی ال سی دی sprintf(distance_str,"%d cm ",distance); lcd_gotoxy(0,0); lcd_puts(distance_str); _delay_ms(500); } } |
در آخر هم فایل اصلی پروژه و شماتیک پروتئوس رو برای دانلود قرار دادم.
برای سلامتی و تعجیل ظهور امام زمان (عج) صلوات
مهمان
سلام وقت بخیر خدا قوت و خسته نباشید
برای اندازه گیری نرخ سوزش میل سوخت جامد استوانه ای شکل به قطر 8mm طول 15cm که بصوزت سیگاری در محفظه تحت فشار دما بالا میسوزه میخواستم ببینم میشه با روش التراسونیک سرعت سوختن رو اندازه گیری کنم اگه میشه چه سنسوری رو پیشنهاد میکنین؟
دقت هم خیلی مهمه
ممنون میشم راهنماییم کنید
نویسنده این مطلب
سلام دوست عزیز. با توجه به اینکه قطر استوانه کوچک است این نوع سنسور جوابگوی کار شما نمی باشد. میتوانید از سنسور (ماژول) های مادون قرمز استفاده کنید. شما می توانید ماژول مناسب خود را در اینجا پیدا کنید.
مهمان
احسنت
دستت درد نکنه
سایت و مطالب شما و اقعا عالیه
موفق باشید
مهمان
سلام
اطلاعی از نحوه کار سنسور های پارک خودرو ( التراسونیک) و طریقه اتصالشون به میکرو رو دارین?
این سنسور ها فقط دو سیم مثبت و منفی دارن و خبری از Vcc و GND و تریگر نیست!
با تشکر
مدیر سایت
سلام – نه والا – یه لینک بدید ازش بررسی کنم.
مهمان
سلام مهندس من میخواستم این تابلو هایی که جلوش میایستیم و روشن میشه رو مدارشو طراحی کنم از همین ماژول استفاده کردم براشم بازه تعریف کردم روی دیوار و اجسام درست کار میکنه مثلان وقتی یه جسمی رو به ۲۰ سانتیش نزدیک میکنم رله فعال میشه ولی وقتی بدن انسان جلوش قرار میگیره قاتی میکنه ممنون میشم راهنماییم کنید
مدیر سایت
سلام-معمولا اگه دیده باشی از این سنسور استفاده نمیکنن – یه سنسوری که شبیه یه نیم دایره هستش استفاده میکنن – تو فروشگاه ها هستش ولی من اسمشو دقیقا خاطرم نیست.
نویسنده سایت
متشکرم
مهمان
سلام خسته نباشید.ببخشید تو برنامه بالا متوجه نمیشم این قسمتو که چرا فاصله رو ضربدر2 کردین جای تقسیم بر 2؟؟؟
مهمان
برای کالیبره کردن در 2 ضرب میشه. چون توی تبدیل به سانتی متر عرض پالس بر 58 تقسیم شده و سپس مقدار به دست اومده رو در 2 ضرب می کنیم. می توانستیم مستقیما عرض پالس را در 29 تقسیم کنیم. این اعداد به صورت تجربی و باتوجه به نوع ماژول و عرض پالس و … به دست می ایند
مهمان
آخه تو دیتاشیت فقط عدد 58 ذکر شده در حالی که این ضرب در 2 چرا باید بر کالیبره شدن استفاده بشه؟فاصله رو اشتباه نمیکنه؟؟تو سایت دیگه ای هم مشابه اینو دیدم ولی اونجا هم ضربدر 2 نشده بود!!!!!
ممنون از پاسخگویی شما.
مهمان
من وقتی مدار رو راه اندازی کردم، توی تست های اولیه متوجه شدم اون فاصله ای که نمایش داده میشه نصف فاصله واقعی هست. بنابراین در 2 ضرب کردم.این بستگی به نوع دستگاه آلتراسونیک داره و معمولا با تست های اولیه می تونین مقدار صحیح رو حدس بزنید. توی مدلی که من استفاده کردم اینجوری بود.
مهمان
Ok
خیلی ممنون
مهمان
سلام با تشکر از سایتتون
ببخشید سرعت این ماژول بیشتره یا srf05 ?
مهمان
سلام وقت شما بخیر . با تشکر از مطالب و پروژه های مفیدتون
کارتون خیلی عالیه برای شما ارزوی موفقیت روزافزون دارم . اگه امکانش هست راجب اینکه سنسور های فرستنده و گیرنده روبروی هم باشن بیشتر توضیح بدین ؟ یعنی من میتونم این دوتارو جدا از هم قرار بدم وبتونم فاصله ی بین هردو رو بدست بیارم ؟
مدیر سایت
سلام
بهتره توی eca.ir مطرح کنید
مهمان
اوکی خیلی ممنون . من آشنایی زیادی در الکترونیک و رباتیک ندارم و با کمک توضیحات شما مطالب رو بهتر درک میکنم اگر امکانش هست پروژه ساخت گیرنده gps رو با همین شیوه قرار بدید . بازم تشکر میکنم از وقتی که برای ما میذارین
مهمان
سلام. مکانیزم این سنسورها این هست که فرستنده سیگنالی را ارسال میکنه و بعد از برخورد به یک جسم بازتاب می شه و توسط گیرنده دریافت میشه. فاصله به دست اومده باید تقسیم بر دو بشه (مسیر رفت + مسیر برگشت) حالا اگه دو سنسور روبروی هم باشن مسافت دیگه تقسیم بر دو نمیشه. باید از مدل هایی استفاده کنید که گیرنده و فرستنده از هم جدا هستند.اتفاقا قیمتشون هم ارزونتره.
مهمان
سلام . ممنون از پاسخ شما
با تصور اینکه سنسور فرستنده دست کاربر باشه و هرقت بخواد بتونه این مسافت رو روی ال سی دی ببینه(با فشردن یک دکمه) . سنسور گیرنده چطور میفهمه که سیگنال کی ارسال شده و از چه طریقی این مدت زمان دریافت سیگنال رو به دستگاه فرستنده اعلام میکنه ؟
بازم تشکر میکنم از شما
مهمان
ماژول کلی از زمانی که پالس ارسال میشه شروع می کنه به شمارش ثانیه ها و وقتی که سیگنال به گیرنده رسید شمارش تموم میشه. شما باید مکانیزمی تعبه کنید تا مدت زمان ارسال پالس توسط فرستنده تا دریافت توسط گیرنده رو به دست بیارید.حالا زمان رو دارید و سرعت پالس رو هم دارید. با استفاده از رابطه x = vt می تونید مسافت رو حساب کنید.
سنسور گیرنده فقط میگه که من پالس رو دریافت کردم و این شما هستید که باید مکانیزی رو طراحی می کنید تا متوجه بشید در چه مدت زمانی پالس توسط گیرنده دریافت شده.
مهمان
سلام
هی پسر کارت خعلی درسته دمت گرم
ایمیلم سرکاریه :)))))))))))))))
مهمان
دمتون گرم. چیزی که متفاوت بود توضیح کامل و عالی برنامه بود. از این که با اتمل استودیو هم برنامه نوشتید و توضیح دادید هم ممنونم. تا الان همش با کدویژن کار میکردم ولی الان دیگه اتمل استودیو رو حرفه ای تر میدونم.موفق باشید.
مهمان
همین هگز رو وقتی میخوام پروگرام کنم ارور میده 0h
ایسی بدون مشکل پاک میشه ولی وقتی میخوام وریفای فلش کنم این ارور رو میده
لطفا اگه میشه یه راهنمایی کنید این مشکلم حل شه فاصله سنج لازمم
مهمان
من پروژه Sr 04 رو میخوام
مدیر سایت
مطلب زیر رو بخون توش توضیح دادم…۰۴ با ۰۵ زیاد فرقی نداره—پروژه زیر رو هم عملی بستم و فیلمش رو هم تو مطلب زیر گزاشتم لذا مشکلی نداره….در مورد اون یکی مطلب(با اتمل) نظری ندارم
https://dmf313.ir/%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D9%88-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-%D9%85%D8%A7%DA%98%D9%88%D9%84-%D9%81%D8%A7%D8%B5%D9%84%D9%87-%D8%B3%D9%86%D8%AC-srf05/
مهمان
میشه تو محیط کد ویژن این رو بزارید
مدیر سایت
یه مطلب برا کدویژن من تو سایت گزاشتم اگه دقت کرده باشی
مهمان
سلام…ممنون میشن بگی کد ویژنش کجاست یا بگإاری رو سایت….میخوام بسازم مدارو احتیاج دارم…ممنون
مدیر سایت
سلام
متوجه سوالتون نشدم
مهمان
سلام
من ترم آخر کاردانی الکترونیک هستم….میخوام واسه پروژه ساختم فاصله سنج بسازم….اگر امکانش هست برنامه این پروژه در محیط کدویژن….یا پروژه ای در حد این بهم معرفی کنی بی نهایت سپاسگزارم
مدیر سایت
سلام
همین پروژه با کدویژن تو سایت هستش…بگردی پیدا میکنی
مهمان
این مدار تو پروتوس حتی رو ال سی دی هم چیزی نشون نمیده
مدیر سایت
تو پروتئوس چییزی رو هم نباید نشون بده…. چون پروتئوس اکثر ماژول ها رو شبیه سازی نمیتونه بکنه
نویسنده این مطلب
سلام
ببخشید که دیر جواب میدم:
نقل قول: “این ماژول تو دقت انداز گیری با هم فرق ندارن؟؟؟؟”
توس سایتهای مختلفی راجع به این دو بحث شده و جاهایی نوشتن که SRF05 دقیقتره ولی توی چند موردی که من تست کردم تفاوتی را احساس نکردم! البته شاید ابزار اندازه گیری من دقیق نبوده
نقل قول : ” این چند صد متر…کدوم ماژول بیش از ۱۵ متر اندازه میگیره؟؟؟ ”
پاسخ: سنسورهای التراسونیک بر اساس محدوده فرکانسی خود به دو دسته صنعتی و غیر صنعتی تقسیم بندی میشوند. حسگرهای فرا صوت غیر صنعتی در محدوده فرکانسی 40 کیلو هرتز و حسگرهای صنعتی در حد مگا هرتز هستند. سونار ها نیز که برای ناوبری کشتی ها استفاده می شود از این دسته اند. که میتوانند تا چندصد متر زیر دریا را عمق سنجی کنند (عمق سنجی آکوستیکی)
مهمان
با بسکام هم یاد بدین ممنون منتظرم .ایمیلمو گذاشتم
مدیر سایت
با بسکام یاد نمیدیم…….بسکام ارزش کار کردن نداره…..
به نطر من شما هم برید سمت c
مهمان
این ماژول تو دقت انداز گیری با هم فرق ندارن؟؟؟؟
(منظورم srf05 و srf04 بودش…………)
مهمان
این ماژول تو دقت انداز گیری با هم فرق ندارن؟؟؟؟

تو اول مطلب گفتی که :
[“ماژول های سنج مسافت التراسونیک انواع مختلفی دارند و در رنج های وسیعی از ۲ سانتی متر تا چندصد متر بسته به نوع, برای مقاصد خاصی طراحی و استفاده می شوند”]
این چند صد متر…کدوم ماژول بیش از 15 متر اندازه میگیره؟؟؟امکان داره اسم ماژول رو بگید..
من بیشتری بردی که دیدم 12متر بود تقریبا که قیمت ماژولش حدا 100 تومن بود