محمدصالح کامیاب
محمدصالح کامیاب
خواندن ۳ دقیقه·۲ ماه پیش

ساخت یک رادار در خانه ۲

سلام! در فرستهٔ قبل راداری ساختیم که در زاویه‌های مختلف می‌ایستاد و فاصله را اعلام می‌کرد. شاید این خیلی به درد بخور نباشد. در این فرسته رادارمان را ارتقا خواهیم داد و کاربردی‌ترش خواهیم کرد.

اگر هنوز فرستهٔ قبل را نخوانده‌اید، معطل نکنید!

ایده

اینکه رادار در هر زاویه فاصله را به ما اعلام کند خیلی حوصله سر بر است. ایده است که رادار فقط هنگام بروز مشکل صدایمان کند. برای این کار لازم است رادار فاصلهٔ مورد انتظار در هر زاویه را بداند و اگر چیزی از آن فاصله نزدیک‌تر آمد، بوق هشدار به صدا در آید.

لوازم مورد نیاز جدید

  • یک بلندگوی پیزو

شمای کلی

شمای کلی
شمای کلی

اندازه‌گیری اولیه

متغیر distance را به یک آرایهٔ ۱۹ تایی تبدیل می‌کنیم تا مقادیر اندازه‌گیری اولیه را در آن ذخیره کنیم. چون سروو از زاویهٔ ۰ تا ۱۸۰، ۱۰ درجه ۱۰ درجه می‌چرخد، در کل می‌شود ۱۹ تا. مقادیر اولیه‌اش را هم ۰ می‌گذاریم. یک متغیر جدید به نام newDistance هم تعریف می‌کنیم تا کار قبلی distance را انجام دهد!

https://gist.github.com/mskf1383/50177c4fe6ba2a5f475d4d3baa2226d1

تابع getDistance را اصلاح می‌کنیم تا فاصلهٔ اندازه گرفته شده را به جای ذخیره در متغیر، برگرداند:

https://gist.github.com/mskf1383/e76ef0ebb0cada2aac3833cf02e7b829
توجه کنید که در اولِ تابع، نوشته شده int؛ چون مقداری که برمی‌گرداند int است. قبلاً void بود. یعنی هیچ مقداری را برنمی‌گرداند.
حالا که مقدار بر می‌گرداند، باید آن را به یک متغیر نسبت بدهیم!

داخل تابع setup کدهای مربوط به چرخیدن سروو و فاصله‌سنجی اولتراسونیک را قرار می‌دهیم. این کدها فقط یک‌بار اجرا می‌شوند و نتیجهٔ فاصله‌سنجی در آرایهٔ distance ذخیره می‌شود:

https://gist.github.com/mskf1383/8ce5732c3cb18c7d84d5e0371c2ed1aa
به علامت «کوچک‌تر/مساوی» برای مقایسهٔ متغیر angle با ۱۸۰ توجه کنید. در تابع loop که علامت «کوچک‌تر» گذاشته شده، در حلقهٔ اول، از ۰ تا ۱۷۰ می‌رود و در حلقهٔ دوم، از ۱۸۰ تا ۱۰ (تمام زاویه‌ها پوشش داده می‌شود). اما اینجا فقط یه حلقه داریم و باید «کوچک‌تر/مساوی» بگذاریم تا از ۰ تا ۱۸۰ شمارش شود!

می‌توانیم آرایهٔ distance را [با مشقّت] داخل سریال چاپ کنیم تا ببینیم فاصلهٔ مورد انتظار در هر زاویه چقدر است (داخل همان تابع setup):

https://gist.github.com/mskf1383/5fbe01b8934899ff21091ebb4fc80f6d

تابع هشدار

قبل از هر چیز، پایانهٔ پیزومان را معرفی می‌کنیم (به پایانهٔ ۱۰) و در تابع setup هم آن را به عنوان خروجی تعیین می‌کنیم (برای شلوغ نشدن، فقط کدهای پیزو را گذاشته‌ام):

https://gist.github.com/mskf1383/1720f0831d92c4dad327c08a7ef7fc20

نام تابع showResault را به warn تغییر می‌دهیم؛ چون قرار است تغییر کاربری بدهد. قرار است هر بار که فراخوانی شد، علاوه بر نمایش فاصلهٔ «اشیای ناخواسته» روی نمایشگر، یک بوق هم تحویل ما بدهد! برای این که از تابع tone استفاده می‌کنیم. این تابع یک موج مربعی با بسامد مورد نظر به پایهٔ مورد نظر می‌فرستد.

https://gist.github.com/mskf1383/c4e723fcc48ae26f5a551e4791e7a673

چرخهٔ رادار

در نهایت کدهای تابع loop را اصلاح می‌کنیم تا فقط وقتی که فاصلهٔ اندازه گرفته شده از فاصلهٔ مورد انتظار کمتر بود (البته با ۵cm خطا)، تابع warn را فرابخواند.

https://gist.github.com/mskf1383/0dbdd07326702defd7c91bb81218f31d
دقت کنید که در تابع setup، سروو تا زاویهٔ ۱۸۰ چرخیده بود. به همین خاطر در اینجا از زاویهٔ ۱۸۰ شروع کردیم. اگر دوباره از زاویهٔ ۰ شروع می‌کردیم، سروو یک حرکت ۱۸۰ درجه‌ای می‌کرد تا به زاویهٔ ۰ برسد!

کد کامل

https://gist.github.com/mskf1383/dcf260b96f09312afe41d3e80a2ae3b8

نتیجه

https://www.aparat.com/video/video/embed/videohash/rbbz598/vt/frame
رادارآردوینوآموزشالکترونیک
شاید از این پست‌ها خوشتان بیاید