ลองจินตนาการดูว่า ถ้าคุณสั่งให้มอเตอร์หมุนไปที่องศาที่ต้องการ แล้วมันไม่ได้แค่หมุนสุ่มๆ แต่สามารถ "เช็กตัวเองได้ว่าถึงจุดนั้นหรือยัง" แถมยังแก้ไขตำแหน่งตัวเองได้ถ้ามีอะไรมาขัดขวาง... นี่แหละครับคือความเจ๋งของสิ่งที่เรียกว่า Servo Motor (เซอร์โวมอเตอร์)
ในบทเรียนนี้ เราจะมาเจาะลึกกันว่าเซอร์โวมอเตอร์รู้ตำแหน่งของตัวเองได้อย่างไร ไมโครคอนโทรลเลอร์ (Arduino) คุยกับมันภาษาอะไร และปิดท้ายด้วยโปรเจกต์สนุกๆ อย่างการใช้เซนเซอร์หมุน (Rotation Sensor) ควบคุมองศาของมอเตอร์แบบเป๊ะๆ พร้อมแสดงผลบนหน้าจอ LCD ครับ!

อุปกรณ์ที่ต้องเตรียม (Supplies)
- บอร์ด Arduino UNO
- บอร์ดขยายพอร์ต (I/O Expansion Shield)
- เซอร์โวมอเตอร์ (รุ่นจิ๋ว SG90)
- เซนเซอร์แบบหมุน (Rotation Sensor / Potentiometer)
- หน้าจอ I2C LCD Screen
- สายจัมเปอร์ (Jumper wires)
- (อุปกรณ์อ้างอิงจากชุด DFRobot MindPlus Arduino Coding Kit)
คลิกเพื่อดูรูปภาพอุปกรณ์ทั้งหมด (View More)
Step 1: วิดีโอสอนแบบเข้าใจง่าย
Step 2: เจาะลึก! ข้างใน Servo Motor มีอะไร?
เซอร์โวมอเตอร์โด่งดังมากในวงการรถบังคับ เครื่องบินบังคับ หรือเรือบังคับ เพราะงานพวกนี้ต้องการการควบคุมองศาเลี้ยวที่แม่นยำมากๆ (ถ้าใช้มอเตอร์หมุนสุ่มๆ รถคงตกถนนไปแล้ว) นั่นทำให้มันกลายเป็นพระเอกในวงการหุ่นยนต์ (Robotics) ด้วยเช่นกัน
ข้างในกล่องเซอร์โวเล็กๆ นี้ ไม่ได้มีแค่มอเตอร์เปล่าๆ แต่ประกอบไปด้วย:
-
DC Motor: มอเตอร์กระแสตรงตัวจิ๋วที่หมุนเร็วมากแต่แรงน้อย
-
Gearbox (ชุดเกียร์): ทำหน้าที่ทดรอบมอเตอร์ให้หมุนช้าลง แต่ได้ "แรงบิด (Torque)" มหาศาล ทำให้มันยกของหนักๆ ได้
-
Potentiometer (ตัวต้านทานปรับค่าได้): ตัวนี้แหละคือ "ระบบฟีดแบ็ก (Feedback)"! มันจะถูกต่อเข้ากับแกนหมุน เพื่อวัดว่าตอนนี้มอเตอร์หมุนไปกี่องศาแล้ว
-
Control Circuit (แผงวงจรควบคุม): มันจะคอยเปรียบเทียบ "องศาที่เราสั่ง" กับ "องศาจริงที่วัดได้จาก Potentiometer" ถ้ายังไม่ตรง มันก็จะสั่งมอเตอร์ให้หมุนชดเชยจนกว่าจะเป๊ะ! ระบบนี้เรียกว่าการควบคุมแบบปิด (Closed-loop control)
Arduino คุยกับ Servo ยังไง?
มันคุยกันผ่านสัญญาณพัลส์ดิจิทัลที่เรียกว่า PWM (Pulse Width Modulation) โดยเซอร์โวจะรอรับสัญญาณทุกๆ 20 มิลลิวินาที ความกว้างของพัลส์ (ช่วงที่ไฟเปิด) จะเป็นตัวบอกองศา:
- พัลส์กว้าง ~1 มิลลิวินาที = หมุนไปสุดฝั่งซ้าย
- พัลส์กว้าง ~1.5 มิลลิวินาที = อยู่ตรงกลางพอดี
- พัลส์กว้าง ~2 มิลลิวินาที = หมุนไปสุดฝั่งขวา
คลิกเพื่อดูรูปโครงสร้างภายในและการทำงานของ Servo (View More)
Step 3: ผู้สนับสนุนโปรเจกต์
โปรเจกต์นี้ได้รับการสนับสนุนจาก DFRobot ผู้จัดจำหน่ายฮาร์ดแวร์เพื่อการศึกษาแบบโอเพนซอร์สระดับโลก โดยใช้ชุด MindPlus Arduino Coding Kit ซึ่งรวมเซนเซอร์และอุปกรณ์ที่ออกแบบมาให้ผู้เริ่มต้นทดลองต่อวงจรได้ง่ายๆ ไม่ต้องมานั่งปวดหัวกับการหาซื้ออะไหล่ทีละชิ้นครับ
Step 4: ลงมือทำ! บิดปุ่มเพื่อหมุน Servo
เป้าหมายของเราคือ การเอาเซนเซอร์หมุนมาคุมองศาของเซอร์โว พร้อมโชว์ตัวเลของศาบนหน้าจอ LCD เพื่อแสดงให้เห็นว่า "อินพุตจากมนุษย์" ถูกแปลงเป็นการเคลื่อนไหวทางกลไกได้อย่างไร
- สวม Expansion Shield ทับลงบน Arduino UNO ให้เรียบร้อย
- ต่อสายสัญญาณ Servo เข้าที่ช่อง Digital Pin 3
- ต่อเซนเซอร์หมุน (Rotation sensor) เข้าที่ช่อง Analog Pin A3
- ต่อจอ LCD เข้าช่อง I2C (SCL -> A5, SDA -> A4)
เมื่อเปิดเครื่อง หน้าจอจะโชว์องศาปัจจุบัน พอเราบิดปุ่ม เซอร์โวก็จะบิดตามทันที นี่คือหลักการพื้นฐานของการสร้างแขนกลหุ่นยนต์เลยล่ะ!
คลิกเพื่อดูรูปการต่อวงจรและผลลัพธ์ (View More)
Step 5: อธิบายโค้ด (พร้อมให้กดก๊อปปี้)
โค้ดของเราจะเริ่มจากการอ่านค่าแรงดันไฟฟ้าจากเซนเซอร์หมุน (ซึ่งจะได้ค่ามาเป็น 0-1023) จากนั้นเราจะใช้คำสั่ง map() เพื่อแปลงสเกล 0-1023 ให้กลายเป็นองศา 0-180 องศา แล้วโยนค่านี้ไปให้ไลบรารี Servo จัดการสร้างสัญญาณ PWM ส่งไปคุมมอเตอร์อีกทีครับ
คลิกเพื่อดูและคัดลอกโค้ด C++ (View More)
#include <Wire.h>
#include <DFRobot_RGBLCD1602.h>
#include <Servo.h>
#define SERVO_PIN 3
#define POT_PIN A3
DFRobot_RGBLCD1602 lcd(0x60, 16, 2);
Servo myServo;
void setup() {
myServo.attach(SERVO_PIN);
lcd.init();
}
void loop() {
// อ่านค่าจากที่บิด (0-1023)
int potValue = analogRead(POT_PIN);
// แปลงค่าเป็นองศา (0-180)
int angle = map(potValue, 0, 1023, 0, 180);
// สั่งให้ Servo ขยับ
myServo.write(angle);
// โชว์องศาบนหน้าจอ LCD
lcd.setCursor(0, 1);
lcd.print("Angle: ");
lcd.print(angle);
lcd.print((char)223); // สัญลักษณ์องศา
lcd.print(" "); // เคลียร์ตัวเลขเก่า
delay(15);
}
Step 6: สรุปผล
จากบทเรียนนี้ คุณได้เข้าใจแล้วว่าเซอร์โวแตกต่างจากมอเตอร์ทั่วไปยังไง การเคลื่อนไหวของมันไม่ได้เกิดจากการหมุนมั่วๆ แต่ผ่านการ "สั่งการ -> วัดผล -> แก้ไข" อย่างเป็นระบบ
นี่คือก้าวสำคัญของการเรียน Arduino เลยครับ เพราะคุณได้เปลี่ยนจากคนที่แค่ "คุมสัญญาณไฟ" มาเป็นคนที่ "คุมพฤติกรรมกลไก" ได้แล้ว ลองเอาไปประยุกต์ทำแขนกล หรือระบบกันสั่น (Stabilization) ดูนะครับ!

พร้อมสร้างหุ่นยนต์ตัวแรกของคุณหรือยัง?
คำเตือน: เนื้อหานี้เป็นการสรุปและเรียบเรียงจากบทความต้นฉบับภาษาอังกฤษ ข้อมูลฉบับภาษาไทยอาจมีความคลาดเคลื่อนบางประการจากการตีความหรือย่อเนื้อหา