شاید تا به حال از خودتان پرسیده باشید که دستگاههای رادار و اسکنر محیط چگونه کار میکنند؟ چطور میتوان اجزای داخل یک محیط را شناسایی کرد؟ یا به زبان ساده تر چطور میتوان یک رادار درست کرد؟ در این قسمت از پروژه های آردوینو ابتدا میخواهیم به معرفی یکی از سنسورهای آلتراسونیک (فراصوت) معروف برای تشخیص حرکت و فاصله سنجی بپردازیم و در نهایت پروژه عملی ساخت رادار پیشرفته بهوسیله سرو موتور و نمایش گرافیکی روی ال سی دی نوکیا را انجام دهیم. در این پروژه حسگر آلتراسونیک بر روی سرو موتور سوار شده و بهصورت گردشی محیط دور تا دور خود را اسکن مینماید. سپس بهصورت همزمان بر روی نمایشگر رنگی نوکیا موقعیت فعلی رادار و نقاط پیدا شده، نمایش داده میشوند.
اگر شما از آن دسته افرادی هستید با آردوینو مخالف هستند، پیشنهاد میکنم این پروژه را صرف نظر از آردوینو بودن پلت فرم مطالعه فرمایید. شما در این پروژه میتوانید به خوبی هماهنگی و اتصال چند ماژول، سنسور و نمایشگر با یکدیگر، و در عین حال سادگی را بهوسیله یک میکروکنترلر 8 بیتی ببینید. این پروژه به جهت سادگی و عمومی بودن بر روی پلت فرم آردوینو اجرا شده است. شما میتوانید با توجه به عملکرد برنامه، آن را برای میکروکنترلر های دیگر تعمیم دهید.
مدار و شماتیک رادار آلتراسونیک
راه اندازی حسگر HC-SR04
قبلاً در سیسوگ پستی کامل در رابطه با راه اندازی حسگر HC-SR04 منتشر شده است، اما بهصورت اجمالی، این حسگر شامل چهار پایه است. دو پایه برای تغذیه (GND, VCC)، که این حسگر با پنج ولت کار میکند. برای راه اندازی سنسور شما میبایست یک پالس با مدت زمان مشخص به پایه Trigger بدهید تا سیگنال رفت را در هوا منتشر کند. سیگنال منتشر شده، پس از برخورد با مانع مجدداً به سمت حسگر بازتاب میشود. ما از طریق پایهی Echo منتظر برگشت سیگنال میمانیم و مدت زمان رفت و برگشت سیگنال را محاسبه میکنیم. اگر این مدت زمان را تقسیم بر دو کنیم، فاصله زمانی حسگر تا مانع بهدست میآید. از آنجایی که سرعت انتشار صوت در محیط را میدانیم، میتوانیم با محاسبات ریاضی ساده فاصله طولی مانع تا حسگر را بهدست بیاوریم.
در خطوط ابتدایی برنامه، پایههای تری گر و اکو را برای آردوینو مشخص میکنیم:
1 2 | #define trigPin 2 #define echoPin 3 |
1 2 | pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); |
1 | long distance = calc_distance(); |
راه اندازی سرو موتور
آموزش راه اندازی سرو موتور توسط آردوینو نیز قبلاً در پستی جداگانه و بهصورت کامل در سیسوگ آموزش داده شده است. بهصورت خلاصه، Servo Motor یک موتور الکتریکی با سیستم کنترل بازخورد با دقت بسیار بالاست که میتوان شافت آن را در جهت و زاویه دلخواه برای رادارمان تنظیم کرد. سرو موتور در دو نوع DC و AC وجود دارد. سرو مورد استفاده در این پروژه SG90 میباشد که از نوع DC بوده و قابلیت چرخش 180 درجهای و تحمل وزن تا 9 گرم را دارد. به لطف کتابخانهها و توابع از پیش نوشته شده آردوینو، نیازی نیست شما با جزئیات تولید PWM توسط میکرو کنترلر درگیر شوید.
1 2 3 | #include <Servo.h> Servo myservo; |
تنظیمات اولیه مربوط به شماره پین متصل به سرو، درون تابع setup آردوینو
1 | myservo.attach(8); |
حال در هر قسمت از برنامه که نیاز داشته باشید، میتوانید به کمک این تابع زاویه ای از 0 تا 180 به سرو بدهید:
1 2 | myservo.write(j); delay(100); |
بهتر است پس از زاویه دادن به سرو، مقداری تاخیر در برنامه اضافه کنیم تا مطمئن شویم سرو در موقعیت خود قرار گرفته است.
راه اندازی نمایشگر رنگی نوکیا
قبلاً در سیسوگ آموزش راه اندازی LCD گرافیکی Nokia 1661 و دانلود کتابخانه آن منتشر و در مدت کوتاهی به یکی از پربحث ترین مطالب سیسوگ تبدیل شد. پیشنهاد میکنم حتماً این مقاله را نیز مطالعه بفرمایید. کتابخانه نوشته شده توسط زئوس، برای AVR، ARM و آردوینو قابل استفاده میباشد.
توابع پر استفاده این کتابخانه:
راه اندازی اولیه نمایشگر:
1 | nlcdInit(); |
تنظیم زاویه چرخش نمایشگر:
1 | nlcdSetOrientation(LCD_ORIENTATION_90); |
در ورودی تابع بالا، میتوانید مقادیر زیر را استفاده کنید:
1 2 3 4 | LCD_ORIENTATION_NORMAL LCD_ORIENTATION_90 LCD_ORIENTATION_180 LCD_ORIENTATION_270 |
دیگر توابع مورد استفاده در برنامه:
1 2 | nlcdSetBackgroundColor(BG_color); // تنظیم رنگ پس زمینه نمایشگر nlcdClear(); // پاک کردن محتویات صفحه نمایشگر |
توضیح الگوریتم برنامه اصلی رادار آلتراسونیک
نقطه شروع رسم شعاع را دقیقا در پایین و مرکز LCD قرار میدهیم. با توجه به ابعاد نمایشگر این نقطه (80,128) بدست میآید. حداکثر طول این شعاع را 78 پیکسل در نظر میگیریم تا هنگامی که زاویه این شعاع صفر و یا 180 درجه باشد، از نمایشگر بیرون نزند.
با استفاده از تابع زیر میتوانید روی نمایشگر خود کمان ها را برای زاویه دلخواه رسم نمایید:
1 | draw_ray(const int h, const int k, const int r, float angle, rgb_color16bit color); |
h و k مختصات شروع رسم شعاع هستند که آن را (80,128) بدست آوردیم.
r شعاع کمان است که حداکثر آن برای این نمایشگر 78 میباشد. برای نمایشگر های دیگر پس از محاسبه میتوانید آن را داخل متغیر زیر در خطوط اول برنامه تغییر دهید:
1 | int circle_r = 78; |
اما این اندازه، حداکثر شعاع دایره بود، ما قصد رسم شعاع های یک دایره را نداریم. ما میخواهیم با توجه به مقادیر به دست آمده از سنسور آلتراسونیک، طول این شعاع کاهش یابد:
1 | r = map(distance, 0, radar_range, 0, circle_r); |
radar_range محدوده ای است که شما برای رادار خود تعیین میکنید و اسکن آن را محدود به این ناحیه میکنید. در خطوط اولیه برنامه شما میتوانید این مقدار را تغییر بدهید.
float angle نیز اندازه زاویه ای است که میخواهیم شعاع در آن زاویه رسم شود. دقت کنید که این تابع اندازه زاویه را برحسب رادیان میگیرد. پس لازم است تا اندازه زاویه را در عدد 0.0174 ضرب نماییم. با توجه به تصویر بالا، چون ما برای نیم دایره، قسمت بالایی آن را لازم داریم، برای بهدست آمدن زوایه درست، این مقدار را در -1 نیز ضرب میکنیم.
حال که راه اندازی تمام قسمت های رادار را میدانید، ما با استفاده از یک حلقه for از شماره 0 تا 180 را میشماریم و باز میگردیم. در هر بار شمارش، ابتدا زاویه را به سرو موتور میدهیم تا سنسور ما را به آن زاویه ببرد. سپس با کمک سنسور آلتراسونیک فاصله مدار تا مانع را اندازه میگیریم. پس از اندازه گیری، متناسب با این فاصله شعاع دایره را در آن زاویه رسم می کنیم.
کد هایی که هر بار در حلقق For اجرا می شوند، در اینجا j زاویه مورد نظر ماست:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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); } |
بهجای اینکه دو حلقه شمارنده برای 0 تا 180 و سپس مجددا از 180 تا 0 بنویسیم، یک شمارنده از 0 تا 361 نوشتیم و در خط ششم، متغیر j را تصحیح میکنیم.
توضیح خط 14:
radar_range همانطور که بالاتر نیز اشاره کردیم، محدوده ای است که برای رادار خود در نظر میگیرید. مقدار این متغیر در خطوط اولیه برنامه قابل تغییر است. اگر distance (فاصله بدست آمده تا مانع) از این مقدار بیشتر باشد، مقدار آن را با خود radar_range برابر قرار میدهیم. زیرا وجود مانع در خارج از محدوده تعریف شده، برای ما اهمیت ندارد. همچنین اگر این مقدار از صفر کمتر باشد، نشان دهنده محاسبات غلط یا عدم توانایی تشخیص توسط سنسور آلتراسونیک میباشد. در این صورت نیز مقدار distance را حداکثر (radar_range) قرار میدهیم.
توضیح خط 16:
اگر مانع از فاصله ای که ما برای آن تعریف کرده ایم نزدیک تر شد، بازر شروع به جیغ زدن میکند. مقدار active_buzzer در ابتدای کد قابل ویرایش میباشد. پین مربوط به بازر نیز در همان ابتدای برنامه در buzzerPin تعریف شده است. پایه پیش فرض شماره 6 میباشد. استفاده از بازر اختیاری میباشد.
نکات عملی
با توجه به جریان محدود USB و وجود چندین المان مصرف کننده در مدار، USB پاسخگوی جریان مدار نیست و شما میبایست از طریق یک منبع خارجی جریان مناسب با ولتاژ 5 ولت را به پایه Vin آردوینو تزریق کنید. اگر این جریان کمکی را متصل نکنید، رادار شروع به کار میکند، اما به محض اینکه سرو موتور شروع به کار کند، کل مدار ریست می کند.
همچنین شما باید سرور موتور را بر روی سطحی محکم نمایید و سپس سنسور آلتراسونیک را بر روی آن بگونهای سوار کنید تا بتواند به راحتی گردش نماید.
فیلم عملکرد رادار آلتراسونیک
دانلود ها
لینکهای دانلود
اسم فایل
- sisoog radar – digi boy (Sina).zip
سلام مقاومت ها چند اهم هستند؟
سلام. 220 اهم
سلام میشه کد کامل اردیینوش رو بهم بدید تشکر
سلام رضای عزیز
کد کامل پروژه داخل پیوست های آخر مطلب موجود است. از اونجا می تونید دانلود کنید.
سلام وقت بخیر.فروش قطعات دارید.واگرهست هزینه کامل چقدراست
سلام
همه قطعات این پروژه در بازار به راحتی قابل تهیه هست و میتونید از بازار تهیه کنید. فقط تهیه نمایشگر ممکنه یکم مشکل باشه که میتونید از این فروشگاه تهیه کنید
سلام کتابخانه ال سی دی 1661رو دانلود کردم اما روی اردینو uno نصب نمیشه
سلام وقت بخیر
ممنون برای آموزشهای خوب و خصوصا رایگانتون
میشه به جای نمایشگر نوکیا از نمایشگر TFT استفاده کرد؟ شیوه ی درست راه اندازیش را هم توضیح میدید؟ خیلی از سایتها توضیحهاتی دادن ولی در عمل قابل اجرا نیست
درود.
بله، میشه از TFT هم در این پروژه استفاده کرد. اگر فرصت شد، آموزش TFT رو هم مد نظر قرار میدم. این آموزش هم از قبل هست، البته برای ARM
https://sisoog.com/2020/06/21/%d8%b1%d8%a7%d9%87%d8%a7%d9%86%d8%af%d8%a7%d8%b2%db%8c-tft-lcd-%d8%a8%d8%a7-%d8%a7%d8%b3%d8%aa%d9%81%d8%a7%d8%af%d9%87-%d8%a7%d8%b2-ltdc-%d8%a8%d8%ae%d8%b4-%d8%a7%d9%88%d9%84/
ایول واقعا حال کردم. اصلا فکرشو نمیکردم با یه آردوینو بشه همچین چیزی ساخت! هم پیچیدست و هم ساده! از سایت خوبتون ممنونم.
خواهش میکنم.
سلام .
سپاس خیلی جالب بود.
ممنون، خواهش میکنم.