Category (Click)
개발보드 덕질하기

[ESP32-C6] ESPRESSIF Zigbee 맛보기, ESP32-C6-DevKitC-1 핸즈온

 차완기 - @3/6/2023, 12:17:00 AM

ESP32-C6, 뒷통수

지난 2021년 8월, ESPRESSIF에서는 Zigbee(IEEE 802.15.4)를 지원하는 ESP32-H2 MCU를 발표했었습니다. 이미 ESPRESSIF에서는 저렴한 가격과 공식 아두이노 지원이라는 무기로 DIY 및 일부 개발 포지션에서 큰 비중을 차지하고 있었는데요, ESP32-H2를 통해 Zigbee까지 준비 중이라 하여 ESP32-H2의 출시를 기대하게 되었습니다. 덕분에 같은 연도 4월에 발표되었던 ESP32-C6는 RISC-V, Wi-Fi 6 정도의 상대적으로 평범한(?) MCU라 잊게 되었습니다.
그러던 중 올해인 2023년 1월, ESP32-H2는 여전히 소식이 없는 와중에 ESP32-C6가 출시되었습니다. 심드렁하게 기사를 읽다가 이상한 문구를 발견하게 되었습니다. 전혀 상상도 못하고 있던 802.15.4 프로토콜 지원이 낑겨있는것을 보고 깜짝 놀라게 되었습니다. ESP32-C6의 공개 기사를 다시 읽어봐도 Zigbee에 대한 언급이 없는데, 갑자기 추가되어 공개된 이유는 잘 모르겠습니다.
개발자 샘플이기는 하지만 일단 구매하고 보자는 생각에 바로 2개 구매했습니다. (현재는 개발자 샘플 구매가 불가능한 상태입니다)

ESP32-C6-DevKitC-1 도착

그 후 한동안 잊고 있다가 제품이 도착하였습니다.
제품 뒷면에는 개발 버전임을 알려주는 스티커가 붙어있었습니다. 동봉된 가이드라인에 따르면 개발 버전에는 아래 기능을 사용할 수 없다고 합니다.
ADC calibration (추후 양산 버전에서 추가)
Light-sleep, Deep-sleep (추후 ESP-IDF 업데이트로 지원)
또한 개발 중인 ESP-IDF v5.1에서 공식 지원이 시작될 예정이며, 현재는 ESP-IDF의 깃헙 master branch에서 ESP32-C6를 지원하고 있습니다.
이제 보드를 살펴볼 차례이죠. 여태껏 공식 개발 보드에 USB Type C를 넣어주지 않는 이유가 궁금했었는데 이제야 C 타입 커넥터가 들어간 보드를 보게 되었네요. 2개의 USB 커넥터가 달려있는 것을 보아 MCU에 USB 기능이 내장되어 있어 보입니다. USB 왼쪽을 보면 USB-Serial 칩인 CP2102, GPIO 8과 연결된 RGB LED인 WS2812B가 보이네요.
특이하게 ESP32-C6-DevKitC-1에는 점퍼(J5)가 있는데요, 이 점퍼를 이용하면 MCU의 소비 전류를 측정할 수 있습니다. 저전력이 중요한 MCU다 보니 이러한 기능을 제공하는 것 같습니다.

MCU 스펙 살펴보기

아직 PRELIMINARY 상태인 ESP32-C6의 Datasheet부터 살펴보겠습니다.
우선 ESP32-C6는 다른 C 시리즈와 마찬가지로 오픈소스 아키텍처인 RISC-V CPU를 사용합니다. 160 MHz 짜리 HP(High-Performance) 프로세서와 20 MHz 짜리 LP(Low-) 프로세서로 구성되어 있으며 LP는 HP 프로세서를 사용하지 않는 절전 모드에서 사용하거나 HP의 보조 프로세서로 함께 사용할 수 있습니다. 아직 RISC-V에 대해서는 생소해 다음에 시간을 가지고 공부해야겠습니다.
다음으로 뒷통수를 맞은 connectivity에서는 기존의 Bluetooth 5IEEE 802.11b/g/n 기반의 Wi-Fi는 그대로 있고 802.11ax 기반인 Wi-Fi 6가 추가되었습니다. 대신 Wi-Fi 6는 AP로는 사용이 불가능하고 2.4 Ghz 주파수에 20Mhz 대역폭만 사용이 가능하다고 하네요. 마지막으로 가장 중요한 Zigbee의 표준인 802.15.4를 지원하는 것을 알 수 있습니다.
Flash가 내장된 ESP32-C6FH4 같은 경우 4 MB(QSPI)가 내장되고 외장 Flash는 최대 16 MB까지 연결할 수 있습니다. 네트워크를 때려 박고 무엇보다 네트워크로 펌웨어를 업데이트하는 OTA를 지원하기 위해서는 넉넉한 Flash는 필수이죠.
마지막으로 GPIO는 패키지에 따라 30개(QFN40), 22개(QFN32)입니다.
ESP32-H2와는 다르게 Wi-Fi를 지원하고 성능이 높으며 많은 GPIO를 제공해 게이트웨이 등으로 사용하기 좋아 보입니다. 실제로 ESP32-C6의 소개문을 보니 Matter 게이트웨이로 써먹기 좋다고 하네요.

ESP32-C6-WROOM-1-N8

제가 구매한 개발 보드는 ESP32-C6-WROOM-1-N8 모듈이 장착되어 있었습니다. ESP32-C6-WROOM-1 데이터시트를 확인해 보면 8 MB 짜리 QSPI가 들어있고 GPIO는 23개 있습니다.

Zigbee 맛보기

Zigbee 때문에 구매한 만큼 일단 Zigbee부터 맛봐야겠습니다. Zigbee를 지원하는 ESPRESSIF MCU는 esp-zigbee-sdk를 통해 Zigbee를 사용할 수 있고 dev branch인 esp-idf의 master branch를 사용하면 Zigbee 예제를 확인할 수 있습니다.
우선 esp-zigbee-sdk의 Zigbee HA profile API를 사용하는 예제인 HA_on_off_light와 HA_on_off_switch 예제를 테스트해 보기로 하였습니다.

예제 살펴보기

여기서 사용하는 예제인 HA~~는 HA(Home Automation) 표준에서 정의한 Zigbee 디바이스 프로필 중 On/Off Switch와 On/Off light를 이용하며, HA 표준은 Zigbee Cluster 구현을 위해 ZCL(Zigbee Cluster Library)을 사용하는 점 미리 언급하고 넘어가겠습니다.
HA_on_off_light 예제 중 일부
zigbee task 부분 코드를 살펴보면 esp-zigbee-sdk HA API의 typedef로 (118라인)미리 만들어진 cluster 구조에 매크로를 통해 cluster의 attribute를 세팅하고, (119라인)이를 endpoint 리스트에 추가하는 아주 직관적이고 간단한 단계를 거치는 것을 확인할 수 있었습니다.
여기서 ON/OFF 조명 cluster의 attribute들을 설정하는 매크로를 열어보면 esp-ziebee-sdk의 ZCL API를 이용해 설정된 기본값을 확인할 수 있습니다. 그런데, 조금 이상한 것이 ZCL에 명시된 attribute 중 일부가 보이지를 않았습니다.
genBasic cluster의 typedef를 따라가 보니 ZCL v8에서 정의된 attribute 중 일부만 만들어져 있었습니다. Home Assistant의 Z2M에서 장치를 구분하는 기준인 ModelIdentifier가 없어 당장은 Home Assistant에서는 사용하지 못할듯합니다... (내부 코드는 빌드 된 상태로 제공되어 수정이 불가능합니다)
@5/21/2023 추가
HA 프로파일에서 제공하지 않을 뿐 ZCL API를 이용해 추가할 수 있습니다.
아무튼 대략적으로 살펴보았을 때 상당히 간편하게 만들어져 있어 추후에 잘 써먹을 수 있을 것 같습니다. 지금은 핸즈온이니 여기까지만 알아보고 코드를 실행시켜 보죠.
코드에서는 스위치 쪽 디바이스가 coordinator, 조명 쪽 디바이스가 end device로 동작하며, 실제로 스위치를 클릭했을 때 LED가 꺼지고 켜지는 것을 확인할 수 있었습니다.

Home Assistant Z2M...?

앞서 언급한 내용처럼 지금 당장은 esp-zigbee-sdk에서 ZCL의 genBasic attribute 중 일부를 지원하지 않아 Z2M에서 커스텀 디바이스로 사용이 불가능해 보입니다. 그럼에도 ZCL 표준은 만족하기 때문에 Z2M에서 페어링 하고 Zigbee의 Binding 기능을 이용해 제어하는 것은 가능해 보입니다.
Z2M에 연결한 후 장치의 데이터를 가져오는 것은 문제없이 작동하지만, Z2M 상에 등록되지 않기 때문에 콘솔에서도 제어할 수가 없네요. 이건 조금 더 시간이 지난 후에 시도해 봐야겠습니다.
@5/21/2023 추가
HA 프로파일에서 제공하지 않을 뿐 ZCL API를 이용해 추가할 수 있습니다.
여기까지 ESP32-C6 MCU에 대해 간략히 알아보았습니다. 덕분에 Zigbee에 대해 많이 공부하게 되었네요. Thread 역시 지원하니 한번 사용해 봐야겠습니다.