ESP32 บทเรียนที่ 17/55 - การควบคุมเซอร์โวมอเตอร์โดยใช้ ESP32 และโพเทนชิโอมิเตอร์ - ชุดการเรียนรู้ IoT สำหรับ ESP32
ในบทช่วยสอนนี้ เราจะเรียนรู้วิธีการควบคุมมอเตอร์เซอร์โวโดยใช้ไมโครคอนโทรลเลอร์ ESP32 และโพเทนชิโอมิเตอร์จากชุดการเรียนรู้ IoT ESP32 โดย SunFounder เมื่อสิ้นสุดโปรเจกต์นี้ คุณจะสามารถปรับมุมของมอเตอร์เซอร์โวได้อย่างราบรื่นโดยใช้โพเทนชิโอมิเตอร์ ซึ่งช่วยให้ควบคุมได้อย่างแม่นยำ นี่เป็นวิธีที่ดีในการสำรวจความสามารถของ ESP32 และวิธีการเชื่อมต่อกับมอเตอร์

เมื่อเราเจาะลึกรายละเอียด เราจะครอบคลุมส่วนประกอบฮาร์ดแวร์ที่จำเป็น คำแนะนำการเดินสายไฟ และตัวอย่างโค้ดเพื่อให้ทุกอย่างทำงานได้ สำหรับการนำเสนอที่เห็นภาพมากขึ้น อย่าลืมดูวิดีโอที่เกี่ยวข้องกับบทช่วยสอนนี้ (ในวิดีโอที่ 0:30)
อธิบายฮาร์ดแวร์
ส่วนประกอบหลักสำหรับโปรเจกต์นี้ประกอบด้วยไมโครคอนโทรลเลอร์ ESP32 มอเตอร์เซอร์โว (SG90) และโพเทนชิโอมิเตอร์ ESP32 เป็นไมโครคอนโทรลเลอร์ที่ทรงพลังซึ่งมี Wi-Fi และ Bluetooth ในตัว ทำให้เหมาะสำหรับโปรเจกต์ IoT สามารถควบคุมอุปกรณ์ต่างๆ รวมถึงมอเตอร์ได้อย่างแม่นยำสูง
มอเตอร์เซอร์โว SG90 เป็นส่วนประกอบที่ใช้กันอย่างแพร่หลายซึ่งสามารถหมุนได้ประมาณ 270 องศา มอเตอร์ทำงานบนสัญญาณมอดูเลตความกว้างพัลส์ (PWM) โดยที่มุมการหมุนจะถูกกำหนดโดยความกว้างของพัลส์ที่ส่งไปยังมอเตอร์ โพเทนชิโอมิเตอร์ทำหน้าที่เป็นตัวต้านทานแบบปรับค่าได้ ช่วยให้คุณปรับแรงดันไฟฟ้าที่ส่งไปยัง ESP32 ซึ่งจะควบคุมตำแหน่งของเซอร์โว
รายละเอียดจากดาต้าชีต
| ผู้ผลิต | SG |
|---|---|
| หมายเลขชิ้นส่วน | SG90 |
| แรงดันไฟฟ้าลอจิก/IO | 3.3 V (ESP32) |
| แรงดันไฟฟ้าจ่าย | 5 V |
| กระแสเอาต์พุต (ต่อช่อง) | 1.2 A |
| กระแสสูงสุด (ต่อช่อง) | 2.5 A |
| คำแนะนำความถี่ PWM | 50 Hz |
| เกณฑ์แรงดันไฟฟ้าอินพุตลอจิก | 0.2 V (ต่ำ), 2.5 V (สูง) |
| แรงดันตก / RDS(on) / ความอิ่มตัว | 0.5 V |
| ขีดจำกัดความร้อน | 85 °C สูงสุด |
| แพ็คเกจ | พลาสติก |
| หมายเหตุ / รุ่นต่างๆ | มีจำหน่ายในประเภทเกียร์ที่แตกต่างกัน |
- ตรวจสอบให้แน่ใจว่าเซอร์โวได้รับพลังงานด้วยแรงดันไฟฟ้าที่เหมาะสม (5V)
- เชื่อมต่อกราวด์ของเซอร์โวเข้ากับกราวด์ของ ESP32 เพื่อให้มีจุดอ้างอิงร่วมกัน
- ใช้สัญญาณ PWM ที่เหมาะสมเพื่อควบคุมตำแหน่งของเซอร์โว
- ระวังความต้องการกระแสของเซอร์โว ใช้แหล่งจ่ายไฟภายนอกหากจำเป็น
- ตรวจสอบการกำหนดพินที่ถูกต้องเมื่อเดินสายไฟเพื่อหลีกเลี่ยงการกำหนดค่าที่ผิดพลาด
คำแนะนำการเดินสายไฟ

ในการเดินสายไฟมอเตอร์เซอร์โวและโพเทนชิโอมิเตอร์เข้ากับ ESP32 ให้เริ่มต้นโดยเชื่อมต่อสายกราวด์ของเซอร์โว (โดยทั่วไปเป็นสีดำหรือสีน้ำตาล) เข้ากับพินกราวด์พินใดพินหนึ่งบน ESP32 จากนั้นเชื่อมต่อสายไฟ (โดยทั่วไปเป็นสีแดง) ของเซอร์โวเข้ากับพิน 5V บน ESP32 สุดท้าย เชื่อมต่อสายสัญญาณ (โดยทั่วไปเป็นสีส้มหรือสีขาว) จากเซอร์โวเข้ากับพิน 25 บน ESP32
สำหรับโพเทนชิโอมิเตอร์ ให้เชื่อมต่อพินด้านนอกหนึ่งพินเข้ากับพิน 3.3V บน ESP32 และพินด้านนอกอีกพินเข้ากับกราวด์ พินตรงกลางของโพเทนชิโอมิเตอร์ควรเชื่อมต่อกับพิน 34 บน ESP32 การตั้งค่านี้ช่วยให้ ESP32 อ่านค่าแรงดันไฟฟ้าที่แปรผันจากโพเทนชิโอมิเตอร์ ซึ่งจะใช้ในการควบคุมตำแหน่งของเซอร์โว
ตัวอย่างโค้ดและคำอธิบาย
ตัวอย่างโค้ดต่อไปนี้เริ่มต้นเซอร์โวและตั้งค่าพารามิเตอร์สำหรับควบคุมการเคลื่อนที่:
#include
Servo myServo;
const int servoPin = 25;
const int minPulseWidth = 500; // 0.5 ms
const int maxPulseWidth = 2500; // 2.5 ms
void setup() {
myServo.attach(servoPin, minPulseWidth, maxPulseWidth);
myServo.setPeriodHertz(50); // เซอร์โวมาตรฐาน 50Hz
}
ในโค้ดนี้ เรารวมไลบรารี ESP32Servo และสร้างอินสแตนซ์ของเซอร์โวด้วยชื่อ myServo เรากำหนดหมายเลขพินสำหรับเซอร์โวและตั้งค่าความกว้างพัลส์ต่ำสุดและสูงสุดที่สอดคล้องกับขีดจำกัดมุมของเซอร์โว
ต่อไป มาดูลูปที่เคลื่อนเซอร์โวไปมาอย่างต่อเนื่อง:
void loop() {
for (int angle = 0; angle <= 180; angle++) {
int pulseWidth = map(angle, 0, 180, minPulseWidth, maxPulseWidth);
myServo.writeMicroseconds(pulseWidth);
delay(15);
}
for (int angle = 180; angle >= 0; angle--) {
int pulseWidth = map(angle, 0, 180, minPulseWidth, maxPulseWidth);
myServo.writeMicroseconds(pulseWidth);
delay(15);
}
}
ลูปนี้จะค่อยๆ เปลี่ยนมุมจาก 0 ถึง 180 องศาและกลับมาอีกครั้ง โดยใช้ฟังก์ชัน map เพื่อแปลงมุมเป็นความกว้างพัลส์ที่สอดคล้องกันสำหรับเซอร์โว การเปลี่ยนแปลงแต่ละครั้งจะตามด้วยการหน่วงเวลาสั้นๆ เพื่อให้เซอร์โวเคลื่อนที่ไปยังตำแหน่งใหม่ได้อย่างราบรื่น
การสาธิต / สิ่งที่คาดหวัง
เมื่อทุกอย่างเชื่อมต่อและอัปโหลดโค้ดแล้ว คุณควรเห็นมอเตอร์เซอร์โวเคลื่อนที่อย่างราบรื่นจาก 0 ถึง 180 องศาและกลับมา หากคุณปรับโพเทนชิโอมิเตอร์ เซอร์โวควรสะท้อนตำแหน่งใหม่ตามแรงดันไฟฟ้าที่โพเทนชิโอมิเตอร์ให้มา ระวังการกลับขั้วเมื่อเดินสายไฟ เนื่องจากอาจทำให้ส่วนประกอบเสียหายได้ (ในวิดีโอที่ 3:45)
ไทม์สแตมป์ของวิดีโอ
- 00:00 เริ่มต้น
- 1:56 มอเตอร์เซอร์โวคืออะไร
- 5:00 หน้าเอกสาร
- 6:33 อธิบายการเดินสายไฟสำหรับเซอร์โว
- 7:45 การเลือกพอร์ต COMP สำหรับ ESP32 ใน Arduino IDE
- 9:27 อธิบายโค้ด Arduino
- 14:31 สาธิตการควบคุมเซอร์โวโดยใช้ ESP32
- 16:04 การจ่ายไฟให้เซอร์โวนอกเหนือจาก 5V
- 18:47 การควบคุมเซอร์โวโดยไม่ใช้ลูป
- 20:15 การควบคุมเซอร์โวด้วยโพเทนชิโอมิเตอร์
- 21:37 อธิบายโค้ด Arduino สำหรับเซอร์โวกับโพเทนชิโอมิเตอร์
#include <ESP32Servo.h>
// Define the servo and the pin it is connected to
Servo myServo;
const int servoPin = 25;
// Define the minimum and maximum pulse widths for the servo
const int minPulseWidth = 500; // 0.5 ms
const int maxPulseWidth = 2500; // 2.5 ms
void setup() {
// Attach the servo to the specified pin and set its pulse width range
myServo.attach(servoPin, minPulseWidth, maxPulseWidth);
// Set the PWM frequency for the servo
myServo.setPeriodHertz(50); // Standard 50Hz servo
}
void loop() {
// Rotate the servo from 0 to 180 degrees
for (int angle = 0; angle <= 180; angle++) {
int pulseWidth = map(angle, 0, 180, minPulseWidth, maxPulseWidth);
myServo.writeMicroseconds(pulseWidth);
delay(15);
}
// Rotate the servo from 180 to 0 degrees
for (int angle = 180; angle >= 0; angle--) {
int pulseWidth = map(angle, 0, 180, minPulseWidth, maxPulseWidth);
myServo.writeMicroseconds(pulseWidth);
delay(15);
}
}
Common Course Links
Common Course Files
แหล่งข้อมูลและเอกสารอ้างอิง
-
เอกสารESP32 Tutorial 17/55- SunFunder Servo motor documentationdocs.sunfounder.com
ไฟล์📁
แผ่นข้อมูล (pdf)
-
DS5160 Servo motor datasheet
DS5160_datasheet.pdf0.33 MB
ไฟล์อื่น ๆ
-
Download SG90 datasheet (PDF)
robojax-servo-sg90_datasheet.pdf