ESP-IDF로 ESP32 소프트웨어 개발하기

3 분 소요

ESP-IDF는 ESP32의 개발사인 Espressif에서 제공하는 ESP32 전용 개발환경이다. ESP32에서 구동할 소프트웨어는 아두이노 개발환경에 ESP32용 툴체인을 설치하여 개발할 수 있지만, ESP-IDF에서 개발하면 ESP32를 속속들이 이용할 수 있기 때문에 더 좋은 선택이다.

개발환경으로 아두이노와 ESP-IDF 중에서 무엇을 선택할 지는 여기를 참고한다.

이 글에서는 Windows 11에서 ESP-IDF를 설치하고 샘플 코드를 컴파일하고 실행하는 과정을 기술한다.

ESP-IDF

윈도우 인스톨러로 설치하기

이 글을 쓰는 시점(2022년 12월)에 ESP-IDF는 5.0이 최신 버전이다.

ESP-IDF는 보통의 Windows Application처럼 Windows Installer로 설치할 수 있다. 설치 과정은 별로 어려운 것이 없으므로 자세한 내용은 넘어간다.

설치를 마치면 바탕화면에 아래와 같이 아이콘이 생성된다.

ESP-IDF icons

아이콘을 실행하면 CMD 또는 Power Shell이 실행된다. 그 창에서 idf.py 명령으로 코드를 컴파일하고 실행할 수 있다.

Visual Studio Code에서 설치하기

Visual Studio Code는 전세계 개발자들의 사실상의 표준 툴이 되었다. Visual Studio Code를 가지고 있다면 Visual Studio Code에서 설치할 수도 있다.

윈도우 인스톨러로 이미 설치했다면, 설치과정에서 “USE EXISTING SETUP”을 선택하면 이미 설치된 환경을 이용하므로 설치 시간을 대폭 줄일 수 있다.

컴파일하기

예제코드 복사

기본 설정으로 설치하면 C:\Espressif\frameworks\esp-idf-v5.0 디렉토리에 ESP-IDF가 설치된다. C:\Espressif\frameworks\esp-idf-v5.0\examples 디렉토리에는 아래와 같이 예제코드가 들어있다. 이제 예제코드 중에서 가장 기본인 hello_world 프로젝트를 빌드할 것이다.

Examples

작업디렉토리를 하나 만들고 예제 코드를 복사한다. 나는 D:\work 디렉토리에 복사했다.

바탕화면의 ESP-IDF 아이콘을 실행하고, D:\work\examples\get-started\hello_world 디렉토리로 이동한다.

C:\Espressif\frameworks\esp-idf-v5.0>D:
D:\>cd \work\examples\get-started\hello_world
D:\work\examples\get-started\hello_world>dir/w
 Volume in drive D is Data
 Volume Serial Number is F8F4-A27C

 Directory of D:\work\examples\get-started\hello_world

[.]                     [..]                    CMakeLists.txt          [main]
pytest_hello_world.py   README.md               sdkconfig.ci
               4 File(s)          3,285 bytes
               3 Dir(s)  291,893,764,096 bytes free

config

ESP-IDF로 빌드할 때는 제일 먼저 타겟 보드를 지정해야 한다. 이 작업은 맨 처음 빌드할 때 한 번만 하면 된다. 물론 프로젝트 진행 중에 타겟 보드를 바꿀 때는 다시 해 주어야 한다.

나는 ESP32 보드를 사용하므로, 아래 명령의 파라미터로 esp32를 주었다.

idf.py set-target esp32

set-target을 하고 나면 sdkconfig 파일과 build 디렉토리가 만들어진다.

  • sdkconfig 파일에는 project configuration이 들어있다.
  • build 디렉토리는 프로젝트를 빌드하기 위한 파일들이 들어있다.

sdkconfig 파일은 txt 파일이므로, 편집기로 보거나 수정할 수 있다. 하지만 복잡한 dependency 관계를 고려하며 수정하는 것은 매우 불편하다. 아래 명령으로 MENU 형식으로 보거나 변경할 수 있다.

idf.py menuconfig

hello_world 예제는 아주 기본적인 config만 켜져 있다. 지금은 menuconfig의 설정을 건드릴 일이 없으니, 구경만 하고 ESC를 눌러 빠져 나온다.

menuconfig에서는 정말 많은 설정을 변경할 수 있다. 변경한 항목의 dependency는 자동으로 처리된다. 잘 모르는 설정은 건드리지 말되, 프로젝트에 따라 Component config에서 Bluetooth, WIFI, Power, GPIO 등 주변장치를 설정하거나, Espressif에서 제공하는 software library를 설정할 일은 많을 것이다.

build

idf.py build 명령으로 빌드를 한다. 처음 빌드를 하면 시간이 몇 분 정도 걸린다.

idf.py build
...
[839/840] Generating binary image from built executableesptool.py v4.4_src_esp32.c.obj←[K
Creating esp32 image...
Merged 2 ELF sections
Successfully created esp32 image.
Generated D:/work/examples/get-started/hello_world/build/hello_world.bin
[840/840] cmd.exe /C "cd /D D:\work\examples\get-star...amples/get-started/hello_world/build/hello_world.bin"hello_world.bin binary size 0x2b230 bytes. Smallest app partition is 0x100000 bytes. 0xd4dd0 bytes (83%) free.

Project build complete.
...

실행하기

시리얼 포트 확인

ESP32 보드를 PC에 연결한다. 장치관리자를 열고 아래 그림과 같이 시리얼 포트가 보이는지 확인한다. 나는 COM4에 시리얼 포트가 연결되었다. 여기에서 확인한 포트를 이후 명령의 파라미터로 준다.

Serial Port

flash

idf.py flash 명령으로 ESP32 보드에 빌드한 이미지를 write한다. 이 때, -p COM4 이런 식으로 위에서 확인한 시리얼 포트를 파라미터로 준다.

idf.py -p COM4 flash
...
Compressed 176688 bytes to 93360...
Writing at 0x00010000... (16 %)
Writing at 0x0001b4bc... (33 %)
Writing at 0x00020d91... (50 %)
Writing at 0x00026552... (66 %)
Writing at 0x0002efd3... (83 %)
Writing at 0x00036ecc... (100 %)
Wrote 176688 bytes (93360 compressed) at 0x00010000 in 2.5 seconds (effective 573.1 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 103...
Writing at 0x00008000... (100 %)
Wrote 3072 bytes (103 compressed) at 0x00008000 in 0.0 seconds (effective 511.7 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...
Done

위와 같이 “Done”이 나오면 된다.

간혹 아래와 같이 Serial Port를 찾을 수 없다는 에러 메시지가 나온다. 이럴 때는 ESP32 보드를 PC에서 뺐다가 다시 끼우면 정상 동작 한다.

Serial port COM4 
COM4 failed to connect: Could not open COM4, the port doesn't exist

시리얼 포트 출력 확인

idf.py monitor 명령으로 시리얼 포트의 출력을 확인한다. Hello_world 예제는 Hello world를 출력하고 10초 뒤에 리셋을 하는 단순한 코드이다. 아래와 같은 출력이 반복될 것이다.

idf.py -p COM4 monitor
...
Hello world!
This is esp32 chip with 2 CPU core(s), WiFi/BT/BLE, silicon revision v3.0, 2MB external flash
Minimum free heap size: 295868 bytes
Restarting in 10 seconds...
Restarting in 9 seconds...
Restarting in 8 seconds...
Restarting in 7 seconds...
Restarting in 6 seconds...
Restarting in 5 seconds...
Restarting in 4 seconds...
Restarting in 3 seconds...
Restarting in 2 seconds...
Restarting in 1 seconds...
Restarting in 0 seconds...
Restarting now.

CTRL+]를 누르면 시리얼 포트 모니터링에서 shell로 빠져나온다.

알아두기

idf.py flash 명령은 build와 flash를 동시에 수행한다. idf.py flash monitor 명령은 build, flash, monitoring을 동시에 수행한다.

Reference

태그:

업데이트: