Raspberry PI ควบคุม Servo ด้วย ServoBlaster จาก PiBits

โครงงานทีี่ประกอบไปด้วย Raspberry PI กับ Servo Motor นับเป็นโครงงานยอดนิยม  ปัจจุบันมีตัวช่วยในการควบคุมการหมุน Servo Motor โดยการต่อผ่าน GPIO pins ของ Raspberry PI อยู่หลายตัว เช่น RPi.GPIO[1], Occidentalis V0.2 [2], WiringPi [3], RPIO [4], ฯล ในบทความนี้ผมจะกล่าวถึงตัวหนึ่งที่ใช้งานได้ดีไม่น้อยไปกว่าตัวอื่นคือ ServoBlaster จาก PiBits [5] ครับ


Servo Motor

ก่อนอื่นต้องขอให้ข้อมูลของ Servo Motor นิดหนึ่ง สำหรับท่านที่ยังไม่เคยใช้งาน Servo Motor มาก่อนนะครับ

ในชีวิตประจำวันของเราจะได้พบกับการใช้ประโยชน์จาก Motor ไฟฟ้ามากมาย เช่น ปั็มนำ้ พัดลม เครื่องปรับอากาศ เครื่องปั่นนำ้ผลไม้ บันไดเลื่อน รถไฟฟ้า ฯลฯ  และ Servo Motor ก็คือ Motor ชนิดหนึ่งแต่มีส่วนที่เพิ่มเติมคือ

1. มีการติดตั้งชุดเฟืองเพื่อให้สามารถกำหนดมุมของการหมุน และเพิ่มแรงบิด
2. มีการติดตั้งวงจร position encoder [6]  เพื่อให้รับทราบขนาดของมุมและทิศทางของการหมุน
3. องศาการหมุนของ Servo Motor จะหมุนได้เพียง 0 - 180 องศาเท่านั้น ในขณะที่ Motor จะหมุนได้ 360 องศา

ภาพข้างล่างแสดงองค์ประกอบของ Servo Motor ขนาดเล็กที่ใช้ไฟฟ้าขนาด 4.5  - 6.0 V  (บางท่านอาจเรียกว่า Hobbyist Servo)  ซึ่งนิยมนำมาใช้ทำโครงงานร่วมกับ Raspberry Pi


ภาพจาก http://en.wikipedia.org/wiki/Servo_%28radio_control%29

การควบคุม Servo Motor จะต้องอาศัยสิ่งที่เรียกว่า Pulse หรือสัญญาณไฟฟ้าในรูปแบบของระดับศักย์ทางไฟฟ้า 0,1 โดย 0 หมายถึงไม่มีศักย์ไฟฟ้าและ 1 หมายถึงศักย์ของแบตเตอร์รี่

ภาพจาก http://en.wikipedia.org/wiki/Servo_control


การควบคุมการหมุนก็คือการควบคุมรูปแบบของสัญญาณนี้ด้วยคอมพิวเตอร์หรือ Raspberry PI นั้นเอง (รายละเอียดเพิ่มเติ่ม [7][8][9]


ติดตั้ง ServoBlaster จาก PiBits  ให้กับ Raspberry PI

(https://github.com/richardghirst/PiBits/tree/master/ServoBlaster)

ServoBlaster เป็นผลงานของ Richard Ghirst เขียนขึ้นด้วยภาษา C สำหรับใช้งานบน Raspberry PI โดยเฉพาะ ออกแบบมาให้ใช้งานได้กับ Servo Motor 8 ตัวพร้อมกัน มีความแม่นยำสูงเพราะใช้ Hardware PWM  ใช้งานง่ายมากใช้เวลาทำความเข้าใจสั้น ๆ ถึงแม้จะเขียนด้วยภาษา C แต่เราก็สามารถสร้างโปรแกรมภาษา Python มาทำงานร่วมได้ครับ

ขั้นตอนการติดตั้ง


1. ดาวน์โหลด source code

$ git clone https://github.com/richardghirst/PiBits.git

จะได้ folder ชื่อ PiBits มา

2. คอมไพล์ source code

$ cd PiBits/ServoBlaster/user

ท่านจะเห็นไฟล์ servod.c อยู่

$ make servod

รอจนการคอมไพล์สิ้นสุด ท่านจะได้ไฟล์ servod ซึ่งเป็น executable file ครับ จากนั้นก็ทำสำเนา servod ไปไว้ในที่เราจะเรียกใช้งานได้ง่าย เช่น /usr/local/bin เป็นต้น (จะไม่ทำก็ได้นะ แต่เวลาเรียกใช้งานก็ต้องอ้าง path ให้ถูกต้อง)




การเชื่อมต่อระหว่าง Raspberry PI  กับ Servo Motor


Servo Motor ที่นิยมกันมักจะใช้ไฟฟ้าขนาด 5V มีสายสัญญาณ 3 สาย สำหรับ

1. ไฟฟ้าขนาด 5V (มักมีสีแดงหรือใกล้เคียงสีแดง)
2. สายสัญญาณ คอยรับสัญญาณจาก Computer หรือ Raspberry PI (เป็นสีอื่น เช่น ขาว เขียว เหลือง ฯล)
3. Ground (มักมีสีคล้ำหรือดำ)

จาก รูปข้างล่างผมต่อ Servo Motor เข้ากับ pin 12  (GPIO 18) ของ Raspberry PI เพื่อใช้ส่งสัญญาณควบคุมไปที่ Servo Motor ผมจะให้พลังงานแก่ Servo Motor แยกต่างหาก (ไม่ต่อสายจาก pin 2 จาก Raspberry PI)  และก็ใช้ Ground ร่วมกันระหว่าง Servo กับ Raspberry PI



ทดสอบการใช้งาน ServoBlaster


ServoBlaster ทำงานแบบ daemon ครับ ดังนั้นเราต้องทำให้ daemon ทำงานเสียก่อน และเราต้องใช้ศักย์ของ root เพื่อให้เราสามารถเรียกใช้งานฮาร์ดแวร์ได้

$ sudo <path of> servod



ServoBlaster จะรายงานข้อมูลให้เราทราบหลายอย่าง ส่วนที่เราจะสนใจในบทความนี้คือ Servo mapping ครับ (ท่านสามารถศึกษาเพิ่มเติมจากเว็บของผู้สร้างได้โดยตรง) ผมจะยกตัวอย่างสักบรรทัดหนึ่งมาครับ เช่น

0  on P1-7       GPIO-4

หมายถึง หากท่านต่อสายสัญญาณจาก Pin ที่ 7 ของ Raspberry PI (GPIO 4) ไปยัง Servo แล้ว Servo ตัวนั้นจะหมายถึง Server หมายเลข 0

ในขั้นตอนนี้ ServoBlaster จะสร้าง device ขึ้นมาชื่อ servoblaster เราสามารถตรวจสอบได้โดยใช้คำสั่ง ls  /dev/servo* และ device นี้เองที่เราจะใช้ส่งคำสั่งควบคุมไปยัง Servo ครับ



หลังจากต่อสายกันเรียบร้อยแล้ว ที่นี้ลองมาสั่งให้ Servo หมุนไป 50% หรือ 90 องศากัน ครับ โดยใช้รูปแบบคำสั่ง

<servo number>=<servo position> > /dev/servoblaster หรือ

<pin header>-<pin number>=<servo position> > /dev/servoblaster


ในกรณีของผมคือ ต่อ Servo กับ Pin 12 ซึ่งหมายถึง Servo Number 2 ก็จะได้

$ sudo echo P1-12=50% > /dev/servoblaster  หรือ



$ sudo echo 2=50% > /dev/servoblaster   



เมื่อต้องการเลิกใช้งานก็เพียงเรียกใช้คำสั่ง

$ sudo killall servod


สร้างโปรแกรมด้วย Python

ในภาษา Python มี module ชื่อ subprocess ที่เราจะเอาใช้งานครับ โดยผมจะให้ Servo หมุนไปยังตำแหน่งที่สุ่มขึ้นมาระหว่า  0%  - 100 % (0-180 องศา)


import subprocess
import time
import random


#wake up servoblaster
subprocess.call(['sudo servod'],shell=True)

print "Ctrl-C to stop" 

try:
   while True :
      #random position
      position = random.randint(0,100)

      #create command 
      cmd = "sudo echo P1-12="+str(position)+"% > /dev/servoblaster"

      #send command to servo 
      subprocess.call([cmd],shell=True)

      time.sleep(1)

except KeyboardIntterupt :
   #cleanup 
   subprocess.call(['sudo killall servod'],shell=True) 



ตัวอย่างวิดีโอที่ใช้ Servo พร้อมกัน 3 ตัว

 

ความคิดเห็น