فاصله سنج با ماژول التراسونيک و رزبریپای، معمولا در کاربردهای صنعتی و غير صنعتی از يک فرستنده التراسونيک و يک گيرنده يا حسگر التراسونيک استفاده میشود. نحوه عملکرد به اين صورت میباشد که ابتدا فرستنده موج التراسونيک که موجی در رنج فرکانس التراسونيک است را ارسال میکند و اين موج پس از برخورد به مانع بازگشت میکند و گيرنده اين موج بازگشتی را دريافت میکند. حال با توجه به زمان و طيف فرکانس بازگشتي مي توان به اطلاعاتي از قبيل عمق،نوع، سرعت و … مانع دست يافت.در اين قسمت هدف تشخيص فاصله با سنسور اولتراسنويک است که در ادامه با نحوهی راه اندازی اين سنسور را با رزبری پای آشنا خواهيم شد. برای اين کاربرد از رايج ترين ماژول های التراسونيک موجود در بازار ماژول SRF04 و SRF05 میباشد.
ماژول
اکثر ماژولهای التراسونيک (سنجش مسافت) (Ultrasonic Ranging Module) از دو قسمت فرستنده و گيرنده تشکيل شدهاند. قسمت فرستنده در کسری از ثانيه امواج التراسونيک را ارسال میکند اين امواج پس از برخورد به جسم بازتاب داده میشوند. وظيفه قسمت گيرنده دريافت امواج بازتابی از جسم است.
گيرنده و فرستنده ماژولهای HC-SR04 و HC-SR05 در کنار يکديگر قرار دارند و میتوانند جسمهای در فاصله 2 تا 300 سانتیمتر را با دقت قابل قبولی تشخيص دهند. البته ماژولهايی نيز وجود دارند که قسمت گيرنده و فرستنده به صورت جدا از يکديگر طراحی شدهاند و میتوان گيرنده و فرستنده را روبروی يکديگر قرار داد و اکثرا برای مقاصدی همچو تشخيص مانع استفاده میشوند.
ماژول SRF05 نسخه تکامل يافته SRF04 میباشد. اين نسخه جديد دو مد کاری را پشتيبانی میکند و 5 پايه جهت کار با با ماژول را در اختيار قرار میدهد. اما ماژول SRF04 دارای 4 پايه میباشد و تنها يک مد کاری را پشتيبانی میکند. هردوی اين ماژول ها دارای يک مد کاری مشترک هستند اين مد کاری بانام مد1 شناخته ميشود.در اين قسمت تنها از مد کاری 1 استفاده شده.
راه اندازی ماژول
همان طور که در دياگرام مشخص شده است براي تريگ ماژول ابتدا بايد يک پالس با عرض حداقل 10 ميکرو ثانيه به پايه Trigger اعمال کنيم. ماژول به صورت اتوماتيک 8 عدد پالس با فرکانس 40 کيلو هرتز ارسال ميکند. وقتي که پالسها ارسال شد پايه ECHO يک میشه و تا زمانی که برگشت پالس ها از جسم را دريافت نکند اين پايه يک باقی ميماند. پس با اندازه گيری مدت زمانی که اين پايه در سطح منطقی 1 بوده است ميتوان زمان رفت و برگشت صوت را بدست آورد. برای اندازه گيری پالس روی پايه ECHO بايد از تايمر استفاده کرد. بعد از اطلاع از زمان رفت و برگشت سيگنال اولتراسونيک با استفاده از رابطه زير فاصله سنسور تا مانع به راحتی محاسبه میشود.
D=(T/2)(340*100)
سرعت صوت: سرعت امواج التراسونيک برابر با سرعت صوت و عدد ثابتی برابربا 340متر بر ثانيه است.
زمان: مدت زمانی سيگنال روی پايهی ECHO در وضعيت يک منطقی قرار دارد. اين پارامتر بر حسب میکرو ثانيه است.
فاصله: فاصلهی ماژول تا مانع بر حسب Cm.
محدوديتها
اولين وشايد بزرگترين محدوديتی که در راه اندازی اين سنسور در رزبري پای وجود دارد مسئلهی سنجش زمان با تايمر است. چون در رزبری تايمری به صورت سخت افزاری وجود ندارد. بايد اين مشکل را به صورت نرم افزاری حل کرد. برای سنجش زمان در زبان سی کتابخانهای با نام time.h sys/وجود دارد که دارای مجموعهای از توابع میباشد که زمان سیستم را باز میگردانند. تابعی که در این پروژه برای سنجش زمان استفاده شده تابع gettimeofday میباشد.
توضیحات برنامه
در برنامه ی فوق بعد از تریگر کردن ماژول با پایه ی Trig در داخل یک حلقه ی while منتظر high شدن پایه ی echo ماژول میمانیم.سپس با تابع gettimeofday زمان فعلی سیستم را دریافت میکنیم و در ساختمانی با نام tv1 قرار میدهیم و دوباره در یک حلقه ی while دیگر منتظر low شدن پایه ی echo میمانیم و یک بار دیگر زمان فعلی سیستم را با تابع gettimeofday دریافت میکنیم و در ساختمانی با نام tv2 قرار میدهیم .به این ترتیب با تفریق زمان ارسال امواج با زمان دریافت امواج میتوان به فاصله ی جسمی که روبه روی این ماژول قرار دارد با رابطه ای که گفته شد بدست آورید.
نکتهی مهمی در سيم بندی رزبری با سنسور بايد مورد توجه قرار دهيد استفاده از تقسيم کنندهی ولتاژ مقاومتی به منظور کاهش سطح ولتاژ اعمالی به رزبری توسط سنسور است. مقدار مقاومتها 330Ω و 470Ω ميباشد.
/******************************* * Ultra Sonic Raning module Pin VCC should * be connected to 5V power. ******************************/ #include <wiringPi.h> #include <stdio.h> #include <sys/time.h> #define Trig 4 #define Echo 17 void ultraInit(void) { pinMode(Echo, INPUT); pinMode(Trig, OUTPUT); } float disMeasure(void) { struct timeval tv1; struct timeval tv2; long time1, time2; float dis; digitalWrite(Trig, LOW); delayMicroseconds(2); digitalWrite(Trig, HIGH); delayMicroseconds(10); //send out ultrasonic pulses while(!(digitalRead(Echo) == 1)); gettimeofday(&tv1, NULL); //get current time while(!(digitalRead(Echo) == 0)); gettimeofday(&tv2, NULL); //get current time time1 = tv1.tv_sec * 1000000 + tv1.tv_usec; //microsecond time time2 = tv2.tv_sec * 1000000 + tv2.tv_usec; dis = (float)(time2 - time1) / 1000000 * 34000 / 2; //calculate the distance return dis; } int main(void) { float dis; if(wiringPiSetupGpio() == -1){ //when initialize wiring failed,print messageto screen printf("setup wiringPi failed !"); return 1; } ultraInit(); while(1){ dis = disMeasure(); printf("%0.2f cm\n\n",dis); delay(300); } return 0; }
نویسنده : این مقاله توسط دوست عزیم آقا میثم سعیدی برامون ارسال شده.
منبع: میکرودیزاینرالکترونیک