ESP32-CAM - Video Streaming Server

Basierend auf dem ESP32-S-Modul haben einige Firmen wie Ai-Thinker und Seeed-Studio vor einiger Zeit das kompakte ESP32-CAM-Modul herausgebracht, welches die Funktionen eines vollwertigen ESP32 mit einem integrierten OV7670 verbindet.

ESP32-Cam Modul

Features

Zusätzlich zu den Features des regulären ESP32 bietet dieses Modul noch mehr:

Technische Daten des Herstellers seeed

Abmessungen 40,5mm × 27mm × 4,5mm
Gewicht 20g
Package DIP-16
SPI Flash Default 32Mbit
RAM 520kB SRAM +4M PSRAM
Bluetooth Bluetooth 4.2 BR/EDR und BLE standards
WLAN 802.11 b/g/n/
Unterstützte Schnittstellen UART, SPI, I²C, PWM
SD-Karte Max. 4GByte
Ein-/Ausgänge 9
UART Baudrate Default 115200bps
Bildformate JPEG (nur OV2640), BMP, Graustufen
Spektrum 2412~2484MHz
Antenne Onboard PCB-Antenne, Verstärkung: 2dBi
Übertragungsleistung 802.11b: 17±2dBm (@11Mbps)
802.11g: 14±2dBm (@54Mbps)
802.11n: 13±2dBm (@MCS7)
Empfindlichkeit CCK, 1 Mbps : -90dBm; CCK, 11 Mbps: -85dBm; 6 Mbps (1/2 BPSK): -88dBm; 54 Mbps (3/4 64-QAM): -70dBm; MCS7 (65 Mbps, 72.2 Mbps): -67dBm
Leistung Turn off the flash lamp: 180mA @ 5V
Turn on the flash lamp and turn on the brightness to the maximum: 310mA @ 5V
Deep-sleep: Minimum power consumption can be achieved 6mA @ 5V
Modem-sleep: Minimum up to 20mA @ 5V
Light-sleep: Minimum up to 6.7mA @ 5V
Sicherheit WPA, WPA2, WPA2-Enterprise, WPS
Betriebsspannung 5V
Betriebstemperatur -20°C ~ 85°C
Lagerung -40°C ~90°C, <90%RH

Eine Übersicht über die Unterschiede und verschiedenen Features der angebotenen ESP-32-CAM-Boards kann man unter Makeradvisor - ESP32 Camera Dev Boards Review bekommen.

Komponenten und Anschlüsse

Komponenten des ESP32-CAM Moduls
Abb.: Komponenten des ESP32-CAM Moduls; Quelle: seeedstudio.com

Das Board hat einen IPEX-Anschluss für eine optionale externe 2,4GHz-Antenne. Wird eine solche Antenne angeschlossen, so muss die Lötbrücke direkt daneben umgelötet werden, damit nicht mehr die interne PCB-Antenne verwendet wird. Durch Verwendung einer externen Antenne kann das WLAN-Signal deutlich verstärkt und damit die Reichweite vergrößert werden.

Anschlüsse des ESP32-CAM Moduls
Abb.: Anschlüsse des ESP32-CAM Moduls; Quelle: seeedstudio.com

Anschlüsse

Pin Beschreibung
GND (3× vorhanden) Masse/Ground-Anschluss bzw. (-)
5V Spannungsversorgung mit +5V (wird oft empfohlen, da mit 3,3V immer wieder auftretende Fehler berichtet wurden)
3,3V Spannungsversorgung mit +3,3V
VCC Spannungsausgang für 3,3V oder 5V.
Hinweis: Diesen Pin NICHT zur Spannungsversorgung des Boards verwenden! Es ist ein Ausgang! Die Ausgangsspannung ist unabhängig von der anliegenden Versorgungsspannung und kann über einen kleinen Jumper auf dem Board auf 5V bzw. 3,3V gestellt werden (Lötarbeit notwendig)
GPIO 0 Dieser Pin entscheidet, ob sich der ESP32 im "flashing-mode" (während der Programmierung) befindet oder nicht. Intern ist der Pin mit einem 10kOhm-Pullup-Widerstand versehen und wird mit GND verbunden, um in den flashing-mode zu wechseln. GPIO0 sollte während des regulären Betriebs des ESP32 nicht mit GND verbunden sein.
GPIO 1 (U0TXD bzw. TX) Serieller Ausgang; wird für die Programmierung mit einem USB/UART-Programmer verwendet.
Nach der Programmierung kann dieser Pin auch für andere Zwecke (z.B. Sensoren/Aktuatoren) verwendet werden. (Die serielle Schnittstelle kann dann nicht mehr zum Debugging verwendet werden)
GPIO 2 Falls die Micro-SD-Karte verwendet wird, wird dieser Pin als DATA0 benutzt. Ansonsten kann der Pin für beliebige Ein-/Ausgabe verwendet werden und besitzt RTC und ADC.
GPIO 3 (U0RXD bzw. RX) Serieller Eingang; wird für die Programmierung mit einem USB/UART-Programmer verwendet.
Nach der Programmierung kann dieser Pin auch für andere Zwecke (z.B. Sensoren/Aktuatoren) verwendet werden. (Die serielle Schnittstelle kann dann nicht mehr zum Debugging verwendet werden)
GPIO 4 Falls die Micro-SD-Karte verwendet wird, wird dieser Pin als DATA1 benutzt. Ansonsten kann der Pin für beliebige Ein-/Ausgabe verwendet werden und besitzt RTC und ADC.
GPIO 4 wird auch für das eingebaute LED-Blitzlicht verwendet und kann u.U. Probleme machen, wenn Blitz und SD-Karte gleichzeitig verwendet werden. Diese Probleme können evtl. umgangen werden, wenn folgender Code zum Initialisieren der SD-Karte verwendet wird:
SD_MMC.begin("/sdcard", true);
GPIO 12 Falls die Micro-SD-Karte verwendet wird, wird dieser Pin als DATA2 benutzt. Ansonsten kann der Pin für beliebige Ein-/Ausgabe verwendet werden und besitzt RTC und ADC.
GPIO 13 Falls die Micro-SD-Karte verwendet wird, wird dieser Pin als DATA3 benutzt. Ansonsten kann der Pin für beliebige Ein-/Ausgabe verwendet werden und besitzt RTC und ADC.
GPIO 14 Falls die Micro-SD-Karte verwendet wird, wird dieser Pin als CLK benutzt. Ansonsten kann der Pin für beliebige Ein-/Ausgabe verwendet werden und besitzt RTC und ADC.
GPIO 15 Falls die Micro-SD-Karte verwendet wird, wird dieser Pin als CMD benutzt. Ansonsten kann der Pin für beliebige Ein-/Ausgabe verwendet werden und besitzt RTC und ADC.
GPIO 16 Dies ist der Standard-UART-Pin, der auch als Eingang verwendet werden kann. Intern ist der Pin mit einem 10kOhm-Pullup-Widerstand versehen und hat standardmäßig den Zustand HIGH. GPIO 16 besitzt keinen ADC (nicht geeignet für analoge Eingabe/Sensorik) und kann auch nicht als externe Quelle zum Aufwecken aus dem Sleep-Modus verwendet werden, da es kein RTC-GPIO ist.
GPIO 33 Dieser Pin ist mit der eingebauten roten SMD-LED (neben dem Reset-Knopf) verbunden und kann diese steuern. Zu beachten ist, dass die LED mit invertierter Logik funktioniert, d.h. sie leuchtet, wenn LOW als Signal anliegt:
void setup() {
    pinMode(33, OUTPUT);
}

void loop() {
    digitalWrite(33, LOW);
}

Verwendete Bauteile

Einrichtung der Programmier-Schnittstelle

Das ESP32-CAM-Board wird ohne ISP-Programmer (d.h. ohne USB-Anschluss) ausgeliefert, damit ist es notwendig einen USB/UART-Wandler zu verwenden, um das Modul zu programmieren. Hier wird ein FTDI-Koverter mit einem USB Mini-B-Anschluss verwendet.

Anschlüsse

Zum Programmieren muss auf dem Board GND mit GPIO0 verbunden werden (z.B. mit einem Jumper). (Diese Überbrückung wird dann nach der Programmierung wieder entfernt) Vor jedem Programmieren muss außerdem der Reset-Knopf des Boards gedrückt werden.
Vorher überprüfen, wo die Pins des verwendeten Boards wirklich liegen, es kann hier verschiedene Belegungen geben!

ESP32-CAM FTDI
GND GND
3,3V VCC (bzw. 3,3V)
GPIO3 (U0R bzw. U0RXD) TX
GPIO1 (U0T bzw. U0TXD) RX
GND mit GPIO0 (IO0) verbinden -

Einrichtung mit der Arduino-IDE

Zum Übertragen des Sketches an das ESP32-CAM-Board wird die Arduino-IDE vorbereitet. Allerdings wird im Menu "Werkzeuge → Board:" nun "AI Thinker ESP32-CAM" und der entsprechende Port -an dem der FTDI-Konvert hängt- ausgewählt.

Video-Streaming Server

Im Menu der Arduino-IDE wird nun "Datei → Beispiele → ESP32 → Camera → CameraWebServer" gewählt, wobei ein recht langer Sketch zum Erstellen eines Streaming servers geladen wird. In diesem Sketch müssen noch ein paar kleine Anpassungen vorgenommen werden:

Nun kann der Sketch kompiliert und auf das ESP32-Board hochgeladen werden. (Dies kann einige Zeit dauern).

Hochladen des Sketches auf das ESP32-CAM Boards
Abb.: Diese oder ähnliche Meldungen sollten im Debug-Fenter der Arduino-IDE erscheinen, wenn der Upload des Sketches beginnt.
Hochladen des Sketches auf das ESP32-CAM Boards
Abb.: Diese oder ähnliche Meldungen sollten im Debug-Fenter der Arduino-IDE erscheinen, wenn der Upload des Sketches beendet ist.

Nach dem erfolgreichen Hochladen des Sketches wird die GND-GPIO0-Verbindung entfernt, die serielle Konsole in der Arduino-IDE geöffnet und auf 115200 Baud umgestellt. Nach dem Drücken des Reset-Knopfes auf dem Board sollte in der serielle Konsole nach der Initialisierung die IP für den Streaming-Server angezeigt werden:

Ausgabe in der seriellen Konsole
Abb.: Initialisierung und IP-Adresse wird in der seriellen Konsole angezeigt.

Jetzt kann ein beliebiger Webbrowser mit dieser IP als URL geöffnet werden und es sollte das Web-Interface des ESP32-CAM-Streamingservers erscheinen. Neben etlichen Einstellungsmöglichkeiten erscheint ein Live-Bild der Kamera, sobald der Knopf "Start Stream" gedrückt wurde:

Starten des Video-Streams des ESP32-CAM-Boards
Abb.: Starten des Video-Streams im Web-Interface des ESP32-CAM-Boards.
Erste Aufnahme in VGA(640x480)
Abb.: Erste Aufnahme in VGA(640x480).

Der rohe Video-Stream ist unter der URL 192.168.xxx.xxx:81/stream erreichbar und sollte von Streaming-Programmen konsumiert werden können. Mit VLC ist es mir nicht gelungen, einen Stream zu bekommen, doch unter (Debian-)Linux hat mpv funktioniert.
mpv installieren:
sudo apt-get update
sudo apt-get install mpv

Nun muss noch eine Konfigurations-Datei für das MJPEG-Video-Format angelegt werden:
touch ~/.config/mpv/mpv.conf echo demuxer-lavf-probescore=25 >> ~/.config/mpv/mpv.conf
Jetzt kann der Stream gestartet werden:
mpv 192.168.xxx.xxx:81/stream

Einstellungen vornehmen

Der gestartete Webserver erlaubt es, die Kamera direkt zu steuern. Grundsätzlich werden die Befehle in folgender Notation gesendet:
http://192.168.xxx.xxx/control?var=[KEY]&val=[VALUE]
Die folgende Tabelle enthält die meisten der konfigurierbaren Einstellungen der Kamera:

Einstellung Key Wertebereich
Auflösung framesize 10 UXGA(1600×1200)
9 SXGA(1280×1024)
8 XGA(1024×768)
7 SVGA(800×600)
6 VGA(640×480)
5 CIF(400×296)
4 QVGA(320×240)
3 HQVGA(240×176)
0 QQVGA(160×120)
default=4
Bildqualität quality 10..63 (gut..schlecht)
default=10
Helligkeit brightness -2..2
default=0
Kontrast contrast -2..2
default=0
Sättigung saturation -2..2
default=0
Spezialeffekte special_effect 0 Kein Effekt
1 Negativ
2 Schwarz/Weiss
3 Rot gefärbt
4 Grün gefärbt
5 Blau gefärbt
6 Sepia
default=0
Automatischer Weissabgleich awb 0 Aus
1 Ein
default=1
Spezialfunktionen für den Weissabgleich awb_gain 0 Aus
1 Ein
default=1
Weissabgleich-Einstellung wb_mode 0 Auto
1 Sonnig
2 Bewölkt
3 Büro
4 Zuhause
default=0
Belichtungssteuerung (Automatic Exposure Control) aec 0 Aus
1 Ein
default=1
? aec2 0 Aus
1 Ein
default=1
? ae_level -2..2
default=0
? aec_value 0..1200
default=204
Automatische Verstärkungsregelung (automatic gain control) agc 0 Gain
1 Gain-Ceilling
default=2
? gainceiling 0..6 (2×..128×
default=0
? bpc 0 Aus
1 An
default=0
? wpc 0 Aus
1 An
default=1
? raw_gma 0 Aus
1 An
default=1
Linsenkorrektur lenc 0 Aus
1 An
default=1
Horizonale Spiegelung hmirror 0 Aus
1 An
default=1
Vertikale Spiegelung vflip 0 Aus
1 An
default=1
Farbbalken colorbar 0 Aus
1 An
default=0
Gesichtssuche face_detect 0 Aus
1 An
default=0
Gesichtserkennung face_recognize 0 Aus
1 An
default=0

Statische IP im internen Netzwerk

Will man vermeiden, dass das ESP32-CAM-Board jedesmal eine andere (zufällige) IP vom Router zugewiesen bekommt, so kann man auch eine statische IP konfigurieren. Dazu müssen folgende Teile dem Sketch hinzugefügt werden:

Nach dem Hochladen und Ausführen des Sketches sollte genau unter diesen IP-Adresse nun das Web-Interface für den Streaming-Server zu finden sein. (Bei mir gab es mit der FritzBox! ein paar Probleme, was vermutlich an der falschen Konfiguration des Gateways lag)

ESP32-CAM als Access Point (AP)

Will man das Board unabhängig vom Router betreiben, so kann man auch einen Access Point mit dem ESP32 erstellen lassen und das Video-Streaming darüber betreiben. Hierfür müssen folgende Änderungen am obigen Sketch vorgenommen werden:

Nach dem Hochladen des geänderten Sketches kann man sich nun mit dem durch den ESP32 erstellen AP (mit SSID und Password) verbinden und über die in der seriellen Konsole ausgegebenen IP-Adresse auf das Web-Interface des Streaming-Servers verbinden.

Probleme

Falls es Probleme beim kompilieren, hochladen oder ausführen des Sketches gibt, dann findet man unter ESP32-CAM Troubleshooting Guide von Random Nerd Tutorials einige Lösungen.

zurück