← Hobby
25 tháng 7, 2026
esp32cameraesp-dlgesture

Gesture LED

ESP32-S3 + camera đếm ngón tay bằng esp-dl, bật LED WS2812 và stream HUD lên iPad.

Một cuối tuần mình thử xem ESP32-S3 có thể tự nhìn bàn tay mà không cần gửi ảnh lên server hay không. Kết quả là chiếc Freenove media kit với camera OV3660 có thể chạy model hand_gesture_recognition ngay trên chip, nhận các cử chỉ như one, two, three, likeok.

   Bàn tay              ESP32-S3 (esp-dl)          Đầu ra
  ┌────────┐   RGB565  ┌──────────────────┐   ┌──────────────┐
  │ OV3660 │ ────────► │ HandDetect       │ ─►│ WS2812 GPIO48│
  │ camera │           │   → GestureCls   │   │ (đổi màu/sáng)│
  └────────┘           │ one·two·…·ok     │   └──────────────┘
                       └────────┬─────────┘   ┌──────────────┐
                                └───────────► │ Web UI (iPad)│
                                  Wi-Fi LAN   │ shot.jpg+json│
                                              └──────────────┘

[Ảnh cần bổ sung] Board Freenove ESP32-S3, camera và LED onboard khi đang chạy.

Nó làm gì?

Khi đưa 1–5 ngón tay trước camera, ESP32 xử lý ảnh rồi đổi màu LED WS2812 ở GPIO48. Nếu dùng một dải từ 5 LED trở lên, số LED sáng sẽ bằng số ngón tay nhận được. Trang web trên iPad đồng thời hiển thị ảnh camera, con số và emoji tương ứng.

Toàn bộ inference chạy on-device bằng esp-dl; trình duyệt chỉ lấy ảnh từ /shot.jpg và kết quả mới nhất từ /gesture.json. Không có cloud và cũng không cần tự train model.

[Video demo cần bổ sung] Giơ lần lượt 1–5 ngón tay; quay cùng lúc LED đổi màu và HUD trên iPad.

Phần cứng

Camera dùng GPIO4/5 cho SCCB nên project này không gắn chung với HC-SR04 của các game siêu âm.

Build và thử

cd ~/projects/esp/games/gesture-led
idf.py set-target esp32s3
idf.py menuconfig      # Gesture LED → WiFi SSID/pass
idf.py build
../copybins.sh gesture-led

Lần build đầu sẽ tải esp-dl cùng hai model nên lâu hơn bình thường. Sau khi flash, cho ESP và iPad vào cùng Wi‑Fi rồi mở http://gesture.local/.

[Ảnh cần bổ sung] Screenshot web UI có live camera, số ngón, emoji và dãy LED.

Code nằm ở đâu?

  • main/vision.cpp: detect bàn tay và phân loại cử chỉ
  • main/led.c: map số ngón sang màu hoặc số LED
  • main/http_server.c: web UI, ảnh chụp, JSON và MJPEG stream
  • main/www/index.html: giao diện hiển thị trên iPad

Phần mình thích nhất ở project này là cả camera, model và web server đều nằm trong một board nhỏ. Nó chưa nhanh như nhận diện trên điện thoại, nhưng đủ để một cử chỉ tay điều khiển được phần cứng mà không cần đi qua Internet.