- ESP32 RC Cars là hệ thống camera điều khiển từ xa dựa trên ESP32-CAM, triển khai đồng thời phát trực tuyến video thời gian thực và điều khiển động cơ·servo qua WebSocket
- Ứng dụng máy chủ Python quản lý giao tiếp WebSocket và cung cấp giao diện web để xem video từ thiết bị ESP32 và điều khiển thiết bị từ trình duyệt
- Các tính năng chính gồm phát trực tiếp video từ ESP32-CAM, điều khiển động cơ·servo bằng lệnh WebSocket, tự động timeout đưa thiết bị về trạng thái mặc định khi không nhận được lệnh điều khiển, và canvas video cho nhiều client
- Phần cứng cần có gồm AI Thinker hoặc ESP32-CAM tương thích, động cơ·servo kết nối với GPIO, nguồn 5V ổn định và mạng Wi‑Fi; thẻ SD là tùy chọn
- Các lệnh điều khiển có dạng
MOTOR:<speed>, SERVO:<angle>, CONTROL:<speed>:<angle>; máy chủ sắp xếp khung hình video từ nhiều client ESP32 theo dạng lưới và phát tới giao diện web
Tổng quan dự án
- ESP32 RC Cars là ví dụ về hệ thống camera điều khiển từ xa dựa trên ESP32
- ESP32-CAM truyền video thời gian thực qua WebSocket, còn động cơ và servo được điều khiển bằng lệnh WebSocket
- Ứng dụng máy chủ Python quản lý giao tiếp WebSocket và cho phép xem, điều khiển thiết bị ESP32 từ giao diện web
- Video demo: https://youtu.be/OubYFXmvA1E
Tính năng chính
- Gửi phát trực tiếp video từ ESP32-CAM tới máy chủ web
- Điều khiển từ xa động cơ và servo bằng lệnh WebSocket
- Nếu không có lệnh điều khiển trong một khoảng thời gian nhất định, động cơ và servo sẽ tự động quay về trạng thái mặc định
- Máy chủ bố trí linh hoạt feed video của nhiều client lên canvas
Phần cứng và vật liệu
- Phần cứng cần thiết
- ESP32-CAM, module AI Thinker hoặc bo mạch tương thích
- Động cơ và servo kết nối với các chân GPIO phù hợp
- Nguồn 5V ổn định cho ESP32-CAM
- Mạng Wi‑Fi để liên lạc
- Tùy chọn thẻ SD nếu cần cho các chức năng khác
- Vật liệu sử dụng là các thành phần từ bộ kit mua trên AliExpress
- Khung gầm xe
- Bộ điều tốc điện tử
- Đã dùng bản 30A, đầu ra BEC là 5V 3A, có vẻ đủ dòng để chạy ESC và servo
- Giá đỡ pin
- 2 cell 18650 3.6V hoặc pack pin 7.4V
- Đã dùng cả hai; cell linh hoạt hơn cho các dự án khác
- ESP32-CAM
- Mẫu có ăng-ten ngoài là rất quan trọng, và dùng camera mắt cá 170 độ
- Bluetooth Gamepad
Cách đấu dây
- Tháo adapter JST 3 chân của servo đi kèm khung gầm xe, rồi chuyển sang đầu cắm JST 4 chân để có thể kết nối với ESP32
- Nối chung dây dương·âm của servo, rồi thêm đầu cắm JST cái 3 chân bằng dụng cụ bấm cos
- Kết nối dây điều khiển màu trắng của ESC với đầu cắm JST 4 chân và đầu cắm cái 3 chân
Cấu hình phần mềm
- Các thư viện dùng trong mã ESP32
WiFi.h: kết nối Wi‑Fi
ArduinoWebsockets.h: giao tiếp WebSocket
esp_camera.h: điều khiển camera ESP32-CAM
ServoControl.h, Esc.h: điều khiển servo và động cơ
Arduino.h: các hàm Arduino tiêu chuẩn
- Cài đặt các phụ thuộc cho máy chủ Python bằng lệnh sau
sudo apt install python3-aiohttp python3-opencv python3-numpy
Cấu hình và chạy
- Cấu hình firmware ESP32
- Thiết lập thông tin xác thực Wi‑Fi và URL máy chủ WebSocket trong
secrets.h
#define WIFI_SSID "YourWiFiSSID"
#define WIFI_PASSWORD "YourWiFiPassword"
#define WS_SERVER_URL "ws://YourServerIP:Port"
- Các chân GPIO của camera đã được cấu hình sẵn cho bo AI Thinker ESP32-CAM
- Nếu cần, chỉnh sửa chân động cơ và servo cho phù hợp với cấu hình phần cứng
- Cấu hình máy chủ Python
- Đặt script máy chủ trong cùng thư mục với tệp
index.html cho giao diện web
- Chạy máy chủ bằng lệnh sau
python3 app.py
Cách dùng và lệnh WebSocket
- Quy trình sử dụng ESP32
- Tải sketch được cung cấp lên ESP32-CAM bằng Arduino IDE hoặc nền tảng tương thích
- Kiểm tra đầu ra serial để xác nhận đã kết nối thành công với Wi‑Fi và máy chủ WebSocket
- Quy trình sử dụng máy chủ
- Chạy script máy chủ Python
- Mở giao diện web trên trình duyệt để xem luồng video trực tiếp
- Gửi lệnh điều khiển qua kết nối WebSocket
- Các lệnh được hỗ trợ
MOTOR:<speed>: đặt tốc độ động cơ, phạm vi từ -255 đến 255
SERVO:<angle>: đặt góc servo, phạm vi từ 0 đến 180
CONTROL:<speed>:<angle>: điều khiển đồng thời tốc độ động cơ và góc servo
Chi tiết hoạt động và khắc phục sự cố
- Các bước khởi tạo ESP32
- Kết nối với mạng Wi‑Fi đã chỉ định
- Cấu hình ESP32-CAM phù hợp cho truyền video
- Thiết lập kết nối WebSocket với máy chủ
- Xử lý timeout sẽ đưa tốc độ động cơ về
0 và góc servo về 90 nếu không có lệnh điều khiển trong một khoảng thời gian nhất định
- Máy chủ Python giao tiếp với nhiều client ESP32 qua WebSocket
- Máy chủ xử lý các khung hình video đầu vào, sắp xếp động theo dạng lưới rồi phát tới giao diện web
- Nếu có vấn đề kết nối, hãy kiểm tra thông tin xác thực Wi‑Fi trong
secrets.h, đồng thời xác nhận máy chủ WebSocket đang chạy và có thể truy cập được
- Nếu có vấn đề với luồng video, hãy kiểm tra nguồn cấp cho ESP32-CAM có phù hợp không và xác nhận cấu hình khởi tạo camera
- Dự án được phát hành theo MIT License
1 bình luận
Các ý kiến trên Hacker News
Dùng một điện thoại HTC Magic cũ làm camera + bộ phát Wi-Fi, rồi nối với Arduino qua cổng serial và level shifter để điều khiển servo và LED RGB
Kết nối không thật sự ổn định, nhưng khá vui; có lẽ giờ là lúc hồi sinh dự án với thế hệ vi điều khiển tiếp theo
Nếu bạn thích dự án, cách giúp ích lớn nhất là giới thiệu mình với ai đó đang tìm lập trình viên làm việc từ xa
Công việc chính của mình là lập trình viên Ruby on Rails, nhưng mình cũng có thể cân nhắc việc về robotics
Bài này đáng đọc: https://www.reddit.com/r/esp32/comments/r7kqtt/esp32cam_supe...
Trước khi áp dụng vài lời khuyên, tốc độ khung hình khá tệ
Hàn lại điện trở 0Ω gần như là một cuộc phiêu lưu, nhưng dù sao cũng đã nối đúng chân, và kết quả trông như thế này: https://imgur.com/a/LJflZ80
Mình đã thêm link ăng-ten đã dùng vào README
Phần mềm cơ bản có thể bắt đầu dễ dàng với khoảng 20 dòng mã C nếu dùng thư viện tay cầm Bluetooth
Sau đó mình thêm các tính năng để dễ điều khiển hơn; cách điều khiển 2 dải xích bằng 2 cần analog thì ổn ở tốc độ thấp, nhưng vì dùng 2 động cơ drone nên xe chạy gần tới 20km/h, cần một kiểu điều khiển khác
Cuối cùng, mình dùng cò của tay cầm DualShock để điều khiển trực tiếp từng dải xích với giới hạn vòng tua; còn khi chạy tốc độ cao thì dùng cần trái lên/xuống để tăng tốc và cần phải trái/phải để lái, để nó chạy như xe RC thông thường
Đây là video của cùng mẫu in 3D mình dùng làm nền tảng, từ 00:50 có thể thấy rõ tốc độ: https://www.youtube.com/watch?v=3Mv_tDY89Zw
Mình không rành chế tạo RC; thường người ta điều khiển thế nào? Có phải kết nối trực tiếp tay cầm PS4 với ESP không?
Mình tò mò độ trễ của dự án này khoảng bao nhiêu
Trong khi đó, phần video của quadcopter FPV lại bị chia tách. Một số dùng analog vì khi tín hiệu yếu đi thì nó suy giảm dần thay vì mất hẳn rồi kết nối lại; một số dùng truyền thông dựa trên 802.11, và thực tế khá cạnh tranh
Ví dụ, Walksnail Goggles dùng 802.11 cho liên kết video; tuy không thật sự mở hay được tài liệu hóa tốt, vẫn có những người đào sâu bên trong như các công trình của Chris Rosser
Độ trễ của cấu hình kiểu này có vẻ đủ tốt ngay cả cho các cuộc đua quadcopter tốc độ cao
[0] https://www.expresslrs.org
Và: https://github.com/gyrex/CrystalVideo
Tốc độ khung hình nhìn chung có vẻ bị giới hạn bởi việc ESP32 có thể chụp ảnh nhanh đến đâu
Khi đo FPS bằng script Python, mình nhận được khoảng 50fps từ các ESP32, và gần đây đã mua một router du lịch để thử nghiệm bên ngoài nhà
Có thể điều khiển từ xa khi nhìn feed video không? Lo lắng lớn nhất của mình là nó có vẻ quá chậm để tránh chướng ngại vật ở hầu hết các tốc độ
Khi có thời gian, mình định kết hợp hai thứ để điều khiển xe và xem cả feed camera trên màn hình
Nếu không cần kính cận hoặc có đeo kính áp tròng, combo DJI O4 “lite” và kính N3 là lựa chọn tốt hơn nhiều
Bài viết từ vài năm trước, nên giờ có thể đã có cách dễ hơn hoặc tốt hơn để đạt kết quả tương tự: https://hackaday.com/2021/10/25/fast-indoor-robot-watches-ce...
Chúng hoàn toàn không giống hình ảnh pha trộn giữa chó robot Boston Dynamics và Terminator trong phim, nhưng rất hữu ích cho những công việc “nhàm chán”, ít gây chú ý hơn như đặt mìn, kích nổ mìn, hoặc mang một lượng nhỏ nhu yếu phẩm cho binh sĩ đang ẩn nấp đâu đó trên tiền tuyến