esp-idf-video-snapshot

Capture still images from a USB camera using ESP-IDF

MIT License

Stars
8

esp-idf-video-snapshot

Capture still images from a USB camera using ESP-IDF.

This example demonstrates how to:

This example enumerates the attached camera descriptors, negotiates the selected resolution and FPS, and starts capturing video.

I based it on this official example.

Hardware Required

ESP32-S2/ESP32-S3

This example requires any ESP32-S2 or ESP32-S3 with external PSRAM and exposed USB connector attached to USB camera. ESP module without external PSRAM will fail to initialize. I used this board. esp32-s3-1

Stable power supply

USB cameras consume a lot of electricity. If the power supplied to the USB port is insufficient, the camera will not operate and ESP32 resets.

USB Type-A Femail connector

Breakout boards are available from AliExpress or eBay.

USB camera with UVC support

Here is a list of USB cameras that support UVC that work with FreeBSD. From what I've researched, ESP-IDF has limited USB support. For example, the Logitech C615 works with Linux, but not with ESP-IDF. I tested with these cameras.

  • Logitech C270 -> Success
  • Logitech C615 -> Fail
  • Logitech QuickCam Pro 9000 -> Fail
  • PAPALOOK AF925 -> Fail
  • Microdia(Very old model) -> Success
  • Microdia MSI Starcam Racer -> Success
  • Microsoft LifeCam NX6000 -> Fail
  • Microsoft LifeCam Cinema -> Success
  • Microsoft LifeCam Studio -> Success
  • Microsoft LifeCam HD3000 -> Success
  • Microsoft LifeCam HD5000 -> Success

It is very hard to find a camera that works with ESP-IDF. On this document says that these cameras work with ESP-IDF.

  • Logitech C980
  • CANYON CNE-CWC2

When usb support provided by ESP-IDF is updated, this issue may eliminate the problem. Detail is here.

Software Required

ESP-IDF V5.0 or later. ESP-IDF V4.4 release branch reached EOL in July 2024.

Wireing

ESP BOARD          USB CONNECTOR (type A)
                         +--+
5V        -------------> | || VCC
[GPIO19]  -------------> | || D-
[GPIO20]  -------------> | || D+
GND       -------------> | || GND
                         +--+

Installation

git clone https://github.com/nopnop2002/esp-idf-video-snapshot
cd esp-idf-video-snapshot
idf.py set-target {esp32s2/esp32s3}
idf.py menuconfig
idf.py flash monitor

Configuration

Wifi Setting

You can connect using the mDNS hostname instead of the IP address. config-wifi-2

You can use static IP. config-wifi-3

Select Snapshot Trigger

You can choose one of the following as trigger.

  • Trigger is the Enter key on the keyboard
    For operation check
  • Trigger is a GPIO toggle Some GPIOs are used as boot straps and cannot be used as inputs.

    • Initial Sate is PULLDOWN The trigger is prepared when it is turned from OFF to ON, and a picture is taken when it is turned from ON to OFF.

    • Initial Sate is PULLUP The trigger is prepared when it is turned from ON to OFF, and a picture is taken when it is turned from OFF to ON.

  • Trigger is TCP Socket
    You can use tcp_send.py as trigger.
    python3 ./tcp_send.py
  • Trigger is UDP Socket
    You can use udp_send.py as trigger.
     python3 -m pip install -U netifaces
     python3 ./udp_send.py
    
  • Trigger is MQTT Subscribe
    You can use mosquitto_pub as trigger.
    mosquitto_pub -h your_broker -p 1883 -t "/take/picture" -m ""
  • Trigger is HTTP Request
    You can use this command as trigger.
    curl "http://esp32-camera.local:8080/take/picture"

Post Setting

  • No post
    Still images don't post anywhere.
  • Post using HTTP
    Still images are posted using HTTP.
    You can download the HTTP server from here.

Filenames can be timestamped.

Camera Setting

Some cameras need to change frame size and frame format. See here. config-camera-1

How to use

  • Build and flash firmware to esp32.

  • Connect the USB camera at this timing. WaitingForDevice

  • For available USB cameras, device information will be displayed and video streaming will begin. StreamStart

  • For unavailable USB cameras, you will see an error like this. NotSupportCamera

  • Execute trigger. ExecuteTrigger

View picture using Built-in WEB Server

You can view the pictures taken using the built-in WEB server. Enter the ESP32's IP address and port number in the address bar of your browser. You can use mDNS instead of IP address.

References

https://github.com/nopnop2002/esp-idf-video-streaming