การควบคุมเซอร์โวมอเตอร์
หลักการทำงานของเซอร์โวมอเตอร์
เซอร์โวมอเตอร์
(Servo
Motor) คือ
มอเตอร์ไฟฟ้ากระแสตรงที่มักถูกนำมาใช้ในการควบคุมมุมหรือตำแหน่งเชิงเส้นที่มีความละเอียดสูง
โดยเซอร์โวมอเตอร์จะประกอบด้วยมอเตอร์ ชุดเกียร์ และบอร์ดควบคุม
รวมไว้เป็นโมดูลเดียวกัน และจะรับสัญญาณควบคุม (signal, S) เพียง
1 เส้น ไฟเลี้ยง VCC และกราวด์ GND
อีกอย่างละ 1 เส้น รวมเป็น 3 เส้น
โดยทั่วไปเราสามารถควบคุมให้เซอร์โวมอเตอร์หมุนในทิศตามเข็มนาฬิกา (หมุนขวา) หรือ
ทวนเข็มนาฬิกา (หมุนซ้าย) ได้ โดยมีมุมในการหมุนตั้งแต่ 0 องศา ถึง 180 องศา
นั่นคือ เซอร์โวจะหมุนได้เพียง 180 องศาหรือครึ่งรอบเท่านั้น โดยมีตำแหน่งกึ่งกลางอยู่ที่
90 องศา สัญญาณ S ที่ใช้ควบคุมมอเตอร์ชนิดนี้จะเป็นสัญญาณที่มีการมอดูเลตความกว้างพัลส์
(Pulse Width Modulation, PWM) และมีระดับแรงดันแบบ
TTL ระดับแรงดัน VCC ที่จ่ายให้มอเตอร์นี้จะอยู่ในช่วงประมาณ
4 ถึง 6 โวลต์ รูปที่ 8.1(ก) แสดงภาพถ่ายของเซอร์โวมอเตอร์ขนาดเล็กทั่วไปและ
รูปที่ 8.1(ข) แสดงลักษณะภายในของเซอร์โวมอเตอร์นี้
รูปที่
8.1
ลักษณะทั่วไปและโครงสร้างภายในของเซอร์โวมอเตอร์
การทำงานของเซอร์โวมอเตอร์
เมื่อจ่ายสัญญาณพัลส์เข้ามายังเซอร์โวมอเตอร์ในส่วนวงจรควบคุมภายในจะทำการอ่านและประมวลผลค่าความกว้างของสัญญาณพัลส์ที่ส่งเข้ามาเพื่อแปลค่าเป็นตำแหน่งองศาที่ต้องการให้มอเตอร์
หมุนเคลื่อนที่ไปยังตำแหน่งนั้น แล้วส่งคำสั่งไปทำการควบคุมให้มอเตอร์
หมุนไปยังตำแหน่งที่ต้องการ โดยมีเซนเซอร์บอกตำแหน่งเป็นตัวป้อนกลับค่ามุมที่แกนหมุน
ๆ ไป
มาให้วงจรควบคุมเปรียบเทียบกับค่าอินพุตเพื่อควบคุมให้ได้ตำแหน่งที่ต้องการอย่างถูกต้องแม่นยำ
สัญญาณพัลส์สำหรับควบคุมเซอร์โวมอเตอร์
การควบคุมเซอร์โวมอเตอร์ทำได้โดยการสร้างสัญญาณพัลส์ป้อนให้กับวงจรควบคุมภายในเซอร์โวมอเตอร์ดังในรูปที่
8.2 เริ่มต้นให้สร้างพัลส์คาบเวลา 20 มิลลิวินาที (ms) แล้วปรับความกว้างของพัลส์ให้เท่ากับ
1.5 ms จะได้ว่าแกนเซอร์โวจะอยู่ที่ตำแหน่งกึ่งกลาง (90
องศา) ดังรูปที่ 8.2(ก) การหมุนในช่วงมุม 0-90 องศา จะใช้พัลส์กว้างในช่วงประมาณ
0.5-1.5 ms มอเตอร์จะหมุนไปตำแหน่งขวามือ (ตามเข็มนาฬิกา,
0 ถึง 90 องศา) ดังรูปที่ 8.2(ข)
และถ้าส่งพัลส์กว้างประมาณ 1.5-2.5 ms แกนหมุนของมอเตอร์จะหมุนไปด้านซ้ายมือ
(ทวนเข็มนาฬิกา, 90 ถึง 180 องศา)
ดังรูปที่ 8.2(ค)
การป้อนสัญญาณพัลส์ที่มีความกว้างตั้งแต่ ~0.5 ms ไปจนถึง 1.5 ms ทำให้เซอร์โวมอเตอร์หมุนทวนเข็มนาฬิกา
ซึ่งถ้าค่าความกว้างพัลส์ยิ่งต่างจากค่า 1.5 ms มากเท่าใดมุมที่เซอร์โวมอเตอร์หมุนไปก็จะมากขึ้นเท่านั้น
การป้อนสัญญาณพัลส์ที่มีคาบเวลาช่วงบวกมากกว่า 1.5 ms ถึงประมาณ 2.5 ms จะทำให้เซอร์โวมอเตอร์หมุนทวนเข็มนาฬิกา
โดยถ้าค่าความกว้างพัลส์ยิ่งห่างจาก 1.5 ms มากเท่าใดมุมที่เซอร์โวมอเตอร์หมุนไปก็จะมากขึ้นเท่านั้น
สำหรับการควบคุมความเร็วรอบในการหมุนเซอร์โวมอเตอร์นั้นเราก็สามารถทำได้โดยกำหนดขนาดของพัลส์และใช้การหน่วงเวลาประกอบ
โดยการทดลองในตอนสุดท้าย (ตอนที่ 3) จะแสดงให้เห็นถึงวิธีการทางโปรแกรมในการปรับความเร็วของเซอร์โวมอเตอร์ให้หมุนช้าลง
รูปที่
8.2
ลักษณะพัลส์ของสัญญาณที่ใช้ควบคุมและทิศทางการหมุนของเซอร์โวมอเตอร์
โดยพัลส์ที่แสดงจะควบคุมให้เซอร์โวมอเตอร์อยู่ในตำแหน่งที่ มุม (ก) 90 องศา (ข)
90-0 องศา และ (ค) 90 180 องศา
ไลบรารี
Servo.h
ฟังก์ชันในไลบรารี
Servo.h
เป็นฟังก์ชันที่มาพร้อมกับ Arduino IDE โดยมีฟังก์ชันที่เกี่ยวข้องกับการควบคุมเซอร์โวมอเตอร์
คือ
ฟังก์ชัน attach() คือฟังก์ชันที่ใช้ในการกำหนดขาสัญญาณที่เซอร์โวมอเตอร์นั้นต่อกับบอร์ดไมโครคอนโทรลเลอร์และใช้กำหนดความกว้างของพัลส์ที่
0 องศาและ 180 องศา การเรียกใช้ทำโดยใช้คำสั่ง
servo.attach(pin) หรือ servo.attach(pin,
min, max)
โดย
servo
คือวัตถุที่เรากำหนดขึ้นก่อน และพารามิเตอร์ของคำสั่งนี้ ได้แก่ pin
คือ ขาสัญญาณของบอร์ดไมโครคอนโทรลเลอร์ที่ใช้เชื่อมต่อกับเซอร์โวมอเตอร์
min คือ ความกว้างของพัลส์ที่ 0
องศาของเซอร์โวมอเตอร์ตัวที่ใช้ โดยกำหนดในหน่วยไมโครวินาที (µs) โดยปกติแล้วหากไม่มีการตั้งค่า โปรแกรมจะกำหนดค่าไว้ที่ 544, max คือ ความกว้างของพัลส์ที่ 180 องศาของ Servo ตัวที่ใช้ในหน่วยไมโครวินาที
โดยปกติแล้วหากไม่มีการตั้งค่าโปรแกรมจะกำหนดค่าไว้ที่ 2400
ฟังก์ชัน write()
คือฟังก์ชันที่ใช้ควบคุมตำแหน่งที่ต้องการให้เซอร์โวมอเตอร์หมุนไปยังองศาที่กำหนด
สามารถกำหนดเป็นค่าองศาได้เลย คือ 0-180 องศา
แต่ในเซอร์โวมอเตอร์ชนิดที่เป็น Full Rotation คำสั่ง write
จะเป็นการกำหนดความเร็วในการหมุนโดยค่าเท่ากับ 90 คือคำสั่งให้มอเตอร์หยุดหมุน ค่าเท่ากับ 0
คือการหมุนด้วยความเร็วสูงสุดในทิศทางหนึ่ง และค่าเท่ากับ 180 คือการหมุนด้วยความเร็วสูงสุดในทิศทางตรงกันข้าม การเรียกใช้ทำโดยใช้คำสั่ง
servo.write(angle)
พารามิเตอร์
angle
คือมุมที่ต้องการให้เซอร์โวมอเตอร์หมุนไป
ฟังก์ชัน writeMicroseconds() คือฟังก์ชันที่ใช้ควบคุมตำแหน่งที่ให้มอเตอร์หมุนไปยังตำแหน่งองศาที่กำหนดโดยกำหนดเป็นค่าความกว้างของพัลส์ในหน่วย
µs
ซึ่งปกติแล้ว เซอร์โวมอเตอร์ทั่วไปจะใช้ความกว้างของพัลส์อยู่ที่ 1000-2000
µs ตามที่ได้กล่าวไปข้างต้นแล้ว
มอเตอร์บางรุ่นหรือบางยี่ห้อไม่ได้ใช้ช่วงความกว้างของพัลส์ตามที่ได้กล่าวเอาไว้นี้
อาจจะใช้ช่วง 700-2300 แทนก็สามารถใช้ฟังก์ชัน writeMicroseconds
นี้เพื่อกำหนดความกว้างพัลส์ได้เอง การใช้ฟังก์ชั่น writeMicroseconds
สามารถกำหนดค่าได้อิสระ เราต้องระวังในการใช้งาน
หากสั่งงานให้เซอร์โวมอเตอร์แบบ 0 - 180 องศา
หมุนไปเกินจุดสิ้นสุดคือเกินทั้งฝั่ง 0 หรือ 180 องศา
จะทำให้เกิดเสียงครางดังจากการหมุนไปต่อไม่ได้และมอเตอร์จะกินกระแสสูงขึ้นด้วยในเวลาเดียวกันนั้น
ซึ่งอาจทำให้มอเตอร์เสียหายได้ การเรียกใช้ทำโดยใช้คำสั่ง
servo.writeMicroseconds(µs)
พารามิเตอร์
µs
คือค่าความกว้างของพัลส์ที่ต้องการกำหนดในหน่วยไมโครวินาที
(โดยตัวแปรจำนวนเต็ม)
ฟังก์ชัน read() คือฟังก์ชันอ่านค่าองศาที่สั่งเข้าไปด้วยฟังก์ชัน
write()
เพื่อให้ทราบว่าตำแหน่งองศาสุดท้ายที่เราสั่งเข้าไปนั้นมีค่าเท่าไหร่ซึ่งค่าที่อ่านออกมานั้นจะมีค่าอยู่ในช่วง
0 180 ฟังก์ชันนี้เรียกใช้โดยไม่มีพารามิเตอร์คือ
servo.read()
ฟังก์ชัน attached() คือฟังก์ชันที่ใช้ตรวจสอบว่าเซอร์โวมอเตอร์ที่เราต้องการใช้กำลังต่ออยู่กับขาสัญญาณของบอร์ดไมโครคอนโทรลเลอร์หรือไม่
การเรียกใช้ทำโดยใช้คำสั่ง servo.attached() โดยฟังก์ชันนี้จะส่งค่า
True ออกมา หากเซอร์โวมอเตอร์เชื่อมต่ออยู่กับบอร์ด
ฟังก์ชัน detach() คือฟังก์ชันคืนสถานะของขาที่เรากำหนดให้เป็นขาควบคุมเซอร์โวมอเตอร์ด้วยคำสั่ง
attach()
ให้กลับคือสู่การใช้งานปกติ การเรียกใช้ทำโดยใช้คำสั่ง servo.detach()
การทดลองควบคุมเซอร์โวมอเตอร์
วัตถุประสงค์
1.
เข้าใจการทำงานของเซอร์โวมอเตอร์
2.
สามารถเขียนโปรแกรมให้ไมโครคอนโทรลเลอร์ควบคุมเซอร์โวมอเตอร์ได้
อุปกรณ์ที่ใช้ในการทดลอง
1. เครี่องคอมพิวเตอร์ที่มีระบบปฏิบัติการ
Windows
(ตั้งแต่ Windows 7 ขึ้นไป)
พร้อมติดตั้งโปรแกรม Arduino IDE 1.8.8 IoT 1
เครื่อง
2. NodeMCU v.3 1
บอร์ด
3. NodeMCU Base
Ver 1.0 1
บอร์ด
4. เซอร์โวมอเตอร์ 1
ตัว
5. อะแดปเตอร์ 9 V 1
ตัว
6. สาย USB 1
เส้น
7. สายต่อวงจร (สายจัมพ์
ผู้-เมีย) 3
เส้น
วิธีการทดลอง
ตอนที่
1 การควบคุมทิศทางการหมุนของเซอร์โวมอเตอร์
1.
เชื่อมต่อเซอร์โวมอเตอร์เข้ากับบอร์ด NodeMCU v.3 ดังรูปที่ 8.3
โดยในการทดลองนี้ เราอาจจะต้องใช้อะแดปเตอร์ 9 V จ่ายไฟให้แก่บอร์ด NodeMCU Base เพื่อป้อนไฟให้แก่เซอร์โวมอเตอร์
2.
เขียนโค้ดโปรแกรมดังที่แสดงในหน้าถัดไป
จากนั้นจึงอัปโหลดแล้วสังเกตทิศทางการหมุนของเซอร์โวมอเตอร์
3.
ทดลองเปลี่ยนค่าเวลาในบรรทัดที่ 17 จาก 1000 เป็น 600
แล้วสังเกตมุมสุดท้ายที่เซอร์โวมอเตอร์หมุนไปในทิศทางตามเข็มนาฬิกามากที่สุด
รูปที่
8.3
การต่อวงจรในการทดลองควบคุมเซอร์โวมอเตอร์
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
// Control Servo Motor by NodeMCU
ESP8266 #include <Servo.h> Servo myservo; void setup() { // Servo at PIN D0 myservo.attach(D0); pinMode(D4, OUTPUT); // On Board LED } void loop() { digitalWrite(D4,LOW); // LED ON (active Low)
myservo.writeMicroseconds(1500);
// Center delay(5000);
myservo.writeMicroseconds(1000);
// Rotate CW delay(2000);
myservo.writeMicroseconds(2000); // Rotate CCW
digitalWrite(D4,HIGH); //
LED OFF (active high) delay(2000); } |
แผนผังการทำงานของโปรแกรมในตอนที่ 1
นี้แสดงดังรูปที่ 8.4
รูปที่
8.4 แผนผังการทำงานของโปรแกรมที่แสดงในการทดลองตอนที่ 1
ตอนที่
2 การควบคุมมุมของเซอร์โวมอเตอร์
1.
เชื่อมต่อเซอร์โวมอเตอร์เข้ากับบอร์ด NodeMCU v.3 ดังรูปที่ 8.3
2.
เขียนโค้ดโปรแกรมดังที่แสดงข้างล่างนี้
จากนั้นจึงอัปโหลดแล้วสังเกตตำแหน่งของเซอร์โวมอเตอร์
3.
ทดลองเปลี่ยนค่ามุมในบรรทัดที่ 19 จาก 180 เป็น 135
แล้วสังเกตมุมสุดท้ายที่เซอร์โวมอเตอร์หมุนไปในทิศทางทวนเข็มนาฬิกามากที่สุด
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
// Control Servo Motor by NodeMCU
ESP8266 #include <Servo.h> Servo myservo; void setup() { // Servo at PIN D0 myservo.attach(D0); pinMode(D4, OUTPUT); // On Board LED } void loop() { digitalWrite(D4,LOW); // LED ON (active Low) myservo.write(90); // Center delay(5000); myservo.write(0); // Rotate CW delay(2000); myservo.write(180); // Rotate CCW
digitalWrite(D4,HIGH); //
LED OFF (active high) delay(2000); } |
ตอนที่
3 การควบคุมการเคลื่อนที่ของเซอร์โวมอเตอร์
1.
เชื่อมต่อเซอร์โวมอเตอร์เข้ากับบอร์ด NodeMCU v.3 ดังรูปที่ 8.3
2.
เขียนโค้ดโปรแกรมดังที่แสดงข้างล่างนี้
จากนั้นจึงอัปโหลดแล้วสังเกตการเคลื่อนที่ของเซอร์โวมอเตอร์
3.
ทดลองเปลี่ยนค่าเวลาที่หน่วงในบรรทัดที่ 16 และ 21 จาก 15 เป็น 50
แล้วสังเกตความเร็วในการหมุนของเซอร์โวมอเตอร์หมุนไปในทิศทางทวนเข็มนาฬิกามากที่สุด
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
// Control Servo Motor by NodeMCU
ESP8266 #include <Servo.h> Servo myservo; void setup() { // Servo at PIN D0 myservo.attach(D0); } void loop() { int pos; for (pos = 0; pos <
180; pos += 1) {
myservo.write(pos);
delay(15); } for (pos = 180; pos >=
1; pos -= 1) {
myservo.write(pos);
delay(15); } } |