مقدمه
شاید تابهحال از خودتان پرسیدهباشید که دستگاههای رادار و اسکنر محیط چگونه کار میکنند؟ چطور میتوان اجزای داخل یک محیط را شناسایی کرد؟ یا به زبان سادهتر چطور میتوان یک رادار درست کرد؟ در این پروژه ابتدا میخواهیم به معرفی یکیاز سنسورهای آلتراسونیک(فراصوت) معروف برای تشخیص حرکت و فاصلهسنجی بپردازیم و درنهایت پروژه عملی ساخت رادار پیشرفته بهوسیله سرو موتور و نمایش گرافیکی روی السیدی نوکیا را انجامدهیم. در این پروژه حسگر آلتراسونیک برروی سرو موتور سوارشده و بهصورت گردشی محیط دورتادور خود را اسکن مینماید. سپس بهصورت همزمان برروی نمایشگر رنگی نوکیا موقعیت فعلی رادار و نقاط پیداشده، نمایشداده میشوند. اگر شما از آن دسته افرادی هستید با آردوینو مخالف هستند، پیشنهاد میکنم این پروژه را صرفنظر از آردوینو بودن پلت فرم مطالعه فرمایید. شما در این پروژه میتوانید بهخوبی هماهنگی و اتصال چند ماژول، سنسور و نمایشگر با یکدیگر، و درعینحال سادگی را بهوسیله یک میکروکنترلر ۸بیتی ببینید. این پروژه به جهت سادگی و عمومیبودن برروی پلت فرم آردوینو اجراشدهاست. شما میتوانید باتوجهبه عملکرد برنامه، آنرا برای میکروکنترلرهای دیگر تعمیم دهید.
همچنین بخوانید: آردوینو خوب، بد، زشت ! همه چیز درباره آردوینو
مدار و شماتیک رادار آلتراسونیک
شماتیک مدار رادار آلتراسونیک
راهاندازی حسگر HC-SR04
قبلاً پستی کامل در رابطه با راهاندازی حسگر HC-SR04 منتشرشدهاست، اما بهصورت اجمالی، این حسگر شامل چهار پایه است. دو پایه برای تغذیه(GND, VCC)، که این حسگر با پنج ولت کار میکند. برای راهاندازی سنسور شما میبایست یک پالس با مدت زمان مشخص به پایه Trigger بدهید تا سیگنال رفت را در هوا منتشر کند. سیگنال منتشرشده، پساز برخورد با مانع مجدداً به سمت حسگر بازتاب میشود. ما از طریق پایهی Echo منتظر برگشت سیگنال میمانیم و مدت زمان رفت و برگشت سیگنال را محاسبه میکنیم. اگر این مدت زمان را تقسیم بر دو کنیم، فاصله زمانی حسگر تا مانع بهدست میآید. از آنجاییکه سرعت انتشار صوت در محیط را میدانیم، میتوانیم با محاسبات ریاضی ساده فاصله طولی مانع تا حسگر را بهدست بیاوریم. در خطوط ابتدایی برنامه، پایههای تری گر و اکو را برای آردوینو مشخص میکنیم:
#define trigPin 2 #define echoPin 3
همچنین در تنظیمات اولیه، پایه تریگر را بصورت خروجی، و پایه اکو را بصورت ورودی تعریف مینماییم:
pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT);
عملیات محاسبه فاصله را بهصورت تابعی درون برنامه تعریف کردهایم. خروجی این تابع یک عدد برحسب سانتیمتر، و از جنس Long میباشد. همچنین اگر شما فاصله را برحسب میلیمتر یا اینچ احتیاج داشتهباشید، میتوانید داخل تابع، محاسبه Cm را توضیح (کامنت) کرده و بهجای آن خط مربوط به محاسبهی واحدهای دیگر را از توضیح خارجکنید. در هر قسمت از برنامه که نیاز به دانستن فاصله داشتهباشید، میتوانید خیلیراحت، این تابع را صدا بزنید.
long distance = calc_distance();
راهاندازی سرو موتور
آموزش راهاندازی سرو موتور توسط آردوینو نیز قبلاً در پستی جداگانه و بهصورت کامل آموزش دادهایم. بهصورت خلاصه، Servo Motor یک موتور الکتریکی با سیستم کنترل بازخورد با دقت بسیار بالاست که میتوان شافت آنرا در جهت و زاویه دلخواه برای رادارمان تنظیمکرد. سرو موتور در دو نوع DC و AC وجود دارد. سرو مورداستفاده در این پروژه SG90 میباشد که از نوع DC بوده و قابلیت چرخش ۱۸۰درجهای و تحمل وزن تا ۹ گرم را دارد. به لطف کتابخانهها و توابع از پیش نوشتهشده آردوینو، نیازینیست شما با جزئیات تولید PWM توسط میکروکنترلر درگیر شوید.
#include <Servo.h> Servo myservo;
تنظیمات اولیه مربوط به شماره پین متصل به سرو، درون تابع setup آردوینو
myservo.attach(8);
حال در هر قسمت از برنامه که نیاز داشتهباشید، میتوانید به کمک این تابع زاویهای از ۰ تا ۱۸۰ به سرو بدهید:
myservo.write(j); delay(100);
بهتر است پساز زاویهدادن به سرو، مقداری تاخیر در برنامه اضافهکنیم تا مطمئنشویم سرو در موقعیت خود قرارگرفتهاست.
راهاندازی نمایشگر رنگی نوکیا
قبلاً آموزش راهاندازی LCD گرافیکی Nokia 1661 و دانلود کتابخانه آن منتشر و در مدت کوتاهی به یکیاز پربحث ترین مطالب تبدیلشد. پیشنهاد میکنم حتماً این مقاله را نیز مطالعه بفرمایید. کتابخانه نوشتهشده، برای AVR، ARM و آردوینو قابلاستفاده میباشد.
توصیهشده: راه اندازی LCD گرافیکی Nokia 1661 و دانلود کتابخانه آن
ترتیب اتصال پایههای السیدی نوکیا به آردوینو:
- Arduino
- NOKIA LCD
- GND
- GND
- ۳.۳
- ۳.۳
- ۳.۳
- BL
- ۱۳
- SCL
- ۱۱
- SDA
- ۱۰
- CS
- ۹
- RS
توابع پر استفاده این کتابخانه
راهاندازی اولیه نمایشگر:
nlcdInit();
تنظیم زاویه چرخش نمایشگر:
nlcdSetOrientation(LCD_ORIENTATION_90);
در ورودی تابع بالا، میتوانید مقادیر زیر را استفادهکنید:
LCD_ORIENTATION_NORMAL LCD_ORIENTATION_90 LCD_ORIENTATION_180 LCD_ORIENTATION_270
دیگر توابع مورداستفاده در برنامه:
nlcdSetBackgroundColor(BG_color); // تنظیم رنگ پس زمینه نمایشگر nlcdClear(); // پاک کردن محتویات صفحه نمایشگر
توضیح الگوریتم برنامه اصلی رادار آلتراسونیک
در این پروژه قرار است ما یک رادار آلتراسونیک بسازیم که از زاویه صفر تا ۱۸۰درجه را بهوسیله سنسور آلتراسونیک اسکن کند و پساز اینکه هر زاویه را اسکنکرد، برروی نمایشگر با رسم خط وضعیت وجود مانع را نمایشدهد. سپس مجدداً از ۱۸۰ تا صفر این کار را تکرار نماید. درواقع خطوط رسمشده روی نمایشگر، شعاعهای یک نیمدایره هستند که برای هر زاویه رسم میشوند. برای اینکه نیمدایره رادار ما روی صفحه نمایشگر بهتر رسم شود، پساز راه اندازی، آن را ۹۰درجه میچرخانیم. ابعاد نمایشگری که در این پروژه بکار بردهایم ۱۲۸*۱۶۰ پیکسل میباشد. ممکناست نمایشگری که شما انتخاب میکنید ابعاد دیگری داشتهباشد. برای درک بهتر مختصات شکلزیر را ببینید:
نقطه شروع رسم شعاع را دقیقا در پایین و مرکز LCD قرار میدهیم. باتوجهبه ابعاد نمایشگر این نقطه (۸۰,۱۲۸) بدست میآید. حداکثر طول این شعاع را ۷۸پیکسل درنظر میگیریم تا هنگامیکه زاویه این شعاع صفر و یا ۱۸۰درجه باشد، از نمایشگر بیرون نزند. بااستفادهاز تابع زیر میتوانید روی نمایشگر خود کمانها را برای زاویه دلخواه رسم نمایید:
draw_ray(const int h, const int k, const int r, float angle, rgb_color16bit color);
h و k مختصات شروع رسم شعاع هستند که آنرا (۸۰,۱۲۸) بدست آوردیم. r شعاع کمان است که حداکثر آن برای این نمایشگر ۷۸ میباشد. برای نمایشگرهای دیگر پساز محاسبه میتوانید آنرا داخل متغیر زیر در خطوط اول برنامه تغییر دهید:
int circle_r = 78;
اما این اندازه، حداکثر شعاع دایره بود، ما قصد رسم شعاعهای یک دایره را نداریم. ما میخواهیم باتوجهبه مقادیر بهدستآمده از سنسور آلتراسونیک، طول این شعاع کاهش یابد:
r = map(distance, 0, radar_range, 0, circle_r);
radar_range محدودهای است که شما برای رادار خود تعیین میکنید و اسکن آن را محدود به این ناحیه میکنید. در خطوط اولیه برنامه شما میتوانید این مقدار را تغییر بدهید. float angle نیز اندازه زاویهای است که میخواهیم شعاع در آن زاویه رسمشود. دقتکنید که این تابع اندازه زاویه را برحسب رادیان میگیرد. پس لازماست تا اندازه زاویه را در عدد ۰.۰۱۷۴ ضرب نماییم. باتوجهبه تصویر بالا، چون ما برای نیمدایره، قسمت بالایی آن را لازمداریم، برای بهدستآمدن زوایه درست، این مقدار را در -۱ نیز ضرب میکنیم. حال که راهاندازی تمام قسمتهای رادار را میدانید، ما بااستفادهاز یک حلقه for از شماره ۰ تا ۱۸۰ را میشماریم و باز میگردیم. در هربار شمارش، ابتدا زاویه را به سرو موتور میدهیم تا سنسور ما را به آن زاویه ببرد. سپس با کمک سنسور آلتراسونیک فاصله مدار تا مانع را اندازه میگیریم. پساز اندازهگیری، متناسب با این فاصله شعاع دایره را در آن زاویه رسم میکنیم. کدهایی که هربار در حلقه For اجرا میشوند، در اینجا j زاویه موردنظر ماست:
void loop() { nlcdClear(); for (int i = 0; i < 362; i +=radar_step) { int j; long distance; int r; rgb_color16bit color; if (i < 181) { j = i; color = LCD_VGA_BLUE;} else {j = 180 - (i - 181); color = LCD_VGA_RED;} myservo.write(j); delay(100); distance = calc_distance(); //Radar range limit if (distance > radar_range || distance < 0) distance = radar_range; r = map(distance, 0, radar_range, 0, circle_r); if( distance < active_buzzer) digitalWrite(buzzerPin , HIGH); else digitalWrite(buzzerPin , LOW); draw_ray(80, 128, r, j * -0.0174, color); }
بهجای اینکه دو حلقه شمارنده برای ۰ تا ۱۸۰ و سپس مجددا از ۱۸۰ تا ۰ بنویسیم، یک شمارنده از ۰ تا ۳۶۲ نوشتیم و در خط ششم، متغیر j را تصحیح میکنیم. توضیح خط ۱۴: radar_range همانطورکه بالاتر نیز اشارهکردیم، محدودهای است که برای رادار خود درنظر میگیرید. مقدار این متغیر در خطوط اولیه برنامه قابلتغییر است. اگر distance (فاصله بدستآمده تا مانع) از این مقدار بیشتر باشد، مقدار آنرا با خود radar_range برابر قرار میدهیم. زیرا وجود مانع در خارج از محدوده تعریفشده، برای ما اهمیت ندارد. همچنین اگر این مقدار از صفر کمتر باشد، نشاندهنده محاسبات غلط یا عدمتوانایی تشخیص توسط سنسور آلتراسونیک میباشد. در اینصورت نیز مقدار distance را حداکثر (radar_range) قرار میدهیم. توضیح خط ۱۶: اگر مانع از فاصلهای که ما برای آن تعریفکردهایم نزدیکتر شد، بازر شروع به جیغزدن میکند. مقدار active_buzzer در ابتدای کد قابلویرایش میباشد. پین مربوط به بازر نیز در همان ابتدای برنامه در buzzerPin تعریفشدهاست. پایه پیشفرض شماره ۶ میباشد. استفادهاز بازر اختیاری میباشد.
نکات عملی
باتوجهبه جریان محدود USB و وجود چندین المان مصرف کننده در مدار، USB پاسخگوی جریان مدار نیست و شما میبایست از طریق یک منبع خارجی جریان مناسب با ولتاژ ۵ ولت را به پایه Vin آردوینو تزریقکنید. اگر این جریان کمکی را متصلنکنید، رادار شروعبه کار میکند، اما بهمحضاینکه سرو موتور شروع به کار کند، کل مدار ریست می کند. همچنین شما باید سرور موتور را بر روی سطحی محکم نمایید و سپس سنسور آلتراسونیک را بر روی آن بگونهای سوار کنید تا بتواند بهراحتی گردش نماید.
فیلم عملکرد رادار آلتراسونیک
دانلودها
لینکهای دانلود
اسم فایل
radar – digi boy (Sina).zip
منبع: سیسوگ