Servo SG90 กับ ESP32 ไม่ให้กระตุก: ไฟเลี้ยง ขา PWM และไลบรารี

Servo SG90 กระตุกบน ESP32 มักมาจากไฟเลี้ยงไม่พอ วิธีจ่ายไฟ 5 V แยก ต่อ GND ร่วม ใช้ไลบรารี ESP32Servo เลือกขาที่เหมาะ และทำหัวหุ่นหมุนแบบนุ่มๆ

อัปเดต 2026-11-02

Servo SG90 ที่กระตุก สั่นค้าง หรือทำให้ ESP32 รีเซ็ต เกือบทุกกรณีมาจากไฟเลี้ยงไม่พอ: servo ดึงกระแสสูงเป็นช่วงๆ ตอนเริ่มหมุน ถ้าใช้ไฟร่วมกับบอร์ดจาก USB ไฟจะตกทุกครั้งที่ขยับ ให้จ่าย 5 V แยกจาก buck converter ต่อ GND ร่วมกับบอร์ด แล้วใช้ไลบรารี ESP32Servo สร้างสัญญาณ ซึ่งจะแก้อาการได้เกือบทั้งหมด

การต่อสาย

สาย SG90ต่อไปที่
น้ำตาล (GND)GND ของ buck และ GND ของ ESP32
แดง (VCC)5 V จาก buck converter (ไม่ใช่ขา 3V3)
ส้ม (สัญญาณ)GPIO 25 (หรือขาอื่นที่ใช้ output ได้ ดูด้านล่าง)

สัญญาณ 3.3 V จาก ESP32 สั่ง SG90 ได้ตามปกติ ไม่ต้องใช้ level shifter แต่ไฟเลี้ยงต้องเป็น 4.8–6 V ถ้าป้อน 3.3 V servo จะอ่อนแรงและหมุนไม่ถึงตำแหน่ง

ทำไม servo กระตุก

ใส่ตัวเก็บประจุ 100–470 µF คร่อมขา 5 V กับ GND ใกล้ขั้วต่อ servo ช่วยเลี้ยงไฟตอนกระแสกระชากได้มาก อ่านเรื่องไฟตกเพิ่มเติมใน ESP32 รีเซ็ตเองตอนมอเตอร์หมุน

ขาที่ใช้ได้และขาที่ควรเลี่ยง

ไลบรารี ESP32Servo

ไลบรารี Servo ที่ติดมากับ Arduino IDE ใช้กับ ESP32 ไม่ได้ ให้ติดตั้ง ESP32Servo จาก Library Manager ไลบรารีนี้ใช้วงจร PWM ของ ESP32 (LEDC) สร้างพัลส์ 50 Hz ที่นิ่ง ไม่กระตุกตามงานอื่นของโปรแกรม

#include <ESP32Servo.h>

const int SERVO_PIN = 25;
Servo head;

void setup() {
  head.setPeriodHertz(50);              // servo มาตรฐานใช้ 50 Hz
  head.attach(SERVO_PIN, 500, 2400);    // ความกว้างพัลส์ 0.5–2.4 ms = 0–180°
  head.write(90);                       // หันตรง
}

void loop() {
  head.write(45);  delay(1000);
  head.write(135); delay(1000);
}

ค่า 500 และ 2400 µs เป็นค่าที่ใช้ได้กับ SG90 ส่วนใหญ่ ถ้าสั่ง 0° หรือ 180° แล้วได้ยินเสียงหึ่งค้าง ให้แคบช่วงลง เช่น 600–2300 หรือจำกัดมุมในโค้ดไว้ที่ 10–170°

ถ้าโปรแกรมใช้ PWM ขับมอเตอร์ด้วย analogWrite() ไปพร้อมกัน ให้ attach() servo ก่อน แล้วค่อยตั้งขามอเตอร์ ถ้ายังมีอาการแปลกๆ ให้จอง timer ให้ servo ด้วย ESP32PWM::allocateTimer(0); ใน setup() ก่อน attach()

ทำหัวหุ่นหมุนซ้ายขวาแบบนุ่ม (pan)

หุ่นที่มีหัวบน servo จะดูมีชีวิตขึ้นมากถ้าหัวค่อยๆ หัน แทนที่จะสะบัดไปทันที วิธีง่ายๆ คือขยับทีละองศาทุก 10–15 ms โดยไม่ใช้ delay() ยาว เพื่อให้โปรแกรมอ่านเซนเซอร์ไปพร้อมกันได้

#include <ESP32Servo.h>

const int SERVO_PIN = 25;
const int CENTER = 90, LIMIT = 80;   // หันได้ ±80° จากด้านหน้า
Servo head;
int now = CENTER, target = CENTER;

// angle: −80 (ซ้ายสุด) ถึง +80 (ขวาสุด), 0 = หน้าตรง
void lookAt(int angle) {
  target = CENTER + constrain(angle, -LIMIT, LIMIT);
}

void updateHead() {
  static unsigned long last = 0;
  if (millis() - last < 12) return;  // ~80°/วินาที
  last = millis();
  if (now == target) return;
  now += now < target ? 1 : -1;
  head.write(now);
}

void setup() {
  head.setPeriodHertz(50);
  head.attach(SERVO_PIN, 500, 2400);
  head.write(now);
}

void loop() {
  updateHead();
  // ตัวอย่าง: มองซ้าย มองขวา สลับทุก 2 วินาที
  lookAt((millis() / 2000) % 2 ? 60 : -60);
}

ถ้าหัวหมุนกลับทาง (สั่งขวาแต่หันซ้าย) ให้เปลี่ยน CENTER + … เป็น CENTER - … ใน หุ่นยนต์หาแสง และ หุ่นยนต์ตั้งโต๊ะมีหน้า หัวแบบนี้ถือ LDR สองตัวไว้ แล้วหันไปทางตาที่สว่างกว่า

servo ในตัวจำลอง

โมดูล Head ของตัวจำลองคือ SG90 หนึ่งตัวใต้หน้าจอ หมุนได้ ±90° จากด้านหน้าของหุ่น ในหน้า Code ใช้ await rover.head(40) สั่งหันหัว หรือ rover.trackLight(true) ให้หัวหันตามแสงเอง หน้า Wiring จะต่อสายสัญญาณ servo กับไฟ 5 V ให้อัตโนมัติ:

การต่อขาบน ESP32 DevKit V1 (จัดขาอัตโนมัติจากตัวจำลอง)
HC-SR04
Front sonar
VCC → 5V
TRIG → GPIO26
ECHO → GPIO34 (ผ่าน 1 kΩ / 2 kΩ)
GND → GND
LDR
Left eye LDR
VCC → 3V3
GND → GND
AO → GPIO32
LDR
Right eye LDR
VCC → 3V3
GND → GND
AO → GPIO33
Tactile 12mm
Head button
COM → GND
NO → GPIO27
SG90
Head servo
GND → GND
VCC → 5V
PWM → GPIO25
SSD1306
Face Display
GND → GND
VCC → 3V3
SCL → GPIO22
SDA → GPIO21

เปิดหุ่นที่มีหัว servo ในตัวจำลอง →

ชิ้นส่วน

ชิ้นส่วนสำหรับ ESP32 DevKit V1
ชิ้นส่วนจำนวนราคาประมาณร้าน
ESP32 DevKit V1 (30 ขา)1฿130–฿250Shopee
Ultrasonic HC-SR041฿30–฿60Shopee
โมดูลวัดแสง LDR (มีขา AO)2฿15–฿40Shopee
ปุ่มกด tactile 12 mm + ฝาครอบ1฿5–฿15Shopee
Servo SG901฿40–฿80Shopee
OLED SSD1306 0.96" I²C1฿80–฿150Shopee
ถ่าน Li-ion 186502฿60–฿150Shopee
รางถ่าน 18650 แบบ 2 ก้อน (2S)1฿20–฿60Shopee
Buck converter 7.4 V → 5 V 3 A1฿30–฿90Shopee
สวิตช์เปิด-ปิด1฿5–฿20Shopee
สายจัมเปอร์ ผู้-ผู้ / ผู้-เมีย ชุด 40 เส้น1฿30–฿60Shopee
ตัวต้านทาน 1 kΩ + 2 kΩ (แบ่งแรงดัน 5 V → 3.3 V)1฿2–฿10Shopee
แนะนำเพิ่ม
ที่ชาร์จถ่าน 186501฿100–฿250Shopee
รวมโดยประมาณ฿522–฿1,175

ราคาประมาณการ ณ 2026-10-31 ยังไม่ได้ตรวจกับร้าน · บางลิงก์เป็นลิงก์ affiliate (อ่านเพิ่ม)