چگونه یک ربات شش پا بسازیم؟


این ربات ششپا از طریق برد Raspberry Pi قدرت گرفته و دارای یک حالت مستقل است که در آن به صورت خودکار، کار می کند و از موانع عبور کرده و از طریق موبایل هوشمند میتواند کنترل شود. آیا به این سیستم علاقهمند شدهاید؟ پس با ما همراه باشید.
مفهوم حرکتی ششپایان
برای درک مفهوم حرکتی ششپایان لازم است به گیف زیر توجه فرمایید:
روشهای زیادی برای نحوه راه رفتن در یک ششپا وجود دارد. در اینجا میخواهیم یک نسخه سه موتوره سروو ایجاد نمائیم که تعادل بین هزینه و کارایی وجود داشته باشد. سپس یک موتور سروو دیگر به آن اضافه شده که در "چشم" ربات نصب شده است. این ربات دارای سه حرکت مختلف از قبیل: روبه جلو، عقب، چرخش به راست و چپ است. در تصاویر زیر، نحوه تمام این حرکات را مشاهده مینمائید:
نحوه حرکتی در چرخش به چپ با راست شبیه هم بوده، فقط باید برعکس چرخش به چپ عمل نمود تا ربات شش پا بتواند به سمت راست حرکت کند. این ربات ششپا میتواند در دو حالت عمل کند: حالت اول، آزاد است که هرگونه مایل است حرکت کند. اگر در جلوی خود مانعی را ببیند، دو مرحله به عقب برگشته و سپس به سمت راست/چپ میرود. حالت دوم، به کاربر اجازه میدهد تا حرکات ربات ششپا را از طریق گوشی هوشمند خود کنترل کرده و هدایت نماید. براساس نیازمندیهای طراحی این ربات، نیاز به کنترلکنندهای داشتیم که:
- کنترل چهار سروو به طور همزمان
- خواندن ورودی از سنسور تشخیص مانع
- اتصال به شبکه برای کنترل بیسیم
وسایل موردنیاز برای طراحی:
- 3 عدد سروو موتور Tower Pro SG-5010
- 1 عدد سروو موتور میکرو Tower Pro SG-90
- 1 عدد برد Rasperry Pi (به همراه USB وایفای دانگل)
- سنسور فراصوت HC-SR04
- برد آکریلیک "3 * "9
- میلههای آلومینیومی 1/8″ * 1/2″
- پیچ و مهره
- باتریها
نحوه ساخت پاها:
در اینجا یک طرح برای پاها وجود دارد. از یک حفره 1/8″ * 1/2″ در میله آلومینیومی استفاده میکنیم. پاها باید به اندازه کافی از استحکام برخوردار باشند تا بتواند وزن خود را تحمل کند. لطفا از پایههای پلاستیکی استفاده نکنید.
اتصالات سیمکشی:
در اینجا نحوه اتصالات قطعات را میبینیم:
tilt servo - > GPIO4
right leg -> GPIO21
left leg -> GPIO6
head -> GPIO26
HC-SR04 trigger - > GPIO23
HC-SR04 echo - > GPIO24
#!/usr/bin/python
import RPi.GPIO as GPIO
import pigpio
import time
import sys
import os
import signal
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
tilt = 4
br = 21
bl = 6
trig = 23
echo = 24
head = 26
GPIO.setup(trig, GPIO.OUT)
GPIO.setup(echo, GPIO.IN)
pi = pigpio.pi()
def backward():
pi.set_servo_pulsewidth(tilt, 800)
time.sleep(0.15)
pi.set_servo_pulsewidth(bl, 800)
time.sleep(0.15)
pi.set_servo_pulsewidth(tilt, 2000)
time.sleep(0.15)
pi.set_servo_pulsewidth(br, 1800)
time.sleep(0.15)
pi.set_servo_pulsewidth(tilt, 1500)
time.sleep(0.15)
pi.set_servo_pulsewidth(bl, 1500)
time.sleep(0.15)
pi.set_servo_pulsewidth(br, 1500)
time.sleep(0.15)
return;
def forward():
pi.set_servo_pulsewidth(tilt, 800)
time.sleep(0.15)
pi.set_servo_pulsewidth(bl, 1800)
time.sleep(0.15)
pi.set_servo_pulsewidth(tilt, 2000)
time.sleep(0.15)
pi.set_servo_pulsewidth(br, 800)
time.sleep(0.15)
pi.set_servo_pulsewidth(tilt, 1500)
time.sleep(0.15)
pi.set_servo_pulsewidth(bl, 1500)
time.sleep(0.15)
pi.set_servo_pulsewidth(br, 1500)
time.sleep(0.15)
return;
def left():
pi.set_servo_pulsewidth(tilt, 800)
time.sleep(0.15)
pi.set_servo_pulsewidth(bl, 1800)
time.sleep(0.15)
pi.set_servo_pulsewidth(tilt, 2000)
time.sleep(0.15)
pi.set_servo_pulsewidth(br, 1800)
time.sleep(0.15)
pi.set_servo_pulsewidth(tilt, 1500)
time.sleep(0.15)
pi.set_servo_pulsewidth(bl, 1500)
time.sleep(0.15)
pi.set_servo_pulsewidth(br, 1500)
time.sleep(0.15)
return;
def right():
pi.set_servo_pulsewidth(tilt, 800)
time.sleep(0.15)
pi.set_servo_pulsewidth(bl, 800)
time.sleep(0.15)
pi.set_servo_pulsewidth(tilt, 2000)
time.sleep(0.15)
pi.set_servo_pulsewidth(br, 800)
time.sleep(0.15)
pi.set_servo_pulsewidth(tilt, 1500)
time.sleep(0.15)
pi.set_servo_pulsewidth(bl, 1500)
time.sleep(0.15)
pi.set_servo_pulsewidth(br, 1500)
time.sleep(0.15)
return;
def stop():
pi.set_servo_pulsewidth(tilt, 0)
time.sleep(0.15)
pi.set_servo_pulsewidth(bl, 0)
time.sleep(0.15)
pi.set_servo_pulsewidth(br, 0)
time.sleep(0.15)
return
def obstacleDetected():
backward()
backward()
backward()
backward()
backward()
right()
right()
right()
return
def turnHead():
pi.set_servo_pulsewidth(head, 700)
time.sleep(0.5)
pi.set_servo_pulsewidth(head, 2100)
time.sleep(0.5)
pi.set_servo_pulsewidth(head, 1500)
time.sleep(0.5)
return
def autoMode():
print ("Running in auto mode!")
turnHead()
time.sleep(0.5)
GPIO.output(trig, 0)
time.sleep(0.5)
GPIO.output(trig,1)
time.sleep(0.00001)
GPIO.output(trig,0)
while GPIO.input(echo) == 0:
pulse_start = time.time()
while GPIO.input(echo) == 1:
pulse_end = time.time()
pulse_duration = pulse_end - pulse_start
distance = pulse_duration * 17150
distance = round(distance, 2)
if distance > 1 and distance < 35:
obstacleDetected()
else:
forward()
forward()
forward()
pi.set_servo_pulsewidth(head, 2100)
time.sleep(0.5)
return
def manualMode():
move = str(sys.argv[2])
if move == "F" or move == "f":
print("Moving forward!")
forward()
elif move == "B" or move == "b":
print("Moving backward!")
backward()
elif move == "L" or move == "l":
print("Moving left!")
left()
elif move == "R" or move == "r":
print("Moving right!")
right()
else:
print("Invalid argument!")
return
def main():
opt = str(sys.argv[1])
if opt == "A" or opt == "a":
autoMode()
elif opt == "M" or opt == "m":
manualMode()
return
while True:
main()
GPIO.cleanup()
pi.stop()
دانلود کد پایتون برنامه:
