-
-
-
Tổng tiền thanh toán:
-
Thương hiệu: (Đang cập nhật ...) Loại: (Đang cập nhật ...)
Sau khi đã tìm hiểu tay cầm ESP32 ở Bài 2 và phần cứng Drone ESP32 ở Bài 3, chúng ta bắt đầu bước vào phần quan trọng nhất của lập trình Drone:
Điều khiển 4 động cơ bằng ESP32.
Trong bài này, mục tiêu chưa phải làm cho Drone bay. Chúng ta sẽ xây dựng nền tảng điều khiển motor trước:
ESP32 → PWM → Mạch công suất → Motor 1–4
Khi 4 motor có thể hoạt động độc lập và được điều chỉnh tốc độ, chúng ta mới có cơ sở để thực hiện Motor Mixing, MPU6050 và điều khiển Roll/Pitch/Yaw ở các bài sau.
Sau khi hoàn thành bài học, học viên có thể:
Mục tiêu cuối bài:
ESP32
│
├── PWM → Motor 1
├── PWM → Motor 2
├── PWM → Motor 3
└── PWM → Motor 4
Đây là kiến thức rất quan trọng.
Không nên kết nối trực tiếp motor Drone vào GPIO của ESP32.
GPIO của ESP32 chủ yếu tạo ra tín hiệu điều khiển.
Motor lại cần dòng điện lớn hơn nhiều so với khả năng cung cấp trực tiếp của GPIO.
Do đó, hệ thống cần tầng công suất.
ESP32
│
Tín hiệu PWM
↓
MOSFET / Driver
↓
Motor
↓
Cánh quạt
Với loại Drone Mini sử dụng motor DC chổi than như mẫu trong khóa học, mạch công suất trên PCB đảm nhiệm việc đóng/cắt dòng cấp cho motor.
PWM là viết tắt của:
Pulse Width Modulation – điều chế độ rộng xung.
Thay vì cấp một điện áp liên tục để thay đổi tốc độ motor, ESP32 tạo ra các xung điện đóng/ngắt rất nhanh.
Ví dụ:
PWM thấp:
__|‾|____|‾|____|‾|____
PWM trung bình:
__|‾‾‾|__|‾‾‾|__|‾‾‾|__
PWM cao:
_|‾‾‾‾‾|_|‾‾‾‾‾|_|‾‾‾‾‾|
Tỷ lệ thời gian tín hiệu ở mức HIGH được gọi là Duty Cycle.
Duty càng lớn → công suất trung bình cấp cho motor càng lớn → motor có xu hướng quay nhanh hơn.
Ví dụ đơn giản:
| Duty | Ý nghĩa |
|---|---|
| 0% | Motor tắt |
| 25% | Công suất thấp |
| 50% | Công suất trung bình |
| 75% | Công suất cao |
| 100% | PWM tối đa |
Đây chỉ là cách minh họa nguyên lý.
Tốc độ thực tế của motor không tỷ lệ tuyến tính tuyệt đối với Duty Cycle, vì còn phụ thuộc vào:
Drone quadcopter sử dụng 4 motor để tạo lực nâng và điều khiển tư thế.
Có thể hình dung:
M1
●
/ \
/ \
M2 ● ● M3
\ /
\ /
●
M4
Bốn motor không hoạt động độc lập hoàn toàn.
Chúng sẽ phối hợp với nhau để thực hiện:
Ví dụ khi cất cánh:
M1 ↑
M2 ↑
M3 ↑
M4 ↑
Cả bốn motor cùng tăng tốc → lực nâng tổng tăng.
Nhưng khi Drone cần nghiêng, tốc độ từng motor sẽ được thay đổi theo những mức khác nhau.
Phần này sẽ được nghiên cứu sâu ở Bài 7.
Trước khi lập trình, cần xác định chính xác 4 motor trên PCB thực tế.
Có thể đặt tên:
M1 – Motor 1
M2 – Motor 2
M3 – Motor 3
M4 – Motor 4
Tuy nhiên, M1/M2/M3/M4 chỉ là tên quy ước.
Không nên tự mặc định rằng:
M1 = GPIO X
M2 = GPIO Y
nếu chưa kiểm tra schematic hoặc firmware của chính PCB đang sử dụng.
Đối với khóa học LINHKIEN1993, nên xác định:
Motor
↓
MOSFET/Driver
↓
GPIO ESP32
trên đúng phiên bản PCB Drone Mini ESP32.
Một kênh motor có thể được hiểu theo sơ đồ:
ESP32 GPIO
│
│ PWM
↓
MOSFET
│
│ Dòng motor
↓
Motor
│
↓
Cánh quạt
Khi GPIO thay đổi PWM:
PWM thấp
↓
Motor quay chậm
PWM cao
↓
Motor quay nhanh
Như vậy ESP32 không trực tiếp "kéo" motor mà chỉ ra lệnh cho tầng công suất.
Với Arduino-ESP32 hiện nay, có thể sử dụng phần cứng PWM của ESP32 thông qua LEDC.
Ví dụ cơ bản:
#define MOTOR1_PIN 25
#define PWM_FREQ 20000
#define PWM_RES 8
void setup()
{
ledcAttach(MOTOR1_PIN, PWM_FREQ, PWM_RES);
}
void loop()
{
ledcWrite(MOTOR1_PIN, 128);
}
Trong ví dụ trên:
PWM frequency = 20 kHz
Resolution = 8 bit
Duty = 128
Với độ phân giải 8 bit:
0 → 0%
255 → 100%
Do đó:
ledcWrite(MOTOR1_PIN, 0);
là mức PWM bằng 0.
Trong khi:
ledcWrite(MOTOR1_PIN, 255);
là mức PWM tối đa theo cấu hình trên.
Lưu ý: GPIO
25trong ví dụ chỉ là GPIO minh họa. Khi lập trình PCB Drone LINHKIEN1993, phải thay bằng GPIO thực tế của motor trên schematic/firmware của board.
Trước tiên, không nên điều khiển cả 4 motor cùng lúc.
Hãy kiểm tra từng motor.
Ví dụ:
#define MOTOR1_PIN 25
void setup()
{
ledcAttach(MOTOR1_PIN, 20000, 8);
}
void loop()
{
ledcWrite(MOTOR1_PIN, 100);
delay(2000);
ledcWrite(MOTOR1_PIN, 0);
delay(2000);
}
Nguyên lý:
2 giây
↓
Motor chạy
2 giây
↓
Motor dừng
Lặp lại
Mục tiêu đầu tiên là xác nhận:
ESP32 → Driver → Motor hoạt động đúng.
Chúng ta có thể tăng PWM theo từng bước.
for (int pwm = 0; pwm <= 255; pwm++)
{
ledcWrite(MOTOR1_PIN, pwm);
delay(20);
}
Sau đó giảm xuống:
for (int pwm = 255; pwm >= 0; pwm--)
{
ledcWrite(MOTOR1_PIN, pwm);
delay(20);
}
Motor sẽ thay đổi tốc độ theo giá trị PWM.
Có thể hình dung:
0
│
├── 50
│
├── 100
│
├── 150
│
├── 200
│
└── 255
Đây là bước đầu tiên để học viên hiểu điều khiển tốc độ motor bằng phần mềm.
Sau khi kiểm tra từng motor, chúng ta có thể tạo 4 kênh PWM.
Ví dụ cấu trúc chương trình:
#define MOTOR1_PIN 25
#define MOTOR2_PIN 26
#define MOTOR3_PIN 27
#define MOTOR4_PIN 14
#define PWM_FREQ 20000
#define PWM_RES 8
void setup()
{
ledcAttach(MOTOR1_PIN, PWM_FREQ, PWM_RES);
ledcAttach(MOTOR2_PIN, PWM_FREQ, PWM_RES);
ledcAttach(MOTOR3_PIN, PWM_FREQ, PWM_RES);
ledcAttach(MOTOR4_PIN, PWM_FREQ, PWM_RES);
}
void loop()
{
ledcWrite(MOTOR1_PIN, 100);
ledcWrite(MOTOR2_PIN, 100);
ledcWrite(MOTOR3_PIN, 100);
ledcWrite(MOTOR4_PIN, 100);
delay(3000);
ledcWrite(MOTOR1_PIN, 0);
ledcWrite(MOTOR2_PIN, 0);
ledcWrite(MOTOR3_PIN, 0);
ledcWrite(MOTOR4_PIN, 0);
delay(3000);
}
Các GPIO trên chỉ là ví dụ minh họa. Không nạp nguyên đoạn code này vào PCB Drone nếu chưa thay bằng GPIO đúng của board.
Thay vì viết lại nhiều dòng code, chúng ta có thể tạo một hàm:
void setMotors(int m1, int m2, int m3, int m4)
{
ledcWrite(MOTOR1_PIN, m1);
ledcWrite(MOTOR2_PIN, m2);
ledcWrite(MOTOR3_PIN, m3);
ledcWrite(MOTOR4_PIN, m4);
}
Sau đó:
setMotors(100, 100, 100, 100);
có nghĩa:
M1 = 100
M2 = 100
M3 = 100
M4 = 100
Hoặc:
setMotors(100, 120, 100, 120);
thì mỗi motor có giá trị PWM riêng.
Đây chính là nền tảng để sau này xây dựng Motor Mixing.
Nếu chỉ có:
setMotors(100,100,100,100);
chúng ta mới chỉ điều khiển được tốc độ tổng thể.
Drone thực tế cần nhiều hơn thế.
Ví dụ hệ thống cần tạo một chuyển động Roll:
M1 = 110
M2 = 130
M3 = 110
M4 = 130
Đây chỉ là ví dụ minh họa về nguyên lý, không phải công thức điều khiển chính thức cho PCB này.
Thuật toán thực tế phải phụ thuộc vào:
Motor Mixing là cầu nối giữa:
Lệnh điều khiển → tốc độ từng motor.
Ví dụ:
THROTTLE
│
↓
ROLL ───────→ MOTOR MIXING ←────── YAW
↑
│
PITCH
│
┌─────────┼─────────┐
↓ ↓ ↓
M1 M2 M3 M4
Đầu vào:
Throttle
Roll
Pitch
Yaw
Đầu ra:
Motor 1
Motor 2
Motor 3
Motor 4
Ở Bài 4 chúng ta chưa cần triển khai đầy đủ Motor Mixing.
Mục tiêu hiện tại là đảm bảo 4 kênh motor có thể nhận lệnh độc lập.
Không nên để chương trình cho motor chạy bất kỳ giá trị nào mà không giới hạn.
Có thể tạo hàm:
int limitPWM(int value)
{
if (value < 0)
value = 0;
if (value > 255)
value = 255;
return value;
}
Sau đó:
value = limitPWM(value);
Điều này giúp tránh tình trạng giá trị điều khiển vượt khỏi phạm vi PWM đã cấu hình.
Trong firmware Drone hoàn chỉnh, chúng ta sẽ cần thêm các giới hạn an toàn khác.
Một bài thực hành đơn giản:
for (int pwm = 0; pwm <= 150; pwm++)
{
setMotors(pwm, pwm, pwm, pwm);
delay(20);
}
delay(1000);
setMotors(0, 0, 0, 0);
Mục đích:
Kiểm tra 4 motor có phản ứng đồng đều hay không.
Quan sát:
Đây là cách tiếp cận rất quan trọng trong quá trình debug phần cứng.
Trong quá trình lập trình và kiểm tra motor trên bàn:
Nên tháo cánh quạt trước khi test motor.
Đặc biệt không nên vừa debug firmware vừa cầm Drone trên tay.
Quy trình an toàn:
Tắt nguồn
↓
Tháo cánh quạt
↓
Kiểm tra PCB
↓
Cấp nguồn
↓
Nạp firmware
↓
Test PWM
↓
Test từng motor
↓
Tắt nguồn
↓
Kiểm tra lại
Chỉ tiến hành kiểm tra bay khi đã hoàn thành các bước kiểm tra cần thiết và có khu vực thử nghiệm phù hợp.
Đối với quadcopter, chiều quay của từng motor rất quan trọng.
Không chỉ cần:
Motor chạy.
Mà cần:
Motor chạy đúng chiều theo thiết kế của Drone.
Ví dụ quy ước:
M1 ↻
M2 ↺ M3 ↺
M4 ↻
Đây chỉ là sơ đồ minh họa. Không được lấy chiều quay này làm quy định cho PCB LINHKIEN1993 nếu chưa đối chiếu thiết kế thực tế.
Nếu motor quay sai chiều, có thể xảy ra:
Trong quá trình debug, Serial Monitor là công cụ rất hữu ích.
Ví dụ:
Serial.begin(115200);
Serial.println("Motor Test Start");
Sau đó:
Motor 1 = 100
Motor 2 = 100
Motor 3 = 100
Motor 4 = 100
Nếu muốn chuyên nghiệp hơn, có thể xây dựng giao diện lệnh:
M1 100
M2 150
M3 200
M4 50
ESP32 nhận lệnh từ máy tính và điều khiển motor tương ứng.
Đây là một bài thực hành rất tốt cho sinh viên lập trình nhúng.
Firmware thực tế sẽ không chỉ có:
setMotors();
Mà sẽ phát triển thành kiến trúc:
MAIN LOOP
│
┌─────────────┼─────────────┐
↓ ↓ ↓
ESP-NOW MPU6050 Safety
│ │ │
└─────────────┼─────────────┘
↓
CONTROL INPUT
↓
MOTOR MIXING
↓
MOTOR LIMIT / MAP
↓
MOTOR OUTPUT
┌──────┼──────┐
↓ ↓ ↓
M1 M2 M3 M4
Đây mới là kiến trúc hướng đến của khóa học.
Có thể kiểm tra:
Kiểm tra:
GPIO M1
GPIO M2
GPIO M3
GPIO M4
và kiểm tra riêng từng tầng công suất.
Có thể liên quan đến:
Kiểm tra:
Đây là lỗi rất đáng chú ý.
Có thể liên quan đến:
Khi gặp lỗi này, không nên chỉ sửa code.
Cần kiểm tra cả phần cứng nguồn.
Học viên cần hoàn thành 5 bước:
Xác định GPIO điều khiển:
M1 → GPIO ?
M2 → GPIO ?
M3 → GPIO ?
M4 → GPIO ?
Nạp chương trình PWM.
Test từng motor:
M1 → ON/OFF
M2 → ON/OFF
M3 → ON/OFF
M4 → ON/OFF
Điều chỉnh PWM:
50
100
150
200
và quan sát phản hồi.
Test đồng thời:
M1 = 100
M2 = 100
M3 = 100
M4 = 100
Sau khi hoàn thành, học viên phải trả lời được:
ESP32 đã điều khiển được cả 4 motor độc lập hay chưa?
Sau bài học này, học viên cần hiểu được chuỗi:
ESP32
↓
GPIO / PWM
↓
MOSFET / Motor Driver
↓
Motor
↓
Cánh quạt
Và quan trọng hơn:
M1 ──┐
M2 ──┤
M3 ──┼──→ Có thể điều khiển độc lập
M4 ──┘
Đây là nền tảng để chuyển từ điều khiển một motor sang điều khiển toàn bộ hệ thống quadcopter.
Ở Bài 4, chúng ta chưa cố làm Drone bay ngay.
Chúng ta đi theo đúng tư duy của một kỹ sư:
Hiểu phần cứng → kiểm tra từng khối → điều khiển từng motor → điều khiển 4 motor → sau đó mới ghép thuật toán bay.
Chuỗi kiến thức hiện tại:
BÀI 1
Tổng quan Drone
↓
BÀI 2
Tay cầm ESP32
↓
BÀI 3
Phần cứng Drone
↓
BÀI 4
ESP32 + PWM + 4 Motor
↓
BÀI 5
ESP-NOW
↓
BÀI 6
Joystick → ESP-NOW → Drone
↓
BÀI 7
MPU6050 + Motor Mixing + hiệu chỉnh
↓
BÀI 8
Hoàn thiện & cất cánh
Trong bài tiếp theo, chúng ta sẽ tách hệ thống thành hai thiết bị:
ESP32 TAY CẦM
↕
ESP-NOW
↕
ESP32 DRONE
Mục tiêu là giúp hai ESP32 truyền dữ liệu trực tiếp với nhau, tạo nền tảng để sau đó truyền dữ liệu joystick từ tay cầm đến Drone.
Học điện tử → Học lập trình → Hiểu nguyên lý → Tự nghiên cứu
🌐 linhkien1993.com
📞 Zalo: 0367 547 577
📍 124/8 Võ Văn Hát, P. Long Trường, TP.HCM