در این مقاله آموزش ساخت ربات ترافیک یا تشخیص علایم راهنمایی رانندگی با کمک openCV رو باهم برسی میکنم.

در ابتدا لیستی از لوازم مورد نیاز به همراه لینک تهیه آنها را ذکر میکنیم:

۱.رزپری پای (مدل بی ۳ پلاس)

تصویر رزبری

۲. ال سی دی ۱۶ در ۲  با ماژول ای تو سی(۱۶×۲ i2c LCD)

تصویر ال سی دی

۳.برد بورد

تصویر برد بورد

۴.ماژول رله تک کانال (می توانید از درایور موتور  L298N یا L298D هم استفاده کنید)

تصویر رله

۵.سرو موتور (دو عدد)

تصویر سروو

۶.گیربکس دو طرفه با موتور به همراه چرخ رباتیک (محصول پیشنهادی)

تصویر گیربکس

۷.اتصالات رباتیک (شاسی ۴ عدد٬ شاسی لبه دار ۲ عدد٬ المان ۱۲ حفره ای ۶ عدد)

توصیر شاسیتصویر شاسی لبه دار

تصویر المان

۷.وب کم

۸. کابل جامپر

مشخصات فوق برای این ربات میباشد و میتوانید با خلاقیت خود قطعات را تغییر دهید و هیچ الزامی جهت تهیه وسایل مورد نیاز خود از فروشگاه اینترنتی ذکر شده ندارید اما برخی از قطعات این ربات از فروشگاه لینک داده شده تهیه شده است.

 

مرحل اول: نصب رزبین روی رزبری پای

برای نصب رزبرین لازم است طبق داکیومنت سایت رزبری پیش برید که با این لینک میتوانید به آن مراجعه کنید.

مرحله دوم: نصب پیش نیازهای روی رزبری

در این مرحله پس از نصب رزبین و بالا امدن رزبری پای باید از منوی بالایی گزینه ترمینال را انتخاب کنید

 تصویر باز کردن ترمینال

در ابتدای راه اندازی سیستم لازم است اپدیت سیستم عامل صورت بگیر که با دستورات زیر امکان پذیر است (در دستور را پس از تمام شدن دستور بعدی وارد ترمینال کنید)

sudo apt-get update $
sudo apt-get update $

اگر از نسخه قدیمی رزبین استفاده میکنید بهتر است تا با دستور زیر به ورژن جدیدتر مهاجرت کنید

sudo apt-get dist-upgrade $

لازم است در مرحله در صورت مطرح شدن اجازه برای نصب پکیج ها با زدن دکمه “y” و سپس اینتر را بزنید.

در برنامه نوشه برای ربات از پایتون ورژن ۳.۸ آن استفاده و رزبین به صورت پیش فرض ورژن از ورژن ۲.۸ آن استفاده میکند لذا لازم است برای ران کردن اسکریپت های خود (اسکریپت یعنی قطعه کد) یا نصب کیج پایتون با استفاده از پیپ در اخر دستورات از عدد “۳” استفاده کنیم خوب حالا میبایستی پکیج های لازم برای برنامه را نصب کنیم:

۱.openCV

sudo apt install python3-opencv $

اگر مایل به نصب پکیج از طریق سورس openCV هستید میتوانید جزیات و فرایند آن را در این لینک برسی کنید.

۲.numpy

لازم است اگر از قبل این پکیج را با استفاده از پیپ نصب کرده اید آن را حذف کنید پس ابتدا این دستور را در ترمینال بزنید:

pip3 uninstall numpy $

بعد میبایستی که نامپای را با این دستور نصب کنید:

sudo apt-get install python3-numpy $

ممکن است در فرایند نصب اروری شامل کد “۴۰۳” بگیرید که به علت تحریم های اینترنی رخ میدهد و در انتهای مقاله این مسله را برسی خواهیم کرد

۳.پکیج i2c LCD برای نصب این پکیج میتوانید میبایستی این ریپوزیتوری را کلون کنید (به صورت پیشفرض گیت روی رزبین نصب شده است) ابتدا وارد دایرکتوری دسکتاپ بشوید:

cd Desktop $

سپس دستور زیر را بزنید (اگر ترمینال را ببندید لازم است که بعد از باز کزدن آن در این مرحله دوباره دستور بالا را بزنید)

git clone https://github.com/the-raspberry-pi-guy/lcd.git $

بعد از تمام شدن دستور زیر را وارد کنید:

ls $

و خرجی آن شامل اسم فولدر “lcd-master” میباشد که میبایستی وارد آن شوید:

cd lcd-master $

سپس دستور زیر را وارد کنید و مطمین شوید که ب شما خروجی ای شامل فایل “install.sh” را نشان میدهد:

ls -l $

سپس آن را با دستور زیر نصب کنید:

sudo sh install.sh $

بعد از تمام شدن نصب میبایستی سیستم خور را ریبوت کنید و با استفاده ترمینال آدرس i2c خود را پیدا کنید٬ پس ترمینال را باز کنید و دستور زیر را بزنید اگر خرجی ای نگرفتید باید از دستور دوم استفاده کنید(تنها یکی از دستور های زیر به شما خروجی مطلوب خواهد داد):

دستور اول:

i2cdetect -y 1 $

دستور دوم:

i2cdetect -y 0 $

که این خروجی را مشاهده خواهید کرد (در اینجا آدرس “۶۲” است اما معمولا “۲۷” میباشد):

تصویر خروجی ای تو سی

و اگر ال سی دی را دقیقا منطبق این دستور به برد رزبری متصل نکرده باشید این خروجی را خواهید گرفت:

ای تو سی با ارور

پس برای اتصال صحیح ال سی دی با ای تو سی میبایست طبق این عکس عمل کنید:

سیم کشی ای تو سی

 

GND)Pin 39 or Pin 9) GND
۵V)Pin 2) VCC
SDA)Pin 3/GPIO 2) SDA
SCL)Pin 5/GPIO 3) SCL

بعد از متصل کردن و چک کردن دوباره اتصالات دوباره دستور مربوط به بخش ای توی سی را بزنید تا خروجی مطلوب را دریافت کنید و مطابق عکس ای دی ای تونی را باز کنید:

تونی

سپس گزینه “load” را از بالای ide انتخاب کنید و فایل  “lcd-master” را که دانلود کردیم و در دسکتاپ گذاشتیم را باز کنید و از داخل ان روی فایل “lcddriver.py” دابل کلیک کنید تا با تونی باز شود و سپس چک کنید که خط “۱۹” فایل که شامل این خط کد است:

ADDRESS = 0X62

را مشاهده میکند که عدد اخر سمت راست میبایست عددی باشد که خروجی ترمینا به ما در این مرحله داده است (اینجا “۶۲” بود) که باید با عددی که ترمینال خودتان به شما داده است جایگزینش کنید.

سپس با تونی دوباره گزینه “load” را از بالای صفحه بزنید تا فایل “demo_lcd.py” را از مسیر “lcd-master” باز کنید و با دکمه سبز بالای صفحه آن را اجرا کنید. اگر اروری را مشاهده نکردید ولی تصویری روی ال سی دی نبود میبایست با پتاسیومتر پشت ماژول i2c تغییر ایجاد کنید تا کنتراست مورد نیاز ایجاد شود:

ای تو سی

قبل از اینکه به سراغ متصل کردن سرو موتور ها و رله برسیم میبایست این دستور را در ترمینال خود بزنید تا پایه های رزبری را بر اساس “GPIO” ببینید:

pinout $

و خروجی زیر را دریافت کنید:

خروجی pinout

برای صرفه جویی در سیم کشی خروجی “vcc 5V” رزبری را که در شکل بالا پین دو میشود را به شاسی ها (نه شاسی های لبه دار چرا که میخواهیم ناحیه های اطراف رزبری نارسنا بماند تا از مانع از اسیب دیدن رزبری به خاطر اتصالی شویم) متصل میکنیم:

سیم متصل به پیچ را به یکی از دو پایه ۵ ولت رزبری متصل میکنیم

 

قسمت برق دار ربات

قمست های قرمز رسنا و دارای ولتاژ ۵ ولت هیتند و قسمت های آبی نارسنا و خنثی هستند

سپس “vcc” رله را به بدنه متصل کرده و “gnd” ان را به یکی از ردیف های دلخواه برد بورد متصل میکنیم و پایه سیگنال “in” را به پایه “GPIO 17” متصل میکنیم سپس کابل قرمز رنگ دو سرو موتور را به بدنه متصل میکنیم و کابل قهوه ای رنگ دو موتور را به همان ردیفی که “gnd” رله را متصل کردیم٬ وصل میکنیم و این ردیف را مستقیما با یک جامپر به یکی از پین های “and” رزبری متصل میکنیم سپس برای اینکه بتوانیم با رله خاموش یا روشن شدن دو موتور را کنترل کنیم سیمی را به سه سیسم به خروجی های رله متصل میکنیم که سیم وسطی را به منبع تغذیه و دو سیم باقی مانده را به یکی از پایه های کدام از موتور ها متصل میکنیم و پایه باقی مانده هر کدام از موتور ها را به پایه باقی مانده منبق تغذیه متصل میکنیم در سرو موتو ها هنوز یک پین خالی است که ان دو بار باهم به پین “GPIO 5” رزبری متصل میکنیم تا باهم کنترل شوند.

در مرحله بعدی کد ها را برسی خواهیم کرد

مرحله سوم: برنامه نویسی

کدهای این پروژه را در این ریپوزیتوری گرد آوری کردیم که میتوانید آن را با دستور زیر کلون کنید (مانند دستورات بالا ابتدا از طریق ترمینال وارد دایرکتوری دسکتاپ شوید):

git clone https://gitlab.com/MohammadMojtabaRoshani-TOMaaR/traffic-bot.git $

سپس از ترمینال وارد فولدر “traffic-bot” شوید و اگر وب کم خورد را با کابل usb متصل کرده باشد میتوانید با تونی فایل “road-sign-recognition.py” باز کنید و آن را ران کنید.

فایل موجود در ریپوزیتوری به طور کامل کامنت گزاری شده است و کاملا گویا میباشد تنها در اول config لازم برای اتصالات انجام شده است و تابعی به نام “SetAngle” برای تعیین زاویه سرو ها ساخته شده است که هر کجا نیاز به تغییر جهت ربات باشد این تابع صدا زده میشود و مقدار زاویه ای که برای تغییر جهت نیاز است به عنوان ورودی به آن داده میشود:

def SetAngle(angle):
    duty = angle / ۱۸ + ۲
    GPIO.output(wheel, True)
    pwm.ChangeDutyCycle(duty)
    sleep(۱) 
    GPIO.output(wheel, False)
    pwm.ChangeDutyCycle(۰)

در کد بالا مقداری که به تابع sleep پاس داده شده مقدار زمان مورد نیاز برای چرخش سرو ها است.

بعد از ران شده فایل مذکور در پنجره ای ای که جدید باز میشود اگر تابلویی شناخته شود به این شکل میباشد:

تست

و در ال سی دی هم نام تابلو شناسایی شده نوشته میشود:

در صورتی که تابلوهایی از لیست زیر به ربات نشان داده شود تشخیص داده میشود

علایم

البته سعی شده جهت تشخیص بهتر به جای تابلوی راست و چپ از تابلو های ساده تری استفاده شود که در ویدیویی از عملکرد ربات گذاشته میشود که در آن مشخص است.

مرحله چهارم : مکانیک

این مرحله کاملا متناسب با نیاز شما ساخنه میشود اما تصاویری از نحوه ساخت آن در اینجا قرار داده میشود.