راه اندازی ماژول آلتراسونیک HC-SR04 با آردوینو | آیا تا بحال چیزی در مورد پژواک یابی جانورانی مانند نهنگ, خفاش و… به گوشتان خورده است؟ در این مقاله که توسط خانه رباتیک ایران آماده شده میخواهیم با ماژول HC-SR04 به این قدرت پژواک یابی دست پیدا کنیم.
راه اندازی ماژول آلتراسونیک HC-SR04 با آردوینو
نگاهی اجمالی به HC-SR04
HC-SR04 یک ماژول اندازه گیری مقرون به صرفه با مصرف انرژی پایین و آسان برای استفاده در محدودهای از ۲ سانتی متر (۱ اینچ) تا ۴۰۰ سانتی متر (۱۳ فوت) میباشد.
ولتاژ کاری این ماژول ۵ ولت و از دو ترنسدیوسر به عنوان سنسور آلتراسونیک که مبدل انرژی الکتریکی فرکانس بالا به موج صوتی (انرژی مکانیکی) و بلعکس است استفاده شده است. حرف R (گیرنده) و حرف T (فرستنده) در کنار هر ترنسدیوسر چاپ شده است.
ولتاژ کاری: | ۵V DC |
جریان کاری: | ۱۵mA |
فرکانس کاری: | ۴۰KHz |
حداقل فاصله: | ۲cm |
حداکثر فاصله: | ۴۰۰cm |
دقت اندازه گیری: | ۳mm |
زاویه اندازه گیری: | ۱۵ درجه |
ابعاد: | ۴۵*۲۰*۱۵ cm |
معرفی پایههای ماژول HC-SR04
Vcc: پایه مثبت تغذیه ماژول میباشد.
Gnd: پایه منفی تغذیه ماژول میباشد.
Trig: همانطور که از نام این پایه معلوم است برای تحرک کردن ماژول و ارسال امواج آلتراسونیک استفاده میشود.
Echo: پس از دریافت امواج بازتاب شده ماژول HC-SR04 از طریق این پایه برای ما دیتا ارسال میکند.
آموزشگاه خانه رباتیک ایران
پژواک (Echo) چیست؟
پژواک یا انعکاس (طنین) یعنی صوت پس از بازتاب از منبع با یک تأخیر زمانی به منبع خود برگردد و توسط گوش شخص یا گیرندهای که در این مقاله ماژول HC-SR04 است دریافت شود.
ماژول HC-SR04 دقیقا بر همین اساس کار میکند یعنی یک موج صوتی با فرکانس ۴۰۰۰۰ Hz ارسال میشود که فراتر از دامنه شنوایی انسان است و مقداری از این امواج پس از برخورد با جسم مقابل بازتاب و توسط ترنسدیوسر گیرنده آشکار میشود.
به بیان دقیقتر زمانیکه پایه Trig را به مدت ۱۰ میکروثانیه High (+5v) نگه دارید ماژول شروع به ارسال ۸ پالس آلتراسونیک که برابر با سرعت صوت است میکند.
بلافاصله بعد از ارسال این ۸ پالس پایه Echo به High تغییر وضعیت میدهد و منتظر امواج بازتاب شده میماند, بعد از دریافت اولین موج بازتاب شده پایه Echo به Low تغییر پیدا کرده و ما با استفاده از این فاصله زمانی رفت و برگشت موج آلتراسونیک و دانستن سرعت صوت میتوانیم فاصله بین ماژول تا مانع را حساب کنیم چناچه در برابر ماژول HC-SR04 مانعی وجود نداشته باشد پایه Echo بعد از ۳۸ میلی ثانیه به طور خودکار به Low میشود.
شروع پروژه HC-SR04 با آردوینو:
قطعات مورد نیاز:
- برد بورد
- ماژول
- HC-SR04 برد آردوینو
سیم بندی پروژه:
طبق تصویر پایههای Vcc و Gnd ماژول را به Vcc و Gnd برد آردوینو و پایههای Trig و Echo به ترتیب به پایههای ۶ و ۵ آردوینو متصل میشوند.
کد نویسی:
برای نوشتن کد در نرم افزار آردوینو به دو حالت میتوانیم عمل کنیم. روش دوم که مسیر راحتتر و با دقت بسیار بالاتری نسبت به روش اول است استفاده از کتابخانه NewPing و روش اول با استفاده از متد Pulsein و محاسبات انجام میشود.
قبل از نوشتن کد پروژه لازم هست دانستههای قبلی خود را مرور کنیم, میدانیم به وسیله پایه Echo مدت زمانی که امواج ارسال و دریافت میشوند را میتوانیم اندازه بگیریم, همچنین میتوانیم رابطه بین زمان و فاصله بر حسب سرعت را بصورت زیر بنویسیم.
فاصله = زمان * سرعت
سرعت صوت برابر است با ۳۴۳ متر بر ثانیه که اگر تبدیل به سانتی متر بر میکرو ثانیه کنیم برابر میشود با ۰.۰۳۴۳ حال با استفاده از ضرب زمان اندازه گیری شده در سرعت صوت, فاصله بین ماژول تا مانع حساب میشود ولی بعد از انجام تمام این نکات میبینیم که مسافت حساب شده اشتباه و بیشتر از مقدار واقعی است.
نکتهای که در نظر نگرفتیم این است که پایه Echo مدت زمان رفت و برگشت را به ما میدهد. ولی ما باید فقط یکبار این مسافت را حساب کنیم پس با نصف کردن فاصله خروجی درست بدست میآید.
طبق حرفهایی که در قسمتهای بالا گفتیم و سیم بندی پروژه کد آردوینو به صورت زیر است:
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ ۱۴ ۱۵ ۱۶ ۱۷ ۱۸ ۱۹ ۲۰ |
#define TRIGGER_PIN 6 #define ECHO_PIN 5 //Khane Robotic Iran HC-SR04 Tutorial void setup(){ // put your setup code here, to run once: pinMode(ECHO_PIN,INPUT); pinMode(TRIGGER_PIN,OUTPUT); Serial.begin(۹۶۰۰); } void loop() { // put your main code here, to run repeatedly: delay(۱۰۰); digitalWrite(TRIGGER_PIN,۱); delayMicroseconds(۱۰); digitalWrite(TRIGGER_PIN,۰); long Time = pulseIn(ECHO_PIN,۱); float dis = Time*۰.۰۳۴/۲; Serial.println(dis); } |
راه اندازی ماژول آلتراسونیک HC-SR04 با آردوینو
در خط ۱ و ۲ به عبارتهای TRIGGER_PIN و ECHO_PIN مقدارهای ثابت ۶ و ۵ را اختصاص دادهایم.
۱ ۲ |
#define TRIGGER_PIN 6 #define ECHO_PIN 5 |
در این قسمت پایه ۶ آردوینو به عنوان خروجی و پایه ۵ آردوینو به عنوان ورودی در نظر گرفته شده است همچنین مقدار بادریت سریال برای نمایش خروجی تنظیم شده است.
۱ ۲ ۳ |
pinMode(ECHO_PIN,INPUT); pinMode(TRIGGER_PIN,OUTPUT); Serial.begin(۹۶۰۰); |
قسمت اصلی کد ما در این بخش است در ابتدا تاخیری ۰.۱ ثانیه برای کند شدن روند نمونه برداری و چاپ آن در مانیتور سریال گذاشته شده است, سپس طبق گفتههایمان پایه Trig ماژول به مدت ۱۰ میکرو ثانیه ۱ میشود و بلافاصله به وسیله دستور pulseIn() مدت زمانی که پایه Echo 1 میباشد را محاسبه و طبق فرمولی که بدست آوردیم فاصله را محاسبه میکنیم و در مانیتور سریال نمایش میدهیم.
۱ ۲ ۳ ۴ ۵ ۶ ۷ |
delay(۱۰۰); digitalWrite(TRIGGER_PIN,۱); delayMicroseconds(۱۰); digitalWrite(TRIGGER_PIN,۰); long Time = pulseIn(ECHO_PIN,۱); float dis = Time*۰.۰۳۴/۲; Serial.println(dis); |
روش دوم کتابخانه NewPing:
ابتدا باید کتابخانه NewPing را دانلود و از مسیر Sketch => Include Library => Add.Zip Library کتابخانه فایل Zip کتابخانه NewPing را انتخاب و به پروژه خود اضافه کنید.
کتابخانه NewPing را میتوانید از لینک دانلود کنید.
کتابخانه NewPing با استفاده از یک سری عملیات تخصصی باعث برطرف شدن باگهای و مشکلات احتمالی این ماژول خواهد شد و تا ۱۵ ماژول بصورت همزمان می تواند راه اندازی کند.
کد برنامه ماژول HC-SR04 با استفاده از کتابخانه NewPing را میتوانیم اینگونه بنویسیم:
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ ۱۴ ۱۵ ۱۶ ۱۷ ۱۸ ۱۹ ۲۰ ۲۱ |
#include "NewPing.h" #define TRIGGER_PIN 6 #define ECHO_PIN 5 #define MAX_DISTANCE 400 //Khane Robotic Iran HC-SR04 Tutorial NewPing Iransonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); void setup() { // put your setup code here, to run once: Serial.begin(۹۶۰۰); } void loop() { // put your main code here, to run repeatedly: delay(۱۰۰); float dis = Iransonar.ping_cm(); Serial.println(dis); } |
ابتدا باید کتابخانه NewPing را فراخوانی کنیم.
راه اندازی ماژول آلتراسونیک HC-SR04 با آردوینو
۱ |
#include "NewPing.h" |
در خطهای ۳, ۴و ۵ به عبارتهای TRIGGER_PIN ,ECHO_PIN و MAX_DISTANCE مقدارهای ثابت ۶, ۵ و ۴۰۰ را اختصاص دادهایم که برای تعیین پایههای TRIGGER و ECHO متصل شده به آردوینو و ماکزیمم فاصلهای که میخواهیم بر حسب سانتی متر بسنجیم.
۱ ۲ ۳ |
#define TRIGGER_PIN 6 #define ECHO_PIN 5 #define MAX_DISTANCE 400 |
خط هشتم شئ از کتابخانه NewPing را با اسم Iransonar درست می کنیم. و عبارتهای اختصاص داده شده را به ترتیب قسمت ورودی آن مینویسیم.
۱ |
NewPing Iransonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); |
در خط ۱۳ مقدار بادریت سریال برای نمایش خروجی تنظیم شده است.
۱ |
Serial.begin(۹۶۰۰); |
در این قسمت با تاخیر ۰.۱ ثانیه با استفاده از تابع ping_cm() فاصله ماژول تا جسم مورد نظر بر حسب سانتی متر در متغییر dis میریزیم و در مانیتور سریال نمایش میدهیم.
آموشگاه رباتیک ایران
۱ ۲ ۳ |
delay(۱۰۰); float dis = Iransonar.ping_cm(); Serial.println(dis); |
همچنین شما برای اندازه گیری با دقت اعشار میتوانید از تابع ping() استفاده کنید برای این کار کافیست کدهای زیر را جایگزین خطهای ۱۸, ۱۹ و ۲۰ کنید.
۱ ۲ ۳ |
delay(۱۰۰); float dis = Iransonar.ping(); Serial.println(dis * ۰.۰۳۴ / ۲); |
اگر در پروژه صحت فاصله اندازه گیری شده مهم است با استفاده از تابع ping_median() به تعداد مکرر صحت اندازه گیری خود را بسنجید. و دیتا های غلط که اختلاف زیادی با بقیه دیتاها دارد را حذف کنید.
۱ ۲ ۳ |
delay(۱۰۰); float iterations = Iransonar.ping_median(); Serial.println(iterations * ۰.۰۳۴ / ۲); |
خروجی تمام کدهای نوشته شده برا پس از آپلود بر روی برد آردوینو میتوانید در سریال مانیتور ببینید.
شعبه بابل: پل کارگر به سمت کشوری، روبروی ماکروویو، جنب فروشگاه جانبو
شعبه ساری: خیابان مهدیه، نبش بهمن شرقی