ESP32-CAM용 GPIO 핀 추가 방
이 글에서는 ESP32-CAM 보드 의 GPIO 핀을 더 많이 확보하는 방법을 알아보겠습니다 . ESP32-CAM 모듈은 카메라, 플래시 LED, SD 카드 인터페이스가 내장된 소형 ESP32 기반 보드입니다. 간단한 감시 또는 모니터링 시스템을 구축하는 데 적합합니다.
하지만 사용 가능한 GPIO 핀의 수는 매우 적으며, 특히 카메라와 SD 카드 인터페이스를 사용할 때는 더욱 그렇습니다. 이 튜토리얼에서는 이러한 제한을 해결하는 방법을 보여줍니다.

아래 목차입니다.
개요
필수 부품
ESP32-CAM과 USB-TTL 쉴드
FTDI USB-TTL 어댑터
4GB 마이크로SD 카드
SD 카드 리더기
USB 데이터 케이블
아두이노 IDE
ESP32-CAM의 핀 사용법
다양한 시나리오에서 사용 가능한 GPIO
SD 카드는 사용하지 않았습니다.
SD 카드는 4비트 모드에서 사용됩니다.
SD 카드는 1비트 모드로 사용됩니다.
깊은 수면 활용하기
GPIO 추가
결론
필수 부품
ESP32-CAM 모듈과 프로그래밍 쉴드 또는 FTDI USB-TTL 어댑터가 필요합니다. USB 케이블, 마이크로 SD 카드, SD 카드 리더기 등의 부품은 이미 가지고 있을 수도 있습니다. 그렇다면 따로 구매할 필요는 없습니다. 이 프로젝트에 특별히 필요한 부품은 아닙니다.
ESP32-CAM과 USB-TTL 쉴드
FTDI USB-TTL 어댑터
4GB 마이크로SD 카드
SD 카드 리더기
USB 데이터 케이블
아두이노 IDE 2.x
ESP32-CAM의 핀 사용법
다음 그림은 ESP32-CAM의 핀 배치도를 보여줍니다. 보드에 있는 ESP32-S 칩에는 32개의 GPIO 핀이 있지만, 대부분은 카메라와 PSRAM에 사용되어 외부로 노출되지 않습니다.

ESP32-CAM 모듈의 핀 배치도 ( 출처 )
접근 가능한 10개의 GPIO 핀(보라색)은 자유롭게 사용할 수 있는 것이 아니라 SD 카드 및 시리얼 통신 인터페이스와 공유됩니다. 특히, 보드 왼쪽의 노란색으로 표시된 GPIO 핀(12, 13, 15, 14, 2, 4)은 모두 SD 카드와 공유됩니다. 다음 회로도는 SD 카드 소켓에서 사용되는 신호선을 보여줍니다.

SD 카드 소켓 회로도 ( 출처 )
*ESP32-CAM 회로도 첨부 파일로 올립니다.
보시는 바와 같이 SD 카드에 연결된 데이터 라인은 47K 저항을 통해 내부적으로 풀업되어 있습니다. 아래 표는 SD 카드 인터페이스의 각 데이터 라인에 해당하는 GPIO 핀을 보여줍니다.
| SD Card | ESP32-CAM |
| HS2_CLK | GPIO14 |
| HS2_CMD | GPIO15 |
| HS2_DATA0 | GPIO2 |
| HS2_DATA1 / flash LED | GPIO4 |
| HS2_DATA2 | GPIO12 |
| HS2_DATA3 | GPIO13 |
보드 오른쪽의 GPIO3 및 GPIO1 핀은 직렬 통신(U0_RXD, U0_TXD) 및 보드 프로그래밍에 필요합니다.

ESP32-CAM의 직렬 통신 핀
마지막으로, GPIO0은 카메라의 XCLK 핀에 연결되어 있으며 ESP32를 실행할 때는 연결하지 않은 상태로 두어야 합니다. 내부적으로 GPIO0은 10kΩ 저항으로 풀업되어 있으므로 플래싱 중에는 GND에 연결해야 합니다.
SD 카드 인터페이스를 4비트 모드로 사용하는 경우, 자유롭게 사용할 수 있는 핀은 GPIO16뿐입니다. 단순히 상태 표시용 LED가 필요한 경우에는 보드 뒷면에 있는 빨간색 LED에 연결된 GPIO33을 사용할 수 있습니다.
다양한 시나리오에서 사용 가능한 GPIO
다양한 응용 시나리오를 살펴보고 사용 가능한 GPIO 핀을 알아보겠습니다. GPIO 16은 항상 사용 가능하지만, 설명을 완전하게 하기 위해 아래 설명에 포함했습니다.
SD 카드는 사용하지 않고
SD 카드 인터페이스를 사용하지 않는 경우 GPIO 2, 4, 12, 13, 14, 15, 16번 핀을 사용할 수 있습니다. 다음 그림에서 파란색으로 표시된 핀들이 바로 그 핀들입니다.

SD 카드 없이 사용 가능한 GPIO
SD 카드 인터페이스를 4비트 모드, 1비트 모드 또는 전혀 사용하지 않을 때, 다양한 핀의 LED를 깜빡이게 하면 어떤 결과가 나오는지 확인하려면 다음 테스트 코드를 실행해 보세요.
#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() {
}
이러한 모드에 대한 자세한 내용은 다음 섹션에서 확인할 수 있습니다. SD 카드 인터페이스를 사용하려면 올바르게 포맷된 SD 카드가 삽입되어 있어야 한다는 점을 기억하십시오. 그렇지 않으면 SD_MMC.begin() 호출이 false 반환 값과 함께 실패할 것입니다.
SD 카드 4비트 모드로 사용
SD 카드 인터페이스를 4비트(고속) 모드로 사용하면 GPIO16만 사용할 수 있습니다.

SD 카드 사용 시 GPIO 자유 사용 가능 (4비트 모드)
다음 코드 예시는 SD 카드 인터페이스를 기본 4비트 모드로 초기화하는 방법을 보여줍니다.
#include "SD_MMC.h"
void setup() {
SD_MMC.begin();
...
}
내장 플래시 LED는 GPIO 4에 연결되어 있어 SD 카드 리더기를 사용할 때 플래시 LED가 잠깐 깜빡입니다. 이 현상은 SD 카드 인터페이스를 1비트 모드로 초기화하면 방지할 수 있으며, 이에 대해서는 다음 섹션에서 설명하겠습니다.
SD 카드 1비트 모드로 사용
SD 카드 인터페이스를 1비트 모드로 실행하면 SD 카드와의 데이터 전송 속도는 느려지지만 GPIO12 및 GPIO13 핀을 추가로 사용할 수 있습니다.

SD 카드 사용 시 GPIO 사용 가능 (1비트 모드)
SD 카드 인터페이스를 1비트 모드로 사용하도록 초기화하려면 다음 코드를 사용하십시오. 여기서 중요한 점은 SD_MMC.begin(..., true)의 두 번째 매개변수를 true로 설정하여 1비트 모드를 활성화하는 것입니다.
#include "SD_MMC.h"
void setup() {
SD_MMC.begin("/sdcard", true);
...
}
이를 통해 다음과 같이 플래시 LED(GPIO4)의 깜빡임을 피할 수 있습니다:
#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
...
}
GPIO4를 다른 용도로 사용할 수는 없지만, 적어도 SD 카드 작동에 영향을 주지 않고 플래시 LED를 켜고 끌 수는 있습니다. 단, 플래시 LED를 1초 이상 켜두지 마십시오! 전류 제한 저항이 없어 매우 뜨거워지고 타버릴 수 있습니다! 자세한 내용은 ESP32-CAM 플래시 LED 제어 튜토리얼을 참조하십시오.
깊은 수면 활용하기
ESP32-CAM을 깊은 절전 모드에서 깨우는 용도로만 GPIO 핀이 필요한 경우(예: 움직임 감지 시 사진 촬영), SD 카드 인터페이스가 4비트 모드로 초기화된 경우에도 GPIO 2, 4, 12, 13, 14 또는 15를 사용할 수 있습니다. 아래는 움직임 감지 ESP32-CAM 튜토리얼 에서 발췌한 배선 예시입니다.

AM312 PIR 센서를 ESP32-CAM에 연결하기, 전원 입력 ESP32-CAM에 연결하기
GPIO 추가
SD 카드를 사용하고 3개 이상의 GPIO 핀이 필요한 경우, 가장 쉬운 방법은 I2C 인터페이스를 사용하는 GPIO 확장 보드를 추가하는 것입니다. I2C는 2개의 핀만 필요하며, SD 카드를 1비트 모드로 초기화하면 3개의 GPIO 핀(12, 13, 16)을 사용할 수 있습니다.
다음 배선도는 MCP23017 GPIO 확장 보드를 I2C를 통해 ESP32-CAM의 GPIO12 및 GPIO13에 연결하는 방법을 보여줍니다.

MCP23017 GPIO 확장기 연결하기
다음은 GPIO 확장기와 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, ...);
...
}
MCP23017 GPIO 확장기에 대해 더 자세히 알아보려면 " Arduino에서 MCP23017 GPIO 확장기 사용하기" 튜토리얼을 참조하세요. 여러 개의 MCP23017 칩을 연결하여 최대 128개의 GPIO를 사용할 수 있습니다. 이 정도면 충분하겠죠? ;)
MCP23017과 같은 양방향 GPIO 확장기 대신 시프트 레지스터를 사용하여 입력 또는 출력을 추가할 수도 있습니다. 자세한 내용은 "74HC165 시프트 레지스터를 사용한 입력 추가" 및 "74HC595 시프트 레지스터를 사용한 아두이노 출력 추가" 튜토리얼을 참조하십시오.
결론
이 글에서는 ESP32-CAM의 GPIO 핀을 늘리는 방법을 설명했습니다. 여러분의 프로젝트에 도움이 되길 바랍니다. 궁금한 점이 있으면 댓글로 남겨주세요.
즐거운 조립 시간 되세요 😉
매일 조금씩이라도 나아간다. 항해를 멈추지 않으면 언젠가 육지에 도착한다. 절대 포기하지 않는다.
여러분도 절대 포기하지 마세요. 여정이 전부입니다.
취업, 창업의 막막함, 외주 관리, 제품 부재!
당신의 고민은 무엇입니까? 현실과 동떨어진 교육, 실패만 반복하는 외주 계약,
아이디어는 있지만 구현할 기술이 없는 막막함.
우리는 알고 있습니다. 문제의 원인은 '명확한 학습, 실전 경험과 신뢰할 수 있는 기술력의 부재'에서 시작됩니다.
이제 고민을 멈추고, 캐어랩을 만나세요!
코딩(펌웨어), 전자부품과 디지털 회로설계, PCB 설계 제작, 고객(시장/수출) 발굴과 마케팅 전략으로 당신을 지원합니다.
제품 설계의 고수는 성공이 만든 게 아니라 실패가 만듭니다. 아이디어를 양산 가능한 제품으로!
귀사의 제품을 만드세요. 교육과 개발 실적으로 신뢰할 수 있는 파트너를 확보하세요.
캐어랩