Hướng dẫn ESP32 17/55 - Điều khiển động cơ Servo bằng ESP32 và chiết áp - Bộ học IoT ESP32
Trong hướng dẫn này, chúng ta sẽ học cách điều khiển động cơ servo bằng vi điều khiển ESP32 và chiết áp từ bộ kit học tập IoT ESP32 của SunFounder. Kết thúc dự án này, bạn sẽ có thể điều chỉnh góc của động cơ servo một cách mượt mà bằng chiết áp, cho phép điều khiển chính xác. Đây là cách tuyệt vời để khám phá khả năng của ESP32 và cách nó giao tiếp với động cơ.

Khi đi sâu vào chi tiết, chúng ta sẽ đề cập đến các linh kiện phần cứng cần thiết, hướng dẫn đấu dây và các ví dụ mã để mọi thứ hoạt động. Để có hình ảnh trực quan hơn, hãy xem video liên quan đến hướng dẫn này (trong video ở phút 0:30).
Giải thích phần cứng
Các thành phần chính cho dự án này bao gồm vi điều khiển ESP32, động cơ servo (SG90) và chiết áp. ESP32 là một vi điều khiển mạnh mẽ có Wi-Fi và Bluetooth tích hợp, phù hợp cho các dự án IoT. Nó có khả năng điều khiển nhiều thiết bị khác nhau, bao gồm cả động cơ, với độ chính xác cao.
Động cơ servo SG90 là một linh kiện được sử dụng rộng rãi có thể xoay khoảng 270 độ. Nó hoạt động dựa trên tín hiệu điều chế độ rộng xung (PWM), trong đó góc quay được xác định bởi độ rộng của xung gửi đến. Chiết áp hoạt động như một điện trở biến đổi, cho phép bạn điều chỉnh điện áp gửi đến ESP32, từ đó điều khiển vị trí của servo.
Chi tiết datasheet
| Nhà sản xuất | SG |
|---|---|
| Số hiệu linh kiện | SG90 |
| Điện áp logic/IO | 3,3 V (ESP32) |
| Điện áp cấp nguồn | 5 V |
| Dòng điện đầu ra (mỗi kênh) | 1,2 A |
| Dòng điện đỉnh (mỗi kênh) | 2,5 A |
| Hướng dẫn tần số PWM | 50 Hz |
| Ngưỡng logic đầu vào | 0,2 V (thấp), 2,5 V (cao) |
| Sụt áp / RDS(on) / bão hòa | 0,5 V |
| Giới hạn nhiệt | 85 °C tối đa |
| Kiểu đóng gói | Nhựa |
| Ghi chú / biến thể | Có sẵn với các loại bánh răng khác nhau |
- Đảm bảo servo được cấp nguồn với điện áp phù hợp (5V).
- Kết nối chân mass của servo với mass của ESP32 để có chung tham chiếu.
- Sử dụng tín hiệu PWM phù hợp để điều khiển vị trí của servo.
- Lưu ý đến yêu cầu dòng điện của servo; sử dụng nguồn ngoài nếu cần thiết.
- Kiểm tra gán chân chính xác khi đấu dây để tránh cấu hình sai.
Hướng dẫn đấu dây

Để đấu dây động cơ servo và chiết áp với ESP32, bắt đầu bằng cách kết nối dây mass của servo (thường màu đen hoặc nâu) với một trong các chân mass trên ESP32. Tiếp theo, kết nối dây nguồn (thường màu đỏ) của servo với chân 5V trên ESP32. Cuối cùng, kết nối dây tín hiệu (thường màu cam hoặc trắng) từ servo với chân 25 trên ESP32.
Đối với chiết áp, kết nối một chân ngoài với chân 3.3V trên ESP32 và chân ngoài còn lại với mass. Chân giữa của chiết áp nên được kết nối với chân 34 trên ESP32. Cách thiết lập này cho phép ESP32 đọc điện áp thay đổi từ chiết áp, được sử dụng để điều khiển vị trí của servo.
Ví dụ mã & hướng dẫn chi tiết
Đoạn mã sau khởi tạo servo và đặt các tham số để điều khiển chuyển động của nó:
#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); // Servo tiêu chuẩn 50Hz
}
Trong mã này, chúng ta bao gồm thư viện ESP32Servo và tạo một đối tượng servo với tên myServo. Chúng ta định nghĩa số chân cho servo và đặt độ rộng xung tối thiểu và tối đa tương ứng với giới hạn góc của servo.
Tiếp theo, hãy xem vòng lặp liên tục di chuyển servo qua lại:
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);
}
}
Vòng lặp này dần dần thay đổi góc từ 0 đến 180 độ và quay lại, sử dụng hàm map để chuyển đổi góc thành độ rộng xung tương ứng cho servo. Mỗi thay đổi được theo sau bởi một độ trễ ngắn để cho phép servo đạt đến vị trí mới một cách mượt mà.
Trình diễn / Điều gì sẽ xảy ra
Khi mọi thứ đã được đấu dây và mã được tải lên, bạn sẽ thấy động cơ servo di chuyển mượt mà từ 0 đến 180 độ và quay lại. Nếu bạn điều chỉnh chiết áp, servo sẽ phản ánh vị trí mới dựa trên điện áp cung cấp từ chiết áp. Hãy cẩn thận với việc đảo cực khi đấu dây, vì nó có thể làm hỏng linh kiện của bạn (trong video ở phút 3:45).
Mốc thời gian video
- 00:00 Bắt đầu
- 1:56 Động cơ servo là gì
- 5:00 Trang tài liệu
- 6:33 Giải thích cách đấu dây cho servo
- 7:45 Chọn cổng COMP cho ESP32 trong Arduino IDE
- 9:27 Giải thích mã Arduino
- 14:31 Trình diễn điều khiển servo bằng ESP32
- 16:04 Cấp nguồn cho servo khác với 5V
- 18:47 Điều khiển Servo không dùng vòng lặp
- 20:15 Điều khiển Servo bằng chiết áp
- 21:37 Giải thích mã Arduino servo với chiết áp
#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
Tài nguyên & tài liệu tham khảo
-
Tài liệuESP32 Tutorial 17/55- SunFunder Servo motor documentationdocs.sunfounder.com
Tập tin📁
Bảng dữ liệu (pdf)
-
DS5160 Servo motor datasheet
DS5160_datasheet.pdf0.33 MB
Các tập tin khác
-
Download SG90 datasheet (PDF)
robojax-servo-sg90_datasheet.pdf