เซอร์โวมอเตอร์ (Servo Motor) เป็นการรวมมอเตอร์ไฟฟ้ากระแสตรง (DC Motor) เข้ากับวงจรควบคุม โดยความแตกต่างที่สำคัญของเซอร์โวมอเตอร์กับมอเตอร์แบบอื่น ๆ คือเซอร์โวมอเตอร์จะรู้ตำแหน่งที่ตัวเองอยู่ และสั่งเปลี่ยนตำแหน่งโดยการเปลี่ยนองศาได้
เซอร์โวมอเตอร์(ส่วนใหญ่)ใช้แรงดันไฟฟ้า 5V และมีองศาการหมุนที่ 0 ถึงประมาณ 200 องศา (ยกเว้นมีการดัดแปลงให้หมุน 360 องศา) นอกจาก 2 ข้อนี้ที่เซอร์โวมอเตอร์ทุกรุ่นมีเหมือนกัน ยังมีอีก 4 ข้อที่เซอร์โวมอเตอร์แต่ละรุ่นมีไม่เหมือนกัน
แรงบิด (Torque) - เป็นเลขบอกกำลังของเซอร์โวมอเตอร์ ยิ่งตัวเลขนี้มีค่ามาก แสดงว่าเซอร์โวมอเตอร์มีแรงมาก
ความเร็วในการหมุน (Speed) - เป็นตัวเลขที่บอกว่าเซอร์โวมอเตอร์สามารถเปลี่ยนตำแหน่งได้เร็วแค่ไหน ยิ่งตัวเลขมีค่ามาก แสดงว่าเซอร์โวมอเตอร์มีความเร็วในการเปลี่ยนตำแหน่งที่เร็วมาก
วัสดุที่ใช้ทำแกนหมุน - วัสดุที่ใช้ทำแกนหมุนของเซอร์โวมอเตอร์มี 2 ชนิด คือ พลาสติก และเหล็ก สำหรับแกนหมุนพลาสติกเมื่อใช้งานเซอร์โวมอเตอร์อย่างหนักเป็นเวลานาน จะทำให้เฟืองของเซอร์โวมอเตอร์ครูด ดังนั้นหากนำเซอร์โวมอเตอร์ไปใช้งานหนักเป็นเวลานาน จึงควรเลือกแกนเหล็ก เพราะแกนเหล็กมีโอกาศที่เฟืองครูดได้น้อยกว่า
ขนาดของแกนหมุน - เซอร์โวมอเตอร์แต่ละรุ่นจะมีขนาดของแกนหมุนที่แตกต่างกัน ตามแรงบิดของเซอร์โวมอเตอร์แต่ละรุ่น
ปัจจัยทั้ง 4 นี้ จะแปรผันตรงกับราคาของเซอร์โวมอเตอร์
ตัวอย่างข้อมูลใน Datasheet ของเซอร์โวมอเตอร์รุ่น SG90 ตาราง Dimensions & Specifications แสดงข้อมูลแรงบิด (Torque) และความเร็วในการหมุน (Speed) ของเซอร์โวมอเตอร์รุ่น SG90
เซอร์โวมอเตอร์ประกอบด้วย 4 ส่วนหลัก คือ มอเตอร์กระแสตรง (DC Motor) ชุดเฟืองทดรอบ (Gear system) วอลุ่ม (Potentiometer หรือ VR) และวงจรควบคุม (Control Electronics)
หลักการทำงานของเซอร์โวมอเตอร์เริ่มที่วงจรควบคุม เมื่อวงจรควบคุมได้รับข้อมูลองศาที่ต้องการมาแล้ว วงจรควบคุมจะคำนวณว่ามอเตอร์จะต้องหมุนในทิศทางตามเข็มนาฬิกา หรือทวนเข็มนาฬิกา เพื่อให้ไปสู่องศาที่ต้องการได้ เมื่อมอเตอร์เริ่มหมุน ตัววอลุ่มที่ติดอยู่กับชุดเฟืองมอเตอร์จะตรวจสอบตำแหน่งที่มอเตอร์หมุนไป โดยหากวอลุ่มตรวจพบว่าตำแหน่งที่มอเตอร์หมุนเริ่มใกล้กับองศาที่ผู้ใช้กำหนด วงจรส่วนควบคุมจะเริ่มสั่งให้มอเตอร์หมุนช้าลงเพื่อให้หมุนเข้าใกล้องศาที่กำหนดได้มากที่สุด เมื่อมอเตอร์หมุนได้ตำแหน่งองศาที่ถูกต้องแล้ว วงจรส่วนควบคุมจะตรวจสอบตำแหน่งของมอเตอร์เป็นระยะ ๆ โดยอ่านค่าจากวอลุ่ม หากตรวจพบว่าตำแหน่งผิดเพี้ยนไปจากค่าที่ตั้งไว้ (อันอาจเกิดจากผู้ใช้เอามือไปหมุนเล่น หรือภาระส่งผลให้ตำแหน่งเคลื่อน) วงจรควบคุมก็จะสั่งให้มอเตอร์หมุนกลับมาให้ได้ตำแหน่งเป็นระยะ ๆ
เซอร์โวมอเตอร์แบ่งออกเป็น 2 ชนิด ดังนี้
เป็นเซอร์โวมอเตอร์ที่นิยมใช้งานทั่วไป มีหลายรุ่น หลายขนาด และหลายราคา สามารถควบคุมให้หมุดได้ตามองศาที่ต้องการ โดยหมุนได้ 0 ถึง 180 องศา (ในบางรุ่นหมุนได้สุดที่ประมาณ 200 องศา)
เป็นเซอร์โวมอเตอร์ที่ส่วนใหญ่ดัดแปลงมาจากแบบ 180 องศา โดยดัดแปลงวงจรควบคุม และตัดแกนหรือนำเอาวอลุ่มออก เพื่อให้เซอร์โวมอเตอร์สามารถหมุนได้ครบรอบ เซอร์โวมอเตอร์ชนิดนี้ไม่สามารถควบคุมองศาได้ ควบคุมได้แค่ความเร็ว และทิศทางการหมุนเท่านั้น นิยมนำมาใช้เป็นมอเตอร์สำหรับรถบังคับ รถวิ่งตามเส้น เพราะอาศัยชุดเฟืองที่เซอร์โวมอเตอร์มีอยู่แล้ว ทำให้ได้แรงบิดที่มากกว่ามอเตอร์กระแสตรงปกติ รวมทั้งการควบคุมยังไม่ต้องใช้วงจรขับมอเตอร์แยก ทำให้ลดความยุ่งยากในการต่อวงจรไปได้มาก รวมทั้งประหยัดค่าใช้จ่ายด้วย
เซอร์โวมอเตอร์ชื่อรุ่นเดียวกัน แต่อาจจะมีทั้งชนิด 180 องศา และ 360 องศา จำเป็นต้องใช้ความระมัดระวังอย่างมากในการเลือกซื้อ
เซอร์โวมอเตอร์มีสาย 3 เส้น ประกอบด้วย
Signal (สีส้ม หรือ สีขาว) - สายสัญญาณควบคุมการหมุนแบบ PWM
VCC (สีแดง) - สายสำหรับจ่ายไฟบวก 5V
GND (สีน้ำตาล หรือ สีดำ) - สายสำหรับจ่ายไฟลบ หรือกราว์ด (GND)
การควบคุมการหมุนของเซอร์โวมอเตอร์จะทำที่สาย Signal โดยป้อนสัญญาณ PWM ความถี่ 50Hz เข้าไป โดยมีความกว้างพัสล์บวกที่ 0.5mS (ค่าต่ำสุด) ถึง 2.5mS (ค่าสูงสุด) หรือ 1mS (ค่าต่ำสุด) ถึง 2mS (ค่าสูงสุด) ตามแต่รุ่นของเซอร์โวมอเตอร์ โดยหากป้อนสัญญาณ PWM ที่มีความกว้างช่วงบวกเข้าไปเท่าค่าต่ำสุด เซอร์โวมอเตอร์จะหมุนไปที่ 0 องศา หากป้อนสัญญาณ PWM เข้าไปเท่าค่าสูงสุด เซอร์โวมอเตอร์จะหมุนไปที่ 180 องศา
การหาค่าความกว้างช่วงบวกของสัญญาณ PWM จากค่าองศา สามารถหาได้จากสูตร
หากต้องการให้ Servo มอเตอร์ที่ทำงาน 0.5mS - 2.5mS หมุนไปที่ 120 องศา ความกว้างพัสล์บวกจะเป็นเท่าใด
สัญญาณ PWM เกิดจากพัสล์บวกและพัสล์ลบ การหาความกว้างพัสล์ลบต้องหาคาบเวลาของสัญญาณก่อน และคาบเวลาของสัญญาณหาได้จากความถี่ โดยใช้สูตร
เมื่อ
T หมายถึง คาบเวลาของสัญญาณ
f หมายถึง ความถี่
เนื่องจากเซอร์โวมอเตอร์ทำงานด้วยสัญญาณ PWM ความถี่ 50Hz ดังนั้นคาบเวลาของสัญญาณจึงหาได้ดังนี้
จึงสรุปได้ว่าที่ความถี่ 50Hz มีคาบเวลาของสัญญาณเป็น 20mS
คาบเวลาของสัญญาณเกิดจากการนำความกว้างพัสล์บวกมาบวกกับความกว้างพัสล์ลบ (T=t1+t2) ดังนั้นหากรู้กว้างพัสล์บวก และรู้คาบเวลาของสัญญาณ ก็จะหาความกว้างพัสล์ลบได้ จากสูตร
เมื่อ
T หมายถึง ความกว้างคลื่น
t1 หมายถึง ความกว้างพัสล์บวก
t2 หมายถึง ความกว้างพัสล์ลบ
เมื่อแทนค่าความกว้างคลื่นและความกว้างพัสล์บวกลงไป จะได้
จึงสรุปว่า ความกว้างพัสล์ลบมีค่า 18.167mS
ต่อเซอร์โวมอเตอร์เข้ากับบอร์ด Arduino Uno R3 ดังนี้ ตัวอย่างใช้เซอร์โวมอเตอร์รุ่น SG90
void setup() {
pinMode(9, OUTPUT); // กำหนดขา 9 เป็นเอาต์พุต
}
void loop() {
digitalWrite(9, HIGH); // สั่งให้ขา 9 เป็นลอจิก 1
delayMicroseconds(1833); // หน่วงเวลาพัสล์บวก 1833uS (1.833mS)
digitalWrite(9, LOW); // สั่งให้ขา 9 เป็นลอจิก 0
delayMicroseconds(18167); // หน่วงเวลาพัสล์ลบ 18167uS (18.167mS)
}
แต่การสั่งงานเซอร์โวมอเตอร์โดยใช้คำสั่ง delay() มักไม่เป็นที่นิยมใช้งาน เพราะจะทำให้การพัฒนาโปรแกรมต่อทำได้ยาก ดังนั้นการสั่งงานเซอร์โวจึงมักใช้วงจรส่วน Timer ที่มีอยู่ในไมโครคอนโทรลเลอร์ทุกเบอร์อยู่แล้วมาสั่งงานแทน
สำหรับแพลตฟอร์ม Arduino ไม่จำเป็นต้องเขียนโปรแกรมสั่งงาน Timer เอง เนื่องจากแพลตฟอร์มมีไลบารี่ Servo ให้อยู่แล้ว ทำมาเพื่อให้การเขียนโปรแกรมสั่งงานเซอร์โวมอเตอร์ในแพลตฟอร์ม Arduino ทำได้ง่ายมากขึ้น โค้ดโปรแกรมตัวอย่างการใช้งานไลบารี่ Servo ดังโค้ดด้านล่าง
#include <Servo.h> // เรียกใช้ไลบารี่ Servo.h
Servo myservo; // สร้างออปเจค myservo จากคลาส Servo
void setup() {
myservo.attach(9); // กำหนดต่อเซอร์โวไว้ที่ขา 9
}
void loop() {
myservo.write(0); // กำหนดให้เซอร์โวหมุนไปที่ 0 องศา
delay(2000); // หน่วงเวลา 2 วิ
myservo.write(90); // กำหนดให้เซอร์โวหมุนไปที่ 90 องศา
delay(2000); // หน่วงเวลา 2 วิ
myservo.write(180); // กำหนดให้เซอร์โวหมุนไปที่ 180 องศา
delay(2000); // หน่วงเวลา 2 วิ
}
มีคำสั่งที่น่าสนใจดังนี้
บรรทัดที่ 3 เป็นการสร้างออปเจค myservo จากคลาส Servo โดยคำสั่งนี้ 1 คำสั่ง จะใช้ควบคุมเซอร์โวมอเตอร์ได้ 1 ตัวเท่านั้น
บรรทัดที่ 6 คำสั่ง myservo.attach(); กำหนดขา Signal ของเซอร์โวมอเตอร์ต่อเข้ากับบอร์ด Arduino จากวงจรด้านบนให้ต่อขา Signal ไว้ที่ขา 9 ในบรรทัดนี้จึงใส่ 9บรรทัดที่ 10 12 และ 14 คำสั่ง myservo.write(); ใช้กำหนดองศาที่ต้องการให้เซอร์โวมอเตอร์หมุนไป
เซอร์โวมอเตอร์แบบ 360 องศา การควบคุมองศาจะเป็นการควบคุมความเร็วและทิศทางแทน โดยหาก
กำหนดองศาหมุนเป็น 90 องศา เซอร์โวมอเตอร์จะหยุดนิ่ง
กำหนดองศาหมุนเป็น 89 ถึง 0 องศา เซอร์โวมอเตอร์จะหมุนตามเข็มนาฬิกา โดยหากกำหนดให้เข้าใกล้ 0 มาก ก็จะหมุนเร็วมากที่สุด หากกำหนดให้ใกล้ 90 มาก ก็จะหมุนช้ามากที่สุด
กำหนดองศาหมุนเป็น 91 ถึง 180 องศา เซอร์โวมอเตอร์จะหมุนทวนเข็มนาฬิกา หากใกล้ 180 องศา เซอร์โวมอเตอร์จะหมุนเร็ว และหากกำหนดองศาเข้าใกล้ 90 องศา เซอร์โวอมอเตอร์ก็จะหมุนช้าที่สุด
การเขียนโปรแกรมบนแพลตฟอร์ม Arduino ของเซอร์โว 360 องศา จะเหมือนกันกับแบบ 180 องศา เพียงแต่การกำหนดองศา จะเป็นตัวกำหนดทิศทางการหมุน และความเร็วในการหมุน
ตัวอย่างโค้ดโปรแกรมควบคุมเซอร์โวมอเตอร์ 360 องศา มีดังนี้
#include <Servo.h> // เรียกใช้ไลบารี่ Servo.h
Servo myservo; // สร้างออปเจค myservo จากคลาส Servo
void setup() {
myservo.attach(9); // กำหนดต่อเซอร์โวไว้ที่ขา 9
}
void loop() {
myservo.write(0); // หมุนตามเข็มนาฬิกา
delay(2000); // หน่วงเวลา 2 วิ
myservo.write(90); // หยุดนิ่ง
delay(2000); // หน่วงเวลา 2 วิ
myservo.write(180); // หมุนทวนเข็มนาฬิกา
delay(2000); // หน่วงเวลา 2 วิ
}
เซอร์โวมอเตอร์หากกำหนดองศาที่ต้องการให้หมุนแตกต่างจากองศาที่อยู่ ณ ปัจจุบันมาก จะทำให้เซอร์โวมอเตอร์หมุนเปลี่ยนองศาเร็วมาก ใบบางงานที่ไม่ต้องการให้เซอร์โวมอเตอร์เปลี่ยนองศาด้วยความเร็ว จำเป็นต้องใช้คำสั่ง for loop เข้ามาช่วยให้การเปลี่ยงองศาของเซอร์โวมอเตอร์ช้าลง
หากองศาก่อนหน้ามีค่าน้อยกว่าองศาที่ต้องการให้เซอร์โวมอเตอร์หมุนไป ให้ใช้ for loop วิ่งค่าองศาในตัวแปร angle เป็นค่าขององศาเก่า ไปค่าองศาใหม่ ตัวอย่างโค้ดให้วิ่งจาก 40 องศา ไป 160 องศา อย่างช้า ๆ เป็นดังด้านล่าง
for (int angle=40;angle<=160;angle++) {
myservo.write(angle);
delay(10);
}
แต่หากองศาเก่ามีค่ามากกว่าองศาใหม่ เงื่อนไขในคำสั่ง for loop จะไปเปลี่ยนไป ตัวอย่างโค้ดให้วิ่งจาก 160 องศา ไป 40 องศา อย่างช้า ๆ เป็นดังด้านล่าง
for (int angle=160;angle>=40;angle--) {
myservo.write(angle);
delay(10);
}
เซอร์โวมอเตอร์เป็นอุปกรณ์ที่ใช้กระแสไฟฟ้ามาก หากใช้เซอร์โวมอเตอร์รุ่นเล็กอย่าง SG90 หรือ MG90S ไฟที่มาจากช่อง USB ของคอมฯ ยังพอจะเลี้ยงได้อยู่ แต่หากเป็นเซอร์โวมอเตอร์ที่มีขนาดใหญ่ แรงบิดสูง อย่าง Futaba S3003 หรือ MG995 จำเป็นต้องใช้แหล่งจ่ายไฟภายนอกเพิ่ม โดยอาจจะเลือกใช้อแดปเตอร์ 5V มาจ่ายไฟเลี้ยงเซอร์โวมอเตอร์เพิ่ม หรือเลือกใช้สวิตชิ่ง 5V ก็ได้เช่นกัน