โครงงานทีี่ประกอบไปด้วย Raspberry PI กับ Servo Motor นับเป็นโครงงานยอดนิยม ปัจจุบันมีตัวช่วยในการควบคุมการหมุน Servo Motor โดยการต่อผ่าน GPIO pins ของ Raspberry PI อยู่หลายตัว เช่น RPi.GPIO[1], Occidentalis V0.2 [2], WiringPi [3], RPIO [4], ฯล ในบทความนี้ผมจะกล่าวถึงตัวหนึ่งที่ใช้งานได้ดีไม่น้อยไปกว่าตัวอื่นคือ ServoBlaster จาก PiBits [5] ครับ
ในชีวิตประจำวันของเราจะได้พบกับการใช้ประโยชน์จาก Motor ไฟฟ้ามากมาย เช่น ปั็มนำ้ พัดลม เครื่องปรับอากาศ เครื่องปั่นนำ้ผลไม้ บันไดเลื่อน รถไฟฟ้า ฯลฯ และ Servo Motor ก็คือ Motor ชนิดหนึ่งแต่มีส่วนที่เพิ่มเติมคือ
ภาพข้างล่างแสดงองค์ประกอบของ Servo Motor ขนาดเล็กที่ใช้ไฟฟ้าขนาด 4.5 - 6.0 V (บางท่านอาจเรียกว่า Hobbyist Servo) ซึ่งนิยมนำมาใช้ทำโครงงานร่วมกับ Raspberry Pi
การควบคุม Servo Motor จะต้องอาศัยสิ่งที่เรียกว่า Pulse หรือสัญญาณไฟฟ้าในรูปแบบของระดับศักย์ทางไฟฟ้า 0,1 โดย 0 หมายถึงไม่มีศักย์ไฟฟ้าและ 1 หมายถึงศักย์ของแบตเตอร์รี่
การควบคุมการหมุนก็คือการควบคุมรูปแบบของสัญญาณนี้ด้วยคอมพิวเตอร์หรือ Raspberry PI นั้นเอง (รายละเอียดเพิ่มเติ่ม [7][8][9]
ServoBlaster เป็นผลงานของ Richard Ghirst เขียนขึ้นด้วยภาษา C สำหรับใช้งานบน Raspberry PI โดยเฉพาะ ออกแบบมาให้ใช้งานได้กับ Servo Motor 8 ตัวพร้อมกัน มีความแม่นยำสูงเพราะใช้ Hardware PWM ใช้งานง่ายมากใช้เวลาทำความเข้าใจสั้น ๆ ถึงแม้จะเขียนด้วยภาษา C แต่เราก็สามารถสร้างโปรแกรมภาษา Python มาทำงานร่วมได้ครับ
1. ดาวน์โหลด source code
จะได้ folder ชื่อ PiBits มา
2. คอมไพล์ source code
ท่านจะเห็นไฟล์ servod.c อยู่
รอจนการคอมไพล์สิ้นสุด ท่านจะได้ไฟล์ servod ซึ่งเป็น executable file ครับ จากนั้นก็ทำสำเนา servod ไปไว้ในที่เราจะเรียกใช้งานได้ง่าย เช่น /usr/local/bin เป็นต้น (จะไม่ทำก็ได้นะ แต่เวลาเรียกใช้งานก็ต้องอ้าง path ให้ถูกต้อง)
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 ทำงานแบบ daemon ครับ ดังนั้นเราต้องทำให้ daemon ทำงานเสียก่อน และเราต้องใช้ศักย์ของ root เพื่อให้เราสามารถเรียกใช้งานฮาร์ดแวร์ได้
$ sudo <path of> servod
ServoBlaster จะรายงานข้อมูลให้เราทราบหลายอย่าง ส่วนที่เราจะสนใจในบทความนี้คือ Servo mapping ครับ (ท่านสามารถศึกษาเพิ่มเติมจากเว็บของผู้สร้างได้โดยตรง) ผมจะยกตัวอย่างสักบรรทัดหนึ่งมาครับ เช่น
หมายถึง หากท่านต่อสายสัญญาณจาก Pin ที่ 7 ของ Raspberry PI (GPIO 4) ไปยัง Servo แล้ว Servo ตัวนั้นจะหมายถึง Server หมายเลข 0
ในขั้นตอนนี้ ServoBlaster จะสร้าง device ขึ้นมาชื่อ servoblaster เราสามารถตรวจสอบได้โดยใช้คำสั่ง ls /dev/servo* และ device นี้เองที่เราจะใช้ส่งคำสั่งควบคุมไปยัง Servo ครับ
หลังจากต่อสายกันเรียบร้อยแล้ว ที่นี้ลองมาสั่งให้ Servo หมุนไป 50% หรือ 90 องศากัน ครับ โดยใช้รูปแบบคำสั่ง
ในกรณีของผมคือ ต่อ Servo กับ Pin 12 ซึ่งหมายถึง Servo Number 2 ก็จะได้
เมื่อต้องการเลิกใช้งานก็เพียงเรียกใช้คำสั่ง
$ sudo killall servod
ตัวอย่างวิดีโอที่ใช้ Servo พร้อมกัน 3 ตัว
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 ตัว
ความคิดเห็น
แสดงความคิดเห็น