Skip to Content

Più pin GPIO per ESP32-CAM

Più pin GPIO per ESP32-CAM

In questo articolo imparerai come ottenere più pin GPIO liberi per la tua ESP32-CAM scheda. I moduli ESP32-CAM sono piccole schede basate su ESP32 con una fotocamera integrata, LED flash e interfaccia per scheda SD. Sono ideali per costruire semplici sistemi di sorveglianza o monitoraggio.

Tuttavia, il numero di pin GPIO liberamente disponibili è molto limitato, soprattutto quando la fotocamera e l’interfaccia per scheda SD sono in uso. Questo tutorial ti mostra come superare questa limitazione.

Componenti necessari

Ti servirà un modulo ESP32-CAM con uno shield di programmazione o un adattatore FTDI USB-TTL. Alcuni altri componenti come cavo USB, micro SD Card o lettore di schede SD potresti già averli. Non è necessario acquistarli, nessuno di questi è specifico per questo progetto.

ESP32-CAM con shield USB-TTL

Adattatore FTDI USB-TTL

MicroSD Card 4GB

Lettore di schede SD

USB data cable

Cavo dati 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 dei pin dell’ESP32-CAM

L’immagine seguente mostra il pinout dell’ESP32-CAM. Il ESP32-S chip sulla scheda ha 32 pin GPIO ma la maggior parte sono usati dalla fotocamera e dalla PSRAM e non sono esposti.

Pinout del modulo ESP32-CAM (source)

I 10 pin GPIO accessibili (colorati in viola) non sono però completamente liberi, ma condivisi con l’interfaccia della scheda SD e la comunicazione seriale. In particolare, tutti i GPIO evidenziati in giallo (12, 13, 15, 14, 2, 4) sul lato sinistro della scheda sono condivisi con la scheda SD. Lo schema seguente mostra le linee di segnale usate dal connettore della scheda SD:

Schematic of SD Card Socket
Schema del connettore della scheda SD (source)

Come puoi vedere, le linee dati collegate alla scheda SD sono internamente tirate verso l’alto con resistenze da 47K. La tabella sotto elenca quale pin GPIO corrisponde a quale linea dati dell’interfaccia della scheda SD:

Scheda SDESP32-CAM
HS2_CLKGPIO14
HS2_CMDGPIO15
HS2_DATA0GPIO2
HS2_DATA1 / LED flashGPIO4
HS2_DATA2GPIO12
HS2_DATA3GPIO13

I pin GPIO3 e GPIO1 sul lato destro della scheda sono necessari per la comunicazione seriale (U0_RXD, U0_TXD) e per la programmazione della scheda.

Serial Communication pins on ESP32-CAM
Pin di comunicazione seriale sull’ESP32-CAM

Infine, GPIO0 è collegato al pin XCLK della fotocamera e dovrebbe rimanere flottante (non collegato) durante il funzionamento dell’ESP32. Internamente, GPIO0 è tirato verso l’alto da una resistenza da 10KΩ e deve essere collegato a GND durante la fase di flashing.

Questo lascia come unico pin liberamente utilizzabile GPIO16, se l’interfaccia della scheda SD è usata in modalità 4-bit. Se ti serve solo un LED di stato, puoi usare GPIO33, che è collegato a un LED rosso sul retro della scheda.

GPIO disponibili in diversi scenari

Vediamo diversi scenari applicativi e quali pin GPIO sono disponibili. GPIO16 sarà sempre disponibile, ma lo includo nelle descrizioni per completezza:

Nessuna scheda SD utilizzata

Se l’interfaccia della scheda SD non è usata, hai disponibili i GPIO 2, 4, 12, 13, 14, 15 e 16. Questi sono i pin segnati in blu nella figura seguente:

Free GPIO without SD-Card
GPIO liberi senza scheda SD

Puoi provare il seguente codice di test per vedere cosa succede quando vuoi far lampeggiare un LED su vari pin usando l’interfaccia della scheda SD in modalità 4-bit, 1-bit o non usandola affatto:

#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() {
}

Troverai maggiori dettagli su queste modalità nelle sezioni successive. Ricorda solo che, se vuoi usare l’interfaccia della scheda SD, devi avere una scheda SD formattata correttamente inserita. Altrimenti, la SD_MMC.begin() chiamata fallirà restituendo un valore di false.

Scheda SD usata in modalità 4-bit

Se usi l’interfaccia della scheda SD in modalità 4-bit (alta velocità), avrai disponibile solo GPIO16:

Free GPIO with SD-Card (4-bit Mode)
GPIO liberi con scheda SD (modalità 4-bit)

Il seguente estratto di codice mostra come inizializzare l’interfaccia della scheda SD nella modalità 4-bit predefinita:

#include "SD_MMC.h"

void setup() {
  SD_MMC.begin();
  ...
}

Nota che il LED flash integrato è collegato a GPIO4, il che fa sì che il LED flash lampeggi brevemente quando si usa il lettore di schede SD. Puoi evitare questo inizializzando l’interfaccia della scheda SD in modalità 1-bit, di cui parleremo nella sezione successiva.

Scheda SD usata in modalità 1-bit

Se usi l’interfaccia della scheda SD in modalità 1-bit, il trasferimento dati sarà più lento ma guadagni i pin GPIO12 e GPIO13 come disponibili:

Free GPIOs with SD-Card (1-bit Mode)
GPIO liberi con scheda SD (modalità 1-bit)

Per inizializzare l’interfaccia della scheda SD in modalità 1-bit usa il seguente codice. La parte importante è impostare il secondo parametro in SD_MMC.begin(..., true) a true, che attiva la modalità 1-bit.

#include "SD_MMC.h"

void setup() {
  SD_MMC.begin("/sdcard", true);
  ...
}

Questo ti permette anche di evitare il lampeggio del LED flash (su GPIO4) così:

#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
  ...
}

Anche se non puoi usare GPIO4 per altri scopi, puoi almeno accendere e spegnere il LED flash a piacimento, senza interferenze con le operazioni della scheda SD. Tuttavia, non devi tenere acceso il LED flash per più di un secondo! Non ha una resistenza di limitazione della corrente, si scalda molto e si brucia! Per maggiori dettagli vedi il tutorial Control ESP32-CAM Flash LED.

Utilizzo della modalità Deep-sleep

Se ti servono pin GPIO solo per risvegliare l’ESP32-CAM dalla modalità deep-sleep, ad esempio per scattare una foto quando viene rilevato un movimento, puoi effettivamente usare i GPIO 2, 4, 12, 13, 14 o 15, anche quando l’interfaccia della scheda SD è inizializzata in modalità 4-bit. Di seguito un esempio di cablaggio dal tutorial Motion Activated ESP32-CAM.

Connecting AM312 PIR Sensor to ESP32-CAM
Collegamento di v a ESP32-CAM

Aggiunta di GPIO

Se vuoi usare la scheda SD e ti servono più di 3 pin GPIO, il metodo più semplice è aggiungere una scheda GPIO Expander che usa un’interfaccia I2C. I2C richiede solo due pin e se inizializzi la scheda SD in modalità 1-bit, hai tre pin GPIO disponibili (12, 13, 16).

Lo schema di cablaggio seguente mostra come collegare la scheda MCP23017 GPIO Expander tramite I2C ai GPIO12 e GPIO13 dell’ESP32-CAM:

Connecting the MCP23017 GPIO Expander
Collegamento della scheda MCP23017 GPIO Expander

Ecco un esempio di codice che descrive come inizializzare il GPIO Expander e la scheda 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, ...);
  ...

}

Se vuoi saperne di più sul GPIO Expander MCP23017 dai un’occhiata al tutorial Using GPIO Expander MCP23017 With Arduino. Nota che puoi collegare in cascata più chip MCP23017, ottenendo fino a 128 GPIO. Sicuramente abbastanza ; )

Invece di un GPIO Expander bidirezionale come l’MCP23017 potresti anche usare Shift Register per aggiungere più ingressi o uscite. Vedi i tutorial More Inputs With 74HC165 Shift Register e More Arduino Outputs With 74HC595 Shift Register per maggiori dettagli.

Conclusioni

Questo articolo ti ha mostrato come ottenere più pin GPIO per il tuo ESP32-CAM. Spero ti sia utile per i tuoi progetti. Se hai domande, sentiti libero di lasciarle nella sezione commenti.

Buon divertimento con il tinkering 😉