ساخت ربات مسیریاب با رزبری پای + کد پایتون و مدار

ساخت ربات مسیریاب

در این مطلب آموزشی می خواهیم ساخت ربات مسیریاب با استفاده از رزبری پای را بررسی کنیم. پروژه ی بسیار ساده ای که نیاز به اطلاعات شما در زمینه های مختلفی مانند برنامه نویسی پایتون، ساخت مدار الکترونیکی و کار با رزبری پای دارد.

 

آنچه نیاز خواهید داشت

  • 8 سیم جامپر ماده به ماده یا ماده به نر
  • سنسورهای مادون قرمز (خرید)
  • سیم لحیم و هویه
  • چسب برق (لنت)

 

ربات باگی

 

کانکتورها را آماده کنید

اولین قدم شما این خواهد بود که سنسورهای مادون قرمز را به ربات مسیر یاب متصل کنید. به طور معمول، نوع سنسور مادون قرمز مورد استفاده در این پروژه باید به  پایه V 3.3 متصل شود، اما شما میتوانید دو سنسور را همزمان به یک پایه پاور 5 ولت وصل کنید (به صورت موازی).

اول باید سیم ها را آماده کنید!

رزبری پای
سه تا از سیم های جامپر ماده به ماده را بردارید، رابط را از یک انتها و سپس غلاف پلاستیکی را نیز جدا کنید تا حدود یک سانتی متر از سیم چند رشته ای زیر آن نمایان شود.

 

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

 

 

 

ربات باگی
محل اتصال سیم ها را با مقدار کمی چسب برق بپوشانید. کل فرآیند را با سه جامپر ماده به ماده دیگر تکرار کنید.

سنسورهای مادون قرمز (IR) را وصل کنید

هر ماژول دارای سه پایه است: VCC برای تغذیه، GND برای زمین و DO برای خروجی دیجیتال.

رزبری پای ربات

 

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

 

سیم
سیم دوم جامپر لحیم شده را بردارید و دو سر را به پین GND در هر سنسور خط وصل کنید.

 

سیم جامپر
دو سیم جامپر باقیمانده را به پین DO در هر سنسور خط وصل کنید.

 

اکنون پایه های VCC هر دو سنسور خط را به یک پایه 5 ولتی در رزبری پای و پایه های GND سنسورها را به یک پایه GND در رزبری پای وصل کنید. هر یک از دو پایه DO را می توان به هر پایه شماره گذاری شده GPIO متصل کرد. در این مثال از پین های GPIO 17 و GPIO 27 استفاده شده است.

 

سنسورهای مادون قرمز را تست کنید

در مرحله بعد میخواهیم تست کنیم که آیا سنسورهای تشخیص خط کار می کنند یا خیر، و در انتها آنها را کمی تنظیم می کنیم.

ربات باگی
دو سوراخ کوچک در زیر ربات مسیر یاب ایجاد کنید تا سنسور بتواند خط زیر آن را مشاهده کند و همچنین سنسورها را در جای خود محکم کنید.

هنگامی که سنسورها از روی یک خط تیره رنگ عبور می کنند، LED روی ماژول باید خاموش شود.

ساخت ربات مسیریاب با رزبری پای

ربات درشکه

 

ربات مسیریاب
از پتانسیومتر کوچک روی برد برای تنظیم سنسورهای استفاده کنید، به طوری که 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- دریافت می کند، آن را به سمت عقب هدایت می کند.

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

  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/

هر سه شنبه با مقالات رزبری پای همراه توسکانیک باشید

آخرین مقالات

مقالات مرتبط