En este artículo aprenderás cómo obtener más pines GPIO libres para tu ESP32-CAM placa. Los módulos ESP32-CAM son pequeñas placas basadas en ESP32 con una cámara integrada, LED de flash y una interfaz para tarjeta SD. Son ideales para construir sistemas simples de vigilancia o monitoreo.
Sin embargo, el número de pines GPIO disponibles es muy reducido, especialmente cuando la cámara y la interfaz de la tarjeta SD están en uso. Este tutorial te muestra cómo superar esta limitación.
Partes necesarias
Necesitarás un módulo ESP32-CAM con un shield de programación o un adaptador FTDI USB-TTL. Algunos otros componentes como cable USB, tarjeta micro SD o lector de tarjetas SD probablemente ya los tengas. No es necesario comprarlos, ninguno es especial para este proyecto.

ESP32-CAM con shield USB-TTL

Adaptador FTDI USB-TTL

Tarjeta MicroSD 4GB

Lector de tarjeta SD

Cable de datos USB

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.
Uso de pines del ESP32-CAM
La siguiente imagen muestra el pinout del ESP32-CAM. El ESP32-S chip en la placa tiene 32 pines GPIO, pero la mayoría están usados por la cámara y la PSRAM y no están accesibles.

Los 10 pines GPIO accesibles (color púrpura) tampoco están completamente libres, ya que se comparten con la tarjeta SD y las interfaces de comunicación serial. Específicamente, todos los GPIO marcados en amarillo (12, 13, 15, 14, 2, 4) en el lado izquierdo de la placa se comparten con la tarjeta SD. El siguiente esquema muestra las líneas de señal usadas por el conector de la tarjeta SD:

Como también puedes ver, las líneas de datos conectadas a la tarjeta SD están internamente conectadas a un nivel alto mediante resistencias de 47K. La tabla a continuación muestra qué pin GPIO corresponde a cada línea de datos de la interfaz de la tarjeta SD:
| Tarjeta SD | ESP32-CAM |
|---|---|
| HS2_CLK | GPIO14 |
| HS2_CMD | GPIO15 |
| HS2_DATA0 | GPIO2 |
| HS2_DATA1 / LED de flash | GPIO4 |
| HS2_DATA2 | GPIO12 |
| HS2_DATA3 | GPIO13 |
Los pines GPIO3 y GPIO1 en el lado derecho de la placa son necesarios para la comunicación serial (U0_RXD, U0_TXD) y la programación de la placa.

Finalmente, GPIO0 está conectado al pin XCLK de la cámara y debe quedar flotante (sin conectar) cuando el ESP32 está en funcionamiento. Internamente, GPIO0 está conectado a un nivel alto mediante una resistencia de 10KΩ y debe conectarse a GND durante el flasheo.
Esto deja solo el GPIO16 como un pin libremente usable, si la interfaz de la tarjeta SD se usa en modo de 4 bits. Si solo necesitas algún tipo de LED de estado, puedes usar GPIO33, que está conectado a un LED rojo en la parte trasera de la placa.
GPIO disponibles en diferentes escenarios
Veamos diferentes escenarios de aplicación y cuáles pines GPIO están disponibles. GPIO16 siempre estará disponible, pero lo incluyo en las siguientes descripciones para mayor completitud:
Sin tarjeta SD usada
Si no se usa la interfaz de la tarjeta SD, tienes disponibles los GPIOs 2, 4, 12, 13, 14, 15 y 16. Estos son los pines marcados en azul en la siguiente imagen:

Puedes probar el siguiente código de prueba para ver qué sucede cuando quieres hacer parpadear un LED en varios pines usando la interfaz de la tarjeta SD en modo de 4 bits, modo de 1 bit o sin usarla:
#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() {
}
Encontrarás más detalles sobre estos modos en las siguientes secciones. Solo recuerda que si quieres usar la interfaz de la tarjeta SD, necesitarás tener una tarjeta SD correctamente formateada insertada. De lo contrario, la SD_MMC.begin() llamada fallará con un valor de retorno de false.
Tarjeta SD usada en modo de 4 bits
Si usas la interfaz de la tarjeta SD en modo de 4 bits (alta velocidad), solo tendrás disponible el GPIO16:

El siguiente fragmento de código muestra cómo inicializar la interfaz de la tarjeta SD en el modo predeterminado de 4 bits:
#include "SD_MMC.h"
void setup() {
SD_MMC.begin();
...
}
Ten en cuenta que el LED de flash incorporado está conectado al GPIO4, lo que hace que el LED de flash parpadee brevemente cuando se usa el lector de tarjeta SD. Puedes evitar esto inicializando la interfaz de la tarjeta SD en modo de 1 bit, que discutiremos en la siguiente sección.
Tarjeta SD usada en modo de 1 bit
Si ejecutas la interfaz de la tarjeta SD en modo de 1 bit, la transferencia de datos será más lenta, pero ganarás los GPIO12 y GPIO13 como pines disponibles:

Para inicializar la interfaz de la tarjeta SD en modo de 1 bit usa el siguiente código. Lo importante aquí es establecer el segundo parámetro en SD_MMC.begin(..., true) a true, lo que activa el modo de 1 bit.
#include "SD_MMC.h"
void setup() {
SD_MMC.begin("/sdcard", true);
...
}
Esto también te permite evitar el parpadeo del LED de flash (en GPIO4) de esta manera:
#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
...
}
Aunque no puedes usar GPIO4 para otros propósitos, al menos puedes encender y apagar el LED de flash a tu gusto, sin interferir con las operaciones de la tarjeta SD. Sin embargo, ¡no debes mantener el LED de flash encendido por más de un segundo! No tiene resistencia limitadora de corriente, se calienta mucho y se quemará. Para más detalles, consulta el Control ESP32-CAM Flash LED tutorial.
Uso del deep-sleep
Si necesitas pines GPIO solo para despertar el ESP32-CAM del deep-sleep, por ejemplo para tomar una foto cuando se detecta movimiento, puedes usar los GPIOs 2, 4, 12, 13, 14 o 15, incluso cuando la interfaz de la tarjeta SD está inicializada en modo de 4 bits. A continuación un ejemplo de conexión del Motion Activated ESP32-CAM tutorial

Añadiendo GPIOs
Si quieres usar la tarjeta SD y necesitas más de 3 pines GPIO, el método más sencillo es añadir una placa expansora de GPIO que use una interfaz I2C. I2C solo necesita dos pines y si inicializas la tarjeta SD en modo de 1 bit, tendrás tres pines GPIO disponibles (12, 13, 16).
El siguiente diagrama de conexiones muestra cómo conectar la MCP23017 GPIO Expander placa vía I2C a los GPIO12 y GPIO13 del ESP32-CAM:

Y aquí tienes un ejemplo de código que describe cómo inicializar el expansor de GPIO y la tarjeta SD:
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, ...);
...
}
Si quieres aprender más sobre el expansor de GPIO MCP23017, echa un vistazo al Using GPIO Expander MCP23017 With Arduino tutorial. Ten en cuenta que puedes encadenar múltiples chips MCP23017, lo que te da hasta 128 GPIOs. ¡Seguro que es suficiente ; )
En lugar de un expansor de GPIO bidireccional como el MCP23017, también podrías usar registros de desplazamiento para añadir más entradas o salidas. Consulta los tutoriales More Inputs With 74HC165 Shift Register y More Arduino Outputs With 74HC595 Shift Register para más detalles.
Conclusiones
Este artículo te mostró cómo obtener más pines GPIO para tu ESP32-CAM. Espero que te sea útil para tus proyectos. Si tienes alguna pregunta, no dudes en dejarla en la sección de comentarios.
¡Feliz bricolaje! 😉

