[TH] VisionRobo Car: Drive Motor

บทความนี้เป็นการเขียนโปรแกรมภาษาไพธอนเพื่อขับเคลื่อนหุ่นยนต์เคลื่อนที่ด้วยล้อ โดยตัวหุ่น VisionRobo car เป็นชุดหุ่นยนต์ที่ติดตั้งการเคลื่อนที่ด้วยมอเตอร์ไฟฟ้ากระแสตรงที่ติดกับชุดเฟืองจำนวน 2 ล้อ ใช้วงจรขับมอเตอร์กระแสตรงต่อเข้ากับบอร์ด Raspberry Pi และต่อโมดูลกล้องแบบ USB WebCamera และโมดูล Ultrasonic Sensor เพื่อใช้ในการประมวลผลภาพ และคำนวณระยะห่างของตัวหุ่นยนต์กับวัตถุรอบตัว

ภาพพที่ 1 VisionRobo car

อุปกรณ์

ตัวอย่างบทความนี้ใช้อุปกรณ์ดังนี้ครับ

  1. บอร์ด Raspberry Pi 3 หรือ 4
  2. บอร์ดขับมอเตอร์ไฟฟ้ากระแสตรง เช่น ET-DC MOTOR DRIVE KIT หรือ MX1508 เป็นต้น
  3. มอเตอร์ไฟฟ้าที่ติดกับชุดเฟืองจำนวน 2 ตัว
  4. ล้อสำหรับต่อกับมอเตอร์ไฟฟ้า
ภาพที่ 2 บอร์ดโมดูลขับมอเตอร์ไฟฟ้ากระแสตรง MX1508
ภาพที่ 3 ชุดมอเตอร์ไฟฟ้ากระแสตรง

การขับมอเตอร์

การขับมอเตอร์กระทำโดยการส่งสัญญาณดิจิทัลจำนวน 2 ขาสำหรับควบคุมวิธีการทำงานของมอเตอร์ ดังตารางต่อไปนี้

GPIO#1GPIO#2มอเตอร์
11หยุด
00หยุด
10หมุน
01หมุนตรงกันข้ามกับ (1/0)

จากตารางจะได้ว่า เมื่อต่อเข้ากับมอเตอ์ 2 ตัวจึงต้องอาศัยขา GPIO จำนวน 4 ขา โดย 2 ขาแรกคุมทิศทางการหมุนของมอเตอร์ตัวที่ 1 และอีก 2 ขาสำหรับควบคุมการหมุนของมอเตอร์ตัวที่ 2

การเชื่อมต่อกับโมดูลขับเคลื่อนมอเตอร์

จากบอร์ดโมดูลขับมอเตอร์ไฟฟ้ากระแสตรงที่มีขาสำหรับใช้งาน 6 ขา ทำการเชื่อมต่อกับบอร์ด Raspberry Pi ดังตารางต่อไปนี้

บอร์ดขับมอเตอร์ฯRaspberry Pi
Vcc5VDC
GNDGND
IN1GPIO17
IN2GPIO18
IN3GPIO22
IN4GPIO23

การต่อขาของบอร์ดขับมอเตอร์ไฟฟ้ากระแสตรงกับมอเตอร์ไฟฟ้ากระแสตรงเป็นดังนี้ครับ

บอร์ดขับมอเตอร์ฯมอเตอร์ไฟฟ้ากระแสตรง
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