چگونه یک ربات با قابلیت تشخیص موانع بسازیم؟


یکی از مدارات مورد نیاز برای رباتیک، تشخیص موانع موجود در پیست میباشد. از طریق مدارات و سنسورهای مختلفی میتوان این کار را انجام داد که به سنسورهای اولتراسونیک، مادون قرمز و … اشاره کرد. البته باید توجه داشت در صورتی که موانع موجود در پیست شما به رنگ مشکی هست و سرعت ربات شما بالاست، بهتر است از مدارات دقیقتر و سنسور دیگری مانند اولتراسونیک استفاده کنید.
وسایل موردنیاز برای طراحی:
- برد Rasperry Pi 3
- سنسور اولتراسونیک (فراصوت)
- سنسور مادون قرمز
- کنترلر پیشران موتور L298N
- دنده موتور DC
- L7805
- باتری 12 ولت
- باتری 9 ولت
- دکمه فشاری
چگونگی نحوه طراحی:
برد Raspberry Pi با استفاده از پینهای GPIO، USB، Ethernet، HDMI، LCD و دوربین، توانایی برقراری ارتباط با دنیای بیرون را دارد. در اینجا ما از برد Raspberry Pi 3 استفاده میکنیم که یک پردازنده چهار هستهای ARMv7 64bit دارد، که دارای یک گیگابایت رم همراه با Wi-Fi و بلوتوث است.
از ماژول دامنه فراصوت HC-SR04 در این پروژه مورد استفاده قرار گرفت. این تابع اندازهگیری بدون تماس از 2 سانتیمتر تا 400 سانتیمتر را فراهم میکند؛ محدوده دقت تا 3 میلیمتر است. این ماژول شامل فرستنده، گیرنده و مدار کنترل اولتراسونیک میباشد.
سنسور مادون قرمز یک وسیله الکترونیکی است که برای تشخیص ویژگیهای خاصی از محیط اطراف خود با انتشار و یا تشخیص اشعه مادون قرمز مورد استفاده قرار میگیرد. سنسورهای مادون قرمز نیز قادر به اندازهگیری گرمائی هستند که توسط یک جسم منتشر میشوند و حرکت را تشخیص میدهند. محدوده اندازهگیری فاصله از 10 تا 80 سانتیمتر است.
ماژول پیشران L298N اجازه میدهد تا موتور DC در هر دو جهت حرکت کند. این ویژگی باعث میشود تا مجموعهای از دو موتور DC را به طور همزمان در هر جهت کنترل کند. بدین معنی که میتوانیم دو موتور DC با یک کنترلکننده موتور واحد را کنترل کنیم. L298N یک سیگنال از Raspberry Pi دریافت میکند و سیگنال نسبی را به موتورها منتقل میکند. دارای دو پین ولتاژ است، یکی از آنها برای جلب جریان برای L298N استفاده میشود و دیگری برای اعمال ولتاژ به موتور استفاده میشود. L298N سیگنال خروجی را براساس ورودی دریافت شده از میکروپروسسور سوئیچ میکند.
تنظیمکننده ولتاژ IC، ولتاژ خروجی را با یک مقدار ثابت حفظ میکند. IC 7805، مدار مجتمع رگولاتور ولتاژ (IC) یکی از اعضای سری 78xx از IC تثبیتکننده ولتاژ ثابت است که برای حفظ نوسان استفاده میشود. xx در 78xx نشاندهنده ولتاژ خروجی ثابت است که آن را فراهم میکند. منبع تغذیه کنترل شده با ولتاژ 5/8 ولتی 7805 IC را نیز فراهم میکند.
تشخیص موانع و دورشدن از آن با استفاده از دو موتور 200 دور در دقیقه و 12 ولت DC استفاده میکند. موتور استفاده شده دارای قطر شفت 6 میلیمتر با حفرههای داخلی است. سوراخ داخلی برای نصب آسان چرخ ها با استفاده از پیچ ها است. این آسان برای استفاده از موتور کم هزینه برای نرم افزار رباتیک است. دو موتور ساختگی نیز همراه با دو موتور DC در ربات استفاده می شود. موتور محرک محور محرک طراحی شده است به طوری که آن را نشان دهنده اندازه محور و شکل یک موتور واقعی است، اما یک جزء منفعل است به عنوان آن را فقط به عنوان یک حمایت برای تعمیر چرخ های غیر فعال در شاسی ربات استفاده می شود.
دیاگرام مدار
در دیاگرام مدار، خطوط جامد نشاندهنده سیمهای زنده (Vcc) هستند؛ خطوط نقطهای نشاندهنده زمین و خطوط نقطه نقطه، نشاندهنده سیمهایی هستند که از طریق آن اطلاعات از برد Raspberry Pi به محرکها منتقل میشود و بالعکس.
import curses
import RPi.GPIO as GPIO
class MotorControler(object):
def __init__(self, parent=None):
self._data = {'name': 'MOTOR', 'delay': 0.01, 'LD': 14, 'LU': 15, 'RD': 18, 'RU': 23}
self.init_pin()
def init_pin(self):
self.GPIO_LD_PIN = self._data.get('LD', -1) self.GPIO_LU_PIN = self._data.get('LU', -1)
self.GPIO_RD_PIN = self._data.get('RD', -1) self.GPIO_RU_PIN = self._data.get('RU', -1)
if self.GPIO_LD_PIN == -1 or self.GPIO_LU_PIN == -1 or self.GPIO_RD_PIN == -1 or self.GPIO_RU_PIN == -1:
print('message', 'FATAL ERROR : INVALID PIN ENCOUNTER # ' + str(self.GPIO_LD_PIN) + ', ' + + str(
self.GPIO_LU_PIN) + ', ' + + str(self.GPIO_RD_PIN) + ', ' + + str(self.GPIO_RU_PIN))
# pin setup
# set GPIO numbering mode and define output pins
GPIO.setup(self.GPIO_LD_PIN, GPIO.OUT)
GPIO.setup(self.GPIO_LU_PIN, GPIO.OUT)
GPIO.setup(self.GPIO_RD_PIN, GPIO.OUT)
GPIO.setup(self.GPIO_RU_PIN, GPIO.OUT)
time.sleep(0.5)
# warmup time self.stop()
def stop(self):
GPIO.output(self.GPIO_LD_PIN, False) GPIO.output(self.GPIO_LU_PIN, False)
GPIO.output(self.GPIO_RD_PIN, False) GPIO.output(self.GPIO_RU_PIN, False)
def step_forward(self):
GPIO.output(self.GPIO_LD_PIN, False) GPIO.output(self.GPIO_LU_PIN, True)
GPIO.output(self.GPIO_RD_PIN, False) GPIO.output(self.GPIO_RU_PIN, True) print('Move Forward')
def step_backward(self):
GPIO.output(self.GPIO_LD_PIN, True) GPIO.output(self.GPIO_LU_PIN, False)
GPIO.output(self.GPIO_RD_PIN, True) GPIO.output(self.GPIO_RU_PIN, False) print('Move Backward')
def step_right(self):
GPIO.output(self.GPIO_LD_PIN, True) GPIO.output(self.GPIO_LU_PIN, False)
GPIO.output(self.GPIO_RD_PIN, False) GPIO.output(self.GPIO_RU_PIN, True) print('Move Right')
def step_left(self):
GPIO.output(self.GPIO_LD_PIN, False) GPIO.output(self.GPIO_LU_PIN, True)
GPIO.output(self.GPIO_RD_PIN, True) GPIO.output(self.GPIO_RU_PIN, False) print('Move Left')
def move_forward(self, count=15):
for i in range(count):
self.step_forward() self.stop()
def move_backward(self, count=15):
for i in range(count):
self.step_backward() self.stop()
def move_right(self, count=15):
for i in range(count):
self.step_right() self.stop()
def move_left(self, count=15): for i in range(count):
self.step_left() self.stop()
#set GPIO numbering mode and define output pins GPIO.setmode(GPIO.BOARD)
# Get the curses window, turn off echoing of keyboard to screen, turn on # instant (no waiting) key response, and use special values for cursor keys screen = curses.initscr() curses.noecho() curses.cbreak() screen.keypad(True) motor = MotorControler() try:
while True:
char = screen.getch() if char == ord('q'):
break elif char == curses.KEY_UP:
motor.move_forward(count=15)
elif char == curses.KEY_DOWN:
motor.move_backward(count=15) elif char == curses.KEY_RIGHT: motor.move_right(count=15) elif char == curses.KEY_LEFT: motor.move_left(count=15) elif char == 10: motor.stop()
finally:
#Close down curses properly, inc turn echo back on!
curses.nocbreak(); screen.keypad(0); curses.echo()
curses.endwin()
GPIO.cleanup()
دانلود کد پایتون برنامه:
