PlatformIO IDE는 별도의 설정 없이도 컴퓨터와 연결된 ESP32 개발보드를 자동으로 인식합니다. 그러면 별도의 설정은 필요 없을까요? 개발자가 직접 설정을 잡아야 하는 이유는 세 가지입니다. 첫째, 두 개 이상의 개발보드를 사용하기 위해. 둘째, 통신 속도 최적화를 위해. 셋째, 시스템 충돌 발생 시 콜 스택을 확인하기 위해. 각각에 대한 자세한 내용은 아래 본문에서 다뤄보도록 하겠습니다.
그런데 본문으로 들어가기에 앞서 Windows 운영체제 컴퓨터를 사용 중이라면 ESP32 USB 드라이버가 설치되어 있는지부터 확인해야 합니다. 만약 설치되어 있지 않다면 ESP32 USB 드라이버 설치(Windows) 글을 참조하여 설치한 다음 진행해주시기 바랍니다.
Table of Contents
1. 개발보드 포트 번호 설정
1.1. 포트 번호 설정이 필요한 이유
컴퓨터에 USB 드라이버가 설치됐다면 ESP32 개발보드를 연결함과 동시에 직렬 통신 포트가 자동으로 인식됩니다. 여러 개의 개발보드를 연결했다면 Windows 운영체제는 각 보드를 쉽게 구분할 수 있도록 COM3, COM4와 같이 포트 번호를 부여합니다. COM 포트는 communication의 축약어로 통신을 의미하고 뒤에 붙는 숫자는 현재 할당되지 않은 번호 중에서 하나가 부여됩니다.
Windows 운영체제에서는 컴퓨터는 장치 인스턴스 경로를 사용해서 각 개발보드를 구분합니다. 이를 통해 각 개발보드에 포트 번호가 중복되지 않게 할당할 수 있습니다. 장치 인스턴스 경로는 제조사 식별자(VID), 제품 식별자(PID), 시리얼 번호로 구성됩니다. 장치 인스턴스 경로는 다음과 같은 방법으로 확인할 수 있습니다.
- 장치 관리자에 인식된 포트를 더블 클릭하여 속성 창을 엽니다.
- 속성 창의 상단에 위치한 탭 중에서 자세히 탭을 클릭합니다.
- 속성 드롭다운 메뉴에서 장치 인스턴스 경로를 클릭합니다.

하지만 장치 인스턴스 경로가 동일한 경우에도 다른 포트 번호가 할당될 때가 있습니다. 예를 들어, 장치 연결 순서를 변경하면 포트 번호가 COM4에서 COM3으로 변경될 수 있습니다. 여러 개의 개발보드를 사용하면 포트 번호가 바뀔 때마다 설정에 반영해줘야 하기에 꽤 번거롭습니다. 그래서 이런 불편함을 줄이기 위해 장치 인스턴스 경로마다 동일한 포트 번호가 할당되도록 설정해줄 필요가 있습니다.

1.2. 포트 번호 설정 방법
개발보드 별로 고정된 포트 번호를 할당할 때 주의해야 하는 점이 있습니다. 특별한 이유가 없다면 서로 다른 두 개의 장치에 동일한 포트 번호가 할당되지 않도록 설정해야 한다는 것입니다. 동일한 포트 번호를 두 개 이상의 장치에 할당하는 경우 운영체제에서 경고를 주기는 하지만 설정을 막지는 않기 때문입니다.
또한 운영체제가 한 자릿수부터 순차적으로 포트 번호를 할당하기 때문에 다른 장치가 개발보드에 할당됐었던 포트 번호를 가져갈 수도 있습니다. 이러한 경우 개발보드에 다른 포트 번호가 할당될 수 있습니다. 그래서 두 자리 또는 세 자릿수의 포트 번호를 사용하는 것이 좋습니다. 저는 개발보드에 세 자릿수의 포트 번호를 할당하는 것을 선호합니다.
- 속성 창의 상단에 위치한 탭 중에서 포트 설정 탭을 클릭합니다.
- 고급 버튼을 클릭하여 고급 설정 창을 엽니다.
- COM 포트 번호 드롭다운 메뉴를 클릭합니다.
- 고정으로 할당시킬 번호를 클릭합니다.
- 고급 설정 창의 확인 버튼을 클릭합니다.
- 속성 창의 확인 버튼을 클릭합니다.

아래 그림과 같이 할당된 포트 번호가 설정된 값과 동일하게 변경되었다면 정상적으로 설정이 완료된 것입니다. 그림의 왼쪽은 포트 번호를 설정하기 전이고 오른쪽이 설정 이후로 할당됐던 포트 번호가 변경된 것을 확인할 수 있습니다.

이제 포트 번호 설정이 완료되었습니다. 포트 번호를 쉽게 인지할 수 있도록 할당한 번호를 표시해두는 것이 좋습니다. 나중에 포트 번호를 변경해야 할 수도 있으니 포스트잇이나 스티커를 사용하는 것도 좋습니다.

2. 포트 번호 설정 방법에 따른 차이
PlatformIO IDE에서 ESP32 개발보드의 포트를 설정하는 방법은 두 가지로 자동 설정과 수동 설정이 있습니다. 자동 설정 방법이 편해보이지만 실제로 개발하기에는 적합하지 않습니다. 서두에서 말씀드린 세 가지 이유에 대해 하나씩 자세히 살펴보겠습니다.
2.1. 복수의 개발보드 활용성
그림 2.1은 자동 설정 방법을 사용할 때 어떤 포트가 PlatformIO IDE와 연결되는지를 나타낸 것입니다. 파랑색 음영으로 표현된 부분이 자동으로 연결된 포트이고, 빨강색 음영이 들어간 부분은 연결되지 않은 포트입니다. 둘 중에 어떤 포트를 사용할지 선택할 수 없기 때문에 동시에 하나의 개발보드로만 작업 가능함을 알 수 있습니다.
복수의 개발보드를 사용하려면 개발자가 직접 포트 번호를 지정해줘야 합니다. 그럼 하나의 개발 보드만 사용한다면 자동 설정도 괜찮은 방법일까요? 101번 포트의 모니터링 화면을 보면 “Hello world” 위에 깨진 글자가 있는 것을 볼 수 있습니다. 이는 최적화 되지 않은 통신 속도로 인한 것으로 하나의 보드만 사용할 때도 자동 설정은 한계가 있음을 알 수 있습니다.

2.2. 통신 속도 최적화
ESP32로 개발하는 과정은 작성한 프로그램을 개발보드에 업로드하고 로그 메시지를 모니터링하며 개발자의 의도대로 동작하는지 확인하는 과정의 반복입니다. 하루에 수십번도 넘게 반복되는 이러한 과정은 통신 속도에 영향을 많이 받습니다. 문제는 자동 설정의 경우 통신 속도가 낮게 설정되어 불필요한 시간 낭비를 유발한다는 것입니다.
그림 2.2에서는 자동 설정과 수동 설정 간의 속도 차이를 확인할 수 있습니다. 설정 속도를 기준으로 비교해보면 수동 설정 시 프로그램 업로드 속도는 2배, 모니터링 속도는 12배가 빨라집니다. 실제로 소요되는 시간을 기준으로 비교하면 그 차이는 다소 줄어들지만 자동 설정 대비 빠르다는 점에는 변함 없습니다.
- 프로그램 업로드 속도로 460,800bps(자동), 921,600bps(수동)로 설정되었습니다.
- 프로그램 업로드 유효 속도로 599.1kbps(자동), 841.4kbps(수동)로 측정되었습니다. 유효 속도는 프로그램 업로드에 걸린 실제 시간을 기준으로 측정됩니다.
- 모니터링 속도로 9,600bps(자동), 115,200bps(수동)로 설정되었습니다.
- ESP32 기본 통신 속도와 자동 설정의 속도가 일치하지 않아 로그 메시지가 깨지게됩니다.

그림 2.3은 통신 속도에 따라 로그 메시지를 출력하는데 소요되는 시간을 나타낸 것입니다. 테스트에 사용된 로그 메시지는 알파벳 26개 문자로 100번 반복해서 출력했습니다. 9,600bps, 115,200bps는 각각 자동 설정과 ESP32의 기본 통신 속도입니다. 자동 설정 시 동일한 데이터를 출력하는 데 12배 정도의 시간이 더 걸리는 것을 볼 수 있습니다.
개발이 완료된 이후 보다 개발 중일 때 훨씬 더 많은 로그 메시지를 출력합니다. 프로그램이 의도한 대로 동작하는지 확인하고 문제가 발생했을 때 원인을 분석하기 위한 정보를 확인하기 위해서입니다. 이로 인해 전반적인 개발 속도에도 영향을 미치게 됩니다. 따라서 개발보드가 지원하는 한 높은 통신 속도를 설정해주는 것이 좋습니다.

2.3. 모니터링 관련 기능 활용성
로그 메시지는 프로그램의 동작을 확인하는데 유용합니다. 프로그램이 충돌하기 전까지는 말이죠. 프로그래머가 생각하지 못했던 예외로 인해 충돌이 발생하는만큼 예외가 어떻게, 어디서 발생했는지 추적하는 것이 문제를 수정하는 첫걸음이 됩니다. 다행히 ESP32는 충돌이 발생했을 때의 콜 스택을 그림 2.4와 같이 Backtrace 라는 이름으로 제공합니다.
그림 2.4에서 노랑색 음영이 들어간 부분이 바로 충돌이 발생했을 때의 콜 스택입니다. 콜 스택에는 충돌이 발생할 때까지 함수가 어떤 순서로 호출되었는지에 대한 정보가 들어 있습니다. 그래서 콜 스택 정보를 해석하면 충돌의 원인을 파악하는데 많은 도움이 됩니다. 다만 콜 스택은 사람이 이해할 수 있는 형태가 아니기에 반드시 번역기가 필요합니다.
다행히도 PlatformIO IDE는 번역기를 가지고 있습니다. 아쉽게도 자동 설정에서는 콜 스택 번역기가 비활성화 되어 있습니다. 그림 2.4의 윗쪽은 자동 설정, 아랫쪽은 수동 설정으로 번역기를 활성화 해준 것입니다. 빨강색 음영이 바로 번역된 콜 스택 정보로 사람이 쉽게 이해할 수 있습니다.

자동으로 로그 메시지를 파일로 저장하는 기능 또한 유용합니다. 아무래도 개발자가 수동으로 저장해야 하는 경우에는 깜빡할 때가 있는데 이럴 때 버그가 발생하면 추적하기 어려워집니다. 특히 며칠씩 프로그램을 돌릴 때는 로그 파일 없이는 오동작이 있었는지조차도 파악하기 쉽지 않습니다. 이런 실수를 예방하는 좋은 방법이 자동 저장 기능입니다.

3. 업로드 및 모니터 설정
그림 3.1은 PlatformIO 프로젝트 설정에 사용되는 platformio.ini 파일로 업로드 및 모니터링을 설정하는 예시를 나타낸 것입니다. 제가 주로 사용하는 설정 항목만 정리했기 때문에 전체 항목은 PlatformIO 공식 문서를 참조해주시기 바랍니다. 1번부터 4번줄까지는 작업 환경과 개발 플랫폼에 대한 설정으로 PlatformIO 프로젝트 설정을 참조해주시기 바랍니다.

항목 | 설명 |
upload_port | 프로그램을 개발보드로 업로드할 때 사용할 포트 번호 |
upload_speed | 프로그램을 개발보드로 업로드할 때의 통신 속도 |
upload_protocol | 프로그램을 개발보드로 업로드할 때 사용할 통신 프로토콜 Espressif ESP32 개발보드 기본값: esptool |
monitor_port | 개발보드가 출력하는 로그를 모니터링할 때 사용할 포트 번호 |
monitor_speed | 개발보드가 출력하는 로그를 모니터링할 때의 통신 속도 |
monitor_filters | – time: 로그 메시지에 밀리초 단위의 시간 정보를 추가 – log2file: 로그 메시지를 프로젝트 내부에 파일로 저장 – send_on_enter: 데이터 입력 후 엔터 키를 눌렀을 때 개발보드로 전송 – esp32_exception_decoder: 충돌 발생 시 ESP32 콜 스택을 해석 |
프로그램을 개발보드에 업로드할 때는 포트, 통신 속도, 프로토콜을 설정할 수 있습니다. 통신 속도는 문제가 없다면 높을 수록 좋습니다. 저는 921,600bps를 주로 사용합니다. 대부분의 경우 업로드 프로토콜은 기본값 그대로 사용해도 무방하기 때문에 별도로 설정을 잡지 않아도 됩니다. 하지만 OTA나 JTAG을 사용하는 경우에는 프로토콜을 변경해야 합니다.
개발보드의 동작을 모니터링할 때는 포트, 통신 속도, 필터를 설정할 수 있습니다. 업로드와 마찬가지로 문제가 없다면 통신 속도는 높을 수록 좋습니다. 다만 ROM 부트로더의 통신 속도는 115,200bps로 고정되어 있기 때문에 개발보드가 부팅될 때 출력하는 로그가 깨질 수 있습니다. GPIO 15번 핀에 풀다운 저항을 걸면 부트로더 로그가 출력되지 않습니다.

4. 마무리
PlatformIO IDE에서 ESP32 개발보드로 개발하는데 도움이 될 통신 포트 및 모니터링 설정 방법을 정리해보았습니다. 이러한 설정은 개발에 필수는 아니지만 각자의 상황에 맞게 적용하면 보다 개발 편의성이 향상될 것이라 생각합니다. 본문에서 다루지 못한 설정도 많기 때문에 PlatformIO에서 제공하는 문서를 한번 읽어보는 것도 좋습니다.