In diesem Artikel lernst du, wie du mehr freie GPIO-Pins für dein ESP32-CAM Board bekommst. Die ESP32-CAM-Module sind kleine ESP32-basierte Boards mit integrierter Kamera, Blitz-LED und SD-Karten-Schnittstelle. Sie eignen sich hervorragend zum Bau einfacher Überwachungs- oder Monitoringsysteme.
Allerdings ist die Anzahl der frei verfügbaren GPIO-Pins sehr gering, besonders wenn die Kamera und die SD-Karten-Schnittstelle genutzt werden. Dieses Tutorial zeigt dir, wie du diese Einschränkung umgehen kannst.
Benötigte Teile
Du benötigst ein ESP32-CAM-Modul mit einem Programmier-Shield oder einen FTDI USB-TTL Adapter. Einige andere Teile wie USB-Kabel, micro SD-Karte oder SD-Kartenleser hast du vielleicht schon. Diese Teile sind nicht speziell für dieses Projekt nötig.

ESP32-CAM mit USB-TTL Shield

FTDI USB-TTL Adapter

MicroSD Karte 4GB

SD-Kartenleser

USB-Datenkabel

Arduino IDE
Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.
Pin-Belegung des ESP32-CAM
Das folgende Bild zeigt die Pinbelegung des ESP32-CAM. Der ESP32-SChip auf dem Board hat 32 GPIO-Pins, aber die meisten werden von der Kamera und PSRAM genutzt und sind nicht herausgeführt.

Die 10 zugänglichen GPIO-Pins (lila markiert) sind ebenfalls nicht frei verfügbar, sondern werden mit der SD-Karte und der seriellen Schnittstelle geteilt. Insbesondere sind alle gelb markierten GPIOs (12, 13, 15, 14, 2, 4) auf der linken Seite des Boards mit der SD-Karte geteilt. Das folgende Schaltbild zeigt die vom SD-Karten-Sockel genutzten Signalleitungen:

Wie du auch sehen kannst, sind die Datenleitungen zur SD-Karte intern mit 47K-Widerständen nach oben gezogen. Die folgende Tabelle zeigt, welcher GPIO-Pin welcher Datenleitung der SD-Karten-Schnittstelle entspricht:
| SD-Karte | ESP32-CAM |
|---|---|
| HS2_CLK | GPIO14 |
| HS2_CMD | GPIO15 |
| HS2_DATA0 | GPIO2 |
| HS2_DATA1 / Blitz-LED | GPIO4 |
| HS2_DATA2 | GPIO12 |
| HS2_DATA3 | GPIO13 |
Die GPIO3 und GPIO1 Pins auf der rechten Seite des Boards werden für die serielle Kommunikation (U0_RXD, U0_TXD) und das Programmieren des Boards benötigt.

Schließlich ist GPIO0 mit dem Kamera-XCLK-Pin verbunden und sollte beim Betrieb des ESP32 frei (nicht verbunden) bleiben. Intern ist GPIO0 mit einem 10KΩ-Widerstand nach oben gezogen und muss beim Flashen mit GND verbunden werden.
Damit bleibt dir nur GPIO16 als frei nutzbarer Pin, wenn die SD-Karten-Schnittstelle im 4-Bit-Modus verwendet wird. Wenn du nur eine Status-LED brauchst, kannst du GPIO33 verwenden, der mit einer roten LED auf der Rückseite des Boards verbunden ist.
Verfügbare GPIOs in verschiedenen Szenarien
Schauen wir uns verschiedene Anwendungsszenarien an und sehen, welche GPIO-Pins verfügbar sind. GPIO16 ist immer verfügbar, ich führe ihn aber der Vollständigkeit halber in den folgenden Beschreibungen mit auf:
Keine SD-Karte verwendet
Wenn die SD-Karten-Schnittstelle nicht genutzt wird, hast du die GPIOs 2, 4, 12, 13, 14, 15 und 16 zur Verfügung. Das sind die blau markierten Pins im folgenden Bild:

Du kannst den folgenden Testcode ausprobieren, um zu sehen, was passiert, wenn du eine LED an verschiedenen Pins blinken lassen willst, während die SD-Karten-Schnittstelle im 4-Bit-Modus, 1-Bit-Modus oder gar nicht verwendet wird:
#include "SD_MMC.h"
const byte ledPin = 12; // 13, ...
void setup() {
Serial.begin(115200);
pinMode(ledPin, OUTPUT);
// SD_MMC.begin(); // 4-bit Mode
// SD_MMC.begin("/sdcard", true); // 1-bit Mode
for (int i = 0; i < 10; i++) {
Serial.println("blink");
digitalWrite(ledPin, HIGH);
delay(500);
digitalWrite(ledPin, LOW);
delay(500);
}
}
void loop() {
}
Mehr Details zu diesen Modi findest du in den folgenden Abschnitten. Denk nur daran, wenn du die SD-Karten-Schnittstelle nutzen willst, muss eine korrekt formatierte SD-Karte eingelegt sein. Andernfalls schlägt der SD_MMC.begin()Aufruf mit einem Rückgabewert von falsefehl.
SD-Karte im 4-Bit-Modus verwendet
Wenn du die SD-Karten-Schnittstelle im 4-Bit-(Highspeed-)Modus nutzt, steht dir nur GPIO16 zur Verfügung:

Der folgende Codeausschnitt zeigt, wie die SD-Karten-Schnittstelle im Standard-4-Bit-Modus initialisiert wird:
#include "SD_MMC.h"
void setup() {
SD_MMC.begin();
...
}
Beachte, dass die eingebaute Blitz-LED an GPIO4 angeschlossen ist, was dazu führt, dass die Blitz-LED kurz aufleuchtet, wenn der SD-Kartenleser verwendet wird. Du kannst das vermeiden, indem du die SD-Karten-Schnittstelle im 1-Bit-Modus initialisierst, was wir im nächsten Abschnitt besprechen.
SD-Karte im 1-Bit-Modus verwendet
Wenn du die SD-Karten-Schnittstelle im 1-Bit-Modus betreibst, ist die Datenübertragung langsamer, aber du gewinnst GPIO12 und GPIO13 als verfügbare Pins hinzu:

Um die SD-Karten-Schnittstelle im 1-Bit-Modus zu initialisieren, verwende den folgenden Code. Wichtig ist hier, den zweiten Parameter in SD_MMC.begin(..., true) auf true zu setzen, was den 1-Bit-Modus aktiviert.
#include "SD_MMC.h"
void setup() {
SD_MMC.begin("/sdcard", true);
...
}
Das erlaubt dir auch, das Aufblitzen der Blitz-LED (an GPIO4) zu vermeiden, so:
#include "SD_MMC.h"
void setup() {
pinMode(GPIO_NUM_4, OUTPUT);
digitalWrite(GPIO_NUM_4, LOW); // switch of flash LED
SD_MMC.begin("/sdcard", true); // flash LED remains off
...
}
Während du GPIO4 nicht für andere Zwecke nutzen kannst, kannst du zumindest die Blitz-LED nach Belieben ein- und ausschalten, ohne die SD-Karten-Operationen zu stören. Allerdings darfst du die Blitz-LED nicht länger als eine Sekunde einschalten! Sie hat keinen Vorwiderstand, wird sehr heiß und brennt durch! Mehr Details findest du im Control ESP32-CAM Flash LED Tutorial.
Nutzung von Deep-Sleep
Wenn du GPIO-Pins nur brauchst, um den ESP32-CAM aus dem Deep-Sleep zu wecken, z.B. um bei Bewegung ein Bild zu machen, kannst du tatsächlich GPIOs 2, 4, 12, 13, 14 oder 15 verwenden, selbst wenn die SD-Karten-Schnittstelle im 4-Bit-Modus initialisiert ist. Unten ein Verdrahtungsbeispiel aus dem Motion Activated ESP32-CAM Tutorial

Hinzufügen von GPIOs
Wenn du die SD-Karte nutzen willst und mehr als 3 GPIO-Pins brauchst, ist die einfachste Methode, ein GPIO-Expander-Board mit I2C-Schnittstelle hinzuzufügen. I2C benötigt nur zwei Pins und wenn du die SD-Karte im 1-Bit-Modus initialisierst, hast du drei GPIO-Pins frei (12, 13, 16).
Das folgende Verdrahtungsdiagramm zeigt, wie du das MCP23017 GPIO Expander Board per I2C mit GPIO12 und GPIO13 des ESP32-CAM verbindest:

Und hier ist ein Beispielcode, der zeigt, wie man den GPIO-Expander und die SD-Karte initialisiert:
include "Wire.h"
#include "Adafruit_MCP23X17.h"
#include "SD_MMC.h"
Adafruit_MCP23X17 mcp;
void setup() {
Serial.begin(115200);
SD_MMC.begin("/sdcard", true); // 1-bit Mode
Wire.begin(13, 12); // SDA=13, SCL=12
if (!mcp.begin_I2C()) { // Default address 0x20
Serial.println("MCP23017 not found!");
while (1);
}
// Example: set pin 0 on MCP23017 as output
mcp.pinMode(0, OUTPUT);
}
void loop() {
mcp.digitalWrite(0, ...);
...
}
Wenn du mehr über den MCP23017 GPIO-Expander erfahren möchtest, schau dir das Using GPIO Expander MCP23017 With Arduino Tutorial an. Beachte, dass du mehrere MCP23017-Chips kaskadieren kannst, was dir bis zu 128 GPIOs gibt. Sicherlich genug ; )
Statt eines bidirektionalen GPIO-Expanders wie dem MCP23017 könntest du auch Schieberegister verwenden, um mehr Eingänge oder Ausgänge hinzuzufügen. Siehe die More Inputs With 74HC165 Shift Register und das More Arduino Outputs With 74HC595 Shift RegisterTutorial für mehr Details.
Fazit
Dieser Artikel hat dir gezeigt, wie du mehr GPIO-Pins für dein ESP32-CAM bekommst. Ich hoffe, das hilft dir bei deinen Projekten. Wenn du Fragen hast, hinterlasse sie gerne im Kommentarbereich.
Viel Spaß beim Tüfteln 😉

