ESP32 보드들이 드디어 배송됐다. (사실 몇 주 됨)
Visual Studio Code의 ESP-IDF extension을 드디어 사용할 수 있게 되었지만, 일단 연속성을 위해 직전 ESP8266 개발 준비를 위해 사용한 PlatformIO IDE extension을 우선 계속해서 사용해 보기로 했다.
이번에도 간단한 Blink LED 예제를 통해 개발 준비를 완성시켜 보겠다.
PlatformIO IDE extension 설치 방법은 기존 ESP8266 포스트를 참고하면 되겠다.
1. LOLIN S2 Mini V1.0.0 (ESP32-S2) Blink LED 예제 (ESPIDF framework)
Framework를 Espidf로 설정하여 새로운 프로젝트 "Blink_LED_ESP32-S2_LOLIN-S2-Mini_ESPIDF"를 생성하는 것으로 시작한다.
하나 알게 된 사실은 프로젝트 이름 중간에 띄어쓰기 (whitespace) 가 있으면 오류가 생긴다는 점!
"...
Detected a whitespace character in project paths.
========================== [FAILED] ..."
식으로 오류가 생기고 프로젝트가 정상적으로 생성되지 않으니 참고.
조금 걸릴 수 있음.
"src" 폴더에는 기본 main.c와 CMakeLists.txt가 존재하고, 후자 내용에는 자동으로 생성되는 파일이라고 써 있다.
"[ESP-IDF] LED Blink 구현" 블로그의 Blink LED 예제를 기본 틀로 하여 main.c를 아래와 같이 작성했다.
주 변경 내용은 GPIO pin 숫자인데, LED가 연결된 GPIO 숫자가 ESP32-S2 개발보드마다 상이하므로 대상 보드의 회로도나 스펙을 반드시 확인하고 반영해야 한다.
그럼 이제 Build를 해 보자.
위 오류는 찾아 보니 아마 나의 특수한 경우 때문에 생긴 것 같다.
내용을 보면
File "/Users/jihwanmoon/.platformio/packages/tool-esptoolpy/esptool.py", line 41, in <module>
import esptool
File "/Users/jihwanmoon/.platformio/packages/tool-esptoolpy/esptool/__init__.py", line 42, in <module>
from esptool.bin_image import intel_hex_to_bin
File "/Users/jihwanmoon/.platformio/packages/tool-esptoolpy/esptool/bin_image.py", line 16, in <module>
from intelhex import HexRecordError, IntelHex
ModuleNotFoundError: No module named 'intelhex'
*** [.pio/build/lolin_s2_mini/bootloader.bin] Error 1
========================== [FAILED]
이며, 일단 표면적으로 알 수 있는 원인은 Build시 호출되는 Python 환경에서 "intelhex" 라이브러리 (모듈) 을 인식하지 못 했다는 점이다.
나는 거의 Anaconda 가상환경만 사용하지만, Build 과정에서 따로 Anaconda를 활성화하지는 않았을 것 같아서 macOS 기본 Python3 환경에 intelhex를 설치해 주었다.
오랜만에 가상환경이 아닌 기본 Python3 환경에 패키지를 설치하려니 조금 헷갈렸는데, 터미널을 켤 때 자동으로 활성화되는 Anaconda "base" 기본 가상환경을 먼저 비활성화시킨 후 pip3 명령어를 통해 설치하면 됐다.
>> conda deactivate
>> pip3 install intelhex
그런데 위 과정을 통해서도 해결이 되지 않았다.
설마 내 terminal이 실행과 동시에 Anaconda "base" 가상환경을 사용하기 때문에 여기에 추가해 줬어야 되는 것인가??
그래서 "base"에도 설치해 보았다.
>> conda install conda-forge::intelhex
..
그래도 안 됨..
엇, 그런데 이상하게도 내 MacBook의 기본 Python3와 위 스크린샷에 있는 Python 버전이랑 다르다는 것을 알게 되었다.
버전을 확인해 보니 기본 Python3의 버전은 3.9x였고, Build 과정에서의 Python 버전은 3.11이다.
게다가 내 Anaconda 가상환경들의 모든 Python은 그보다 더 높은 버전이었다.
아니 대체 어디에서 튀어나온 Python 3.11인 것인가?
그래서 좀 찾아 보니 PlatformIO IDE에서 esptool을 사용하여 Build를 할 때 자체 built-in Python으로 수행한다는 것을 알게 되었다.
특히 esptool의 Python 관련 위치는 ~/.platformio/packages/tool-esptoolpy 인 것을 파악했다.
그리고 이 packages 아래 폴더들은 Build를 할 때 추가적으로 필요한 부분이 있으면 인터넷에서 fetch 받아 자동으로 설치되는 것이라는 이야기도 읽을 수 있었다.
그래서 이 폴더를 과감하게 지우고 Build를 다시 시도했다. (Full clean이나 Clean으로 임시 파일 정리 좀 해 주고 Build를 선택하는 것이 깔끔할 듯)
성공했다!!
게다가 PlatformIO IDE의 packages 폴더 아래에 esptoolpy가 자동으로 다시 설치된 것도 확인했다.
아마 전에 ESP8266 개발 준비 과정을 통해 ~/.platformio/packages/에 tool-esptool, tool-esptoolpy 등의 패키지가 설치된 상태였는데 이때 설치된 버전에는 IntelHex 패키지는 빠져있어서 생긴 문제인 것으로 생각됨.
이제 LOLIN S2 Mini V1.0.0 을 연결하고 Upload를 하자.
잉?? 실패??
AVAILABLE: cmsis-dap, esp-bridge, esp-prog, espota, esptool, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa
CURRENT: upload_protocol = esptool Looking for upload port...
Auto-detected: /dev/cu.usbmodem1234561
Forcing reset using 1200bps open/close on port /dev/cu.usbmodem1234561 Waiting for the new upload port...
Uploading .pio/build/lolin_s2_mini/firmware.bin esptool.py v4.9.0
Serial port /dev/cu.usbmodem1234561
Connecting......................................
A fatal error occurred: Failed to connect to ESP32-S2: No serial data received. For troubleshooting steps visit: https://docs.espressif.com/projects/esptool/en/latest/troubleshooting.html
*** [upload] Error 2
PlatformIO port를 깜빡하고 따로 설정을 안 해 줬는데 그게 문제인가 싶었는데, Auto-detected 부분을 읽어 보고 현재 MacBook에 활성화된 USB port 목록을 살펴 보니 제대로 잘 연결된 것을 확인했다.
WeMos D1 R1 ESP8266 보드로 Blynk 특강 진행할 때 체감상 10%? 확률로 불량이 있었던 경험이 있어서 자연스럽게 이번에도 개발 보드의 문제가 아닐까라는 생각이 들게 되었다.
특히 연결할 때 다른 보드들은 LED가 아주 잠깐이라도 깜빡이는데 이 보드는 그러지 않았던 것이 찝찝하기도 했고.
그런데 열심히 구글링과 ChatGPT와 Gemini를 통해 알아낸 엄청난 사실이 있었다.
"Issues with serial-USB of Wifi module" Reddit 글을 읽어 보면 되는데, ESP32-S2의 경우 ESP8266과 다르게 flash를 시키려면 bootloader 모드로 연결시켜야 된다는 점!
보드의 양 옆 (위아래?) 을 보면 "RST"과 GPIO 0에 각각 버튼이 있는 것을 볼 수 있다.
Bootloader 모드로 진입하기 위해서는 GPIO 0 버튼을 누른 채로 USB에 연결시켜야 한다.
평소처럼 그냥 연결하게 되면 dev/cu.usbmodemXXXX... 로 port가 활성화 되고 bootloader 모드로 연결하게 되면 dev/cu.usbmodemYYYY... 로 뭔가 port의 주소가 달라지는 것을 확인했다.
Bootloader 모드로 진입시킨 후 다시 upload를 시도했다.
성공!
아, 그런데 serial 데이터 통신이 되는지 (monitor 모드) 확인하는 것을 깜빡.
LED on/off에 따라 문구를 출력하도록 아래와 같이 코드를 수정해 주었다.
printf를 사용해도 된다고 하는데 아직 안 해 봄.
ESP에서 제공하는 log 관련 함수를 사용하는 것이 권장된다고 하여 위와 같이 수정해 주었다.
그리고 다시 monitor를 눌러보았지만 terminal에는 아무 것도 뜨지 않았다.
그런데 자세히 terminal을 보니 LOLIN S2 Mini V1.0.0이 아닌 다른 Bluetooth port로 연결되고 있는것을 확인함..
그래서 Blink LED가 제대로 flash된 LOLIN S2 Mini V1.0.0의 port를 찾아 보려 했는데, 이제는 아예 port가 사라졌다!?
또 열심히 구글링, ChatGPT, Gemini를 통해 알아낸 것은 이 것이 정상이라는 것.
한번 정상적으로 flash가 되면 port가 아예 막히나 보다.
그럼 어떻게 serial 통신을 하나?
USB Communications Device Class (CDC) 를 활성화 시켜 줘야 한다고 함.
가상 COM port를 만들어 통신 통로를 만들어 준다고 하는데, 자세한 부분은 안 찾아 봤다.
Visual Studio Code의 왼쪽 프로젝트 폴더 트리구조를 보면 sdkconfig로 시작하는 파일이 생성되어 있는 것을 확인할 수 있는데, 여기에서 USB_CDC를 아래와 같이 활성화 해 주자.
초기에는
>> # CONFIG_ESP_CONSOLE_USB_CDC is not set
로 주석처리되어 있을 텐데, "Y"로 yes해 주면 되는 듯.
>> CONFIG_ESP_CONSOLE_USB_CDC=y
이제 다시 monitor를 시도해 보면
출력 성공.
새로운 /dev/cu.usbmodemZZZZ... port가 생긴 것도 확인 완료.
Comments
Post a Comment