Arduino + Servo Motor: พื้นฐานการควบคุมเซอร์โวมอเตอร์สำหรับผู้เริ่มต้น

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

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

Servo Motor connected to Arduino

อุปกรณ์ที่ต้องเตรียม (Supplies)

  • บอร์ด Arduino UNO
  • บอร์ดขยายพอร์ต (I/O Expansion Shield)
  • เซอร์โวมอเตอร์ (รุ่นจิ๋ว SG90)
  • เซนเซอร์แบบหมุน (Rotation Sensor / Potentiometer)
  • หน้าจอ I2C LCD Screen
  • สายจัมเปอร์ (Jumper wires)
  • (อุปกรณ์อ้างอิงจากชุด DFRobot MindPlus Arduino Coding Kit)
คลิกเพื่อดูรูปภาพอุปกรณ์ทั้งหมด (View More)
Supply 1
Supply 2
Supply 3
Supply 4
Supply 5
Supply 6
Supply 7

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)
Inside a Servo
PWM Signal diagram
Servo Horns

Step 3: ผู้สนับสนุนโปรเจกต์

โปรเจกต์นี้ได้รับการสนับสนุนจาก DFRobot ผู้จัดจำหน่ายฮาร์ดแวร์เพื่อการศึกษาแบบโอเพนซอร์สระดับโลก โดยใช้ชุด MindPlus Arduino Coding Kit ซึ่งรวมเซนเซอร์และอุปกรณ์ที่ออกแบบมาให้ผู้เริ่มต้นทดลองต่อวงจรได้ง่ายๆ ไม่ต้องมานั่งปวดหัวกับการหาซื้ออะไหล่ทีละชิ้นครับ

DFRobot 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)
Project Wiring
Rotation Sensor detail
LCD Screen display

Step 5: อธิบายโค้ด (พร้อมให้กดก๊อปปี้)

โค้ดของเราจะเริ่มจากการอ่านค่าแรงดันไฟฟ้าจากเซนเซอร์หมุน (ซึ่งจะได้ค่ามาเป็น 0-1023) จากนั้นเราจะใช้คำสั่ง map() เพื่อแปลงสเกล 0-1023 ให้กลายเป็นองศา 0-180 องศา แล้วโยนค่านี้ไปให้ไลบรารี Servo จัดการสร้างสัญญาณ PWM ส่งไปคุมมอเตอร์อีกทีครับ

Code Snippet Image
คลิกเพื่อดูและคัดลอกโค้ด 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) ดูนะครับ!

Finished Project Setup

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

อ้างอิงและเรียบเรียงโดย: Globalbyteshop Blog

แหล่งที่มาต้นฉบับ:
- บทความโดย lucascreator: How to Use Servo Motors With Arduino - Lesson #19

แท็ก


Blog posts

© 2026 บริษัท โกลบอลโทรนิค อินเตอร์เทรด จํากัด, ขับเคลื่อนโดย Shopify

    • PayPal

    เข้าสู่ระบบ

    ลืมรหัสผ่านใช่ไหม?

    ยังไม่มีบัญชีใช่ไหม?
    สร้างบัญชี