Servo SG90 กับ ESP32 ไม่ให้กระตุก: ไฟเลี้ยง ขา PWM และไลบรารี
Servo SG90 กระตุกบน ESP32 มักมาจากไฟเลี้ยงไม่พอ วิธีจ่ายไฟ 5 V แยก ต่อ GND ร่วม ใช้ไลบรารี ESP32Servo เลือกขาที่เหมาะ และทำหัวหุ่นหมุนแบบนุ่มๆ
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 กระตุก
- กระแสกระชาก SG90 ใช้กระแสเพียงไม่กี่ mA ตอนอยู่นิ่ง แต่ตอนออกตัวหรือออกแรงต้านอาจดึงหลายร้อย mA พอร์ต USB ที่ต้องเลี้ยงทั้ง ESP32 และ servo จึงจ่ายไม่ทัน ไฟตก servo กระตุก และบางครั้งบอร์ดรีเซ็ต
- ไม่ได้ต่อ GND ร่วม ถ้า servo ใช้ไฟจากแหล่งอื่นแต่ GND ไม่ได้ต่อกับบอร์ด สัญญาณจะไม่มีจุดอ้างอิง servo จะสั่นแบบสุ่ม
- สัญญาณรบกวนจากมอเตอร์ สาย servo ที่เดินขนานกับสายมอเตอร์ยาวๆ รับสัญญาณรบกวนเข้ามาได้
- สั่งตำแหน่งกระโดด สั่งจาก 0° ไป 180° ทันทีทำให้ดึงกระแสสูงสุดและหัวสะบัด
- สั่งเกินระยะที่หมุนได้จริง SG90 แต่ละตัวหมุนได้ไม่เท่ากัน ถ้าสั่งเลยขอบ เฟืองจะดันค้างและส่งเสียงหึ่ง
ขาที่ใช้ได้และขาที่ควรเลี่ยง
- ใช้ได้ดี GPIO 4, 13, 14, 16–19, 21–23, 25–27, 32, 33
- ห้ามใช้ GPIO 34–39 เป็น input อย่างเดียว สร้างสัญญาณ PWM ไม่ได้ และ GPIO 6–11 ต่อกับ flash
- ควรเลี่ยง GPIO 0, 2, 5, 12, 15 เป็นขา strapping servo ที่ดึงขาตอนบูตอาจทำให้บอร์ดบูตผิดโหมด (ดู ESP32 อัปโหลดโค้ดไม่ได้) และ GPIO 1, 3 ใช้กับ Serial ของ USB
ไลบรารี 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 ให้อัตโนมัติ:
| HC-SR04 Front sonar | VCC → 5VTRIG → GPIO26ECHO → GPIO34 (ผ่าน 1 kΩ / 2 kΩ)GND → GND |
|---|---|
| LDR Left eye LDR | VCC → 3V3GND → GNDAO → GPIO32 |
| LDR Right eye LDR | VCC → 3V3GND → GNDAO → GPIO33 |
| Tactile 12mm Head button | COM → GNDNO → GPIO27 |
| SG90 Head servo | GND → GNDVCC → 5VPWM → GPIO25 |
| SSD1306 Face Display | GND → GNDVCC → 3V3SCL → GPIO22SDA → GPIO21 |
เปิดหุ่นที่มีหัว servo ในตัวจำลอง →
ชิ้นส่วน
| ชิ้นส่วน | จำนวน | ราคาประมาณ | ร้าน |
|---|---|---|---|
| ESP32 DevKit V1 (30 ขา) | 1 | ฿130–฿250 | Shopee |
| Ultrasonic HC-SR04 | 1 | ฿30–฿60 | Shopee |
| โมดูลวัดแสง LDR (มีขา AO) | 2 | ฿15–฿40 | Shopee |
| ปุ่มกด tactile 12 mm + ฝาครอบ | 1 | ฿5–฿15 | Shopee |
| Servo SG90 | 1 | ฿40–฿80 | Shopee |
| OLED SSD1306 0.96" I²C | 1 | ฿80–฿150 | Shopee |
| ถ่าน Li-ion 18650 | 2 | ฿60–฿150 | Shopee |
| รางถ่าน 18650 แบบ 2 ก้อน (2S) | 1 | ฿20–฿60 | Shopee |
| Buck converter 7.4 V → 5 V 3 A | 1 | ฿30–฿90 | Shopee |
| สวิตช์เปิด-ปิด | 1 | ฿5–฿20 | Shopee |
| สายจัมเปอร์ ผู้-ผู้ / ผู้-เมีย ชุด 40 เส้น | 1 | ฿30–฿60 | Shopee |
| ตัวต้านทาน 1 kΩ + 2 kΩ (แบ่งแรงดัน 5 V → 3.3 V) | 1 | ฿2–฿10 | Shopee |
| แนะนำเพิ่ม | |||
| ที่ชาร์จถ่าน 18650 | 1 | ฿100–฿250 | Shopee |
| รวมโดยประมาณ | ฿522–฿1,175 | ||
ราคาประมาณการ ณ 2026-10-31 ยังไม่ได้ตรวจกับร้าน · บางลิงก์เป็นลิงก์ affiliate (อ่านเพิ่ม)