Chọn pin, driver và mạch nguồn cho xe robot ESP32 dùng 2 motor 140 mini
- 1. Kết luận nhanh
- 2. Ước tính dòng tiêu thụ
- 3. So sánh các phương án pin
- 4. Driver đôi là gì, chọn loại nào
- 5. Cấp nguồn 5 V cho ESP32 bằng mạch buck
- 6. Sơ đồ nối dây
- 7. Lưu ý chống reset và an toàn pin
- 8. Code mẫu
- 9. Khi gắn thêm ESP32-CAM
- 10. Câu hỏi thường gặp
- Dùng 1 driver cho 2 motor được không?
- Pin 9V có dùng được không?
- Vì sao ESP32 bị reset khi motor chạy?
- Không có buck, cấp 7,4 V vào VIN được không?
- Vì sao giới hạn PWM khoảng 70 %?
- 11. Linh kiện đề xuất
Xe robot ESP32 với 2 motor 140 mini nên dùng pin 2S 7,4 V, một driver đôi TB6612FNG và mạch hạ áp 5 V: ước tính dòng, so sánh pin, driver, nối dây, chống reset và code mẫu.
Câu hỏi PYWORLD hay nhận: "Xe robot của em gồm 1 board ESP32 DevKit (chip nạp CH340), 2 motor DC 140 mini loại 3–6 V, sau này gắn thêm ESP32-CAM. Nên dùng pin gì, có cần 2 driver không?"
Bài này trả lời từng ý: ước tính dòng, chọn pin, chọn driver, cấp nguồn cho ESP32, nối dây, chống reset và code mẫu.
1. Kết luận nhanh
- Pin: 2 pin 18650 nối tiếp (2S, 7,4 V danh định, 8,4 V khi đầy), có mạch bảo vệ BMS 2S và công tắc.
- Driver: 1 driver đôi cho cả 2 motor, nên dùng TB6612FNG. Không cần 2 driver.
- Nguồn ESP32: 1 mạch hạ áp (buck converter) chỉnh 5,0 V vào chân VIN.
- Code: giới hạn PWM khoảng 70 % vì motor chỉ chịu 3–6 V.
2. Ước tính dòng tiêu thụ

Số liệu tham khảo, mỗi lô motor và pin sẽ khác:
| Thiết bị | Chạy bình thường | Đỉnh |
|---|---|---|
| Motor 140 mini (mỗi con) | không tải 0,1–0,3 A, có tải khoảng 0,5 A | kẹt (stall current) khoảng 1 A |
| ESP32 DevKit | 0,1–0,25 A | khoảng 0,5 A khi phát Wi-Fi |
| ESP32-CAM (thêm sau) | khoảng 0,2–0,3 A | 0,3–0,5 A |
| Tổng, chưa có ESP32-CAM | khoảng 1,2 A | khoảng 2,5 A |
| Tổng, có ESP32-CAM | khoảng 1,45 A | khoảng 3 A |

Pin 2500 mAh chạy được bao lâu? Nên chỉ dùng khoảng 80 %, tức 2000 mAh. Thời gian ≈ 2000 mAh ÷ dòng trung bình:
- chưa có ESP32-CAM: 2000 ÷ 1200 ≈ 1 giờ 40 phút chạy liên tục;
- có ESP32-CAM: 2000 ÷ 1450 ≈ 1 giờ 20 phút;
- xe đứng yên, chỉ ESP32 bật: khoảng 10 giờ.
Hai pin nối tiếp vẫn là 2500 mAh, chỉ có điện áp tăng gấp đôi. Pin, dây nguồn và công tắc nên chịu được ít nhất 3 A.
3. So sánh các phương án pin
| Phương án | Điện áp | Ưu điểm | Nhược điểm |
|---|---|---|---|
| Pin 9V vuông | 9 V | Gọn, dễ mua | Khoảng 400–600 mAh (tham khảo), không chịu được 1–2 A: không phù hợp |
| 4 pin AA | 6 V (kiềm), 4,8 V (NiMH) | Dễ mua | Sụt áp mạnh khi motor chạy, quá thấp để buck ra 5 V ổn định |
| 1S 18650 + mạch tăng áp (boost) | 3,7 V → 5 V | Nhẹ, sạc dễ | Mạch boost thông dụng ra 5 V chỉ khoảng 1,5 A, không gánh nổi 2 motor |
| 2S 18650 | 7,4 V (6,0–8,4 V) | Đủ áp cho driver và buck, chịu dòng tốt, sạc lại được | Cần BMS 2S, sạc đúng loại 8,4 V, giới hạn PWM |
| LiPo 2S | 7,4 V | Nhẹ, dòng xả rất cao | Cần sạc cân bằng, dễ phồng, cháy nếu dùng sai; hợp người đã có kinh nghiệm |

Vì sao pin 9V vuông không phù hợp
Pin 9V có điện trở trong lớn. Khi 2 motor khởi động kéo 1–2 A, điện áp tụt mạnh làm ESP32 reset, và dung lượng vài trăm mAh chỉ đủ chạy vài phút. Cách tính khối pin và chọn khay có trong bài ghép pin 18650 nối tiếp, song song.
4. Driver đôi là gì, chọn loại nào
Mỗi motor DC cần một mạch H-bridge: 4 công tắc bán dẫn đảo chiều dòng điện để motor quay tiến hoặc lùi; tín hiệu PWM bật tắt rất nhanh để chỉnh tốc độ. Driver đôi có 2 H-bridge (kênh A, kênh B) trên một mạch, nên 1 driver điều khiển được 2 motor.

| Driver | Điện áp motor | Dòng mỗi kênh | Sụt áp | Giá tương đối |
|---|---|---|---|---|
| TB6612FNG | 2,5–13,5 V | 1,2 A, đỉnh 3,2 A | Thấp, khoảng 0,2–0,5 V | Trung bình |
| MX1508 | khoảng 2–10 V | khoảng 1,5 A | Thấp | Rẻ nhất |
| L9110S | 2,5–12 V | 0,8 A | Khoảng 0,5–1 V | Rẻ |
| L298N | 5–35 V | 2 A | Khoảng 2 V | Trung bình, mạch to |
Số liệu tham khảo, đối chiếu thông số của đúng module.
- TB6612FNG dùng MOSFET nên ít hao áp, mát, logic 3,3 V như ESP32, có chân STBY tắt cả hai motor: phù hợp nhất cho motor 140.
- MX1508 rẻ, nhỏ, nhưng pin 2S đầy 8,4 V đã gần mức tối đa. L9110S chỉ chịu 0,8 A, thấp hơn dòng kẹt 1 A của motor.
- L298N mất khoảng 2 V trên driver: pin 7,4 V chỉ còn khoảng 5,4 V tới motor, motor nhỏ chạy yếu, driver nóng. L298N hợp motor lớn, nguồn 12 V hơn (xem bài ESP32 điều khiển động cơ DC với L298N).
5. Cấp nguồn 5 V cho ESP32 bằng mạch buck
- Dùng LM2596 (vào 4–40 V, khoảng 2 A) hoặc MP1584 (vào 4,5–28 V, có bản cố định 5 V). Mini-360 nhỏ nhưng dòng thấp hơn, không đủ khi thêm ESP32-CAM.
- Chỉnh ra 5,0 V bằng đồng hồ trước khi nối, rồi nối 5 V vào VIN, GND vào GND.
- Không cấp 7,4 V vào chân 3V3: chân này nối thẳng vào chip, quá 3,6 V là hỏng ESP32.
- Buck cần điện áp vào cao hơn ngõ ra khoảng 1,5–2 V (tham khảo). Pin 2S xuống khoảng 6,6–7 V thì 5 V bắt đầu tụt: lúc đó nên sạc.
- Khi cắm USB để nạp code hoặc xem Serial Monitor, tạm rút dây 5 V từ buck vào VIN, giữ GND chung, để không có hai nguồn 5 V cùng cấp vào board.

Chi tiết các đường nguồn trên board: bài cấp nguồn cho ESP32 đúng cách và lỗi brownout.
6. Sơ đồ nối dây

| Từ | Tới | Ghi chú |
|---|---|---|
| Pin 2S cực + | Công tắc | Chịu ít nhất 3 A |
| Công tắc | TB6612FNG VM, buck IN+ | Tụ 470–1000 µF sát chân VM |
| Buck OUT+ (5,0 V) | ESP32 VIN | Chỉnh 5,0 V trước khi nối |
| ESP32 3V3 | TB6612FNG VCC | Nguồn logic 3,3 V |
| ESP32 D27, D26, D25 | PWMA, AIN1, AIN2 | Motor trái (kênh A) |
| ESP32 D13, D33, D32 | PWMB, BIN1, BIN2 | Motor phải (kênh B) |
| ESP32 D4 | STBY | HIGH thì driver làm việc |
| AO1, AO2 / BO1, BO2 | Motor trái / phải | Tụ 100 nF giữa hai chân motor |
| Pin − | GND driver, buck, ESP32 | GND chung |

Các chân giống bài xe robot ESP32 điều khiển bằng điện thoại. Nếu đổi chân: không dùng GPIO 6–11 (nối bộ nhớ flash); cẩn thận GPIO 0, 2, 12, 15 vì mức điện áp lúc bật nguồn quyết định chế độ khởi động; GPIO 34–39 chỉ đọc vào, không xuất PWM. Xem thêm sơ đồ chân ESP32 DevKit V1.
7. Lưu ý chống reset và an toàn pin
- Nối chung GND của pin, driver, buck, ESP32 và ESP32-CAM.
- Tụ gốm 100 nF hàn thẳng vào hai chân mỗi motor để giảm nhiễu chổi than.
- Tụ hóa 470–1000 µF (≥ 16 V) sát chân VM: bù dòng lúc motor khởi động, điện áp không tụt đột ngột, ESP32 không reset.
- Cho motor tăng tốc dần (code mẫu tăng trong khoảng 300 ms).
- Dùng pin có mạch bảo vệ hoặc BMS 2S; hai pin cùng loại, cùng mức điện áp trước khi ghép.
- Sạc đúng loại: mạch sạc 2S (8,4 V) hoặc bộ sạc cân bằng, không dùng mạch sạc 1S hay nối thẳng củ sạc 5 V. Xem bài mạch sạc pin 2S, 3S, 4S từ Type-C 5 V.

8. Code mẫu
Bài dùng gói esp32 phiên bản 3.3.10, không cần thư viện ngoài. Chọn board DOIT ESP32 DEVKIT V1, nạp code, mở Serial Monitor 115200 baud, gõ w tiến, s lùi, a trái, d phải, x dừng, 1–9 đổi tốc độ.
// PYWORLD.VN - Xe robot ESP32 DevKit + driver đôi TB6612FNG + 2 motor 140 mini
// PYWORLD.VN - Tiến, lùi, rẽ bằng PWM (LEDC, gói esp32 3.x: ledcAttach, ledcWrite)
// PYWORLD.VN - Thử bằng Serial Monitor 115200: w tiến, s lùi, a trái, d phải, x dừng, 1-9 tốc độ
// ----- Chân nối: giống bài xe robot dùng L298N (bánh trái 27/26/25, bánh phải 13/33/32) -----
const int PWMA = 27; // tốc độ motor trái (kênh A)
const int AIN1 = 26;
const int AIN2 = 25;
const int PWMB = 13; // tốc độ motor phải (kênh B)
const int BIN1 = 33;
const int BIN2 = 32;
const int STBY = 4; // HIGH: driver làm việc; LOW: ngắt cả hai motor
// ----- PWM -----
const uint32_t TAN_SO_PWM = 20000; // 20 kHz: motor không kêu rít
const uint8_t DO_PHAN_GIAI = 10; // 10 bit: duty 0..1023
const int DUTY_MAX = (1 << DO_PHAN_GIAI) - 1;
// Pin 2S đầy là 8,4 V, motor 140 mini định mức 3-6 V:
// giới hạn duty để điện áp trung bình lên motor khoảng 6 V.
const float DIEN_AP_PIN_DAY = 8.4;
const float DIEN_AP_MOTOR_MAX = 6.0;
const int DUTY_GIOI_HAN = (int)(DUTY_MAX * DIEN_AP_MOTOR_MAX / DIEN_AP_PIN_DAY); // khoảng 730
int tocDo = 70; // % của mức giới hạn, đổi bằng phím 1-9
int hienTrai = 0, hienPhai = 0; // tốc độ đang chạy (-100..100) của hai bánh
// Đặt một motor: phanTram > 0 quay tiến, < 0 quay lùi, = 0 thả trôi.
void datMotor(int chanPwm, int chanIn1, int chanIn2, int phanTram) {
phanTram = constrain(phanTram, -100, 100);
digitalWrite(chanIn1, phanTram > 0 ? HIGH : LOW);
digitalWrite(chanIn2, phanTram < 0 ? HIGH : LOW);
ledcWrite(chanPwm, (uint32_t)(abs(phanTram) * DUTY_GIOI_HAN / 100));
}
// Tăng/giảm tốc dần trong khoảng 300 ms: dòng khởi động nhỏ hơn, ESP32 ít bị reset.
void chayMem(int trai, int phai) {
const int SO_BUOC = 10;
int truocTrai = hienTrai, truocPhai = hienPhai;
for (int i = 1; i <= SO_BUOC; i++) {
datMotor(PWMA, AIN1, AIN2, truocTrai + (trai - truocTrai) * i / SO_BUOC);
datMotor(PWMB, BIN1, BIN2, truocPhai + (phai - truocPhai) * i / SO_BUOC);
delay(30);
}
hienTrai = trai;
hienPhai = phai;
}
void tien() { chayMem(tocDo, tocDo); }
void lui() { chayMem(-tocDo, -tocDo); }
void reTrai() { chayMem(-tocDo / 2, tocDo / 2); } // quay tại chỗ sang trái
void rePhai() { chayMem(tocDo / 2, -tocDo / 2); }
void dung() { chayMem(0, 0); }
void setup() {
Serial.begin(115200);
pinMode(STBY, OUTPUT);
digitalWrite(STBY, LOW); // giữ driver ở chế độ chờ khi đang cài đặt
for (int chan : {AIN1, AIN2, BIN1, BIN2}) {
pinMode(chan, OUTPUT);
digitalWrite(chan, LOW);
}
if (!ledcAttach(PWMA, TAN_SO_PWM, DO_PHAN_GIAI) || !ledcAttach(PWMB, TAN_SO_PWM, DO_PHAN_GIAI)) {
Serial.println("Loi: khong gan duoc PWM");
while (true) delay(1000);
}
ledcWrite(PWMA, 0);
ledcWrite(PWMB, 0);
digitalWrite(STBY, HIGH); // driver sẵn sàng
Serial.printf("San sang. Gioi han duty %d/%d (motor toi da %.1f V)\n", DUTY_GIOI_HAN, DUTY_MAX, DIEN_AP_MOTOR_MAX);
Serial.println("Lenh: w tien, s lui, a trai, d phai, x dung, 1-9 toc do");
}
void loop() {
if (!Serial.available()) return;
char lenh = Serial.read();
if (lenh >= '1' && lenh <= '9') {
tocDo = 20 + (lenh - '1') * 10; // 1 = 20 %, 9 = 100 %
Serial.printf("Toc do %d %%\n", tocDo);
return;
}
switch (lenh) {
case 'w': tien(); Serial.println("Tien"); break;
case 's': lui(); Serial.println("Lui"); break;
case 'a': reTrai(); Serial.println("Re trai"); break;
case 'd': rePhai(); Serial.println("Re phai"); break;
case 'x': dung(); Serial.println("Dung"); break;
}
}
ledcAttach(chân, 20000, 10): PWM 20 kHz, 10 bit (0–1023). Gói esp32 3.x thay cách dùng kênhledcSetupcủa bản 2.x.ledcWrite(chân, duty): đặt độ rộng xung;DUTY_GIOI_HANkhoảng 730/1023 giữ điện áp trung bình lên motor khoảng 6 V khi pin đầy.datMotor(): một chân IN mức HIGH, chân kia LOW để chọn chiều; cả hai LOW thì motor quay trơn rồi dừng.chayMem(): đổi tốc độ trong 10 bước để giảm dòng khởi động.
Bánh quay ngược thì đảo hai dây của motor đó. Xem thêm bài PWM trên ESP32.
9. Khi gắn thêm ESP32-CAM
- ESP32-CAM lấy 5 V từ buck vào chân 5V của nó; dòng đỉnh phía 5 V lên khoảng 1 A, nên dùng buck từ 2 A trở lên hoặc một buck riêng cho camera.
- Dây 5 V và GND tới ESP32-CAM ngắn, tiết diện lớn, thêm tụ 470–1000 µF sát chân 5V. Serial báo "Brownout detector was triggered" là nguồn chưa đủ.
- Không lấy nguồn ESP32-CAM từ chân 3V3 của DevKit.

10. Câu hỏi thường gặp
Dùng 1 driver cho 2 motor được không?
Được. Driver đôi có 2 kênh A, B, mỗi kênh một motor với tốc độ, chiều quay riêng.
Pin 9V có dùng được không?
Không nên: pin không cấp nổi 1–2 A, điện áp tụt làm ESP32 reset và hết pin sau vài phút.
Vì sao ESP32 bị reset khi motor chạy?
Lúc khởi động, motor kéo dòng gần bằng dòng kẹt làm điện áp tụt thoáng qua. Khắc phục bằng tụ ở VM và motor, GND chung, buck 5 V riêng cho ESP32, tăng tốc dần.
Không có buck, cấp 7,4 V vào VIN được không?
Nhiều board vẫn chạy, nhưng ổn áp trên board nóng và dễ quá tải khi thêm ESP32-CAM. Buck 5 V an toàn hơn. Tuyệt đối không nối 7,4 V vào 3V3.
Vì sao giới hạn PWM khoảng 70 %?
Motor 140 định mức 3–6 V, pin 2S đầy 8,4 V; 6 ÷ 8,4 ≈ 70 % giữ điện áp trung bình khoảng 6 V, motor đỡ nóng, bền hơn.
11. Linh kiện đề xuất
- 1 ESP32 DevKit V1 Type-C CH340.
- 1 khay pin 18650 loại 2S, 2 pin 18650 cùng loại, mạch bảo vệ BMS 2S.
- 1 mạch sạc pin 2S từ Type-C 5 V.
- 1 driver đôi TB6612FNG.
- 1 mạch hạ áp LM2596 hoặc MP1584 bản 5 V.
- 2 motor 140 mini, bánh xe, khung xe, 1 công tắc chịu ít nhất 3 A.
- 1 tụ hóa 470–1000 µF ≥ 16 V, 2 tụ gốm 100 nF, dây cắm test board.
Cần tư vấn chọn linh kiện cho xe robot, bạn có thể gọi hoặc nhắn Zalo cho PYWORLD SHOP qua số 0915703319.
Xem thêm