Arduino and Motor Control (Servo Motor)

อธิบายการทำงานของ Servo motor

สำหรับ Servo motor นั้น นิยามของมันคือ เป็นมอเตอร์ที่มีการควบคุมการเคลื่อนที่ของมัน (State) ไม่ว่าจะเป็นระยะ ความเร็ว มุมการหมุน โดยใช้การควบคุมแบบป้อนกลับ (Feedback control)   ถ้าลองไปค้นดูในตำรา หรือ ใน google จะพบว่า การควบคุมแบบป้อนกลับเป็น keyword สำคัญที่ทำให้มอเตอร์ตัวนั้นๆ เรียกว่าเป็นแบบ Servo  ซึ่งข้อแตกต่างนี้ชัดเจนระหว่าง Servo motor กับ Servo motor

Stepper motor จะไม่มีการป้อนกลับ แต่ควบคุมการเคลื่อนที่แบบระบบเปิด โดยการส่งสัญญาณไปที่ตัว Stator ให้เคลื่อนที่ไปเป็น step ที่ตายตัว เช่น ทีละ 1.5 องศา เป็นต้น  (ความละเอียดของการเคลื่อนที่ขึ้นกับคุณสมบัติของ Stepper motor และเทคนิคการควบคุม)  ในขณะที่ Servo motor ต้องการสัญญาณป้อนกลับเพื่อใช้ในการประเมินตำแหน่ง หรือ ความเร็ว หรือ State อื่นๆ  เพื่อไปประมวลการเคลื่อนไหวที่เหมาะสม เทียบกับตำแหน่งที่ผู้ใช้ระบุ  โดยอาจจะใช้การควบคุมแบบปิดได้หลายๆ แบบ แล้วแต่ผู้ผลิต แต่แบบที่นิยมมากที่สุดก็คือ Propotional Integral Derivative (PID Control)

Servo motor ที่มีขายในปัจจุบันก็มีหลายแบบมากๆ เช่น แบบที่ประกอบด้วยมอเตอร์กระแสตรง (DC motor) แบบที่ใช้มอเตอร์กระแสสลับ (AC motor) ก็มี แบบ มอเตอร์ไร้แปรงถ่านก็มี  แถมมีหลากหลายวิธีการควบคุม

ข้อดีของ Servo motor

  • สามารถให้ค่าทอร์กที่สูง
  • สามารถเคลื่อนที่ความเร็วสูง
  • ใช้งานกับการควบคุมความเร็วได้ดี
  • มีหลากหลายขนาดให้เลือก (มากกว่า Stepper motor )
  • เงียบ ไม่เหมือน Stepper motor
  • ผู้ผลิต (อ้างว่า) ชอบบอกว่าควบคุมได้ดีกว่า Stepper และไม่มีการสะดุดจังหวะเหมือนที่ Stepper motor เป็นในกรณีที่เจอกับทอร์กต้านสูงๆ

ข้อเสีย

  • แพงว่า Stepper motor
  • ไม่สามารถทำงานโดยการควบคุมแบบเปิด
  • ต้องมีการจูนค่าในการควมคุม (สำหรับ Servo ที่มีราคาสูงกว่าแบบที่ใช้กับมือสมัครเล่น)
  • ในกรณีที่ใช้ DC motor ต้องมีการบำรุงรักษา เนื่องจากแปรงถ่านอาจสึก

ตัวอย่าง Code

#include  <Servo.h>

Servo myservo;         // create servo object to control a servo

int val;  

int potpin = 0;        // Pin to potentiometer

void setup()

{

 Serial.begin(9600);

 delay(400);

 myservo.attach(9);  // attaches the servo on pin 9 to the servo control pin (orange)

 delay(300);

}

void loop()

{

  val = analogRead(potpin);         // define analog read pin

  val = map(val, 0, 1023, 0, 140);  // scaling input to 0 – 180 degree

  Serial.println(val);

  myservo.write(val);               // position of servo arm

  delay(15);                        // adjust for selecting movement speed

}

การรันโปรแกรม

Servo

ไฟล์ Source Code

https://drive.google.com/a/bumail.net/file/d/0B_v2RYZPknhEaVBQb05OWVFVZGs/view?usp=sharing

  •  
  •  
  •  
  •  
  •  
  •  
Sittikiat Siryen
at GlurGeek.Com
ขณะนี้กำลังศึกษาอยู่ที่มหาวิทยาลัยกรุงเทพ คณะวิศวกรรมศาสตร์ สาขาคอมพิวเตอร์

Leave a Reply