บทความนี้เป็นการเขียนโปรแกรมภาษาไพธอนเพื่อขับเคลื่อนหุ่นยนต์เคลื่อนที่ด้วยล้อ โดยตัวหุ่น VisionRobo car เป็นชุดหุ่นยนต์ที่ติดตั้งการเคลื่อนที่ด้วยมอเตอร์ไฟฟ้ากระแสตรงที่ติดกับชุดเฟืองจำนวน 2 ล้อ ใช้วงจรขับมอเตอร์กระแสตรงต่อเข้ากับบอร์ด Raspberry Pi และต่อโมดูลกล้องแบบ USB WebCamera และโมดูล Ultrasonic Sensor เพื่อใช้ในการประมวลผลภาพ และคำนวณระยะห่างของตัวหุ่นยนต์กับวัตถุรอบตัว
อุปกรณ์
ตัวอย่างบทความนี้ใช้อุปกรณ์ดังนี้ครับ
- บอร์ด Raspberry Pi 3 หรือ 4
- บอร์ดขับมอเตอร์ไฟฟ้ากระแสตรง เช่น ET-DC MOTOR DRIVE KIT หรือ MX1508 เป็นต้น
- มอเตอร์ไฟฟ้าที่ติดกับชุดเฟืองจำนวน 2 ตัว
- ล้อสำหรับต่อกับมอเตอร์ไฟฟ้า
การขับมอเตอร์
การขับมอเตอร์กระทำโดยการส่งสัญญาณดิจิทัลจำนวน 2 ขาสำหรับควบคุมวิธีการทำงานของมอเตอร์ ดังตารางต่อไปนี้
GPIO#1 | GPIO#2 | มอเตอร์ |
---|---|---|
1 | 1 | หยุด |
0 | 0 | หยุด |
1 | 0 | หมุน |
0 | 1 | หมุนตรงกันข้ามกับ (1/0) |
จากตารางจะได้ว่า เมื่อต่อเข้ากับมอเตอ์ 2 ตัวจึงต้องอาศัยขา GPIO จำนวน 4 ขา โดย 2 ขาแรกคุมทิศทางการหมุนของมอเตอร์ตัวที่ 1 และอีก 2 ขาสำหรับควบคุมการหมุนของมอเตอร์ตัวที่ 2
การเชื่อมต่อกับโมดูลขับเคลื่อนมอเตอร์
จากบอร์ดโมดูลขับมอเตอร์ไฟฟ้ากระแสตรงที่มีขาสำหรับใช้งาน 6 ขา ทำการเชื่อมต่อกับบอร์ด Raspberry Pi ดังตารางต่อไปนี้
บอร์ดขับมอเตอร์ฯ | Raspberry Pi |
---|---|
Vcc | 5VDC |
GND | GND |
IN1 | GPIO17 |
IN2 | GPIO18 |
IN3 | GPIO22 |
IN4 | GPIO23 |
การต่อขาของบอร์ดขับมอเตอร์ไฟฟ้ากระแสตรงกับมอเตอร์ไฟฟ้ากระแสตรงเป็นดังนี้ครับ
บอร์ดขับมอเตอร์ฯ | มอเตอร์ไฟฟ้ากระแสตรง |
---|---|
OUT1 | มอเตอร์ซ้าย |
OUT2 | มอเตอร์ซ้าย |
OUT3 | มอเตอร์ขวา |
OUT4 | มอเตอร์ขวา |
ตัวอย่างโปรแกรม
xxx
#code26-1
from time import time
from time import monotonic
from time import sleep
import RPi.GPIO as GPIO
pinM1a = 17
pinM1b = 18
pinM2a = 22
pinM2b = 23
def init():
GPIO.setmode(GPIO.BCM)
GPIO.setup(pinM1a, GPIO.OUT)
GPIO.setup(pinM1b, GPIO.OUT)
GPIO.setup(pinM2a, GPIO.OUT)
GPIO.setup(pinM2b, GPIO.OUT)
def deinit():
GPIO.cleanup()
def stop():
GPIO.output(pinM1a, False)
GPIO.output(pinM1b, False)
GPIO.output(pinM2a, False)
GPIO.output(pinM2b, False)
def forward():
GPIO.output(pinM1a, True)
GPIO.output(pinM1b, False)
GPIO.output(pinM2a, False)
GPIO.output(pinM2b, True)
def left():
GPIO.output(pinM1a, True)
GPIO.output(pinM1b, False)
GPIO.output(pinM2a, True)
GPIO.output(pinM2b, False)
def right():
GPIO.output(pinM1a, False)
GPIO.output(pinM1b, True)
GPIO.output(pinM2a, False)
GPIO.output(pinM2b, True)
def backward():
GPIO.output(pinM1a, False)
GPIO.output(pinM1b, True)
GPIO.output(pinM2a, True)
GPIO.output(pinM2b, False)
init()
forward()
sleep(0.5)
stop()
sleep(1)
backward()
sleep(0.5)
stop()
sleep(1)
left()
sleep(0.5)
stop()
sleep(1)
right()
sleep(0.5)
stop()
sleep(1)
deinit()
สรุป
จากบทความนี้จะพบว่าเมื่อเปรียบเทียบกับหุ่นยนต์ที่ใช้การขับเคลื่อนด้วยมอเตอร์เซอร์โวพบว่า DC Motor มีความเร็วที่สูงกว่า เคลื่อนที่ได้ไวกว่า แต่อย่างไรก็ดีด้วยความเร็วที่มากกว่าทำให้ควบคุมระยะทางได้ยากกว่า โดยเฉพาะการทำงานกับเซ็นเซอร์บางประเภท หรือเขียนโปรแกรมที่ประมวลผลนานแต่มอเตอร์ยังหมุนอยู่อาจจะส่งผลให้การตอบสนองไม่ทันต่อการเคลื่อนที่ และที่สำคัญคือ ตัวหุ่น VisionRobo car ต้องการกระแสค่อนข้างมากเนื่องจากใช้บอร์ด Raspberry Pi เมื่อเทียบกับหุ่นยนต์ที่ใช้ ESP8266 ดังนั้น การออกแบบหุ่นยนต์ต้องพิจารณาถึงขนาดและน้ำหนักของแหล่งจ่ายไฟที่ต้องติดกับกับตัวหุ่นยนต์ด้วย
สุดท้ายนี้ ทีมงานเราหวังว่าบทความนี้คงเป็นประโยชน์บ้างไม่มากก็น้อยกับผู้อ่าน และขอให้สนุกกับการเขียนโปรแกรมครับ
(C) 2020, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุงเมื่อ 2020-12-16
ปรับปรุงเมื่อ 2021-09-10