Servo เป็นคำศัพท์ที่ใช้กันทั่วไปในระบบควบคุมอัตโนมัติ มาจากภาษาละติน คำว่า Sevus หมายถึง “ทาส” (Slave) ในเชิงความหมายของ Servo Motor ก็คือ Motor ที่เราสามารถสั่งงานหรือตั้งค่า แล้วตัว Motor จะหมุนไปยังตำแหน่งองศาที่เราสั่งได้เองอย่างถูกต้อง
servo motor (servo motor) คือ มอเตอร์ไฟฟ้ากระแส เป็นมอเตอร์ที่มีการควบคุมการเคลื่อนที่ของมัน (State) ไม่ว่าจะเป็นระยะ ความเร็ว มุมการหมุน โดยใช้การควบคุมแบบป้อนกลับ (Feedback control) เป็นอุปกรณ์ที่สามารถควบคุมเครื่องจักรกล หรือระบบการทํางานนั้นๆ ให้เป็นไปตามความต้องการ เช่น ควบคุมความเร็ว (Speed), ควบคุมแรงบิด (Torque), ควบคุมแรงตําแหน่ง (Position), ระยะทางในการเคลื่อนที่ (หมุน) (Position Control) ของตัวมอเตอร์ได้ โดย Servo Motor จะประกอบด้วยมอเตอร์ ชุดเกียร์ และบอร์ดควบคุม รวมไว้เป็นโมดูลเดียวกัน และจะรับสัญญาณควบคุม (signal, S) เพียง 1 เส้น
servo motor มีสาย 3 เส้น ประกอบด้วย
Signal (สีส้ม หรือ สีขาว) - สายสัญญาณควบคุมการหมุนแบบ PWM
VCC (สีแดง) - สายสำหรับจ่ายไฟบวก 5V
GND (สีน้ำตาล หรือ สีดำ) - สายสำหรับจ่ายไฟลบ หรือกราว์ด (GND)
ภาพแสดง การต่อ servo motor เข้ากับบอร์ด Arduino Uno R3
โดยทั่วไปเราสามารถควบคุมให้ servo motor หมุนในทิศตามเข็มนาฬิกา (หมุนขวา) หรือ ทวนเข็มนาฬิกา (หมุนซ้าย) ได้ โดยมีมุมในการหมุนตั้งแต่ 0 องศา ถึง 180 องศา นั่นคือ servo จะหมุนได้เพียง 180 องศาหรือครึ่งรอบเท่านั้น โดยมีตำแหน่งกึ่งกลางอยู่ที่ 90 องศา สัญญาณ S ที่ใช้ควบคุมมอเตอร์ชนิดนี้จะเป็นสัญญาณที่มีการมอดูเลตความกว้างพัลส์ (Pulse Width Modulation, PWM) และมีระดับแรงดันแบบ TTL ระดับแรงดัน VCC ที่จ่ายให้มอเตอร์นี้จะอยู่ในช่วงประมาณ 4 ถึง 6 โวลต์
ภาพแสดง โครงสร้างภายในของ servo motor 180
ภาพแสดง สัญญาณ PWM ที่ส่งผลต่อองศาการหมุนของ servo motor 180
ไลบรารี Servo.h
ฟังก์ชันในไลบรารี Servo.h เป็นฟังก์ชันที่มาพร้อมกับ Arduino IDE โดยมีฟังก์ชันที่เกี่ยวข้องกับการควบคุม servo motor คือ
ฟังก์ชัน attach()
คือฟังก์ชันที่ใช้ในการกำหนดขาสัญญาณที่ servo motor นั้นต่อกับบอร์ดไมโครคอนโทรลเลอร์ และใช้กำหนดความกว้างของพัลส์ที่ 0 องศาและ 180 องศา การเรียกใช้ทำโดยใช้คำสั่ง servo.attach(pin) หรือ servo.attach(pin, min, max)
โดย servo คือวัตถุที่เรากำหนดขึ้นก่อน และพารามิเตอร์ของคำสั่งนี้ ได้แก่ pin คือ ขาสัญญาณของบอร์ดไมโครคอนโทรลเลอร์ที่ใช้เชื่อมต่อกับ servo motor min คือ ความกว้างของพัลส์ที่ 0 องศาของservo motorตัวที่ใช้ โดยกำหนดในหน่วยไมโครวินาที (µs) โดยปกติแล้วหากไม่มีการตั้งค่า โปรแกรมจะกำหนดค่าไว้ที่ 544 , max คือ ความกว้างของพัลส์ที่ 180 องศาของ Servo ตัวที่ใช้ในหน่วยไมโครวินาที โดยปกติแล้วหากไม่มีการตั้งค่าโปรแกรมจะกำหนดค่าไว้ที่ 2400
ฟังก์ชัน write()
คือฟังก์ชันที่ใช้ควบคุมตำแหน่งที่ต้องการให้ servo motor หมุนไปยังองศาที่กำหนด สามารถกำหนดเป็นค่าองศาได้เลย คือ 0-180 องศา แต่ในservo motorชนิดที่เป็น Full Rotation คำสั่ง write จะเป็นการกำหนดความเร็วในการหมุนโดยค่าเท่ากับ 90 คือคำสั่งให้มอเตอร์หยุดหมุน ค่าเท่ากับ 0 คือการหมุนด้วยความเร็วสูงสุดในทิศทางหนึ่ง และค่าเท่ากับ 180 คือการหมุนด้วยความเร็วสูงสุดในทิศทางตรงกันข้าม การเรียกใช้ทำโดยใช้คำสั่ง servo.write(angle)
พารามิเตอร์ angle คือมุมที่ต้องการให้servo motorหมุนไป
ฟังก์ชัน writeMicroseconds()
คือฟังก์ชันที่ใช้ควบคุมตำแหน่งที่ให้มอเตอร์หมุนไปยังตำแหน่งองศาที่กำหนด โดยกำหนดเป็นค่าความกว้างของพัลส์ในหน่วย µs ซึ่งปกติแล้ว servo motor ทั่วไปจะใช้ความกว้างของพัลส์อยู่ที่ 1000-2000 µs ตามที่ได้กล่าวไปข้างต้นแล้ว มอเตอร์บางรุ่นหรือบางยี่ห้อไม่ได้ใช้ช่วงความกว้างของพัลส์ตามที่ได้กล่าวเอาไว้นี้ อาจจะใช้ช่วง 700-2300 แทนก็สามารถใช้ฟังก์ชัน writeMicroseconds นี้เพื่อกำหนดความกว้างพัลส์ได้เอง การใช้ฟังก์ชั่น writeMicroseconds สามารถกำหนดค่าได้อิสระ เราต้องระวังในการใช้งาน หากสั่งงานให้servo motorแบบ 0 - 180 องศา หมุนไปเกินจุดสิ้นสุดคือเกินทั้งฝั่ง 0 หรือ 180 องศา จะทำให้เกิดเสียงครางดังจากการหมุนไปต่อไม่ได้และมอเตอร์จะกินกระแสสูงขึ้นด้วยในเวลาเดียวกันนั้น ซึ่งอาจทำให้มอเตอร์เสียหายได้ การเรียกใช้ทำโดยใช้คำสั่ง servo.writeMicroseconds(µs)
พารามิเตอร์ µs คือค่าความกว้างของพัลส์ที่ต้องการกำหนดในหน่วยไมโครวินาที (โดยตัวแปรจำนวนเต็ม)
ฟังก์ชัน read()
คือฟังก์ชันอ่านค่าองศาที่สั่งเข้าไปด้วยฟังก์ชัน write() เพื่อให้ทราบว่าตำแหน่งองศาสุดท้ายที่เราสั่งเข้าไปนั้นมีค่าเท่าไหร่ ซึ่งค่าที่อ่านออกมานั้นจะมีค่าอยู่ในช่วง 0 – 180 ฟังก์ชันนี้เรียกใช้โดยไม่มีพารามิเตอร์คือ servo.read()
ฟังก์ชัน attached()
คือฟังก์ชันที่ใช้ตรวจสอบว่า servo motor ที่เราต้องการใช้กำลังต่ออยู่กับขาสัญญาณของบอร์ดไมโครคอนโทรลเลอร์หรือไม่ การเรียกใช้ทำโดยใช้คำสั่ง servo.attached() โดยฟังก์ชันนี้จะส่งค่า True ออกมา หาก servo motor เชื่อมต่ออยู่กับบอร์ด
ฟังก์ชัน detach()
คือฟังก์ชันคืนสถานะของขาที่เรากำหนดให้เป็นขาควบคุม servo motor ด้วยคำสั่ง attach() ให้กลับคือสู่การใช้งานปกติ การเรียกใช้ทำโดยใช้คำสั่ง servo.detach()
|
|
บอร์ด Arduino Uno R3 |
Sensor Shield |
|
|
Servo motor 180 องศา |
สาย Micro USB |
1. การต่อ servo motor ตัวที่ 1 เพื่อเป็นตัวปล่อยเครื่องดื่มชนิดที่ 1 (pepsi) โดยต่อดังนี้
- ขา GND (เส้นสีน้ำตาล) ของ Servo 180 ต่อกับ ขา PIN6 (G) ของบอร์ด Arduino
- ขา VCC (เส้นสีแดง) ของ Servo 180 ต่อกับ ขา PIN6 (V) ของบอร์ด Arduino
- ขาสัญญาณ (เส้นสีเหลือง) ของ Servo 180 ต่อกับ ขา PIN6 (S) ของบอร์ด Arduino
2. การต่อ servo motor ตัวที่ 2 เพื่อเป็นตัวปล่อยเครื่องดื่มชนิดที่ 2 (coke)
- ขา GND (เส้นสีน้ำตาล) ของ Servo 180 ต่อกับ ขา PIN7 (G) ของบอร์ด Arduino
- ขา VCC (เส้นสีแดง) ของ Servo 180 ต่อกับ ขา PIN7 (V) ของบอร์ด Arduino
- ขาสัญญาณ (เส้นสีเหลือง) ของ Servo 180 ต่อกับ ขา PIN7 (S) ของบอร์ด Arduino
หมายเหตุ จำนวนของ servo ขึ้นอยู่กับจำนวนสินค้าที่ต้องการจำหน่าย
1. ติดตั้ง Library Servo โดยไปที่ เมนู Sketch --> เลือก Include Library --> เลือก Manage Library…
2. ปรากฏหน้าต่าง Library Manager จากนั้นเสิร์ชว่า ‘servo’ เมื่อเจอ Library Servo แล้ว ให้คลิกปุ่ม Install
วิธีติดตั้งไลบรารี (Library) ให้กับโปรแกรม Arduino IDE ทำได้ 3 วิธีดังนี้
1. ติดตั้งผ่าน Arduino IDE โดยใช้ Library Manager
2. ติดตั้งผ่าน Arduino IDE โดยนำเข้าไฟล์ .zip (ต้องดาวน์โหลดไฟล์ Library มาไว้ในเครื่องก่อน)
3. ติดตั้งโดยนำ Library ไปวางไว้ในโฟลเดอร์ libraries (ต้องดาวน์โหลดไฟล์ Library มาไว้ในเครื่องก่อน)
3. เรียกใช้งาน Library Servo โดยไปที่ เมนู Sketch --> เลือก Include Library --> Servo
จะปรากฏโค้ดตามภาพ
4. ประกาศตัวแปร servo ตัวที่ 1
5. กำหนดค่าให้กับตัวแปร myservo1 จะประกาศคำสั่งไว้ในส่วนของ void setup()
อธิบายโค้ด
กำหนดให้ขา pin6 เป็นขาควบคุม servo1 (ขาควบคุมอ้างอิงจากการต่ออุปกรณ์) และกำหนดให้องศา myservo1 ตั้งต้นอยู่ที่ 90 องศา
6. เขียนคำสั่งควบคุมองศาการหมุนของ servo ตัวที่ 1 ซึ่งเป็นตัวปล่อยเครื่องดื่มชนิดที่ 1 (pepsi) เขียนโค้ดคำสั่งไว้ในฟังก์ชั่น select_menu ในส่วนการ Confirm menu
อธิบายโค้ด
เมื่อมีการกดปุ่มยืนยันการเลือกเมนูที่ 1 กำหนดให้ servo ตัวที่ 1 จะหมุนไปที่ 0 องศา และย้อนกลับมาที่ 90 องศา หน่วงเวลา 1 วินาที
ผลลัพธ์ที่ได้
1. เมื่อมีการกดปุ่มเลือกเมนู 1 (pepsi)
2. กดปุ่ม OK เพื่อยืนยันการเลือกเมนู 1 (pepsi)
3. servo ตัวที่ 1 จะหมุนไปที่ 0 องศา แล้วย้อนกลับไปที่ 90 องศา
4. servoตัวที่ 1 จะทำการปล่อยเครื่องดื่มชนิดที่ 1 (pepsi) ให้หล่นลงมา
7. ประกาศตัวแปร servo ตัวที่ 2
8. กำหนดค่าให้กับตัวแปร myservo2 จะประกาศคำสั่งไว้ในส่วนของ void setup()
อธิบายโค้ด
กำหนดให้ขา pin7 เป็นขาควบคุม servo2 (ขาควบคุมอ้างอิงจากการต่ออุปกรณ์) และกำหนดให้องศา myservo2 ตั้งต้นอยู่ที่ 90 องศา
9. เขียนคำสั่งควบคุมองศาการหมุนของ servo ตัวที่ 2 ซึ่งเป็นตัวปล่อยเครื่องดื่มชนิดที่ 2 (coke) เขียนโค้ดคำสั่งไว้ในฟังก์ชั่น select_menu ในส่วนการ Confirm menu
อธิบายโค้ด
เมื่อมีการกดปุ่มยืนยันการเลือกเมนูที่ 2 กำหนดให้ servo ตัวที่ 2 จะหมุนไปที่ 0 องศา และย้อนกลับมาที่ 90 องศา หน่วงเวลา 1 วินาที
ผลลัพธ์ที่ได้
1. เมื่อมีการกดปุ่มเลือกเมนู 2 (coke)
2. กดปุ่ม OK เพื่อยืนยันการเลือกเมนู 2 (coke)
3. servo ตัวที่ 2 จะหมุนไปที่ 0 องศา แล้วย้อนกลับไปที่ 90 องศา
4. servo ตัวที่ 2 จะทำการปล่อยเครื่องดื่มชนิดที่ 2 (coke) ให้หล่นลงมา
10. หลังจากเขียนโค้ดคำสั่งเรียบร้อยแล้ว คลิก เพื่อเช็คความถูกต้องของ syntax ว่ามี error หรือไม่
11. คลิก เพื่อทำการอัปโหลดคำสั่งไปยังบอร์ด Arduino
กรณีเลือกเครื่องดื่มเมนูที่ 1 (pepsi)
1. เมื่อหยอดเหรียญ 10 ครบทั้ง 2 เหรียญแล้ว จะมีข้อความปรากฏว่า “Select menu 1. pepsi 2.coke ” เพื่อให้กดเลือกสินค้า
2. ในกรณีที่เลือกเมนูที่ 1 (pepsi) ให้ทำการกดปุ่มที่ 1 จากนั้นจะมีข้อความปรากฏว่า “You choose 1.pepsi”
3. เมื่อกดปุ่มที่ 3 (ปุ่ม OK) จากนั้นจะมีข้อความปรากฏว่า “Confirm pepsi”
4. servo ที่ 1 จะหมุนเพื่อปล่อยเครื่องดื่ม pepsi ลงมา
7. หลังจากนั้น หน้าจอจะกลับไปมีข้อความปรากฏว่า “Insert coin ” รอรับเหรียญใหม่
กรณีเลือกเครื่องดื่มเมนูที่ 2 (coke)
1. เมื่อหยอดเหรียญ 10 ครบทั้ง 2 เหรียญ จะมีข้อความปรากฏว่า “Select menu 1. pepsi 2.coke ” เพื่อให้กดเลือกสินค้า
2. ในกรณีที่เลือกเมนูที่ 2 (coke) ให้กดปุ่มที่ 1 จากนั้นจะมีข้อความปรากฏว่า “You choose 2.coke”
3. เมื่อกดปุ่มที่ 3 (ปุ่ม OK) จากนั้นจะมีข้อความปรากฏว่า “Confirm coke”
4. servo ที่ 2 จะหมุนเพื่อปล่อยเครื่องดื่ม coke ลงมา จากนั้น หน้าจอจะกลับไปมีข้อความปรากฏว่า “Insert coin Get coin 10 B.” รอการทำรายการใหม่
|