ESP32-CAM - làm robot giám sát có camera stream về điện thoại

Hướng dẫn ESP32-CAM từ A-Z - cách nạp code không lỗi, stream video MJPEG về trình duyệt, gắn lên xe robot thành robot tuần tra FPV giá dưới 500k. Trong bài viết này, chúng ta sẽ cùng tìm hiểu chi tiết và ứng dụng thực tế trong robot.
ESP32-CAM là gì và bẫy đầu tiên khi mua
ESP32-CAM là bo ESP32 gắn sẵn camera OV2640 2MP và khe thẻ nhớ, giá chỉ 120.000-160.000 đ — con đường rẻ nhất để robot "có mắt": stream video về điện thoại, chụp ảnh khi phát hiện chuyển động, thậm chí nhận diện khuôn mặt cơ bản.
Bẫy khi mua: bo ESP32-CAM trần không có cổng USB. Phải mua kèm một trong hai: đế nạp MB (CH340 gắn sẵn, cắm là nạp — khuyến nghị) hoặc module USB-TTL rời (rẻ hơn nhưng phải đấu dây và bấm nút thủ công). Tìm mua "ESP32-CAM kèm đế nạp MB" chênh khoảng 30.000 đ, tiết kiệm cả buổi vật lộn.
Phần 1 - Nạp code ESP32-CAM lần đầu (chỗ khó nhất toàn dự án)
ESP32-CAM khó tính hơn hẳn DevKit thường. Quy trình chuẩn với đế MB:
- Cắm ESP32-CAM lên đế MB, cắm micro-USB vào máy tính
- Arduino IDE: Board chọn AI Thinker ESP32-CAM, Port chọn cổng COM mới
- Mở ví dụ có sẵn: File - Examples - ESP32 - Camera - CameraWebServer
- Trong tab đầu, chọn đúng model: bỏ comment dòng
#define CAMERA_MODEL_AI_THINKER, comment các model khác - Điền tên WiFi + mật khẩu nhà bạn vào 2 dòng ssid/password
- Upload. Nếu "Failed to connect": giữ nút IO0 trên đế (hoặc nối IO0 xuống GND) trong lúc Connecting, nạp xong rút dây IO0 và bấm RST
Với USB-TTL rời: 5V-5V, GND-GND, U0R-TX, U0T-RX (chéo), và IO0 nối GND khi nạp. Cấp nguồn 5V chân 5V — cấp 3.3V thường không đủ cho camera.
Mở Serial Monitor 115200, bấm RST — thấy dòng Camera Ready! Use 'http://192.168.x.x' là thành công. Mở địa chỉ đó bằng trình duyệt cùng mạng WiFi: giao diện chỉnh camera + nút Start Stream — video trực tiếp từ con bo bé bằng con tem.
Lỗi thường gặp riêng ESP32-CAM
| Lỗi | Nguyên nhân | Cách sửa |
|---|---|---|
| Brownout detector triggered | Nguồn USB yếu — camera ăn dòng đỉnh cao | Cổng USB khỏe, cáp ngắn; chạy pin thì buck 5V ≥ 2A |
| Camera init failed 0x20001 | Cáp camera lỏng hoặc sai model define | Mở lẫy nâu, cắm lại cáp ribbon, kiểm tra define AI_THINKER |
| Nạp xong màn hình toàn ký tự lạ | Quên rút IO0 khỏi GND rồi reset | Rút IO0, bấm RST |
| Stream được 30 giây rồi đứng | Nhiệt — chip nóng khi stream liên tục | Giảm khung hình xuống VGA, dán tản nhiệt nhôm nhỏ |
| Ảnh ám tím/hồng | Đặc tính OV2640 giá rẻ khi thiếu sáng | Bật đèn LED flash trên bo (GPIO 4) hoặc thêm sáng |
Phần 2 - Hiểu và rút gọn code stream
CameraWebServer mẫu khá đồ sộ. Cốt lõi chỉ là: khởi tạo camera → chụp khung hình liên tục → đẩy qua HTTP dạng MJPEG (chuỗi ảnh JPEG nối nhau, trình duyệt tự hiểu là video). Đoạn tối giản để nhúng stream vào dự án riêng:
// trong handler HTTP của bạn:
// content-type: multipart/x-mixed-replace; boundary=frame
while (client.connected()) {
camera_fb_t *fb = esp_camera_fb_get(); // chụp 1 khung
if (!fb) break;
client.printf("--frame\r\nContent-Type: image/jpeg\r\n"
"Content-Length: %u\r\n\r\n", fb->len);
client.write(fb->buf, fb->len); // đẩy JPEG thô
client.print("\r\n");
esp_camera_fb_return(fb); // BẮT BUỘC trả buffer
}Quên esp_camera_fb_return là hết bộ nhớ sau vài khung — lỗi treo bí ẩn số một khi tự viết. Cấu hình khung hình cân bằng cho robot: FRAMESIZE_VGA (640x480) + jpeg_quality 12 — mượt ~15-20 fps trên WiFi gần.
Phần 3 - Gắn lên xe: robot tuần tra FPV
Kiến trúc ghép với xe robot sẵn có (bài Cách làm robot dò line hoặc xe tránh vật cản):
- Phương án A - 2 bo (khuyến nghị): ESP32-CAM chỉ lo stream; ESP32 DevKit sẵn có lo motor + web điều khiển. Trang điều khiển nhúng
<img src="http://ip-cam:81/stream">cạnh các nút lái. Ưu: không đụng code xe, camera treo là xe vẫn chạy, nguồn tách bạch - Phương án B - 1 bo ESP32-CAM làm tất: tiết kiệm 1 bo nhưng chỉ còn vài GPIO trống (12, 13, 14, 15, 2) — đủ cho L298N nếu tằn tiện, và code stream + motor chung một nhân dễ khựng hình khi xe chạy. Chỉ chọn khi tối ưu chi phí là bắt buộc
Nguồn cho phương án A: pin 18650 x2 → buck 5V 3A → cấp song song cả hai bo (CAM ăn đỉnh ~600 mA khi stream + flash). Tổng chi phí robot FPV hoàn chỉnh từ xe sẵn có: thêm ~200.000 đ.
Chốt an toàn quen thuộc: xe nhận lệnh qua web phải có failsafe 600 ms (mất lệnh = dừng) — robot FPV chạy khuất tầm mắt càng bắt buộc.
Phần 4 - Ba hướng chơi tiếp
- Chụp ảnh khi có chuyển động: so sánh độ sáng trung bình giữa 2 khung liên tiếp, lệch quá ngưỡng → lưu JPEG vào thẻ SD kèm mốc thời gian — camera an ninh mini hoàn chỉnh
- Chồng dữ liệu telemetry lên trang stream: pin, khoảng cách HC-SR04 hiện cạnh video — dashboard FPV thực thụ, ghép kỹ thuật bài WiFi web server
- Nhận diện khuôn mặt: firmware mẫu có sẵn face detection (bật trong giao diện web) — chậm (~2-5 fps) nhưng là cửa ngõ trực quan vào computer vision cho học sinh; nhận diện vật thể nghiêm túc hơn thì chuyển ảnh về máy tính xử lý bằng Python
Câu hỏi thường gặp
Xem stream qua Internet (ngoài mạng nhà) được không?
Mặc định không — stream chạy trong mạng LAN. Cách an toàn cho người học: dùng VPN về mạng nhà (nhiều router có sẵn WireGuard), hoặc dịch vụ tunnel. KHÔNG mở port router trực tiếp cho ESP32-CAM: firmware mẫu không có xác thực đáng kể, phơi camera lên Internet công cộng là rủi ro riêng tư thật sự.
Quay video lưu lại được không hay chỉ xem trực tiếp?
Bo lưu được chuỗi ảnh JPEG vào thẻ SD tốt; ghi video MP4 liên tục vượt sức ESP32-CAM (không có encoder phần cứng H.264). Cần ghi hình liên tục: xem stream bằng phần mềm máy tính có chức năng record, hoặc nâng cấp hẳn lên Raspberry Pi + camera.
ESP32-CAM thay được bo DevKit trong các dự án thường không?
Về chip thì cùng ESP32, nhưng thiếu USB, ít GPIO trống, không có nút BOOT/EN tiện lợi — dùng làm bo học tập chính rất cực. Đúng vai của nó: module camera chuyên dụng trong hệ nhiều bo.
Ảnh mờ, chỉnh nét được không?
Được — ống kính OV2640 xoay được để lấy nét: xoay nhẹ vòng ren quanh ống kính (một số bo có keo cố định, lẩy nhẹ keo trước). Xoay từng chút khi đang xem stream đến khi nét ở khoảng cách làm việc của robot (thường 0.5-3 m).
Tài nguyên tải về
Tải bản PDF của bài viết để in giáo án hoặc gửi trước cho học viên.



