ساخت ربات مسیریاب
در این مطلب آموزشی می خواهیم ساخت ربات مسیریاب با استفاده از رزبری پای را بررسی کنیم. پروژه ی بسیار ساده ای که نیاز به اطلاعات شما در زمینه های مختلفی مانند برنامه نویسی پایتون، ساخت مدار الکترونیکی و کار با رزبری پای دارد.
آنچه نیاز خواهید داشت
- 8 سیم جامپر ماده به ماده یا ماده به نر
- سنسورهای مادون قرمز (خرید)
- سیم لحیم و هویه
- چسب برق (لنت)
کانکتورها را آماده کنید
اولین قدم شما این خواهد بود که سنسورهای مادون قرمز را به ربات مسیر یاب متصل کنید. به طور معمول، نوع سنسور مادون قرمز مورد استفاده در این پروژه باید به پایه V 3.3 متصل شود، اما شما میتوانید دو سنسور را همزمان به یک پایه پاور 5 ولت وصل کنید (به صورت موازی).
اول باید سیم ها را آماده کنید!
سنسورهای مادون قرمز (IR) را وصل کنید
هر ماژول دارای سه پایه است: VCC برای تغذیه، GND برای زمین و DO برای خروجی دیجیتال.
سنسورهای مادون قرمز را تست کنید
در مرحله بعد میخواهیم تست کنیم که آیا سنسورهای تشخیص خط کار می کنند یا خیر، و در انتها آنها را کمی تنظیم می کنیم.
هنگامی که سنسورها از روی یک خط تیره رنگ عبور می کنند، LED روی ماژول باید خاموش شود.
ساخت ربات مسیریاب با رزبری پای
پس از تنظیم سنسورها، می توانید به برنامه نویسی ربات مسیر یاب خود ادامه دهید.
برنامه نویسی الگوریتم دنبال کننده ی خط
نکته: در این مثال، برد کنترل کننده موتور به گونه ای وصل شده است که موتور سمت چپ روی پایه های GPIO 7 و GPIO 8 و موتور سمت راست روی پایه های GPIO 9 و GPIO 10 قرار دارد. سنسور خط چپ روی پایه GPIO 17 و سنسور خط سمت راست روی پین GPIO 27 قرار دارد.
mu را از منوی برنامه نویسی Raspberry Pi باز کنید و با تنظیم برد کنترلر موتور و سنسورها با استفاده از gpiozero شروع کنید:
from gpiozero import Robot, LineSensor
from signal import pause
from time import sleep
robot = Robot(left=(7,8), right=(9,10))
left_sensor = LineSensor(17)
right_sensor= LineSensor(27)
برای شروع، یک الگوریتم ساده بنویسید تا کار کردن ربات را آزمایش کنید. gpiozero بسته به اینکه خط شناسایی شده باشد یا نه، می تواند تابعی را فراخوانی کند. مثلا:
left_sensor.when_line = function_name_to_call
left_sensor.when_no_line = other_function_name_to_call
وقتی حسگر left_sensor تشخیص داد که ربات روی خط نیست، به ربات میگوید کاری انجام دهد. تابع مورد نظر را می توانید به صورت زیر تعریف کنید:
به ربات بگویید زمانی که خطی تشخیص داده نشد، جلو برود، اما اگر خطی شناسایی شد بچرخد.
چهار خط کد را به برنامه ربات اضافه کنید تا یک الگوریتم خط اصلی را ایجاد کنید.
توجه کنید که آیا ربات تلاش می کند روی خط بماند یا نه. در اینجا نمونه ای از یک ربات داریم که با این الگوریتم در یک مسیر اصلی اجرا می شود.
ساخت ربات مسیریاب با رزبری پای
با الگوریتم بهتری برنامه ریزی کنید
الگوریتم قبلی ممکن است خوب باشد، ولی به راحتی می توانیم آن را بهبود ببخشیم. بیایید ببینیم الگوریتم بهتر چگونه میتواند باشد؟
هنگامی که سنسور خط روی خط باشد، سیگنال خروجی 1 را نشان می دهد. هنگامی که از خط خارج شود، خروجی سیگنال 0 می دهد.
اگرچه موتورها کمی متفاوت کار می کنند ولی میتوان گفت: در ربات، هر زمان که موتور سمت راست سیگنال 1 را دریافت می کند، موتور را به جلو می راند. هنگامی که موتور سیگنال 1- دریافت می کند، آن را به سمت عقب هدایت می کند.
بیایید نگاهی به الگوریتمی بیندازیم که موقعیت ربات، حالات حسگرهای خطوط و اقدامات مورد نیاز موتورها را در نظر میگیرد.
- ربات کاملاً روی خط است و باید به جلو حرکت کند:
- هر دو سنسور خارج از خط هستند و سیگنال 0 را به خروجی می دهند.
- هر دو موتور برای حرکت به جلو باید سیگنال 1 را دریافت کنند.
2. ربات به سمت چپ حرکت کرده است و باید به راست بپیچد:
- سنسور سمت راست روی خط است و سیگنال 1 را به خروجی می دهد.
- سنسور سمت چپ از خط خارج است و سیگنال 0 را به خروجی می دهد.
- موتور سمت چپ باید به سمت عقب حرکت کند و بنابراین یک سیگنال 1- دریافت کرده است.
- موتور سمت راست باید به سمت جلو حرکت کند و به این ترتیب یک سیگنال 1 دریافت کرده است.
3. ربات به سمت راست حرکت کرده است و باید به چپ بپیچد:
- سنسور سمت راست خارج از خط است و سیگنال 0 را خروجی می دهد.
- سنسور سمت چپ روی خط است و سیگنال 1 را خروجی می دهد.
- موتور سمت چپ باید به سمت جلو حرکت کند و بنابراین سیگنال 1 را دریافت کرده است.
- موتور سمت راست باید به سمت عقب حرکت کند و بنابراین یک سیگنال 1- دریافت کرده است.
چگونه می توانید این کار را در کد انجام دهید؟ اول از همه، باید یک حلقه بی نهایت برای مشاهده مقادیر سنسور ایجاد کنید.
در یک فایل جدید، کدهای زیر را اضافه کرده و اجرا کنید. اگر از پین های مختلف GPIO استفاده کرده اید، تنظیم شماره پین ها را فراموش نکنید.
from gpiozero import Robot, LineSensor
from time import sleep
robot = Robot(left=(7,8), right=(9,10))
left_sensor = LineSensor(17)
right_sensor= LineSensor(27
whileTrue:
left_detect =int(left_sensor.value)
right_detect =int(right_sensor.value)
print(left_detect, right_detect)
حالا ربات را روی خط جلو و عقب ببرید تا ببینید چه اتفاقی می افتد.
در صوتی که تمامی کار ها درست پیش رفته باشد، باید خروجی باینری را از سنسورها مشاهده کنید.
ساخت ربات مسیریاب با رزبری پای
حال که خروجی سنسور را دارید، قبل از ارسال آن به موتورها باید کمی آن را تغییر دهید. طبق الگوریتم:
- اگر خروجی هر دو سنسور صفر باشد، هر دو موتور باید سیگنال 1 را دریافت کنند.
- اگر خروجی سنسور سمت راست 1 باشد، موتور سمت چپ باید سیگنال 1- را دریافت کند.
- اگر خروجی سنسور سمت چپ 1 باشد، موتور سمت راست باید سیگنال 1- را دریافت کند.
در حلقه while True، دو متغیر جدید به نامهای left_mot و right_mot ایجاد کنید. این متغیرها باید همان مقداری را داشته باشند که دوست دارید موتورها دریافت کنند. با این کار به سادگی می توانید مقادیر آنها را در خروجی توسط حلقه چاپ کنید.
ساخت ربات مسیریاب با رزبری پای
الگوریتم نهایی ربات تعقیب خط
اکنون که میتوانید مقادیری را که موتورها می توانند از آنها استفاده کنند در خروجی نشان دهید، وقت آن است که این مقادیر را وارد کنید.
برای شروع، حلقه while True خود را به یک مولد تبدیل کنید. یک مولد تقریبا شبیه یک تابع است، با این تفاوت که به طور مداوم اجرا می شود و فقط زمانی که از آن خواسته می شود، مقادیری را ارائه می دهد.
به این شکل میتوانید حلقه خود را به یک مولد تبدیل کنید:
def motor_speed():
whileTrue:
left_detect =int(left_sensor.value)
right_detect =int(right_sensor.value)
## Stage 1
if left_detect ==0and right_detect ==0:
left_mot =1
right_mot =1
## Stage 2
if left_detect ==0and right_detect ==1:
left_mot =–1
if left_detect ==1and right_detect ==0:
right_mot =–1
#print(r, l)
yield(right_mot, left_mot)
اکنون تنها کاری که باید انجام دهید این است که بگویید منبع مقادیر موتور ربات، نتیجه خروجی مولد خواهد بود.
در این خط کد زیر مولد اضافه کنید:
robot.source = motor_speed()
برای اطمینان از اینکه ربات برای همیشه کار نمی کند، و برای بستن تمام اتصالات اجزای سازنده، می توانید به صورت اختیاری این خطوط را نیز اضافه کنید:
sleep(60)
robot.stop()
robot.source = None
robot.close()
left_sensor.close()
right_sensor.close()
اکنون کد را اجرا کرده و ربات را روی یک مسیر آزمایش کنید.
گاهی اوقات ربات مسیر یاب بیش از حد سریع اجرا می شود، بنابراین می توانید همانطور که در اسکریپت تکمیل شده زیر نشان داده شده است، کد را کمی تغییر دهید. این ضرب کننده سرعت (speed multiplier) اضافه می شود تا سرعت روبات را کمی کندتر کند.
from gpiozero import Robot, LineSensor
from time import sleep
robot = Robot(left=(7, 8), right=(9, 10))
left_sensor = LineSensor(17)
right_sensor= LineSensor(27)
speed = 0.65
def motor_speed()
while True:
left_detect = int(left_sensor.value)
right_detect = int(right_sensor.value)
Stage 1
if left_detect == 0 and right_detect == 0:
left_mot = 1
right_mot = 1
Stage 2
if left_detect == 0 and right_detect == 1:
left_mot = –1
if left_detect == 1 and right_detect == 0:
right_mot = –1
#print(r, l)
yield (right_mot * speed, left_mot * speed)
robot.source = motor_speed()
sleep(60)
robot.stop()
robot.source = None
robot.close()
left_sensor.close()
right_sensor.close()
منبع: https://projects.raspberrypi.org/
هر سه شنبه با مقالات رزبری پای همراه توسکانیک باشید