ESP32 펌웨어 기초 #1: ESP32 소개 및 개발 환경 설정

기운찬곰·2025년 9월 10일

ESP32 펌웨어 기초

목록 보기
1/2
post-thumbnail

ESP32

ESP32는 Wi-Fi와 Bluetooth 기능이 내장된 저비용, 저전력 마이크로컨트롤러입니다. 중국의 팹리스 반도체 회사인 Espressif Systems에서 개발했습니다. 사물 인터넷(IoT) 기기 개발에 널리 사용되며, 다양한 센서와 주변 장치를 연결하여 제어할 수 있습니다.

ESP32-WROOM-32 DevKit 참고.

주요 특징

  • 통신 기능: 2.4 GHz Wi-Fi와 듀얼 모드 블루투스(Classic/BLE)를 지원해 다양한 무선 통신 환경을 구축할 수 있습니다.
  • CPU: 듀얼 코어 Tensilica Xtensa LX6 32비트 마이크로프로세서를 탑재하여 강력한 처리 능력을 제공합니다. 두 개의 CPU 코어(PRO_CPU와 APP_CPU)를 활용하여 멀티태스킹이 가능합니다. 최대 240MHz로 동작합니다.
  • 저전력 소모: 절전 모드를 통해 배터리로 작동하는 기기에도 적합합니다.
  • 다양한 주변 장치 인터페이스: GPIO, ADC, DAC, I2C, SPI, UART 등 다양한 인터페이스를 지원하여 여러 종류의 센서나 모듈과 쉽게 연결할 수 있습니다.
  • 프로그래밍 편의성: Arduino IDE나 ESP-IDF(Espressif IoT Development Framework) 등 다양한 개발 환경을 지원해 초보자도 쉽게 접근할 수 있습니다.
  • Harvard 아키텍처 기반: 명령어와 데이터 메모리가 분리되어 있어 효율적인 처리가 가능하며, 520KB SRAM을 내장하고 있습니다.

아두이노와 비교

오.. 스펙을 보면 아두이노 보다 ESP32 가 훨씬 좋아보이네요. (비교가 안되네요...)

구분아두이노 우노 (Arduino Uno)ESP32
프로세서8비트 ATmega328P (싱글 코어)32비트 Xtensa LX6 (듀얼 코어)
클럭 속도16 MHz최대 240 MHz
메모리 (SRAM)2 KB520 KB
플래시 메모리32 KB4 MB (최대 16 MB)
통신 기능Wi-Fi, Bluetooth 없음Wi-Fi, Bluetooth, BLE 내장
GPIO 핀 개수14개30~40개
동작 전압5V3.3V
가격약 25,000원약 5,000-10,000원

ESP32가 성능 면에서는 아두이노 우노보다 압도적으로 뛰어나지만, 초보자에게는 아두이노가 여전히 배우기 쉽고 접근성이 좋다는 장점이 있습니다. 이미 아두이노 경험이 있거나, 더 강력하고 다양한 기능을 활용하고 싶은 사람은 ESP32가 좋은 선택입니다.

프로젝트의 목적과 자신의 숙련도에 맞춰 선택하는 것이 가장 중요합니다.

개발 환경

ESP32는 다음과 같은 다양한 개발 환경 및 SDK를 지원합니다.

  • ESP-IDF (Espressif IoT Development Framework): Espressif에서 제공하는 공식 개발 프레임워크입니다.
  • Arduino IDE: Arduino 개발 환경에서 ESP32를 쉽게 프로그래밍할 수 있게 해줍니다.
  • MicroPython: Python 언어로 ESP32를 프로그래밍할 수 있도록 지원합니다.

ESP32의 형태

ESP32는 크게 다음과 같은 형태로 나눌 수 있습니다:

  • SoC(System on Chip): 칩 하나에 시스템 기능을 모두 담은 부품 자체입니다.
  • Module: SoC 칩과 주변 부품들이 결합되어 있는 작은 기판입니다.
  • Devkit(Development Kit): 개발자가 쉽게 사용하고 테스트할 수 있도록 USB 포트 등 각종 입출력 단자를 갖춘 개발 보드입니다.

그니까 ESP32은 칩 자체를 의미하고요. WROOM는 이 칩과 필수 부품을 결합한 모듈(module)입니다. DevKit은 이 모듈을 쉽게 사용할 수 있도록 만든 개발 보드(development board)입니다.

ESP32 SoC

ESP32는 단순히 하나의 칩셋이 아니라, Espressif Systems에서 개발한 SoC (System on a Chip) 제품군입니다. 이 칩셋들은 모두 ESP32라는 큰 틀에 속하지만, 각각의 특화된 기능과 성능에 따라 다양한 종류로 나뉩니다.

ESP32가 가장 기본이 되는 오리지널 모델입니다. 그 외에는 용도에 따라 아래와 같이 다양한 선택지가 있으며, 각각 최적화된 특징을 가집니다.

칩셋CPU 코어아키텍처주요 무선 통신특화 기능
ESP32듀얼 코어XtensaWi-Fi, Bluetooth범용 IoT
ESP32-S2싱글 코어XtensaWi-FiUSB OTG
ESP32-S3듀얼 코어XtensaWi-Fi, BluetoothAI, 카메라, USB OTG
ESP32-C3싱글 코어RISC-VWi-Fi, Bluetooth저전력, 저가형
ESP32-C6듀얼 코어RISC-VWi-Fi 6, BT, Thread, Zigbee최신 스마트 홈
ESP32-H2싱글 코어RISC-VBluetooth, Thread, Zigbee저전력, Wi-Fi 없음

ESP32 모듈 (ESP32-WROOM)

'WROOM'은 Espressif Systems에서 제조하는 ESP32 칩 기반의 무선 모듈 시리즈의 이름입니다. ESP32-WROOM 모듈 자체는 작고 금속 케이스로 덮인 형태로, ESP32-WROOM-32와 같은 특정 버전에 따라 Wi-Fi 안테나나 외부 안테나 커넥터 등 세부 사양이 다릅니다

ESP32 칩: WROOM 모듈의 심장부입니다. 이 작은 칩 하나에 CPU, Wi-Fi, 블루투스 기능이 모두 들어있습니다.

추가 부품: WROOM 모듈은 이 ESP32 칩에 더해, 안정적인 작동을 위해 필요한 부품들을 통합해 놓은 완성된 부품입니다. 일반적으로 다음과 같은 것들을 포함합니다.

  • 플래시 메모리: 프로그램을 저장하는 공간입니다. WROOM 모듈에는 보통 4MB의 플래시 메모리가 내장되어 있습니다.
  • 수정 발진기(Crystal Oscillator): 칩의 동작 클럭을 제공합니다.
  • PCB 안테나: Wi-Fi 및 블루투스 통신을 위한 안테나가 내장되어 있습니다. (일부 모델은 외장 안테나 커넥터가 있습니다.)
  • 금속 실드(Shield): 주변 노이즈로부터 칩을 보호하고, FCC와 같은 무선 통신 규정을 준수하기 위해 덮여 있는 금속 케이스입니다.

ESP32-WROOM 모듈은 PCB(회로 기판)에 바로 납땜하여 제품을 만들 수 있도록 설계되어 있습니다. 이 모듈을 사용하면 복잡한 회로 설계 없이도 Wi-Fi 및 블루투스 기능을 제품에 쉽게 추가할 수 있습니다.

ESP32-WROOM 모듈은 자체적으로 사용하기보다는, USB-to-UART 칩, 전원 공급 회로 등을 추가한 개발 보드(Development Board) 형태로 많이 판매됩니다.


ESP32-WROOM 외에도 다양한 모듈이 존재합니다.

  • ESP32-WROVER 시리즈: ESP32-WROOM과 유사하지만, PSRAM (Pseudo-static RAM) 4MB/8MB 이 추가된 모듈입니다. 메모리 집약적인 애플리케이션에 유용합니다. 대용량 데이터 처리, 복잡한 사용자 인터페이스(UI), 음성 처리 등 더 많은 메모리를 필요로 하는 프로젝트에 사용됩니다.
  • ESP32-PICO 시리즈: 초소형 SiP(System-in-Package) 기술을 사용하여 ESP32 칩, 플래시 메모리, 수정 발진기 등 필수 부품을 하나의 작은 패키지에 통합한 모듈입니다. 공간 제약이 있는 웨어러블 기기나 소형 IoT 기기 등 콤팩트한 디자인이 중요한 제품에 적합합니다.

프로젝트의 요구사항에 따라 적절한 모듈을 선택하는 것이 중요합니다. 대부분의 범용 프로젝트에는 WROOM 시리즈가 적합하며, 메모리가 더 필요하다면 WROVER, 공간 제약이 있다면 PICO, 그리고 특정 최신 기능이 필요하다면 S3, C3, C6 기반 모듈을 고려할 수 있습니다.

ESP32 개발 보드 (ESP32 DevKitC)

'DevKit'은 'Development Kit'의 약자로, WROOM 모듈을 사용자가 쉽게 테스트하고 개발할 수 있도록 만든 보드입니다. 즉, WROOM 모듈을 기반으로 만들어진 완성품입니다. 가장 표준적인 형태의 ESP32 개발 보드입니다.

현재는 ESP32-DevKitC-V4 가 최근에 가장 많이 사용되는 거 같습니다.

  • USB to Serial 변환기: 컴퓨터와 ESP32 간의 통신을 담당하는 칩입니다. 이 칩 덕분에 USB 케이블만으로도 코드를 업로드하고 시리얼 통신을 통해 데이터를 주고받을 수 있습니다.
  • 전원 레귤레이터: USB에서 공급되는 5V 전압을 ESP32가 사용하는 3.3V로 변환해주는 역할을 합니다.
  • 핀 헤더: WROOM 모듈의 모든 GPIO 핀을 사용하기 편리하도록 핀 헤더(Pin Header) 형태로 빼놓은 것입니다. 브레드보드에 꽂아 다양한 센서나 모듈과 쉽게 연결할 수 있습니다.
  • 리셋/부트 버튼: 코드를 업로드하거나 보드를 재부팅할 때 사용하는 버튼입니다.

쉽게 말해, WROOM 모듈은 자동차의 엔진, DevKit 보드는 이 엔진을 장착한 테스트용 자동차에 비유할 수 있습니다.


ESP32-DevKitC 외에도 ESP32 개발 보드는 다양한 종류가 있으며, 각 보드는 특정 칩셋을 사용하거나 특정 기능을 강화하여 설계됩니다.

  • TTGO T-Display: TTGO T-Display는 LCD 디스플레이가 내장된 ESP32 개발 보드입니다. TTGO 시리즈는 그 외에도 Camera, LoRa32 특화 모델이 존재합니다.
  • ESP32-CAM: 카메라 모듈이 통합된 ESP32 보드입니다. OV2640, OV3660 등 카메라 모듈을 연결할 수 있는 전용 인터페이스가 있습니다.

이 외에도 ESP32-LyraT(오디오 특화), M5Stack(모듈형 보드) 등 다양한 ESP32 개발 보드들이 있습니다. 프로젝트의 목적에 따라 필요한 기능(디스플레이, 카메라, 이더넷 등)이 내장된 보드를 선택하면 개발 시간을 크게 단축할 수 있습니다.

아래는 TTGO T-Display 개발 보드 참고.

심지어 이렇게 작은 Supermini 개발 보드도 있습니다.

ESP32 처음 시작은 ESP32-WROOM-32 DevKitC v4 가 좋은 거 같네요.

저는 디바이스마트에서 이렇게 생긴 개발 보드를 구매했습니다. (참고)

"V1은 30핀 또는 38핀 버전이 혼재되어 있으나, V4는 38핀(19x2)로 표준화되어 있습니다."

V4는 WROOM-32뿐만 아니라 WROVER(PSRAM 내장) 등 다양한 ESP32 모듈을 지원합니다. V4는 공식적으로 CP2102를 사용하여 드라이버 호환성이 더 좋습니다. V4가 더 작고, 회로 설계가 개선되어 전원 안정성, ESD(정전기) 보호 등이 강화되었습니다. V4가 최신 공식 표준 보드로, Espressif의 공식 문서, 예제, 지원이 더 잘 되어 있습니다.

ESP32 DevKitC 공식 문서 참고: https://docs.espressif.com/projects/esp-idf/en/v5.1/esp32/hw-reference/esp32/get-started-devkitc.html


ESP32 개발 환경

ESP32 개발 환경은 어떤걸 사용할까요?

결론부터 말씀드리면, "정답은 없다" 입니다. 어떤 도구가 좋은지는 개발자의 숙련도와 프로젝트의 목표에 따라 완전히 달라집니다. 각 개발 환경의 특징을 명확히 알면, 자신에게 가장 잘 맞는 최적의 도구를 선택할 수 있습니다.

주요 개발 환경을 비교하며 장단점을 설명해놓을테니 비교해보길 바랍니다.

Arduino IDE

ESP32 개발 환경을 구축하는 가장 일반적이고 쉬운 방법은 Arduino IDE를 사용하는 것입니다.

장점

  • 쉬운 접근성: 가장 큰 장점은 초보자가 쉽게 접근할 수 있다는 것입니다. 직관적인 인터페이스와 단순한 코딩 방식으로 마이크로컨트롤러 프로그래밍을 처음 배우는 사람에게 최적입니다.
  • 방대한 라이브러리: 수많은 센서, 모듈, 통신 프로토콜을 위한 라이브러리가 이미 Arduino IDE용으로 개발되어 있어, 복잡한 기능을 쉽게 구현할 수 있습니다.
  • 활발한 커뮤니티: 오랜 역사와 전 세계적인 사용자층을 기반으로 방대한 양의 튜토리얼, 예제 코드, 포럼 지원을 쉽게 찾을 수 있습니다.

단점

  • 제한적인 기능: 코드 자동 완성, 디버깅, 코드 탐색 같은 전문적인 IDE 기능이 부족합니다. 복잡하고 큰 프로젝트를 다룰 때 불편함을 느낄 수 있습니다.
  • 단일 파일 기반: 프로젝트를 여러 파일로 나누어 관리하는 것이 복잡하여 대규모 프로젝트를 체계적으로 관리하기 어렵습니다.
  • 느린 컴파일 속도: ESP32 보드 패키지는 아두이노 기본 보드보다 컴파일 시간이 더 오래 걸릴 수 있습니다.

아두이노는 ESP32의 모든 기능을 완벽하게 지원하지 못합니다. 특히 FreeRTOS(실시간 운영체제)를 활용한 멀티태스킹, 듀얼 코어 제어, 정밀한 전원 관리 같은 고급 기능을 사용하기가 매우 까다롭거나 불가능한 경우가 많습니다.

ESP-IDF

ESP-IDF는 Espressif Systems가 직접 제공하는 ESP32/ESP32-S/C 시리즈 칩셋 전용 개발 프레임워크입니다. VS Code 확장 프로그램으로 ESP-IDF 세팅해서 사용하는 방식을 강력 추천합니다.

장점

  • 최적의 성능: 칩셋의 모든 기능을 최대한 활용할 수 있도록 설계되었으며, Arduino 환경보다 더 효율적이고 강력한 코드를 작성할 수 있습니다.
  • 심층적인 제어: 하드웨어의 낮은 수준까지 직접 제어할 수 있어, 실시간 운영체제(RTOS) 기능이나 멀티태스킹 등을 세밀하게 다룰 수 있습니다.
  • 최신 기능 지원: 새로운 칩셋이나 기능에 대한 지원이 가장 빠릅니다.

단점

  • 높은 전문성 요구: C/C++ 언어에 대한 깊은 이해가 필요하며, FreeRTOS의 개념, CMake와 같은 빌드 시스템을 다룰 줄 알아야 합니다.
  • 복잡한 환경 설정: 환경 변수 설정, 빌드 시스템 구성 등 초기 설정이 매우 복잡합니다.

PlatformIO

PlatformIO는 다양한 임베디드 개발 플랫폼(아두이노, RTOS 등)을 지원하는 통합 개발 환경(IDE)입니다. Visual Studio Code와 같은 편집기에 플러그인 형태로 통합되어 사용하며, 별도의 IDE 없이 툴체인, 라이브러리, 빌드, 디버깅 등 임베디드 개발에 필요한 모든 기능을 제공하여 개발 효율성을 높여줍니다.

장점

  • 강력한 기능: 코드 자동 완성, 문법 강조, 디버깅 등 전문 개발자에게 필요한 모든 기능을 제공합니다.
  • 통합 환경: Arduino, ESP-IDF 등 여러 프레임워크를 하나의 환경에서 사용할 수 있습니다.
  • 체계적인 프로젝트 관리: 프로젝트 폴더 구조를 자동으로 생성하고, 라이브러리 종속성 관리를 쉽게 할 수 있습니다.

단점

  • 높은 학습 곡선: Arduino IDE에 비해 초기 설정과 사용법이 다소 복잡하여 초보자에게는 진입 장벽이 높을 수 있습니다.
  • 리소스 소모: Arduino IDE보다 더 많은 시스템 리소스를 사용합니다.

⚠️ 주의. PlatformIO를 사용한다고 해서 ESP-IDF를 '안 쓰는' 것은 아닙니다. PlatformIO를 이용해 ESP-IDF 프로젝트를 만들면, PlatformIO가 내부적으로 ESP-IDF 프레임워크와 툴체인을 다운로드하고 설정합니다. (아하~)

실무에서 개발 환경

실제 상업용 제품 개발 실무에서 아두이노 IDE를 사용하는 경우는 거의 없다고 보시는 것이 맞습니다. 아두이노 IDE는 여러 가지 제약 조건이 많기 때문입니다.

  1. 디버깅 기능 부재: 문제가 생기면 Serial.print()를 코드 곳곳에 삽입하여 변수 값을 찍어보는 원시적인 방법에 의존해야 합니다. 실무에서는 디버거 장비(JTAG, SWD)와 연동하여, 코드 실행을 원하는 지점에서 일시정지(Breakpoint)시키고, 모든 변수의 값을 실시간으로 확인하고, 코드를 한 줄씩 실행하는 등의 전문적인 디버깅이 가능합니다.

  2. 성능 및 지원 최적화의 한계: 아두이노 코드는 사용하기 쉽도록 하드웨어의 복잡한 부분을 감춰놓았습니다(추상화). 이 때문에 메모리 사용량이나 실행 속도 면에서 최적화가 어렵습니다. 실무에서는 한정된 메모리(RAM)와 저장 공간(Flash)을 최대한 효율적으로 사용해야 하고, 성능을 극한까지 끌어올려야 하는 경우가 많습니다. 이를 위해서는 하드웨어 레지스터를 직접 제어하는 등 저수준(Low-level)의 접근이 필요한데, 아두이노 IDE 환경에서는 어렵습니다.

  3. 협업 및 버전 관리의 어려움: 실제 제품 개발은 여러 명이 함께하는 팀 프로젝트입니다. Git을 이용한 버전 관리는 기본이며 각 프로젝트가 사용하는 라이브러리와 그 버전을 정확하게 명시하고 관리하여, 누가 어떤 컴퓨터에서 개발하든 동일한 환경을 보장해줍니다. 아두이노 IDE는 이러한 현대적인 협업 방식에 전혀 대응하지 못합니다.

  4. 고급 기능 접근의 제약: 상업용 제품은 배터리 수명을 위해 수면 모드(Deep Sleep)를 정밀하게 제어해야 하거나, 여러 작업을 동시에 처리하기 위해 듀얼 코어와 FreeRTOS를 적극적으로 활용해야 합니다. 이런 고급 기능들은 ESP-IDF에서 가장 완벽하게 지원하며, 아두이노 환경에서는 제한적으로만 사용 가능하거나 아예 불가능합니다.

따라서 실무에서는 VS Code 확장 프로그램으로 ESP-IDF를 세팅해서 사용하는 방법, 혹은 PlatformIO를 많이 사용하고 있는 거 같습니다.

Arduino 용 라이브러리

Arduino용 라이브러리는 ESP-IDF에서 바로 사용하기 어렵습니다. Arduino와 ESP-IDF는 서로 다른 프레임워크와 빌드 시스템을 사용하기 때문입니다.

예를 들어, WiFi.h는 '아두이노 프레임워크'가 제공하는 라이브러리이기 때문에, 'ESP-IDF 프레임워크' 환경에서는 존재하지 않으며, 당연히 #include <WiFi.h>를 하면 컴파일 에러가 발생합니다.

아두이노 프레임워크는 "쉽고 빠르게 만들자", 하드웨어의 복잡한 부분은 감추고, 아주 단순하면서 직관적인 함수 제공이 목적입니다.

#include <WiFi.h> // 아두이노 스타일 헤더

void setup() {
  Serial.begin(115200);
  WiFi.begin("my_ssid", "my_password"); // 매우 간단한 함수 호출

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("WiFi connected!");
}

void loop() {
  // ...
}

ESP-IDF 프레임워크는 "모든 것을 제어하고 최고의 성능을 내자", 하드웨어의 모든 기능을 직접 제어할 수 있는 상세하고 구체적인 함수들을 제공합니다. 코드가 길고 복잡해지는 대신, 훨씬 세밀한 제어가 가능합니다.

#include "esp_wifi.h"       // ESP-IDF 스타일 헤더
#include "esp_event.h"
#include "nvs_flash.h"

void app_main(void) // setup(), loop()가 아닌 app_main()이 시작점
{
    // 1. NVS (비휘발성 저장소) 초기화
    nvs_flash_init();

    // 2. 네트워크 인터페이스 생성
    esp_netif_create_default_wifi_sta();

    // 3. Wi-Fi 기본 설정 초기화
    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
    esp_wifi_init(&cfg);

    // 4. Wi-Fi 설정 (SSID, 비밀번호 등)
    wifi_config_t wifi_config = {
        .sta = {
            .ssid = "my_ssid",
            .password = "my_password",
        },
    };
    esp_wifi_set_mode(WIFI_MODE_STA);
    esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config);

    // 5. Wi-Fi 시작
    esp_wifi_start();

    // (실제로는 이벤트 핸들러를 등록하여 연결 성공/실패를 처리해야 함)
    // ... 매우 복잡 ...
}

ESP-IDF에서 Arduino 라이브러리를 사용하는 방법

  1. Arduino as a Component: Espressif Systems는 ESP-IDF 프로젝트 내에서 Arduino 코드를 컴포넌트(Component)로 포함시킬 수 있도록 지원합니다. 이 방법은 ESP-IDF의 강력한 기능(예: FreeRTOS, 네트워크 스택)을 사용하면서, 특정 기능을 구현할 때 Arduino 라이브러리를 활용할 수 있게 해줍니다.

  2. PlatformIO 환경: PlatformIO는 ESP-IDF와 Arduino 프레임워크를 모두 지원하는 통합 개발 환경(IDE)입니다. PlatformIO를 사용하면 두 프레임워크를 오가며 개발하거나, 하나의 프로젝트에서 두 프레임워크의 코드를 결합하는 것이 비교적 용이합니다.

  3. 수동 포팅: 가장 어려운 방법으로, Arduino 라이브러리의 소스 코드를 ESP-IDF에 맞게 직접 수정하고 포팅하는 것입니다. 라이브러리를 완벽하게 제어할 수 있으며, 불필요한 코드를 제거하여 최적화할 수 있지만, 매우 많은 시간과 전문적인 지식을 요구하며, 라이브러리 업데이트 시 유지보수가 어렵습니다.


VSCode + ESP-IDF 환경 구성

PlatformIO를 이용한 구성 방식은 나중에 다뤄보도록 하고, 여기서는 VSCode 내 확장 프로그램인 ESP-IDF 를 설치해서 사용하는 방법을 소개해보겠습니다.

VS Code에서 ESP32 프로젝트를 진행하신다면 ESP-IDF Extension for VS Code를 설치하시는 것을 강력히 추천합니다.

  1. 공식 지원: Espressif(ESP32 제조사)에서 VSCode용 ESP-IDF 플러그인을 공식적으로 제공. 설치와 설정이 쉽고, 문서도 잘 갖춰져 있음
  2. 생산성: VSCode는 코드 자동완성, 디버깅, 시리얼 모니터, 빌드/플래시 등 개발에 필요한 기능을 플러그인 하나로 통합 제공
  3. 크로스 플랫폼: Windows, macOS, Linux 모두 지원

실무에서도 VSCode + ESP-IDF는 ESP32 개발의 표준에 가깝게 널리 쓰이고 있다고 합니다.

생각보다 다운로드 수가 없어서 이게 맞나...? 싶지만 맞는 거 같습니다. 설치가 끝나면 확장 프로그램 보기를 엽니다. ESP-IDF을 선택하세요.

확장 프로그램에서 제공하는 기본 명령 목록(COMMANDS)을 볼 수 있습니다.

명령 목록에서 ESP-IDF 확장 구성(Configure ESP-IDF Extension)을 선택합니다. 그러면 설정 마법사(Setup Wizard) 창이 뜰 거예요. 이 과정은 VS Code 확장 프로그램이 ESP32 코드를 컴파일하고 업로드하는 데 필요한 핵심 개발 도구들(ESP-IDF 프레임워크, 컴파일러 등)을 설치하고 설정하는 단계입니다.

  • EXPRESS 옵션: 가장 쉽고 확실한 방법입니다. 이 옵션을 선택하면, ESP-IDF와 관련된 모든 필수 도구들을 알아서 다운로드하고 설치해 줍니다. 설치 경로도 자동으로 추천해 주므로 설치만 하면 됩니다. 다만 모든 파일을 다운로드 해야 하므로 오래걸릴 수 있습니다.
  • ADVANCED 옵션: 이것은 이미 사용자가 수동으로 ESP-IDF와 관련 도구들을 다른 폴더에 설치해 둔 고급 사용자를 위한 옵션입니다. 각 도구들의 경로를 직접 지정해야 하므로, 처음 시작하는 경우에는 추천하지 않습니다.

🎯 설치 참고: https://dev91.tistory.com/51

저는 ADVANCED 옵션을 선택해서 진행해보도록 하겠습니다. ADVANCED 옵션은 이미 Git, Python 등이 설치되어 있을 때 복 설치를 원치 않을 때 유용합니다. 또한, Git, Python, 툴체인 등 각 구성 요소의 경로를 사용자가 직접 지정할 수 있습니다.

ESP-IDF 버전 선택해주고, 설치 경로는 따로 변경하지 않고 그대로 진행하겠습니다. 설치 용량은 대략 1.15GB 정도 됩니다.

ESP-IDF는 ESP32 시리즈 칩을 위한 공식 개발 프레임워크 입니다.

ESP-IDF 설치가 진행된 이후에 ESP-IDF Tools가 설치가 바로 이어서 나오게되는데요.

ESP-IDF Tools는 ESP32 개발에 필수적인 소프트웨어 도구들의 모음입니다. 이 도구들은 ESP-IDF 프레임워크와 함께 작동하여 코드를 컴파일하고, 보드에 업로드하며, 디버깅하는 등의 작업을 가능하게 합니다. ESP-IDF를 설치할 때 이 도구들도 함께 설치되거나, 설치 과정에서 자동으로 설치되도록 설정합니다.

주요 도구들은 다음과 같습니다.

  • 컴파일러 (Toolchain): C/C++ 코드를 ESP32 칩이 이해할 수 있는 이진 코드(binary code)로 변환해주는 도구입니다. ESP32는 RISC-V 또는 Xtensa 아키텍처를 사용하므로, 이에 맞는 전용 컴파일러가 필요합니다. ex) xtensa-esp32-elf-gcc 등
  • 플래시 업로더 (esptool.py): 컴파일된 이진 파일을 USB 또는 UART를 통해 ESP32 보드의 플래시 메모리에 업로드하는 데 사용되는 파이썬 기반 스크립트입니다.
  • 빌드 시스템 (CMake): 복잡한 프로젝트의 빌드 프로세스를 관리하는 도구입니다. 소스 코드를 컴파일하고, 필요한 라이브러리를 연결하며, 최종 실행 파일을 만드는 과정을 자동화합니다.
  • 구성 도구 (menuconfig): 터미널 기반의 GUI 도구로, ESP-IDF 프로젝트의 다양한 설정(예: Wi-Fi 설정, 핀 할당, 컴파일러 옵션 등)을 손쉽게 변경할 수 있습니다.
  • 모니터 (idf.py monitor): ESP32 보드의 시리얼 포트 출력을 실시간으로 확인하는 도구입니다. 코드가 실행되는 동안 보드에서 보내는 로그나 디버깅 메시지를 볼 수 있습니다.

ESP-IDF 프레임워크와 ESP-IDF Tools는 상호 보완적이며, 두 가지 모두 ESP32 개발에 필수적입니다. 따라서 "ESP-IDF 설치"라는 말은 보통 프레임워크와 도구들을 모두 설치하는 과정을 포함합니다.

이후에 설치가 완료되면 다음과 같은 화면이 나옵니다.

이 확장 프로그램은 VS Code 창 하단의 상태 표시줄(파란색 막대)에 ESP-IDF 명령에 대한 아이콘 목록을 제공합니다. 아이콘에 마우스를 올리면 실행될 명령을 확인할 수 있습니다.

Python 을 사용하는 이유

ESP-IDF가 내부적으로 Python을 사용하는 주된 이유는 빌드 시스템과 설정 프로세스를 유연하고 자동화하기 위함입니다. ESP-IDF는 빌드, 플래싱, 모니터링 등의 복잡한 작업을 관리하기 위해 Kconfig 및 CMake를 기반으로 하며, 이 과정에서 Python 스크립트가 핵심적인 역할을 합니다.

  1. 자동화 스크립트: ESP-IDF는 idf.py라는 메인 빌드 스크립트를 사용합니다. 이 스크립트는 Python으로 작성되어 있어, 사용자가 idf.py build, idf.py flash와 같은 간단한 명령어를 통해 복잡한 컴파일 및 펌웨어 업로드 과정을 쉽게 실행할 수 있도록 돕습니다.

  2. 설정 시스템(Kconfig): 임베디드 개발에서는 수많은 설정 옵션(예: GPIO 핀, 통신 프로토콜, 모듈 활성화 여부)을 관리해야 합니다. ESP-IDF는 리눅스 커널에서 사용하는 것과 유사한 Kconfig 시스템을 채택했는데, 이 설정 시스템을 처리하고, 메뉴를 생성하며, 헤더 파일을 만드는 데 Python 스크립트가 사용됩니다.

  3. 크로스 플랫폼 호환성: Python은 운영체제에 구애받지 않고 동작하므로, 윈도우, macOS, 리눅스 등 다양한 환경에서 동일한 빌드 및 개발 경험을 제공합니다. 이는 ESP-IDF의 접근성을 높이는 중요한 요소입니다.

idf.py 환경 변수 설정

idf.py 명령어를 터미널에서 사용하려면 환경 변수 설정이 필수적입니다. ESP-IDF는 export.sh 스크립트로 환경 변수를 세팅합니다.

경로: /Users/ckstn0777/esp/v5.4.1/esp-idf (안에 export.sh 가 있음)

IDF_PATH: 이 변수는 ESP-IDF 프레임워크가 설치된 경로를 지정합니다. idf.py 스크립트는 이 경로를 기반으로 필요한 소스 코드, 헤더 파일, 컴포넌트 등을 찾습니다.

Zsh 사용하는 경우 (macOS 기본): ~/.zshrc 에다가 아래와 같이 추가해줍니다.

export IDF_PATH=/Users/ckstn0777/esp/v5.4.1/esp-idf
alias get_idf='. $IDF_PATH/export.sh

그런 다음에 설정 파일을 저장하고 source ~/.zshrc 해서 적용해줍니다.

이제 매번 터미널에서 get_idf 를 입력하면 idf.py를 사용할 수 있습니다. 정상적으로 설치되면 idf.py --version 버전이 표시됩니다.

VS Code 확장 프로그램은 이 모든 과정을 자동으로 관리해 주기 때문에, 별도로 터미널에서 수동으로 환경 변수를 설정할 필요가 없습니다. 즉 터미널에서 직접 idf.py 명령을 사용할 경우는 환경 변수를 설정해줘야 합니다.

profile
행동하는 바보가 돼라. 생각을 즉시 행동으로 옮기는 사람이 되어라

0개의 댓글