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.
Zusätzlich zu den Features des regulären ESP32 bietet dieses Modul noch mehr:
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.
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.
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:
|
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:
|
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-Konverter mit einem USB Mini-B-Anschluss verwendet.
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 | - |
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.
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:
// Select camera model
//#define CAMERA_MODEL_WROVER_KIT
//#define CAMERA_MODEL_ESP_EYE
//#define CAMERA_MODEL_M5STACK_PSRAM
//#define CAMERA_MODEL_M5STACK_WIDE
#define CAMERA_MODEL_AI_THINKER
const char* ssid = "mySSID";
const char* password = "mySecretPassword";
Nun kann der Sketch kompiliert und auf das ESP32-Board hochgeladen werden. (Dies kann einige Zeit dauern).
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 seriellen Konsole nach der Initialisierung die IP für den Streaming-Server angezeigt werden:
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:
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
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 |
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:
IPAddress local_IP(192, 168, 1, 66); // Set your Static IP address
IPAddress gateway(192, 168, 178, 1); // Set your Gateway IP address
IPAddress subnet(255, 255, 255, 0);
setup()
werden vor WiFi.begin(ssid, password);
folgende Zeilen eingefügt:if (!WiFi.config(local_IP, gateway, subnet)) {
Serial.println("Failed to configure WiFi!");
}
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)
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:
const char* ssid = "ESP32CAM-AP";
const char* password = "123456789";
setup();
wird der folgende Code:WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
startCameraServer();
Serial.print("Camera Ready! Use 'http://");
Serial.print(WiFi.localIP());
Serial.println("' to connect");
Serial.print("Init access point...");
WiFi.softAP(ssid, password); // Remove the password parameter, if you want the AP (Access Point) to be open
IPAddress IP = WiFi.softAPIP();
Serial.print("Camera Ready! Use http://");
Serial.println(IP);
startCameraServer();
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.
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