جلوگیری از برخورد ربات به موانع با رزبری پای و پایتون

محتویات
سلام. پروژه عدم برخورد ربات به موانع با رزبری پای پایتون و التراسونیک را آماده کردیم.
آموزش ساخت ربات هوشمند تشخیص مانع با Raspberry Pi
در این پروژه رزبری پای ما یک ربات اتوماتیک میسازیم که به طور مستقل از کنترل کننده های خارجی مثل جوی استیک و … حرکت میکند. این ربات در مسیر خود هر بار که نزدیک یک مانع شود توقف میکند و به عقب رفته و مسیر دیگری را انتخاب میکند. در این پروژه از Raspberry Pi و موتور DC + سنسور التراسونیک استفاده شده است.
در نهایت ما یک ربات میسازیم که میتواند آزادانه حرکت کند و هرگاه مانعی را دید مسیر خود را عوض کند.
ما در مورد ربات ها پروژه های فراوانی داریم که میتوانید از قسمت موضوعات همه آن ها را ببینید.
همچنین ما این پروژه را با آردوینو و PIC هم ساخته ایم :
توضیحات سنسور التراسونیک HC-SR04
ما باید یک اطلاعات کلی نسبت به سنسور التراسونیک داشته باشیم. ما میدانیم که ارتعاش صدا نمیتواند از طریق جامدات نفوذ کند. بنابراین وقتی یک منبع صدا باعث ایجاد ارتعاش شود ، آن ارتعاش از طریق هوا با سرعت 220 متر در هر ثانیه حرکت میکند. همانطور که گفتیم این ارتعاش ها نمیتوانند از طریق جامدات نفوذ کنند ، یعنی وقتی به یک سطح مثل دیوار برخورد کنند ، با همان سرعت برمیگردند به سمت سنسور ، این تکنیک اکو (ECHO) نامگذاری شده است.

سنسور التراسونیک HC-SR04 یک سیگنال خروجی متناسب با فاصله بر اساس اکو فراهم می کند. سنسور در اینجا یک لرزش صدا را در محدوده سنسور ایجاد می کند، و بعد از فرستادن یک ارتعاش ، برای بازگشت صدا منتظر می ماند.

فرستنده یک موج التراسونیک را در فرکانس 40 هرتز ساطع می کند ، این موج از طریق هوا عبور می کند و هنگامی که یک جسم را حس می کند باز میگردد. امواج برگشتی توسط گیرنده مشاهده می شود. اکنون می دانیم زمان لازم برای بازتاب و بازگشت این موج گرفته شده است و سرعت موج التراسونیک 3400 سانتی متر در ثانیه است. با استفاده از این اطلاعات و فرمول زیر میتوان فاصله را حساب کرد [ فاصله = سرعت موج * زمان ]
ربات چگونه موانع را تشخیص میدهد ؟
هنگامی که ربات روشن می شود و شروع به کار می کند ، Raspberry Pi فاصله اشیا را در جلوی آن با استفاده از ماژول سنسور اولتراسونیک اندازه گیری می کند و در یک متغیر ذخیره می کند. سپس RPi این مقدار را با مقادیر از پیش تعریف شده مقایسه می کند و بر این اساس تصمیم می گیرد برای حرکت روبات چپ ، راست ، جلو یا عقب حرکت کند.
در این پروژه ، ما میزان فاصله خطرناک را در رزبری پای، 15 سانتی متر را انتخاب کرده ایم. هرگاه ربات فاصله ای کمتر از 15 سانتی متر از هر جسم داشته باشد، Raspberry Pi ربات را متوقف کرده و به عقب حرکت می کند و سپس آن را به چپ یا راست می چرخاند. اکنون قبل از اینکه دوباره به جلو حرکت کند، Raspberry Pi دوباره بررسی می کند که آیا مانعی در محدوده 15 سانتی متری سمت راست یا چپ وجود دارد یا خیر، اگر وجود داشته باشد ربات دوباره متوقف میشود و به عقب بر میگردد و اگر وجود نداشته باشد بعد از تغییر مسیر به راه خود ادامه میدهد.
سنسور التراسونیک امواج صوتی را به طور مداوم ارسال میکند و در صورتی که بازتاب آن را در مدت زمان کمی دریافت کند، میفهمد که به مانع نزدیک شده است و باید توقف کند. رزبری پای زمان بین ارسال و دریافت موح را بررسی میکند و سپس فاصله را محاسبه میکند. سرعت صدا حدود 340 متر بر ثانیه است. بنابراین میتوان فاصله را با استفاده از فرمول زیر محاسبه کرد.
فاصله = (زمان / 2) * سرعت صدا
سرعت صدا تقریباً 340 متر در ثانیه است.
فاصله بر حسب سانتی متر با به صورت زیر محاسبه میکنیم :
pulse_start = time.time() while GPIO.input(ECHO)==1: GPIO.output(led, False) pulse_end = time.time() pulse_duration = pulse_end - pulse_start distance = pulse_duration * 17150 distance = round(distance,2) avgDistance=avgDistance+distance
جایی که pulse_duration زمان بین ارسال و دریافت سیگنال اولتراسونیک است.
شماتیک عدم برخورد ربات به مانع رزبری پای
مدار پروژه اجتناب از برخورد ربات به مانع بسیار ساده است. همانطور که در تصویر زیر میبنید یک ماژول التراسونیک به پین های GPIO 17 و 27 رزبری پای متصل میشود. موتور درایور L293D برای کنترل موتور ها استفاده میشود و پین های 2 ، 7 ، 10 و 15 آن به پین های GPIO شماره 12 ، 16 ، 20 ، 21 Raspberry Pi متصل میشود. در این پروژه ما از دو موتور DC برای هدایت ربات استفاده کرده ایم. یک موتور به پین های خروجی 6 و 3 موتور درایور و دیگری به پین های 11 و 14 موتور درایور متصل میشود.
قطعات مورد نیاز
- رزبری پای
- ماژول سنسور التراسونیک HC-SR04
- شاسی ROBOT با پیچ کامل
- موتور DC
- موتور درایور L293D
- مقاومت 1 کیلو اهم
- خازن 100 نانو فاراد
اصلاحیه
در مدار بالا برای اتصال التراسونیک به رزبری پای از مدار تقسیم ولتاژ مانند زیر استفاده کنید. زیرا در غیر اینصورت التراسونیک 5 ولت را به رزبری پای میدهد و Raspberry pi تنها تحمل 3.3 ولت را دارد. پس در غیر اینصورت برد شما آسیب میبیند.
برنامه نویسی ربات عدم برخورد به موانع با پایتون
ما در اینجا از زبان پایتون برای برنامه استفاده می کنیم. کد کامل پروژه در انتهای صفحه در فایل دانلودی قرار داده شده است. در اینجا بعضی از قسمت های کد را بررسی میکنیم.
قسمت برنامه نویسی این پروژه نقش بسیار مهمی در انجام کلیه عملیات ها دارد. اول از همه، ما کتابخانه های مورد نیاز را فراخوانی میکنیم. متغیرها را ایجاد می کنیم و پین ها را برای سنسور اولتراسونیک ، موتور و قطعات تعریف می کنیم.
import RPi.GPIO as GPIO // کتابخانه پین های GPIO import time // کتابخانه تاخیر #Import time library GPIO.setwarnings(False) // جلوگیری از هشدار ها GPIO.setmode(GPIO.BCM) TRIG = 17 // پین تریگر التراسونیک ECHO = 27 // پین اکو التراسونیک ... ..... .... .....
سپس ما برخی از توابع را با نام های def forward(), def back(), def left(), def right() ایجاد میکنیم که برای حرکن دادن ربات استفاده میشود.
سپس در برنامه، سنسور اولتراسونیک را فعال کرده و مدت زمان بین ارسال و دریافت موج را اندازه گیری میکنیم و سپس فاصله را اندازه میگیریم.
i=0 avgDistance=0 for i in range(5): GPIO.output(TRIG, False) time.sleep(0.1) GPIO.output(TRIG, True) time.sleep(0.00001) GPIO.output(TRIG, False) while GPIO.input(ECHO)==0: GPIO.output(led, False) pulse_start = time.time() while GPIO.input(ECHO)==1: GPIO.output(led, False) pulse_end = time.time() pulse_duration = pulse_end - pulse_start distance = pulse_duration * 17150 distance = round(distance,2) avgDistance=avgDistance+distance
در آخر کدی را مینویسیم که تعیین کند اگر ربات در فاصله کم تر از 15 سانتی متری موانع بود توقف کند و به عقب برگردد.
if avgDistance < 15: // اگر فاصله کمتر از 15 بود count=count+1 // به متغیر count یک عدد اضافه میشود stop() // توقف time.sleep(1) back() // رو بهرعقب time.sleep(1.5) if (count%3 ==1) & (flag==0): right() // رو به راست flag=1 else: // اگر در سمت راست مانعی بود left() // رو به چپ flag=0 time.sleep(1.5) stop() // توقف time.sleep(1) else: // اگر مانعی نبود forward() // رو به جلو flag=0
موارد موجود در فایل : سورس کامل ، شماتیک کامل