Chọn pin, driver và mạch nguồn cho xe robot ESP32 dùng 2 motor 140 mini

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ụ

Ảnh chụp các motor DC nhỏ có chổi than vỏ kim loại hai dây đỏ, cỡ gần với motor 140 mini, nằm cạnh một quạt tản nhiệt nhỏ
Motor DC nhỏ có chổi than, vỏ kim loại, cỡ gần với motor 140 mini dùng cho xe robot. Ảnh: Auledas, CC BY-SA 3.0, Wikimedia Commons, đã thu nhỏ.

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 Akẹt (stall current) khoảng 1 A
ESP32 DevKit0,1–0,25 Akhoảng 0,5 A khi phát Wi-Fi
ESP32-CAM (thêm sau)khoảng 0,2–0,3 A0,3–0,5 A
Tổng, chưa có ESP32-CAMkhoảng 1,2 Akhoảng 2,5 A
Tổng, có ESP32-CAMkhoảng 1,45 Akhoảng 3 A
Biểu đồ ước tính dòng tiêu thụ của hai motor 140 mini, ESP32 DevKit và ESP32-CAM, tổng dòng đỉnh khoảng 3 A và thời gian chạy với pin 2S 2500 mAh
Hình minh họa: dòng từng thiết bị và thời gian chạy ước lượng (số liệu tham khảo).

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ểmNhược điểm
Pin 9V vuông9 VGọn, dễ muaKhoảng 400–600 mAh (tham khảo), không chịu được 1–2 A: không phù hợp
4 pin AA6 V (kiềm), 4,8 V (NiMH)Dễ muaSụ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 VNhẹ, 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 186507,4 V (6,0–8,4 V)Đủ áp cho driver và buck, chịu dòng tốt, sạc lại đượcCần BMS 2S, sạc đúng loại 8,4 V, giới hạn PWM
LiPo 2S7,4 VNhẹ, dòng xả rất caoCầ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
Ảnh thực tế khay 2 pin 18650 nối tiếp có dây đỏ đen ra sẵn và mạch sạc pin 2S từ cổng Type-C 5 V, phân loại 2S 4A
Ảnh thực tế: khay 2 pin 18650 nối tiếp và mạch sạc pin 2S của shop.

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.

Mặt dưới module driver đôi TB6612FNG màu đỏ có in tên chân: bên trái PWMA, AIN2, AIN1, STBY, BIN1, BIN2, PWMB, GND; bên phải VM, VCC, GND, AO1, AO2, BO2, BO1, GND
Module TB6612FNG nhìn từ mặt dưới: hàng chân điều khiển ở bên trái, hàng chân nguồn và motor ở bên phải. Ảnh: Krishnav25, CC0, Wikimedia Commons, đã cắt và thu nhỏ.
DriverĐiện áp motorDòng mỗi kênhSụt ápGiá tương đối
TB6612FNG2,5–13,5 V1,2 A, đỉnh 3,2 AThấp, khoảng 0,2–0,5 VTrung bình
MX1508khoảng 2–10 Vkhoảng 1,5 AThấpRẻ nhất
L9110S2,5–12 V0,8 AKhoảng 0,5–1 VRẻ
L298N5–35 V2 AKhoảng 2 VTrung 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.
Ảnh thực tế ESP32 DevKit V1 chip nạp CH340 cổng Type-C, mạch hạ áp LM2596 và mạch hạ áp MP1584
Ảnh thực tế: ESP32 DevKit CH340 và hai mạch hạ áp 5 V của shop.

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

Sơ đồ khối nguồn xe robot ESP32: pin 2S 7,4 V qua công tắc tới chân VM của driver TB6612FNG và mạch buck 5 V, buck cấp chân VIN của ESP32, tụ 470–1000 µF ở VM, tụ 100 nF trên mỗi motor 140
Hình minh họa: đường nguồn và tụ lọc của xe robot.
TừTớiGhi chú
Pin 2S cực +Công tắcChịu ít nhất 3 A
Công tắcTB6612FNG VM, buck IN+Tụ 470–1000 µF sát chân VM
Buck OUT+ (5,0 V)ESP32 VINChỉnh 5,0 V trước khi nối
ESP32 3V3TB6612FNG VCCNguồn logic 3,3 V
ESP32 D27, D26, D25PWMA, AIN1, AIN2Motor trái (kênh A)
ESP32 D13, D33, D32PWMB, BIN1, BIN2Motor phải (kênh B)
ESP32 D4STBYHIGH thì driver làm việc
AO1, AO2 / BO1, BO2Motor trái / phảiTụ 100 nF giữa hai chân motor
Pin −GND driver, buck, ESP32GND chung
Sơ đồ nối dây ESP32 DevKit với driver TB6612FNG: D27 PWMA, D26 AIN1, D25 AIN2, D13 PWMB, D33 BIN1, D32 BIN2, D4 STBY, 3V3 vào VCC, hai motor 140 ở AO và BO
Hình minh họa: nối chân ESP32 DevKit với TB6612FNG, hai nhãn cùng chữ là một sợi dây.

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.
Hai mạch bảo vệ BMS cho pin lithium đặt trên thước đo, dài khoảng 6 cm, có các chân hàn B0, B1, B2, B3 nối các cell pin và chân P+, P− ra tải
Ảnh minh họa mạch bảo vệ BMS (loại 3S, dài khoảng 6 cm): chân B nối vào các cell pin, chân P+ và P− ra tải. Mạch 2S cho xe robot có cách đấu tương tự, ít hơn một cell. Ảnh: Retired electrician, CC0, Wikimedia Commons, đã thu nhỏ.

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ênh ledcSetup của bản 2.x.
  • ledcWrite(chân, duty): đặt độ rộng xung; DUTY_GIOI_HAN khoả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.
Module ESP32-CAM màu đen với camera OV2640, khe thẻ nhớ microSD, đèn LED trắng và hai hàng chân có chân 5V, GND ở góc trên bên trái
Module ESP32-CAM: camera OV2640 gắn trên khe thẻ nhớ, đèn LED trắng ở góc dưới, chân 5V và GND ở đầu hàng chân bên trái. Dấu đỏ trên ống kính và dấu vàng trên đèn LED do tác giả ảnh vẽ. Ảnh: Nowforever, CC BY-SA 4.0, Wikimedia Commons, đã thu nhỏ.

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

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.


Tin tức liên quan

Hướng dẫn dùng màn hình LCD 2004 I2C với ESP32
Hướng dẫn dùng màn hình LCD 2004 I2C với ESP32

Hướng dẫn nối màn hình LCD 2004 I2C (mạch PCF8574) với ESP32 DevKit V1, quét địa chỉ I2C, hiển thị 4 dòng chữ, tạo ký tự riêng, làm bộ đếm thời gian và đổi sang LCD 1602.

Hướng dẫn bắt đầu với Wemos D1 R2 (ESP8266) trên Arduino IDE
Hướng dẫn bắt đầu với Wemos D1 R2 (ESP8266) trên Arduino IDE

Hướng dẫn dùng Wemos D1 R2 (ESP8266 khung Arduino UNO) với Arduino IDE 2.x: sơ đồ chân, cài driver CH340 và gói board ESP8266, nạp code nháy LED, kết nối WiFi và xử lý lỗi thường gặp.

ESP32 làm mạch điều khiển bay cho flycam mini động cơ có chổi than: lọc bù, PID, bộ trộn, giá thử
ESP32 làm mạch điều khiển bay cho flycam mini động cơ có chổi than: lọc bù, PID, bộ trộn, giá thử

Dùng ESP32 làm mạch điều khiển bay cho flycam mini động cơ có chổi than: kênh MOSFET, bộ lọc bù, hai vòng PID, bộ trộn bốn động cơ, điều kiện an toàn và cách chỉnh PID trên giá thử.

Hướng dẫn ESP32 làm web server điều khiển relay 4 kênh qua WiFi
Hướng dẫn ESP32 làm web server điều khiển relay 4 kênh qua WiFi

Hướng dẫn dùng ESP32 DevKit V1 làm web server trong mạng WiFi nội bộ, mở trang trên điện thoại để bật, tắt module relay 4 kênh; có sơ đồ nối dây, code Arduino IDE và lưu ý an toàn.

Làm gateway LoRa sang MQTT bằng ESP32: node cảm biến chạy pin gửi dữ liệu về broker
Làm gateway LoRa sang MQTT bằng ESP32: node cảm biến chạy pin gửi dữ liệu về broker

Hướng dẫn làm hệ thống LoRa hoàn chỉnh với ESP32 và SX1278: node chạy pin đo điện áp, gửi gói rồi ngủ sâu; gateway nhận gói LoRa và publish dữ liệu JSON lên broker MQTT qua Wi-Fi.

Hướng dẫn ESP-NOW trên ESP32: truyền dữ liệu giữa hai mạch không cần router Wi-Fi
Hướng dẫn ESP-NOW trên ESP32: truyền dữ liệu giữa hai mạch không cần router Wi-Fi

Hướng dẫn dùng ESP-NOW để hai mạch ESP32 truyền dữ liệu trực tiếp không cần router: xem địa chỉ MAC, chương trình gửi, chương trình nhận, đọc RSSI và xử lý lỗi thường gặp.

Tưới cây tự động với ESP32: cảm biến độ ẩm đất, relay và bơm mini, ngưỡng có trễ
Tưới cây tự động với ESP32: cảm biến độ ẩm đất, relay và bơm mini, ngưỡng có trễ

Làm hệ thống tưới cây tự động với ESP32: cảm biến độ ẩm đất điện dung, hiệu chỉnh khô ướt, relay điều khiển bơm mini, ngưỡng có trễ, giới hạn thời gian bơm và thí nghiệm STEM.

Hướng dẫn lưu dữ liệu vào bộ nhớ flash của ESP32 bằng thư viện Preferences
Hướng dẫn lưu dữ liệu vào bộ nhớ flash của ESP32 bằng thư viện Preferences

Hướng dẫn dùng thư viện Preferences trên ESP32 với Arduino IDE để lưu số đếm, trạng thái relay và thông số cài đặt vào bộ nhớ flash, không mất khi tắt nguồn.


Bình luận
Đã thêm vào giỏ hàng