การควบคุมเซอร์โวมอเตอร์

หลักการทำงานของเซอร์โวมอเตอร์

เซอร์โวมอเตอร์ (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(ข) แสดงลักษณะภายในของเซอร์โวมอเตอร์นี้

 

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) จะแสดงให้เห็นถึงวิธีการทางโปรแกรมในการปรับความเร็วของเซอร์โวมอเตอร์ให้หมุนช้าลง

 

1

 

รูปที่ 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 แล้วสังเกตมุมสุดท้ายที่เซอร์โวมอเตอร์หมุนไปในทิศทางตามเข็มนาฬิกามากที่สุด

1

 

รูปที่ 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

 

1

 

รูปที่ 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);

    }

}