จริงๆ แล้วตัว Raspberry Pi มีขาสัญญาน PWM (Pulse Width Modulation) มาให้เรา 1 ขา คือขาที่ 12 หรือ GPIO 18 ซึ่งดูจะน้อยไปหน่อยและก็ใช้งานค่อนข้างยาก แต่โลกนี้ก็ยังมีผู้ใจดีทำไลบรารีที่สามารถทำให้เจ้า Raspberry Pi ของเราสามารถมีขาสัญญาน PWM เพิ่มได้ถึง 8 ขา และการใช้งานก็แสนง่าย เจ้าไลบรารีตัวนั้นชื่อว่า ServoBlaster เดียววันนี้เราจะลองใช้เจ้านี้ควบคุมการหมุนของ Servo Motor กันดูครับ เผื่อเอาไปประยุกต์ใช้ในการควบคุมแขนกลหรือการหมุนของข้อต่อต่างๆ ได้
เริ่มจากการต่อวงจรกันก่อน โดยให้ต่อสายไฟและกราวด์ของ Servo Motor เข้ากับแหล่งจ่ายไฟภายนอกที่สามารถจ่ายไฟได้ประมาณ 3-5V แล้วแต่ขนาดของ Servo นะครับ (ผมลองต่อเข้ากับขา 5V ของ R-Pi แต่ไม่สามารถใช้งานได้ เครื่องจะ restart เวลาสั่งให้ Servo ทำงาน เข้าใจว่ากระแสไฟที่ R-Pi จ่ายให้น่าจะไม่พอ) และให้ต่อขากราวด์ของ R-Pi เข้ากับกราวด์ของแหล่งจ่ายไฟภายนอกอันนี้ด้วย จากนั้นก็เสียบขาสัญญานของ Servo เข้ากับขา GPIO 4
ต่อเสร็จแล้วได้ออกมาหน้าตาประมาณนี้ครับ (Servo ของผมตัวเล็กนิดเดียว)
จากนั้นทำการติดตั้งโปรแกรม GIT หากใครติดตั้งแล้วก็ข้ามไปขั้นตอนถัดไปเลยครับ
1 | sudo apt-get install git-core |
ทำการโคลน PiBits จาก github.com และทำการติดตั้ง
1 2 3 4 | git clone https://github.com/richardghirst/PiBits.git cd PiBits/ServoBlaster/user make sudo make install |
เมื่อติดตั้งเรียบร้อยแล้ว เราสามารถใช้ขาต่างๆ ทั้ง 8 ขาดังนี้ครับ โดย Servo หมายเลข 0 คือ GPIO 4 และไล่ไปเรื่อยจนถึง Servo หมายเลข 7 ตามตาราง
1 2 3 4 5 6 7 8 9 | Servo number GPIO number Pin in P1 header 0 4 P1-7 1 17 P1-11 2 18 P1-12 3 21/27 P1-13 4 22 P1-15 5 23 P1-16 6 24 P1-18 7 25 P1-22 |
คราวนี้มาทดสอบกันดูว่าสามารถสั่งให้ Servo หมุนได้ไหม โดยเราต้องกำหนดความกว้างของพัลส์เพื่อควบคุมให้ Servo หมุนไปยังมุมต่างๆ ตั้งแต่ 0° – 180° ซึ่งปกติก็จะอยู่ที่ในช่วง 500us – 2000us แต่ผมมักใช้ 1000us ถึง 2000us มากกว่า ซึ่งจะหมุนได้ไม่ครบ 180° แต่ก็ปลอดภัยกับเฟืองในมอเตอร์มากกว่า และถ้าเรากำหนดความกว้างของพัลส์ที่ 1500us ก็จะถือว่าหมุนมาอยู่ตรงกลาง (อันนี้ขึ้นอยู่กับสเปกของ Servo แต่ละตัวด้วยนะครับ แต่ปกติจะประมาณนี้) จากตัวอย่างเราได้ต่อขาสัญญานของ Servo ไว้ที่ขา GPIO 4 ฉะนั้นเวลาสั่ง เราก็จะสั่งไปที่ Servo หมายเลข 0 ตามตัวอย่าง
1 2 3 | echo 0=1000us > /dev/servoblaster echo 0=1500us > /dev/servoblaster echo 0=2000us > /dev/servoblaster |
เพียงเท่านี้เราก็สามารถควบคุมให้ Servo Motor หมุนในมุมต่างๆ ได้แล้วครับ อันนี้เราอาจจะเอาไปประยุกต์ใช้ในการควบคุมการหมุนของกล้องผ่านเว็บก็สามารถที่จะทำได้เช่นกัน ลองนำไปต่อยอดกันดูครับ
ทดสอบการหมุน Servo Motor ในมุมต่างๆ
ดูข้อมูลเพิ่มเติมได้ที่ : https://github.com/richardghirst/PiBits/tree/master/ServoBlaster