3 điểm bởi GN⁺ 2025-02-03 | 1 bình luận | Chia sẻ qua WhatsApp
  • 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
      • Dùng tay cầm PS4

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

 
GN⁺ 2025-02-03
Các ý kiến trên Hacker News
  • Từng làm một thứ tương tự 12 năm trước, khi đã có Arduino nhưng chưa có ESP32: https://newton-net-pl.translate.goog/2012/01/robot/?_x_tr_sl...
    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
  • Cảm ơn phản hồi về dự án; mình muốn tiếp tục phát triển và cũng muốn nhận PR
    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
  • Trước khi mua ESP32 CAM, nên cân nhắc mẫu có ăng-ten ngoài
    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ệ
    • Theo trang quản trị router, ngay khi hàn lại điện trở và gắn ăng-ten, nó tăng ngay từ mức 1Mbps không ổn định lên 20Mbps ổn định
      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
    • Theo kinh nghiệm làm dự án này, ăng-ten ngoài gần như là bắt buộc
      Mình đã thêm link ăng-ten đã dùng vào README
    • Có thể gợi ý mẫu cụ thể không?
  • Hay đấy. Mình đã làm một chiếc xe tăng RC bánh xích chạy bằng ESP32, kết nối Bluetooth với tay cầm PlayStation 4 để điều khiển
    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
    • Thật sự ấn tượng
      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?
  • Vấn đề lớn của FPV, và cũng là lý do nó mắc kẹt với công nghệ analog trong thời gian dài, là độ trễ
    Mình tò mò độ trễ của dự án này khoảng bao nhiêu
    • FPV ngày nay phần lớn dùng ExpressLRS[0], một giao thức mở cho liên kết điều khiển của quadcopter FPV, và thường cũng dùng ESP32
      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
    • Dự án liên quan: https://github.com/wooky/esp32-analog-video-over-wifi
      Và: https://github.com/gyrex/CrystalVideo
    • Mình không có mốc so sánh như trải nghiệm với drone FPV, nhưng trên mạng không dây trong nhà, độ trễ không thành vấn đề ngay cả khi mọi thiết bị gia dụng khác đều đang kết nối
      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à
  • Mình đang nghĩ làm một dự án tương tự nên muốn nghe kinh nghiệm về độ trễ
    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 độ
  • Năm ngoái mình đã mua cùng bộ kit đó, và gần đây cũng mua một tay cầm game ESP32 có màn hình nhỏ: https://github.com/01studio-lab/pyController
    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 kết quả quan trọng hơn niềm vui khi tự chế, thì ngày nay trên AliExpress có thể mua một chiếc xe RC 2,5 inch khá ổn với giá 30 USD, và camera analog 5.8GHz độc lập với giá 25 USD
    • Nếu “độc lập” nghĩa là camera tích hợp tất cả trong một, thì camera có VTX tích hợp thường còn tệ hơn analog thông thường, và vẫn cần kính analog
      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
  • Nếu muốn tự động hóa xe RC, bài này khá thú vị
    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...
  • Ai cũng biết quadcopter FPV được dùng trên chiến trường, nhưng sự quan tâm dành cho phương tiện mặt đất cũng đang tăng dần
    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