3주차_참고 : ESP32 DevKit 개발 보드 핀 구성과 기능 - dhryu60/SmartDevice_2025-1 GitHub Wiki
ESP32 DevKit 보드에는 5V, 3.3V(3V3), GND 등의 전원 관련 핀이 있습니다. 일반적으로 Micro USB 포트를 통해 5V 전원을 공급받으며, 보드의 온보드 LDO 레귤레이터를 통해 3.3V로 변환되어 ESP32 칩과 주변 회로에 공급됩니다 (ESP32-DevKitC V4 - ESP32 - — esp-dev-kits latest documentation). 5V 전원은 USB 연결 시 보드의 5V 핀으로도 출력되며, 외부에서 이 5V 핀에 직접 5V를 인가해 보드에 전원을 공급할 수도 있습니다. 3.3V(3V3) 핀은 레귤레이터 출력으로서 보드에 3.3V를 공급하거나, 외부에서 안정된 3.3V를 직접 입력해 보드를 구동하는 용도로도 사용할 수 있습니다 (ESP32-DevKitC V4 - ESP32 - — esp-dev-kits latest documentation). GND 핀은 공통 접지로 사용되며, 회로의 기준 전압을 형성합니다.
전원 공급 방법 및 주의: ESP32 DevKitC V4 기준으로, 전원 공급에는 세 가지 방법(USB를 통한 5V, 5V 핀 입력, 3.3V 핀 입력)이 있지만 동시에 두 가지 이상을 공급해서는 안 됩니다 (ESP32-DevKitC V4 - ESP32 - — esp-dev-kits latest documentation) (ESP32-DevKitC V4 - ESP32 - — esp-dev-kits latest documentation). 동시에 여러 경로로 전원을 넣을 경우 보드나 전원공급 장치가 손상될 수 있으므로, 하나의 전원 입력만 사용해야 합니다. USB로 전원이 공급되면 보드상의 5V 파워 온 LED가 켜져 전원 입력 상태를 표시합니다 (ESP32-DevKitC V4 - ESP32 - — esp-dev-kits latest documentation). 3.3V 핀을 통해 직접 전원을 공급할 때는 USB나 5V 핀을 사용하지 않도록 해야 하며, 이때는 EN 핀(CHIP_PU)을 사용해 ESP32 칩을 활성화/디스에이블할 수 있습니다. EN 핀은 기본적으로 풀업(pull-up)되어 있어 3.3V 레귤레이터를 활성화하며, EN을 GND에 연결하면 레귤레이터를 비활성화하여 칩을 리셋하거나 꺼둘 수 있습니다 ([ESP32 Pinout Reference: Which GPIO pins should you use? | Random Nerd Tutorials](https://randomnerdtutorials.com/esp32-pinout-reference-gpios/#:~:text=Enable%20)).
ESP32 DevKit의 GPIO(General Purpose Input/Output) 핀들은 다목적 입출력으로 사용되며, 대부분의 ESP32 칩 핀이 보드 양쪽 헤더로 제공되어 다양한 기능을 구현할 수 있습니다 (ESP32-DevKitC V4 - ESP32 - — esp-dev-kits latest documentation). 기본적으로 디지털 입출력 기능을 수행하며, pinMode()
설정을 통해 입력 또는 출력으로 사용할 수 있습니다. 각 GPIO는 내부 풀업/풀다운 저항을 소프트웨어로 제어할 수 있고, 인터럽트 입력, 오픈드레인 출력 등의 모드도 지원합니다. 최대 출력 전류는 핀당 약 40mA 정도가 절대 최대치로 권장되지만 ([ESP32 Pinout Reference: Which GPIO pins should you use? | Random Nerd Tutorials](https://randomnerdtutorials.com/esp32-pinout-reference-gpios/#:~:text=GPIO%20current%20drawn)), 안정적인 동작을 위해 20mA 이하로 사용하는 것이 좋습니다. 몇몇 핀은 입력 전용으로 설정되어 있어서 출력 기능을 지원하지 않는데, 대표적으로 GPIO34 ~ GPIO39는 Input-Only 핀으로 출력이나 PWM 생성에 사용할 수 없습니다 ([ESP32 Pinout Reference: Which GPIO pins should you use? | Random Nerd Tutorials](https://randomnerdtutorials.com/esp32-pinout-reference-gpios/#:~:text=PWM)).
(ESP32-DevKitC V4 - ESP32 - — esp-dev-kits latest documentation) ESP32-DevKitC V4 보드의 핀 배치도. 각 핀의 이름과 기본 기능 (GPIO 번호, ADC 채널, Touch 채널 등) 및 특수 용도가 색상으로 구분되어 표시되어 있다. 빨간색으로 “Flash D0~D3, CMD, CLK”로 표시된 핀들은 내부 플래시에 사용되므로 일반 GPIO로 사용을 피해야 한다. (ESP32-DevKitC V4 - ESP32 - — esp-dev-kits latest documentation)
ESP32의 GPIO 핀들은 다중 기능을 갖도록 설계되어 한 핀에서 여러 기능을 선택적으로 활용할 수 있습니다. 예를 들어, 대부분의 GPIO 핀은 디지털 I/O 기본 기능 외에도 ADC(아날로그-디지털 컨버터 입력)나 터치 센서 입력, PWM 출력 등의 추가 기능이 할당되어 있습니다 (ESP32-DevKitC V4 - ESP32 - — esp-dev-kits latest documentation). ESP32 칩은 내부에 12비트 SAR ADC 채널을 18개까지 제공하는데, DevKit 보드에서 사용 가능한 ADC 핀들은 GPIO 각각에 ADC1_x 혹은 ADC2_x 채널 번호로 매핑됩니다 (ESP32-DevKitC V4 - ESP32 - — esp-dev-kits latest documentation) ([ESP32 DevKitC v4: high resolution pinout, datasheet and specs – Renzo Mischianti](https://mischianti.org/esp32-devkitc-v4-high-resolution-pinout-and-specs/#:~:text=%2A%2012,ATA%2FMMC%2FeMMC%C2%A0host%20controller)). 예를 들어 **GPIO36(VP)**는 ADC1 채널0, **GPIO39(VN)**는 ADC1 채널3 등에 연결되어 있어 아날로그 입력을 읽는 데 사용할 수 있습니다 (ESP32-DevKitC V4 - ESP32 - — esp-dev-kits latest documentation) (ESP32-DevKitC V4 - ESP32 - — esp-dev-kits latest documentation). 단, ADC는 두 개의 장치(ADC1, ADC2)로 나뉘는데 **ADC2에 속한 핀들(GPIO 0,2,4,12-15 등)**은 Wi-Fi 사용 시 충돌이 있을 수 있으므로 주의가 필요합니다 (Wi-Fi 동작 중 ADC2 자원을 사용하지 못함). DAC 기능도 ESP32 칩에 내장되어 있어 2채널 8비트 DAC 출력을 제공합니다 ([ESP32 DevKitC v4: high resolution pinout, datasheet and specs – Renzo Mischianti](https://mischianti.org/esp32-devkitc-v4-high-resolution-pinout-and-specs/#:~:text=%2A%2012,ATA%2FMMC%2FeMMC%C2%A0host%20controller)). DAC 출력이 가능한 핀은 **GPIO25(DAC1)**와 GPIO26(DAC2) 두 개이며, 해당 핀에 아날로그 전압 출력을 직접 생성할 수 있습니다 (ESP32-DevKitC V4 - ESP32 - — esp-dev-kits latest documentation) (ESP32-DevKitC V4 - ESP32 - — esp-dev-kits latest documentation).
이 밖에도 ESP32 GPIO 중 10개의 핀은 정전용량 터치 센서로 동작하는데, GPIO4, 0, 2, 15, 13, 12, 14, 27, 33, 32 등이 **터치 입력 채널 (Touch0Touch9)**로 할당되어 있습니다 (ESP32-DevKitC V4 - ESP32 - — esp-dev-kits latest documentation) (ESP32-DevKitC V4 - ESP32 - — esp-dev-kits latest documentation). 터치 센서는 사람의 손가락이나 물체 접촉으로 인한 정전용량 변화를 감지하여 입력으로 활용할 수 있습니다. 또한 PWM 출력(펄스 폭 변조) 기능은 LEDC(PWM) 컨트롤러를 통해 16개 채널까지 생성 가능하며, 출력 전용 핀을 제외한 모든 GPIO를 PWM 출력으로 활용할 수 있습니다 ([ESP32 Pinout Reference: Which GPIO pins should you use? | Random Nerd Tutorials](https://randomnerdtutorials.com/esp32-pinout-reference-gpios/#:~:text=PWM)). 개발자가 원하는 주파수와 듀티사이클로 PWM 신호를 설정하여 LED 밝기 제어나 모터 속도 제어 등에 사용할 수 있습니다. 다만, 앞서 언급한 것처럼 GPIO3439처럼 출력 기능이 없는 핀에서는 PWM을 사용할 수 없고, 부트 모드에 영향을 주는 일부 핀은 초기 부팅 시 예상치 못한 PWM 신호나 상태를 나타낼 수 있으므로 주의해야 합니다 ([ESP32 Pinout Reference: Which GPIO pins should you use? | Random Nerd Tutorials](https://randomnerdtutorials.com/esp32-pinout-reference-gpios/#:~:text=Some%20GPIOs%20change%20their%20state,the%20ESP32%20resets%20or%20boots)) ([ESP32 Pinout Reference: Which GPIO pins should you use? | Random Nerd Tutorials](https://randomnerdtutorials.com/esp32-pinout-reference-gpios/#:~:text=,GPIO%2015)).
ESP32 DevKit 보드는 풍부한 통신 인터페이스를 지원하여 다양한 주변 장치와 연결할 수 있습니다 ([ESP32 DevKitC v4: high resolution pinout, datasheet and specs – Renzo Mischianti](https://mischianti.org/esp32-devkitc-v4-high-resolution-pinout-and-specs/#:~:text=,and%C2%A0IEEE%201588%20Precision%20Time%20Protocol%C2%A0support)). 칩 내장 하드웨어로 UART(직렬), SPI, I²C, I²S, CAN, Ethernet MAC 등 여러 인터페이스를 제공하며, 개발 보드 설계상 주로 사용되는 UART, SPI, I2C 핀 구성을 살펴보면 다음과 같습니다:
ESP32는 **3개의 UART 인터페이스(UART0/UART1/UART2)**를 제공합니다 ([ESP32 DevKitC v4: high resolution pinout, datasheet and specs – Renzo Mischianti](https://mischianti.org/esp32-devkitc-v4-high-resolution-pinout-and-specs/#:~:text=,ATA%2FMMC%2FeMMC%C2%A0host%20controller)). 이 중 UART0는 기본적으로 USB-시리얼 브리지 칩(CP210x 등)을 통해 컴퓨터와 연결되어 프로그램 업로드와 시리얼 모니터 출력 용도로 사용됩니다. DevKit 보드에서는 UART0의 TXD0(GPIO1), RXD0(GPIO3) 핀이 USB 포트에 연결되어 있어 기본 Serial 통신에 사용되며, 보조 프로세서 없이 PC와 직접 연결됩니다 (ESP32-DevKitC V4 - ESP32 - — esp-dev-kits latest documentation) (ESP32-DevKitC V4 - ESP32 - — esp-dev-kits latest documentation). UART1과 UART2도 하드웨어적으로 존재하지만, 기본 핀 배치가 UART1은 GPIO10(TXD1)과 GPIO9(RXD1), UART2는 GPIO17(TXD2)과 GPIO16(RXD2)에 할당되어 있습니다 ([ESP32 Pinout Reference: Which GPIO pins should you use? | Random Nerd Tutorials](https://randomnerdtutorials.com/esp32-pinout-reference-gpios/#:~:text=UART%20Port%20TX%20RX%20Remarks,be%20assigned%20to%20other%20GPIOs)). 이때 UART1의 기본 핀(GPIO9, GPIO10)은 앞서 언급한 SPI 플래시 메모리 연결 핀이므로 해당 핀에서는 일반 UART 통신을 할 수 없습니다 ([ESP32 Pinout Reference: Which GPIO pins should you use? | Random Nerd Tutorials](https://randomnerdtutorials.com/esp32-pinout-reference-gpios/#:~:text=UART%20Port%20TX%20RX%20Remarks,be%20assigned%20to%20other%20GPIOs)). 따라서 추가 UART를 사용하려면 Serial1.begin(...)
등으로 소프트웨어적으로 다른 GPIO 핀으로 매핑하여 사용해야 합니다. UART2의 경우 기본 핀(GPIO16, GPIO17)이 모듈 종류에 따라 사용 가능 여부가 다릅니다 – ESP-WROOM 모듈을 사용하는 DevKit 보드는 이 핀들을 일반 GPIO/UART로 쓸 수 있지만, ESP-WROVER 모듈이 장착된 보드에서는 GPIO16/17이 PSRAM 제어용으로 예약되어 사용 불가능합니다 (ESP32-DevKitC V4 - ESP32 - — esp-dev-kits latest documentation). UART 통신은 기본적으로 TTL 레벨(3.3V) 직렬통신이며, 각 UART에 TX/RX 두 선이 필요합니다.
ESP32 칩에는 4개의 SPI 인터페이스가 있으며, 이 중 일반적으로 2개는 사용자 용도로 사용됩니다 (HSPI, VSPI) ([ESP32 DevKitC v4: high resolution pinout, datasheet and specs – Renzo Mischianti](https://mischianti.org/esp32-devkitc-v4-high-resolution-pinout-and-specs/#:~:text=,and%C2%A0IEEE%201588%20Precision%20Time%20Protocol%C2%A0support)). DevKit 보드에서 별도로 주변기기와 사용할 수 있는 기본 SPI 버스는 VSPI라고 불리며, Arduino IDE 등에서 기본 SPI 클래스에 매핑되어 있습니다. VSPI의 기본 핀 배치는 다음과 같습니다 ([ESP32 Pinout Reference: Which GPIO pins should you use? | Random Nerd Tutorials](https://randomnerdtutorials.com/esp32-pinout-reference-gpios/#:~:text=By%20default%2C%20the%20pin%20mapping,for%20SPI%20is)):
- MOSI (주 출력) – GPIO23 (ESP32-DevKitC V4 - ESP32 - — esp-dev-kits latest documentation) (ESP32-DevKitC V4 - ESP32 - — esp-dev-kits latest documentation)
- MISO (주 입력) – GPIO19 (ESP32-DevKitC V4 - ESP32 - — esp-dev-kits latest documentation) (ESP32-DevKitC V4 - ESP32 - — esp-dev-kits latest documentation)
- SCK (클럭) – GPIO18 (ESP32-DevKitC V4 - ESP32 - — esp-dev-kits latest documentation) (ESP32-DevKitC V4 - ESP32 - — esp-dev-kits latest documentation)
- CS (칩 선택) – GPIO5 (ESP32-DevKitC V4 - ESP32 - — esp-dev-kits latest documentation) (ESP32-DevKitC V4 - ESP32 - — esp-dev-kits latest documentation)
또 다른 버스인 HSPI도 사용할 수 있는데, 이는 개발자가 두 번째 SPI 버스로 설정해서 사용할 수 있습니다. HSPI의 기본 핀은 GPIO14 (CLK), GPIO12 (MISO), GPIO13 (MOSI), GPIO15 (CS)로 정의되어 있습니다 ([ESP32 Pinout Reference: Which GPIO pins should you use? | Random Nerd Tutorials](https://randomnerdtutorials.com/esp32-pinout-reference-gpios/#:~:text=By%20default%2C%20the%20pin%20mapping,for%20SPI%20is)). 그러나 이들 중 GPIO12, GPIO15 등은 부트 스트래핑 핀이기도 하고, HSPI의 기본 핀 설정은 소프트웨어적으로 변경이 가능하므로 필요에 따라 다른 핀으로 SPI 신호를 remap 할 수 있습니다. 예를 들어 SD 카드를 연결하거나 두 개의 SPI 장치를 동시에 사용할 때 하나는 VSPI(기본 SPI), 다른 하나는 HSPI로 구성하여 사용합니다. ESP32의 SPI는 최대 80MHz까지 클럭을 설정할 수 있고, 다중 장치 사용 시에는 각 장치별 CS 핀을 다르게 할당하여 하나의 버스에 여러 SPI 장치를 공유 연결할 수도 있습니다.
ESP32는 **2개의 I²C 컨트롤러(호스트)**를 내장하고 있으며, 모든 GPIO 핀을 소프트웨어적으로 SDA/SCL로 설정하여 사용할 수 있는 유연성을 갖습니다 ([ESP32 Pinout Reference: Which GPIO pins should you use? | Random Nerd Tutorials](https://randomnerdtutorials.com/esp32-pinout-reference-gpios/#:~:text=I2C)). 다만, 일반적으로 Arduino 개발 환경의 기본 I2C 핀은 GPIO21 (SDA), **GPIO22 (SCL)**로 정해져 있어서 특별한 설정 없이도 이 핀들을 통해 I2C 통신을 사용할 수 있습니다 ([ESP32 Pinout Reference: Which GPIO pins should you use? | Random Nerd Tutorials](https://randomnerdtutorials.com/esp32-pinout-reference-gpios/#:~:text=The%20ESP32%20has%20two%20I2C,the%20default%20I2C%20pins%20are)). DevKit 보드에서도 별도의 I2C 버퍼나 회로 없이 이 핀들을 사용하면 되고, 다른 핀을 쓰고 싶을 경우 Wire.begin(SDA, SCL)
식으로 원하는 GPIO를 할당할 수 있습니다. I²C 통신을 사용하려면 풀업 저항(보드에 내장되어 있지 않으면 외부에 4.7kΩ 정도)을 SDA와 SCL 라인에 걸어주어야 하며, 1개의 I2C 버스에 여러 장치를 병렬로 연결하여 각 장치를 주소로 구분하는 방식으로 동작합니다.
예를 들어, 환경 센서를 I2C로 연결하는 실습을 생각해보겠습니다. AHT10 온습도 센서를 ESP32 DevKit에 연결할 경우, AHT10 모듈의 SCL 핀은 GPIO22, SDA 핀은 GPIO21에 연결하고 전원은 3.3V/GND에 연결합니다 ([IOT Temperature and Humidity Monitoring Device : 8 Steps - Instructables](https://www.instructables.com/IOT-Temperature-and-Humidity-Monitoring-Device/#:~:text=Connect%20the%20ESP32%20and%20AHT10,sensor%20as%20follows)). 이렇게 연결하면, ESP32의 I2C 버스를 통해 센서로부터 데이터를 읽어올 수 있습니다. 아래에서는 해당 연결을 통해 I²C 장치 주소를 스캔하고 센서가 제대로 연결되었는지 확인하는 예시 코드를 소개합니다.
ESP32 칩은 일부 GPIO 핀이 부트 모드(strapping) 설정 용도로 쓰입니다. 이 핀들은 리셋 시 상태를 읽어서 부트로더 진입이나 동작 모드를 결정하고, 이후에는 일반 GPIO로 동작합니다 ([ESP32 Pinout Reference: Which GPIO pins should you use? | Random Nerd Tutorials](https://randomnerdtutorials.com/esp32-pinout-reference-gpios/#:~:text=These%20are%20used%20to%20put,Selection%20can%20be%20found%20here)). 주요 스트래핑 핀과 정상 부팅을 위한 상태는 다음과 같습니다 ([ESP32 Pinout Reference: Which GPIO pins should you use? | Random Nerd Tutorials](https://randomnerdtutorials.com/esp32-pinout-reference-gpios/#:~:text=The%20ESP32%20chip%20has%20the,following%20strapping%20pins)):
- GPIO0 – (FLASH 부팅 모드 선택) 일반 실행시 HIGH, 펌웨어 다운로드(부트로더) 모드 진입을 위해서는 LOW이어야 함 ([ESP32 Pinout Reference: Which GPIO pins should you use? | Random Nerd Tutorials](https://randomnerdtutorials.com/esp32-pinout-reference-gpios/#:~:text=The%20ESP32%20chip%20has%20the,following%20strapping%20pins)). DevKit의 BOOT 버튼이 이 핀을 GND로 연결합니다.
- GPIO2 – 부트 시 LOW 또는 부동(floating) 상태 권장 ([ESP32 Pinout Reference: Which GPIO pins should you use? | Random Nerd Tutorials](https://randomnerdtutorials.com/esp32-pinout-reference-gpios/#:~:text=The%20ESP32%20chip%20has%20the,following%20strapping%20pins)). (일부 모듈에서는 이 핀이 HIGH이면 부팅 실패할 수 있어 특별한 회로에 사용 주의)
- GPIO4 – 스트래핑 핀이지만 특별 조건 없음 (사용된 외부 메모리 종류에 따라 Reserved).
- GPIO5 – 부트 시 HIGH 유지 필요 ([ESP32 Pinout Reference: Which GPIO pins should you use? | Random Nerd Tutorials](https://randomnerdtutorials.com/esp32-pinout-reference-gpios/#:~:text=,must%20be%20HIGH%20during%20boot)). (기본적으로 풀업됨)
- GPIO12 (MTDI) – 부트 시 LOW 유지 필요 ([ESP32 Pinout Reference: Which GPIO pins should you use? | Random Nerd Tutorials](https://randomnerdtutorials.com/esp32-pinout-reference-gpios/#:~:text=,must%20be%20HIGH%20during%20boot)). (이 핀 상태로 FLASH 전압 모드를 결정함; HIGH이면 1.8V 모드로 오인돼 부팅 실패 가능)
- GPIO15 (MTDO) – 부트 시 HIGH 유지 필요 ([ESP32 Pinout Reference: Which GPIO pins should you use? | Random Nerd Tutorials](https://randomnerdtutorials.com/esp32-pinout-reference-gpios/#:~:text=,must%20be%20HIGH%20during%20boot)). (기본 풀업)
일반적으로 DevKit 보드에서는 USB 시리얼칩과 자동 부트로더 회로가 위 핀들의 상태를 자동으로 제어해주기 때문에, 사용자는 신경쓰지 않고도 펌웨어 업로드가 가능합니다 ([ESP32 Pinout Reference: Which GPIO pins should you use? | Random Nerd Tutorials](https://randomnerdtutorials.com/esp32-pinout-reference-gpios/#:~:text=These%20are%20used%20to%20put,Selection%20can%20be%20found%20here)). 다만 사용자가 외부 회로를 연결할 때 이들 핀에 부착된 장치가 부트 시에 간섭을 하지 않도록 해야 합니다 ([ESP32 Pinout Reference: Which GPIO pins should you use? | Random Nerd Tutorials](https://randomnerdtutorials.com/esp32-pinout-reference-gpios/#:~:text=However%2C%20if%20you%20have%20peripherals,those%20pins%20work%20as%20expected)). 예를 들어 GPIO0을 다른 장치와 연결해 HIGH로 끌어올리면 부트로더 모드로 진입하지 못하거나, GPIO2에 부착된 부하가 해당 핀을 HIGH로 만들어버리면 부팅이 안 될 수 있습니다. DevKitC V4 보드의 경우, 이전 버전 일부에서 C15라는 커패시터가 GPIO0 신호에 영향을 주어 간혹 의도치 않게 다운로드 모드로 진입하는 문제가 있어 제거하도록 안내되기도 했습니다 (ESP32-DevKitC V4 - ESP32 - — esp-dev-kits latest documentation) (ESP32-DevKitC V4 - ESP32 - — esp-dev-kits latest documentation).
BOOT 버튼: DevKit 보드에는 “BOOT”로 표시된 버튼이 있는데, 이는 GPIO0을 GND에 연결하는 버튼입니다 (ESP32-DevKitC V4 - ESP32 - — esp-dev-kits latest documentation). 이 버튼을 누른 상태에서 EN 리셋 버튼을 눌렀다가 놓으면, GPIO0이 LOW인 채 리셋되면서 ESP32가 **펌웨어 다운로드 모드(UART 부트로더)**로 진입합니다 (ESP32-DevKitC V4 - ESP32 - — esp-dev-kits latest documentation). 일반적으로 Arduino IDE나 ESP-IDF에서 자동으로 이 절차를 해주지만, 수동으로 펌웨어를 플래싱해야 할 때 이 버튼을 사용합니다.
ESP32는 JTAG 인터페이스를 통해 디버깅을 지원하며, 이는 칩의 내부 디버그 모듈에 연결됩니다. ESP32-WROOM 모듈 기준 JTAG 신호에 해당하는 핀들은 다음과 같습니다: GPIO12 (MTDI), GPIO13 (MTCK), GPIO14 (MTMS), GPIO15 (MTDO) (ESP32-DevKitC V4 - ESP32 - — esp-dev-kits latest documentation) (ESP32-DevKitC V4 - ESP32 - — esp-dev-kits latest documentation). 이 핀들은 각각 JTAG의 TDI, TCK, TMS, TDO에 매핑되며, DevKitC 보드의 헤더를 통해 접근 가능합니다. 외부 JTAG 디버거(예: ESP-Prog 모듈 등)를 이 핀들에 연결하고 ESP32를 디버깅 모드로 설정하면, Step-by-step 실행, 브레이크포인트, 메모리 조회 등 하드웨어 디버깅을 할 수 있습니다. 다만 앞서 언급했듯 GPIO12와 GPIO15는 부트 스트랩 핀이므로, 개발 중 JTAG 연결 회로가 있더라도 부팅 시 이 핀들의 상태(HIGH/LOW)를 유지시켜 정상 부팅되도록 해야 합니다. JTAG 모드를 사용하지 않을 때는 이 핀들을 일반 GPIO나 다른 기능(터치, ADC 등)으로 사용할 수 있습니다. 예를 들어 GPIO14, 12, 13, 15는 각각 터치 입력이나 ADC2 채널로도 쓰이므로, JTAG가 필요 없으면 일반 용도로 활용해도 됩니다.
ESP32는 메인 클럭(40MHz) 외에 저전력 동작시 정밀한 딥슬립 타이머 등을 위해 32.768 kHz 외부 크리스탈 연결을 지원합니다. DevKit 보드에서는 기본적으로 32kHz 크리스탈이 실장되어 있지 않지만, 필요하다면 **GPIO32 (XTAL_32K_P)**와 GPIO33 (XTAL_32K_N) 핀에 32kHz 시계용 크리스탈을 연결하여 사용할 수 있습니다 (ESP32-DevKitC V4 - ESP32 - — esp-dev-kits latest documentation) (ESP32-DevKitC V4 - ESP32 - — esp-dev-kits latest documentation). 이 두 핀은 RTC 서브시스템의 저속 클럭 입력으로 연결되며, 크리스탈과 12pF 정도의 부하 커패시터를 달아주면 안정적인 32kHz 신호를 얻을 수 있습니다. 이를 통해 ESP32의 딥슬립 모드에서 타이머 정확도를 높이거나, 초저속 클럭을 필요로 하는 어플리케이션(예: RTC 알람)을 구현할 수 있습니다. 단, 32kHz 크리스탈을 사용하지 않는 경우 GPIO32, 33은 일반 ADC(ADC1 채널4,5) 및 터치 센서 입력(터치8,9)으로 활용 가능합니다.
이 외에도 ESP32에는 내장 Hall 센서와 온도 센싱 기능이 있는데, Hall 센서는 칩 내부적으로 GPIO36(VP)와 GPIO39(VN)에 연결된 회로로 구성되어 자력 변화를 감지합니다 ([ESP32 Pinout Reference: Which GPIO pins should you use? | Random Nerd Tutorials](https://randomnerdtutorials.com/esp32-pinout-reference-gpios/#:~:text=ESP32%20Built)). 이러한 내장 센서는 별도 핀 출력은 없지만, ADC1 채널을 통해 값을 읽어들일 수 있어 특별한 경우에 활용되기도 합니다.
ESP32 DevKit 보드는 Wi-Fi와 Bluetooth가 내장된 강력한 마이크로컨트롤러로서 IoT 분야와 임베디드 시스템에서 폭넓게 사용됩니다. Wi-Fi를 통해 인터넷이나 로컬 네트워크에 직접 연결될 수 있으므로 센서 데이터 수집 및 전송 장치로 활용하기 적합합니다. 예를 들어, ESP32 DevKit와 온습도 센서를 이용하여 실내 환경 모니터 IoT 디바이스를 만들고, 주기적으로 센서 값을 측정하여 Wi-Fi를 통해 클라우드 서버(예: ThingSpeak 등)나 웹 대시보드로 전송하는 프로젝트가 많이 구현되고 있습니다 ([IOT Temperature and Humidity Monitoring Device : 8 Steps - Instructables](https://www.instructables.com/IOT-Temperature-and-Humidity-Monitoring-Device/#:~:text=In%20this%20instructable%2C%20we%20will,ESP32%20DevKit%20and%20AHT10%20sensor)). 이러한 장치는 웹 서버를 직접 내장하여 사용자가 스마트폰이나 PC 웹브라우저로 접속해 실시간 센서값을 확인하거나 장치를 제어할 수도 있고, MQTT 프로토콜을 사용해 여러 센서 노드의 데이터를 통합 관리하는 IoT 시스템의 한 구성 요소로 사용되기도 합니다.
ESP32의 블루투스(BLE) 기능도 IoT 분야에서 **비콘(beacon)**이나 스마트폰 연동 센서로 활용됩니다. 예를 들어 BLE를 통해 휴대폰 앱에 주기적으로 온도 정보를 브로드캐스팅하는 환경 센서나, 공장 기계의 동작 상태를 BLE로 주변에 알리는 디바이스 등을 들 수 있습니다. Wi-Fi에 비해 전력 소모가 낮은 BLE를 사용하여 배터리 구동 IoT 센서를 구현하고, 필요시 Wi-Fi로 펌웨어를 OTA 업데이트하거나 데이터를 동기화하는 이중 통신 시나리오도 가능합니다.
임베디드 시스템 분야에서는 ESP32의 듀얼 코어 프로세서와 RTOS(FreeRTOS) 지원을 활용하여, 비교적 복잡한 실시간 제어 작업을 동시에 처리하는 경우도 있습니다. 예를 들어 로봇 제어나 드론 제어기에 ESP32를 사용하면 한 코어에서는 센서 융합이나 모터 PID 제어를 수행하고, 다른 코어에서는 무선 통신 스택(Wi-Fi 또는 BLE)을 처리하게 하여 실시간 성능을 높일 수 있습니다. 또한 캔버스(CAN) 인터페이스나 SPI, UART 등을 활용하여 차량 네트워크나 산업용 장치와 통신하는 임베디드 게이트웨이 장치로도 쓰입니다 ([ESP32 DevKitC v4: high resolution pinout, datasheet and specs – Renzo Mischianti](https://mischianti.org/esp32-devkitc-v4-high-resolution-pinout-and-specs/#:~:text=,amplifier)). ESP32는 내부에 충분한 SRAM과 플래시, 그리고 다양한 인터페이스를 갖추고 있어, IoT 외에도 교육용 플랫폼 (마이크로파이썬 지원), 데이터 로거 (SD카드 연결), 스마트 홈 제어기 (예: ESPHome, Tasmota 프로젝트) 등 다방면에 응용되고 있습니다.
ESP32 DevKit 보드에는 개정판(version)에 따른 몇 가지 하드웨어 차이가 존재합니다. DevKit V1이라는 명칭은 초기의 ESP32 개발 보드를 가리키는데, 일반적으로 ESP-WROOM-32 모듈이 장착된 30핀짜리 보드(일부 서드파티 보드, DOIT DevKit v1 등)를 의미합니다. 이에 비해 Espressif 공식 DevKitC V4 보드는 양측에 총 38개의 핀헤더가 있고, 더 최신 개정판입니다. 주요 차이점을 정리하면 다음과 같습니다:
-
USB-시리얼 칩 변경: V1 보드들은 CP2102 또는 CH340 같은 시리얼-USB 컨버터를 사용하였으나, DevKitC V4에서는 CP2102N 칩을 사용합니다. CP2102N은 기존보다 **더 높은 baudrate(최대 3Mbps)**를 지원하고 안정성이 향상되었습니다 ([Does someone know the differences between ESP32-DEVKITV1, ESP32-DEVKITV2 and ESP32-DEVKITC V4 ? : r/esp32](https://www.reddit.com/r/esp32/comments/k9xjl2/does_someone_know_the_differences_between/#:~:text=%E2%80%A2)). 따라서 펌웨어 업로드 속도가 다소 개선되고 USB 연결 신뢰성이 높습니다.
-
핀 배치 및 갯수: V1 (특히 30핀 보드)의 경우 ESP32 칩의 일부 핀(GPIO6~11 등 플래시 연결 핀)은 헤더에 출력되지 않았거나 사용되지 않도록 구성되었습니다. 대신 보드 상에 내장 LED를 제공하여 사용자 피드백 용도로 활용할 수 있게 한 버전도 있습니다 ([ESP32 DEVKIT V1 VS V4 : r/esp32](https://www.reddit.com/r/esp32/comments/w0zbug/esp32_devkit_v1_vs_v4/#:~:text=Samylab81)). 예를 들어 DOIT DevKit v1 보드에는 GPIO2에 연결된 사용자 LED가 있어
HIGH/LOW
로 토글하여 상태를 볼 수 있었습니다. 반면, DevKitC V4 공식 보드는 내장된 사용자 LED가 없고, GPIO6,7,8,9,10,11 (명칭상 D0, D1, D2, D3, CMD, CLK로 표시) 핀까지 모두 핀헤더에 포함되어 총 38핀이 노출됩니다 (ESP32-DevKitC V4 - ESP32 - — esp-dev-kits latest documentation). 그러나 이들 핀은 앞서 설명한 대로 내부 SPI Flash 및 PSRAM과 연결되어 있기 때문에 일반 GPIO로 사용하지 않는 것이 권장됩니다 (ESP32-DevKitC V4 - ESP32 - — esp-dev-kits latest documentation). V4 보드는 필요에 따라 ESP-WROVER (PSRAM 포함 모듈)까지 호환 가능하도록 핀헤더가 구성되었으며, 이 경우 GPIO16, GPIO17 핀이 PSRAM 용도로 점유됩니다 (ESP32-DevKitC V4 - ESP32 - — esp-dev-kits latest documentation). -
기타 변경: DevKitC V4에서는 회로상의 작은 개선이 이루어졌습니다. 예를 들어 자동부팅 회로의 커패시턴스 값 변경(C15 관련)이나, 핀 헤더 구성에서 이름 표기 변경 등이 있습니다. 또한 V4 보드의 크기는 소폭 작아져서 브레드보드에 장착 시 좌우에 약간 더 공간이 생기는 등의 차이가 있습니다 (핀 간 간격은 여전히 2.54mm 표준). 기능적으로 ESP32 모듈 자체의 차이는 없으므로, 사용 방법 측면에서는 V1이나 V4나 거의 동일하며 최신 버전을 사용하는 것이 권장됩니다 ([Does someone know the differences between ESP32-DEVKITV1, ESP32-DEVKITV2 and ESP32-DEVKITC V4 ? : r/esp32](https://www.reddit.com/r/esp32/comments/k9xjl2/does_someone_know_the_differences_between/#:~:text=%E2%80%A2)).
마지막으로, ESP32 DevKit 보드의 핀을 활용한 간단한 실습 예제를 통해 앞서 설명한 내용을 확인해보겠습니다. 각 예제마다 하드웨어 연결 방법과 함께 Arduino IDE용 코드 스니펫을 제공합니다. (Arduino 환경의 ESP32 보드 패키지를 설정했다고 가정합니다.)
하드웨어 연결: LED의 애노드(anode)를 GPIO23 핀에 연결하고, LED의 캐소드(cathode)를 220Ω 저항을 통해 GND에 연결합니다. (만약 DevKit 보드에 사용자 LED가 있다면 해당 LED 핀을 사용해도 됩니다. DevKit V1 보드의 경우 GPIO2에 LED가 있습니다.)
이제 해당 LED를 1초 간격으로 켜고 끄는 예제를 보겠습니다.
const int LED_PIN = 23; // GPIO23 핀에 LED 연결
void setup() {
pinMode(LED_PIN, OUTPUT); // LED 핀을 출력으로 설정
}
void loop() {
digitalWrite(LED_PIN, HIGH); // LED 켜기
delay(1000); // 1초 대기
digitalWrite(LED_PIN, LOW); // LED 끄기
delay(1000); // 1초 대기
}
위 코드를 업로드하면 연결한 LED가 1초 간격으로 점멸(blink)하는 것을 확인할 수 있습니다. 이 예제에서는 GPIO 기본 출력 기능을 사용했습니다.
하드웨어 연결: 위와 동일하게 LED를 GPIO23에 연결합니다. (LED 위치 변경 없이 코드만 수정하여 PWM으로 제어해보겠습니다.) ESP32의 LED PWM 기능을 사용하여 LED 밝기가 서서히 밝아졌다 어두워지도록 해보겠습니다.
const int LED_PIN = 23; // PWM으로 제어할 LED 핀
int brightness = 0; // 밝기 값 (0~255)
int fadeAmount = 5; // 한 번에 변화시킬 밝기 단계
void setup() {
pinMode(LED_PIN, OUTPUT);
// ESP32 Arduino core에서는 analogWrite() 함수 지원
// (필요시 analogWriteResolution(8) 등으로 분해능 설정 가능, 기본 8비트)
}
void loop() {
analogWrite(LED_PIN, brightness); // 현재 밝기로 LED 출력
brightness += fadeAmount; // 밝기 값 변경
if(brightness <= 0 || brightness >= 255) {
fadeAmount = -fadeAmount; // 밝기가 범위를 넘으면 증가/감소 방향 반전
}
delay(30); // 약간의 딜레이 (PWM 변화 속도 조절)
}
이 코드는 analogWrite
함수를 통해 PWM 출력을 생성합니다. analogWrite(LED_PIN, value)
는 해당 핀에 0255에 대응하는 듀티비의 PWM 신호를 출력하며, LED의 평균 밝기를 제어합니다. 위 예제에서는 16비트 해상도로 설정 가능하지만, 간단히 8비트 값을 사용했습니다.)brightness
값을 0부터 255까지 점진적으로 증가시켰다가 감소시켜, LED가 서서히 밝아졌다가 어두워지는 페이드(fade) 효과를 구현했습니다. (참고로 ESP32의 PWM은 8
하드웨어 연결: 10kΩ 정도의 가변저항(potentiometer)을 준비합니다. 가변저항의 한 쪽 끝은 3.3V 핀에, 다른 쪽 끝은 GND에 연결하고, 가운데 핀(wiper)은 GPIO34 핀에 연결합니다. GPIO34는 ADC 기능이 있는 입력전용 핀이므로 아날로그 값을 측정하기 적합합니다.
이제 ADC를 통해 가변저항의 분압 출력(voltage divider output)을 읽어 시리얼 모니터로 출력하는 코드를 보겠습니다.
const int POT_PIN = 34; // 가변저항 wiper 연결 핀 (ADC1 채널6)
void setup() {
Serial.begin(115200);
analogReadResolution(12); // ESP32 ADC 해상도 12비트 (0~4095 값)
}
void loop() {
int adcValue = analogRead(POT_PIN); // ADC 값 읽기 (0~4095)
float voltage = adcValue * (3.3 / 4095.0); // 계산된 전압값 (3.3V 기준)
Serial.print("ADC Raw: ");
Serial.print(adcValue);
Serial.print(" Voltage: ");
Serial.print(voltage, 2);
Serial.println(" V");
delay(500);
}
업로드 후 시리얼 모니터(115200 baud)에서 출력되는 값을 확인하면, 가변저항을 돌릴 때마다 ADC 원시 값(0~4095)과 계산된 전압 값이 변하는 것을 볼 수 있습니다. 이처럼 ADC 입력 핀을 활용하면 센서의 아날로그 출력을 읽어들일 수 있습니다. 예를 들어 광센서(LDR)나 온도센서(아날로그 출력형)의 값을 읽어서 로직을 구성하는 등의 응용이 가능합니다. (주의: ESP32의 ADC2 계열 핀은 Wi-Fi 사용 시 값 읽기가 제한되므로, Wi-Fi를 동시 사용하는 경우 ADC1 계열 핀(GPIO32-39 등)을 주로 사용합니다.)
하드웨어 연결: I2C 통신 테스트를 위해 I2C 장치(예: 앞서 언급한 AHT10 센서 모듈)를 연결합니다. AHT10 기준으로 SCL -> GPIO22, SDA -> GPIO21에 연결하고 전원 3.3V 및 GND를 연결합니다 ([IOT Temperature and Humidity Monitoring Device : 8 Steps - Instructables](https://www.instructables.com/IOT-Temperature-and-Humidity-Monitoring-Device/#:~:text=Connect%20the%20ESP32%20and%20AHT10,sensor%20as%20follows)). (다른 I2C 센서/모듈도 동일하게 SDA, SCL을 연결하면 됩니다. 여러 장치를 연결할 경우 모두 SDA끼리, SCL끼리 병렬 연결합니다.) 또한 SDA와 SCL 라인에는 풀업 저항이 필요할 수 있으나, 일부 모듈에는 내장되어 있습니다.
아래 코드는 I2C 버스에 연결된 장치들의 주소를 스캔하여 시리얼 모니터에 출력하는 I2C 스캐너 예제입니다.
#include <Wire.h>
void setup() {
Serial.begin(115200);
Wire.begin(21, 22); // SDA=GPIO21, SCL=GPIO22로 I2C 시작
Serial.println("I2C Scanner: Scanning for devices...");
}
void loop() {
for(byte address = 1; address < 127; address++) {
Wire.beginTransmission(address);
byte error = Wire.endTransmission();
if(error == 0) {
Serial.print("I2C device found at 0x");
Serial.println(address, HEX);
}
delay(5);
}
Serial.println("Scan done.");
delay(2000); // 2초마다 스캔
}
코드를 업로드하고 시리얼 모니터를 보면, I2C 버스에 연결된 디바이스의 주소를 찾아내어 출력합니다. 예를 들어 AHT10 센서를 연결했다면 해당 센서의 기본 주소(0x38 등)를 발견했다는 메시지가 표시될 것입니다. 이처럼 I2C 통신을 사용하면 ESP32에 다양한 센서 모듈(BME280, OLED 디스플레이, MPU6050 자이로/가속도계 등)을 간편하게 다중 접속 형태로 연결할 수 있습니다. I2C는 2선만으로 여러 장치를 다룰 수 있어 IoT 프로젝트에서 센서 네트워킹에 많이 쓰이는 인터페이스입니다.
이상으로 ESP32 DevKit의 핀 구성과 기능에 대해 전원, GPIO 다기능, 통신 인터페이스, 특수 핀, 실무 활용, 보드 버전 차이, 예제 코드까지 폭넓게 살펴보았습니다. 정리하면, ESP32 DevKit 보드는 3.3V 로 구동되는 Wi-Fi/BLE 마이크로컨트롤러 보드로서, 풍부한 GPIO와 다양한 주변기기 인터페이스(UART, SPI, I2C 등)를 핀헤더로 제공하여 IoT, 임베디드 개발에 매우 유용한 플랫폼입니다. 공식 문서와 데이터시트를 참고하면 각 핀의 세부 기능과 제약을 더욱 정확히 파악할 수 있으며, 실제 회로 설계나 프로젝트에 적용할 때 큰 도움이 됩니다 (ESP32-DevKitC V4 - ESP32 - — esp-dev-kits latest documentation) ([ESP32 DevKitC v4: high resolution pinout, datasheet and specs – Renzo Mischianti](https://mischianti.org/esp32-devkitc-v4-high-resolution-pinout-and-specs/#:~:text=%2A%2012,ATA%2FMMC%2FeMMC%C2%A0host%20controller)). 항상 **신뢰할 수 있는 자료(데이터시트와 Espressif 공식 문서)**를 참고하여 핀 기능과 전기적 특성을 확인하고, 안전한 전원 공급과 올바른 핀 활용이 필요함