Neste artigo, vais aprender como obter mais pinos GPIO livres para o teu ESP32-CAM placa. Os módulos ESP32-CAM são pequenas placas baseadas no ESP32 com uma câmara integrada, LED de flash e interface para cartão SD. São ótimos para construir sistemas simples de vigilância ou monitorização.
No entanto, o número de pinos GPIO livremente disponíveis é muito reduzido, especialmente quando a câmara e a interface do cartão SD estão em uso. Este tutorial mostra-te como contornar esta limitação.
Peças Necessárias
Vais precisar de um módulo ESP32-CAM com um shield de programação ou um adaptador FTDI USB-TTL. Alguns outros componentes, como cabo USB, cartão micro SD ou leitor de cartão SD, podes já ter. Não é necessário comprar, pois nenhum desses componentes é especial para este projeto.

ESP32-CAM com Shield USB-TTL

Adaptador FTDI USB-TTL

Cartão MicroSD 4GB

Leitor de Cartão SD

Cabo de Dados 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.
Utilização dos Pinos do ESP32-CAM
A imagem seguinte mostra o pinout do ESP32-CAM. O ESP32-S chip na placa tem 32 pinos GPIO, mas a maioria está a ser usada pela câmara e PSRAM e não está exposta.

Os 10 pinos GPIO acessíveis (cor roxa) também não estão totalmente livres, pois são partilhados com as interfaces do cartão SD e da comunicação serial. Especificamente, todos os GPIOs marcados a amarelo (12, 13, 15, 14, 2, 4) no lado esquerdo da placa são partilhados com o cartão SD. O esquema seguinte mostra as linhas de sinal usadas pelo soquete do cartão SD:

Como podes ver, as linhas de dados ligadas ao cartão SD são internamente puxadas para alto com resistores de 47K. A tabela abaixo indica qual o pino GPIO que corresponde a cada linha de dados da interface do cartão SD:
| Cartão SD | ESP32-CAM |
|---|---|
| HS2_CLK | GPIO14 |
| HS2_CMD | GPIO15 |
| HS2_DATA0 | GPIO2 |
| HS2_DATA1 / LED de flash | GPIO4 |
| HS2_DATA2 | GPIO12 |
| HS2_DATA3 | GPIO13 |
Os pinos GPIO3 e GPIO1 no lado direito da placa são necessários para a comunicação serial (U0_RXD, U0_TXD) e para a programação da placa.

Finalmente, o GPIO0 está ligado ao pino XCLK da câmara e deve ficar em estado flutuante (não ligado) quando o ESP32 está a funcionar. Internamente, o GPIO0 é puxado para alto por um resistor de 10KΩ e deve ser ligado ao GND durante o flashing.
Isto deixa-te apenas com o GPIO16 como pino livre para uso, se a interface do cartão SD estiver a funcionar em modo 4-bit. Se precisares apenas de um LED de estado, podes usar o GPIO33, que está ligado a um LED vermelho na parte traseira da placa.
GPIOs Disponíveis em Diferentes Cenários
Vamos analisar diferentes cenários de aplicação e ver quais os pinos GPIO disponíveis. O GPIO16 estará sempre disponível, mas incluo-o nas descrições seguintes para maior completude:
Sem Cartão SD
Se a interface do cartão SD não for usada, tens os GPIOs 2, 4, 12, 13, 14, 15 e 16 disponíveis. Estes são os pinos marcados a azul na imagem seguinte:

Podes experimentar o seguinte código de teste para ver o que acontece quando queres piscar um LED em vários pinos usando a interface do cartão SD em modo 4-bit, modo 1-bit ou sem usar:
#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 mais detalhes sobre estes modos nas secções seguintes. Apenas lembra-te que, se quiseres usar a interface do cartão SD, precisas de ter um cartão SD devidamente formatado inserido. Caso contrário, a SD_MMC.begin() chamada irá falhar com um valor de retorno defalse.
Cartão SD usado em Modo 4-bit
Se usares a interface do cartão SD em modo 4-bit (alta velocidade), terás apenas o GPIO16 disponível:

O excerto de código seguinte mostra como inicializar a interface do cartão SD no modo 4-bit por defeito:
#include "SD_MMC.h"
void setup() {
SD_MMC.begin();
...
}
Note que o LED de flash incorporado está ligado ao GPIO4, o que faz com que o LED de flash pisque brevemente quando o leitor de cartão SD é usado. Podes evitar isto inicializando a interface do cartão SD em modo 1-bit, que será discutido na próxima secção.
Cartão SD usado em Modo 1-bit
Se usares a interface do cartão SD em modo 1-bit, a transferência de dados será mais lenta, mas ganhas os GPIO12 e GPIO13 como pinos disponíveis:

Para inicializar a interface do cartão SD para usar o modo 1-bit, usa o seguinte código. O ponto importante aqui é definir o segundo parâmetro em SD_MMC.begin(..., true) paratrue, que ativa o modo 1-bit.
#include "SD_MMC.h"
void setup() {
SD_MMC.begin("/sdcard", true);
...
}
Isto também permite evitar o piscar do LED de flash (no GPIO4) assim:
#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
...
}
Embora não possas usar o GPIO4 para outros fins, podes pelo menos ligar e desligar o LED de flash à vontade, sem interferir com as operações do cartão SD. No entanto, não deves ligar o LED de flash por mais de um segundo! Ele não tem resistor limitador de corrente, aquece muito e pode queimar! Para mais detalhes, vê o Control ESP32-CAM Flash LED tutorial.
Utilização do Deep-sleep
Se precisares de pinos GPIO apenas para acordar o ESP32-CAM do deep-sleep, por exemplo para tirar uma foto quando for detetado movimento, podes usar os GPIOs 2, 4, 12, 13, 14 ou 15, mesmo quando a interface do cartão SD está inicializada em modo 4-bit. Abaixo um exemplo de ligação do Motion Activated ESP32-CAM tutorial

Adicionar GPIOs
Se quiseres usar o cartão SD e precisares de mais de 3 pinos GPIO, o método mais fácil é adicionar uma placa expansora de GPIO que use uma interface I2C. O I2C precisa apenas de dois pinos e, se inicializares o cartão SD em modo 1-bit, tens três pinos GPIO disponíveis (12, 13, 16).
O diagrama de ligação seguinte mostra como ligar a MCP23017 GPIO Expander placa via I2C aos GPIO12 e GPIO13 do ESP32-CAM:

E aqui está um exemplo de código que descreve como inicializar o expansor GPIO e o cartão 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 quiseres aprender mais sobre o expansor GPIO MCP23017, dá uma vista de olhos no Using GPIO Expander MCP23017 With Arduino tutorial. Nota que podes encadear vários chips MCP23017, o que te dá até 128 GPIOs. Certamente suficiente ; )
Em vez de um expansor GPIO bidirecional como o MCP23017, também podes usar registos de deslocamento para adicionar mais entradas ou saídas. Vê os More Inputs With 74HC165 Shift RegistereMore Arduino Outputs With 74HC595 Shift Register tutoriais para mais detalhes.
Conclusões
Este artigo mostrou-te como obter mais pinos GPIO para o teu ESP32-CAM. Espero que isto ajude nos teus projetos. Se tiveres alguma dúvida, não hesites em deixar nos comentários.
Boa bricolage 😉

