Skip to Content

Más pines GPIO para ESP32-CAM

Más pines GPIO para ESP32-CAM

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

USB data cable

Cable de datos USB

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.

Pinout del módulo ESP32-CAM (source)

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:

Schematic of SD Card Socket
Esquema del conector de tarjeta SD (source)

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 SDESP32-CAM
HS2_CLKGPIO14
HS2_CMDGPIO15
HS2_DATA0GPIO2
HS2_DATA1 / LED de flashGPIO4
HS2_DATA2GPIO12
HS2_DATA3GPIO13

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.

Serial Communication pins on ESP32-CAM
Pines de comunicación serial en ESP32-CAM

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:

Free GPIO without SD-Card
GPIO libres sin tarjeta SD

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:

Free GPIO with SD-Card (4-bit Mode)
GPIO libre con tarjeta SD (modo de 4 bits)

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:

Free GPIOs with SD-Card (1-bit Mode)
GPIO libres con tarjeta SD (modo de 1 bit)

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

Connecting AM312 PIR Sensor to ESP32-CAM
Conectando v al ESP32-CAM

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:

Connecting the MCP23017 GPIO Expander
Conectando la MCP23017 GPIO Expander

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! 😉