1편에서는 Windows Terminal에 Arduino CLI 환경을 구성하고 Espressif의 Arduino-ESP32 Core를 설치하는 방법을 알아보았습니다.

이번에는 실제 ESP32-WROOM-32E 프로젝트를 대상으로 컴파일, firmware 업로드, Serial Monitor, 라이브러리 관리를 수행해 보겠습니다.

그리고 Arduino CLI를 사용하는 중요한 이유 중 하나인 반복적인 컴파일 시간을 줄이는 방법도 함께 살펴보겠습니다.


1. 테스트용 ESP32 프로젝트 만들기

예를 들어 다음 위치에서 프로젝트를 만들어 보겠습니다.

mkdir C:\Arduino\ESP32Test

cd C:\Arduino\ESP32Test

Arduino CLI에는 새로운 스케치를 만드는 기능도 있습니다.

arduino-cli sketch new ESP32Test

다음과 같은 프로젝트가 생성됩니다.

C:\Arduino\ESP32Test

└── ESP32Test

└── ESP32Test.ino

ESP32Test.ino에 간단한 코드를 작성합니다.

void setup() {

Serial.begin(115200);

Serial.println("ESP32-WROOM-32E started");

}

 

void loop() {

Serial.println("Hello from ESP32");

delay(1000);

}


2. ESP32-WROOM-32E용으로 컴파일하기

프로젝트 폴더로 이동합니다.

cd C:\Arduino\ESP32Test\ESP32Test

이제 다음 명령으로 컴파일합니다.

arduino-cli compile --fqbn esp32:esp32:esp32 .

마지막의 .은 현재 디렉터리를 의미합니다.

즉 현재 폴더에 있는 Arduino 프로젝트를 다음 보드 설정으로 컴파일하라는 의미입니다.

esp32:esp32:esp32

전체적인 과정은 다음과 같습니다.

ESP32Test.ino

Arduino CLI

Arduino-ESP32 Core

Compiler

Firmware

Arduino IDE에서 Verify 버튼을 누르던 작업을 명령 한 줄로 수행한 것입니다.


3. ESP32에 firmware 업로드하기

먼저 연결된 COM 포트를 확인합니다.

arduino-cli board list

ESP32가 COM5에 연결되어 있다고 가정하겠습니다.

컴파일된 firmware를 업로드하려면:

arduino-cli upload -p COM5 --fqbn esp32:esp32:esp32 .

를 실행합니다.

컴파일과 업로드를 연속해서 실행할 수도 있습니다.

arduino-cli compile --fqbn esp32:esp32:esp32 .

arduino-cli upload -p COM5 --fqbn esp32:esp32:esp32 .

Arduino IDE에서 하던:

Verify

Upload

과정이 두 개의 명령으로 바뀐 것입니다.


4. Serial Monitor 사용하기

Arduino IDE를 열지 않고 ESP32가 보내는 Serial 메시지를 확인할 수도 있습니다.

arduino-cli monitor -p COM5

baud rate가 115200이라면 다음과 같이 지정합니다.

arduino-cli monitor -p COM5 --config baudrate=115200

앞서 작성한 프로그램이 실행되고 있다면 다음과 같은 메시지가 나타납니다.

ESP32-WROOM-32E started

Hello from ESP32

Hello from ESP32

Hello from ESP32

...

따라서 기본적인 ESP32 개발 과정 전체를 Windows Terminal 안에서 처리할 수 있습니다.

Code 수정

Compile

Upload

Serial Monitor

Code 수정

...


5. Arduino CLI에서 라이브러리 검색하기

Arduino CLI에서는 Arduino IDE의 Library Manager에 해당하는 기능도 사용할 수 있습니다.

현재 설치된 라이브러리를 확인하려면:

arduino-cli lib list

특정 라이브러리를 검색하려면:

arduino-cli lib search "Adafruit SHT31"

라이브러리를 설치하려면:

arduino-cli lib install "Adafruit SHT31 Library"

라이브러리 index를 업데이트하려면:

arduino-cli lib update-index

설치된 라이브러리를 업데이트하려면:

arduino-cli lib upgrade

따라서 Board Manager뿐 아니라 Library Manager의 작업도 대부분 Terminal에서 수행할 수 있습니다.


6. Arduino CLI의 중요한 장점 — 반복 컴파일 줄이기

규모가 큰 ESP32 프로젝트에서는 컴파일 시간이 무시하기 어려워집니다.

예를 들어 프로젝트가 다음과 같은 구조라고 생각해 보겠습니다.

Main Firmware

├── WiFi

├── BLE

├── HTTPClient

├── Sensor Library

├── Display Library

└── 기타 Libraries

첫 번째 빌드에서는 프로젝트에 필요한 여러 소스 파일과 라이브러리, Core를 컴파일해야 합니다.

개념적으로 보면:

Application source ──→ Compile ──┐

ESP32 Core ──────────→ Compile ──┤

WiFi ────────────────→ Compile ──┤

BLE ─────────────────→ Compile ──┤→ Link → Firmware

Sensor Library ──────→ Compile ──┤

Other Libraries ─────→ Compile ──┘

프로젝트가 클수록 시간이 오래 걸립니다.

그런데 실제 firmware 개발에서는 모든 파일을 매번 수정하지 않습니다.

대부분은:

센서 처리 코드 한 부분 수정

컴파일

테스트

조건문 수정

컴파일

테스트

처럼 일부 application code만 반복적으로 변경합니다.

ESP32 Core나 사용 중인 라이브러리는 그대로인 경우가 많습니다.

이런 경우 변경되지 않은 부분의 기존 컴파일 결과를 재사용할 수 있다면 전체 빌드 시간을 크게 줄일 수 있습니다.


7. Build Cache와 증분 빌드

첫 번째 컴파일에서는 필요한 파일들을 정상적으로 컴파일합니다.

FIRST BUILD

 

Application ─────────→ Compile

ESP32 Core ──────────→ Compile

WiFi ────────────────→ Compile

BLE ─────────────────→ Compile

Sensor Library ──────→ Compile

Link

Firmware

그 과정에서 재사용할 수 있는 빌드 결과가 남습니다.

이후 라이브러리나 ESP32 Core에 변화가 없고 application source 일부만 변경되었다면 개념적으로:

NEXT BUILD

 

Modified source ─────→ Compile ──┐

ESP32 Core ──────────→ Reuse ───┤

WiFi ────────────────→ Reuse ───┤

BLE ─────────────────→ Reuse ───┤→ Link → Firmware

Sensor Library ──────→ Reuse ───┘

와 같은 방식으로 불필요한 반복 컴파일을 줄일 수 있습니다.

따라서 라이브러리 자체가 변경되지 않았다면 매번 모든 라이브러리를 처음부터 다시 컴파일하는 작업을 줄일 수 있습니다.

ESP32처럼 Core와 라이브러리가 큰 플랫폼에서는 이런 차이가 반복적인 firmware 개발 과정에서 상당히 중요합니다.


8. Build Path를 유지하기

반복적인 개발에서는 build directory를 명시적으로 지정하는 것도 유용합니다.

예를 들어:

arduino-cli compile `

--fqbn esp32:esp32:esp32 `

--build-path .\build `

.

PowerShell의 ` 문자는 명령을 다음 줄로 이어 쓰기 위한 것입니다.

한 줄로 작성하면:

arduino-cli compile --fqbn esp32:esp32:esp32 --build-path .\build .

입니다.

프로젝트 구조는 다음과 같이 관리할 수 있습니다.

ESP32Project

├── ESP32Project.ino

├── source files

└── build

├── object files

├── libraries

└── firmware binaries

동일한 build directory를 유지하면 반복적인 개발에서 기존 빌드 결과를 관리하기도 쉬워집니다.


9. 언제 다시 컴파일되는가?

물론 모든 상황에서 이전 결과를 그대로 사용할 수 있는 것은 아닙니다.

다음과 같은 변화가 있으면 관련 소스가 다시 컴파일될 수 있습니다.

Library source 변경

ESP32 Arduino Core 변경

Board 설정 변경

Compiler option 변경

FQBN 변경

Build directory 삭제

Build/Cache 정리

예를 들어:

esp32:esp32:esp32

에서 다른 보드 설정으로 변경하면 기존 빌드 결과를 그대로 사용할 수 없는 부분이 생깁니다.

따라서 CLI를 이용한 반복 빌드의 핵심은 동일한 개발환경을 유지하면서 변경된 부분만 효율적으로 다시 빌드하는 것입니다.


10. 여러 ESP32에 같은 firmware 업로드하기

CLI의 또 다른 장점은 자동화입니다.

예를 들어 여러 ESP32 보드가 각각 다음 포트에 연결되어 있다고 가정하겠습니다.

COM5

COM6

COM7

PowerShell에서 다음과 같이 처리할 수 있습니다.

$ports = @("COM5", "COM6", "COM7")

 

foreach ($port in $ports) {

 

Write-Host "Uploading firmware to $port"

 

arduino-cli upload `

-p $port `

--fqbn esp32:esp32:esp32 `

.

}

한 번 컴파일한 firmware를 여러 동일한 보드에 순차적으로 업로드하는 작업을 자동화할 수 있습니다.

이는 한두 개의 개발보드를 테스트할 때보다 여러 개의 동일한 제품을 제작하는 단계에서 더욱 유용합니다.


11. Arduino CLI가 특히 유용한 경우

Arduino CLI는 단순한 프로젝트에서는 Arduino IDE보다 오히려 불편하게 느껴질 수도 있습니다.

하지만 다음과 같은 상황에서는 장점이 분명해집니다.

  • ESP32 firmware를 자주 수정하고 컴파일하는 경우
  • 규모가 큰 프로젝트에서 반복 빌드 시간을 줄이고 싶은 경우
  • 동일한 firmware를 여러 보드에 업로드하는 경우
  • 개발환경과 보드 옵션을 명령으로 명확하게 관리하고 싶은 경우
  • PowerShell이나 Python으로 firmware 작업을 자동화하려는 경우
  • Git이나 CI/CD 시스템과 firmware build를 연결하려는 경우
  • 제품 생산 과정에서 firmware 업로드를 자동화하려는 경우

특히 개발보드 수준을 넘어 실제 하드웨어 제품을 제작하기 시작하면 CLI의 활용도가 높아집니다.


12. Arduino IDE와 CLI의 차이

Arduino IDE와 Arduino CLI는 서로 경쟁하는 도구라기보다 목적이 조금 다릅니다.

Arduino IDE는 사람이 직접 개발하기 편한 환경입니다.

코드 작성

→ 버튼 클릭

→ 컴파일

→ 업로드

→ Serial Monitor

반면 Arduino CLI는 반복 가능하고 자동화 가능한 개발환경을 만드는 데 강점이 있습니다.

Source Code

Arduino CLI

Incremental Build

Firmware

Automatic Upload

Device Test

따라서 초기 개발 단계에서는 Arduino IDE를 사용하다가 프로젝트가 커지면서 CLI를 함께 사용하는 방법도 좋습니다.


13. 정리

ESP32-WROOM-32E를 사용하는 일반적인 프로젝트라면 Arduino CLI 개발 흐름은 생각보다 단순합니다.

환경을 한 번 설정한 뒤 실제 개발에서 반복적으로 사용하는 핵심 명령은 몇 개뿐입니다.

컴파일:

arduino-cli compile --fqbn esp32:esp32:esp32 .

업로드:

arduino-cli upload -p COM5 --fqbn esp32:esp32:esp32 .

Serial Monitor:

arduino-cli monitor -p COM5 --config baudrate=115200

그리고 반복적인 개발에서는:

arduino-cli compile --fqbn esp32:esp32:esp32 --build-path .\build .

처럼 build path를 관리할 수 있습니다.

Arduino CLI의 진짜 장점은 단순히 Arduino IDE를 열지 않아도 된다는 데 있지 않습니다.

더 중요한 것은 개발 과정을 명령으로 정의할 수 있다는 점입니다.

이를 통해 변경되지 않은 Core와 라이브러리의 빌드 결과를 활용해 반복 작업을 효율화하고,

코드 수정

증분 빌드

Firmware 생성

업로드

테스트

라는 개발 사이클을 빠르게 반복할 수 있습니다.

그리고 이 과정을 PowerShell, Python 등의 스크립트와 결합하면 결국 ESP32 firmware의 빌드부터 여러 제품에 대한 업로드와 테스트까지 자동화하는 개발·생산 환경으로 확장할 수 있습니다.

Arduino 프로젝트가 단순한 실험을 넘어 실제 제품 개발 단계로 발전하고 있다면 Arduino CLI를 익혀둘 가치가 충분합니다.

 

#ArduinoCLI #ESP32 #아두이노 #펌웨어개발 #JLCPCB

 

___________________________________________________________________________

이 글이 도움이 되셨다면 제 홈페이지(댓글에 링크)를 방문해 보세요.

홈페이지에서는 다음과 같은 다양한 콘텐츠를 만나실 수 있습니다.

·         기술 블로그와 학습 자료

·         pcb 제작 강의와 최신 소식

·         ESP32 IoT 하드웨어 프로젝트

·         KiCad PCB 설계 템플릿 (Github, Gumroad)

·         펌웨어 개발

배우고, 만들고, 함께 성장하는 메이커들을 위한 공간으로 계속 발전시켜 나가겠습니다.

이번에 다음 주말 메이커 페어에서 선보이고 베타 테스터분들에게 나누어 드릴 ESP32 기반 보드를 제작했습니다.

한 대는 현재 KC 무선 인증을 위해 인증기관에 보내 시험을 진행하고 있습니다. 인증이 모두 끝나면 직접 개발한 ESP32 제품을 실제 판매 가능한 제품으로 만들기까지 어떤 과정이 필요한지, 제가 경험한 KC 인증 과정도 별도의 글로 정리해볼 생각입니다.

이번 글에서는 그보다 먼저, 완성된 보드에 펌웨어를 반복해서 개발하고 업로드하면서 사용하게 된 Arduino CLI에 대해 이야기해보려고 합니다.

 


JLCPCB 협찬으로 제작한 ESP32 보드

먼저 이번 보드 제작은 JLCPCB의 지원을 받아 진행했습니다.

이번 제작에서는 기성품 방수 케이스에 넣을 수 있는 버전과 제가 직접 3D 프린터로 제작한 케이스를 사용하는 버전, 두 가지 형태로 준비했습니다.

방수 케이스용 PCB는 검은색 솔더마스크를 사용하고 흰색 실크스크린으로 로고와 QR코드 등을 표시했습니다.

예전에는 직접 설계한 PCB라고 하면 아무래도 '개발용 회로 기판'이라는 느낌이 강했는데, 실제로 완성된 보드를 받아보니 생각보다 상당히 깔끔합니다.

특히 검은색 PCB와 흰색 실크스크린의 조합은 완성품에 가까운 느낌을 줍니다.

보드 왼쪽에는 USB-C 커넥터를 배치해 PC와 직접 연결하여 펌웨어를 업로드할 수 있도록 만들었습니다.

실제 펌웨어를 업로드해 여러 센서와 Wi-Fi 통신 등을 테스트해보니 설계했던 대로 정상적으로 동작했습니다.

아두이노에 익숙한 분들이라면 어느 정도 경험이 쌓인 뒤에는 Arduino Uno와 같은 기성 개발보드만 사용하는 데서 한 단계 더 나아가, ESP32 모듈을 이용해 자신만의 개발보드를 직접 설계해보는 것도 재미있는 경험이라고 생각합니다.

ESP32 역시 Arduino 개발환경을 그대로 사용할 수 있고, 예제와 라이브러리가 매우 풍부하기 때문에 생각보다 접근하기 어렵지 않습니다.

PCB 제작 역시 JLCPCB와 같이 소량 PCB 제작과 SMT 조립을 지원하는 업체를 이용하면 예전처럼 큰 비용을 들이지 않고도 자신의 보드를 만들어볼 수 있습니다.

JLCPCB 관련 링크는 글 하단에 남겨두겠습니다.

이번 글을 마지막으로 이번 보드 제작과 관련한 JLCPCB 협찬 내용도 마무리합니다.


보드를 만들고 나니 새로운 문제가 생겼다

하드웨어 제작이 끝나면 그다음부터는 펌웨어를 계속 수정하고 테스트하는 과정이 시작됩니다.

저 역시 지금까지 ESP32 모듈의 펌웨어 개발에는 주로 Arduino IDE를 사용해왔습니다.

Arduino를 개발한다고 하면 보통 Arduino IDE를 먼저 떠올립니다.

코드를 작성하고, 보드를 선택하고, 포트를 선택한 뒤 VerifyUpload 버튼을 누르면 컴파일부터 펌웨어 업로드까지 대부분 자동으로 처리됩니다.

작은 프로젝트에서는 이 방법이 매우 편리합니다.

그런데 프로젝트가 점점 커지면서 상황이 조금 달라졌습니다.

제가 사용하는 펌웨어 역시 처음에는 비교적 단순했지만 기능을 하나씩 추가하다 보니 코드가 수천 줄 규모로 늘어났고, 여러 ESP32 라이브러리까지 함께 사용하게 되었습니다.

그러면서 한 번 컴파일하고 펌웨어를 업로드하는 데 걸리는 시간이 점점 길어졌습니다.

특히 하드웨어를 개발할 때는 핀 설정 하나를 수정하거나 센서 동작을 확인하기 위해서도 다음 과정을 계속 반복하게 됩니다.

코드 수정

컴파일

업로드

동작 확인

다시 코드 수정

이런 작업을 하루에도 여러 번 반복하게 되는데, 제 개발환경에서는 한 번의 컴파일과 업로드에 10분 이상 걸리는 경우도 있었습니다.

코드 몇 줄을 수정하고 다시 결과를 확인하기 위해 긴 시간을 기다려야 하니 개발 흐름이 자주 끊겼습니다.

그래서 Arduino IDE 이외의 방법을 찾아보기 시작했습니다.

그 과정에서 사용하게 된 것이 바로 Arduino CLI(Command Line Interface)입니다.

Arduino CLI를 사용하면 Windows Terminal이나 PowerShell에서 Arduino 프로젝트의 보드 설치, 라이브러리 관리, 컴파일, 업로드, Serial Monitor 등을 명령어로 수행할 수 있습니다.

처음에는

"버튼 하나 누르면 되는 Arduino IDE를 두고 굳이 명령어를 사용해야 할까?"

라는 생각도 들었습니다.

하지만 실제로 사용해보니 반복적인 ESP32 개발에서는 오히려 CLI 방식이 상당히 편리했습니다.

특히 빌드 캐시와 기존 빌드 결과를 활용하면 변경되지 않은 ESP32 Core나 라이브러리 등을 매번 불필요하게 다시 컴파일하는 일을 줄일 수 있어 반복 빌드 시간이 크게 단축될 수 있습니다.

제 프로젝트에서는 기존에 10분 이상 걸리던 반복적인 컴파일과 업로드 과정이 경우에 따라 약 1분 정도까지 줄어들었습니다.

펌웨어를 자주 수정해야 하는 개발 과정에서는 상당히 큰 차이입니다.

그래서 이번 글에서는 Windows에 Arduino CLI를 처음 설치하는 것부터 시작해 Espressif의 ESP32-WROOM-32E 기반 보드를 개발할 수 있는 환경을 구성하는 방법까지 정리해보겠습니다.

그리고 2편에서는 실제 프로젝트를 이용해

컴파일 → 업로드 → Serial Monitor → 라이브러리 관리

과정을 수행하고, 반복적인 ESP32 펌웨어 개발에서 빌드 시간을 줄이는 방법을 자세히 살펴보겠습니다.


1. Arduino CLI란?

Arduino CLI는 Arduino 개발환경의 주요 기능을 명령줄에서 사용할 수 있도록 만든 공식 도구입니다.

기본적인 명령 구조는 다음과 같습니다.

arduino-cli <명령> <옵션>

Arduino IDE에서는 메뉴와 버튼을 이용해 작업하지만 Arduino CLI에서는 동일한 작업을 명령으로 수행합니다.

예를 들어,

Arduino IDE

Board Manager

보드 선택

Verify

Upload

Serial Monitor

라는 작업이 Arduino CLI에서는,

core install

compile

upload

monitor

라는 명령의 흐름으로 바뀝니다.

처음에는 IDE가 더 편해 보일 수 있습니다. 하지만 명령은 그대로 저장해서 다시 실행할 수 있고 PowerShell이나 Python 스크립트와 결합할 수도 있기 때문에 반복 작업이 많아질수록 CLI의 장점이 커집니다.


2. Arduino CLI의 장점

Arduino CLI의 첫 번째 장점은 개발환경을 명령으로 정확하게 정의하고 반복할 수 있다는 것입니다.

예를 들어,

arduino-cli compile --fqbn esp32:esp32:esp32 .

이라는 명령만 보더라도 어떤 플랫폼과 보드를 대상으로 컴파일했는지를 알 수 있습니다.

두 번째 장점은 자동화가 쉽다는 것입니다.

컴파일과 업로드를 연속해서 수행하거나 여러 보드에 같은 firmware를 업로드하는 PowerShell 스크립트를 만들 수 있습니다.

세 번째로 중요한 장점은 반복적인 컴파일 시간을 줄일 수 있다는 것입니다.

ESP32 프로젝트는 사용자가 작성한 .ino 파일만 컴파일하는 것이 아닙니다. ESP32 Arduino Core와 프로젝트에서 사용하는 여러 라이브러리도 빌드 과정에 참여합니다.

프로젝트가 커지면 이 과정이 상당한 시간을 차지할 수 있습니다.

Arduino CLI에서는 빌드 캐시와 기존 빌드 결과를 활용하여 변경되지 않은 부분을 불필요하게 다시 컴파일하는 작업을 줄일 수 있습니다.

이에 대해서는 2편에서 자세히 살펴보겠습니다.


3. Windows에 Arduino CLI 설치하기

이제 실제로 Windows에 Arduino CLI를 설치해 보겠습니다.

Arduino CLI는 GUI 프로그램이 아니라 하나의 실행 파일을 중심으로 동작합니다. 따라서 Arduino IDE를 반드시 설치해야 Arduino CLI를 사용할 수 있는 것은 아닙니다.

Windows에서는 여러 가지 설치 방법을 사용할 수 있지만, 여기서는 가장 이해하기 쉬운 공식 Windows 실행 파일을 내려받아 설치하는 방법을 기준으로 설명하겠습니다.

3-1. Arduino CLI 다운로드

Arduino 공식 Arduino CLI 페이지 또는 GitHub의 Arduino CLI Releases 페이지에서 Windows용 패키지를 다운로드합니다.

Windows 64비트 PC라면 일반적으로 다음과 같은 Windows 64-bit 패키지를 선택하면 됩니다.

arduino-cli_x.x.x_Windows_64bit.zip

압축 파일을 풀면 핵심 실행 파일인 다음 파일을 확인할 수 있습니다.

arduino-cli.exe

즉 Arduino CLI의 핵심은 이 실행 파일입니다.


3-2. Arduino CLI 전용 폴더 만들기

예를 들어 다음 폴더를 만들어 보겠습니다.

C:\ArduinoCLI

다운로드한 arduino-cli.exe를 이 폴더에 복사합니다.

결과적으로:

C:\

└── ArduinoCLI

└── arduino-cli.exe

와 같은 구조가 됩니다.


3-3. 먼저 직접 실행해 보기

Windows Terminal 또는 PowerShell을 열고 다음과 같이 이동합니다.

cd C:\ArduinoCLI

이제:

.\arduino-cli.exe version

을 실행합니다.

정상적으로 설치되었다면 Arduino CLI의 버전 정보가 출력됩니다.

이 단계까지 성공했다면 arduino-cli.exe 자체는 정상적으로 실행되는 것입니다.

하지만 현재는 C:\ArduinoCLI 폴더 안에서 실행하고 있기 때문에 다른 디렉터리에서는 바로:

arduino-cli

라고 입력해 사용할 수 없습니다.

이를 해결하기 위해 Windows의 PATH 환경 변수에 Arduino CLI 폴더를 등록합니다.


4. Arduino CLI를 Windows PATH에 등록하기

PATH에 다음 폴더를 추가합니다.

C:\ArduinoCLI

Windows 검색창에서:

환경 변수

를 검색한 뒤 시스템 환경 변수 편집을 실행합니다.

그다음:

환경 변수

사용자 변수

Path

편집

새로 만들기

를 선택하고 다음 경로를 입력합니다.

C:\ArduinoCLI

확인을 눌러 설정을 저장합니다.

이미 실행 중인 Windows Terminal은 이전 PATH 정보를 가지고 있을 수 있으므로 Terminal을 닫고 새로 실행하는 것이 좋습니다.

이제 어느 폴더에서든:

arduino-cli version

을 실행합니다.

버전 정보가 출력되면 PATH 설정까지 정상적으로 완료된 것입니다.

또한 Windows에서 실제 어떤 실행 파일을 찾고 있는지 확인하려면 다음 명령을 사용할 수 있습니다.

where.exe arduino-cli

정상적으로 설정되었다면:

C:\ArduinoCLI\arduino-cli.exe

와 같이 표시됩니다.

이제 Arduino CLI 설치가 완료되었습니다.


5. Arduino CLI 초기 설정

Arduino CLI를 처음 사용하는 경우 설정 파일을 생성합니다.

arduino-cli config init

Arduino CLI는 이후 보드 패키지 URL 등의 설정을 이 configuration을 통해 관리합니다.

현재 설정을 확인하려면:

arduino-cli config dump

를 실행합니다.

여기까지 완료했다면:

Arduino CLI 다운로드

arduino-cli.exe 설치

PATH 등록

arduino-cli version

config init

이라는 기본 설치 과정이 끝난 것입니다.

이제 ESP32 개발환경을 추가해 보겠습니다.


6. ESP32-WROOM-32E는 어떤 보드를 설치해야 할까?

여기서 ESP32를 처음 CLI로 사용하는 경우 조금 혼동하기 쉬운 부분이 있습니다.

ESP32-WROOM-32E는 Arduino에서 설치하는 보드 패키지의 이름이 아닙니다.

ESP32-WROOM-32E는 Espressif에서 만든 ESP32 기반의 무선 MCU 모듈입니다.

개념적으로 보면 다음과 같습니다.

ESP32 SoC

ESP32-WROOM-32E Module

개발보드 또는 Custom PCB

따라서 WROOM-32E를 사용한다고 해서 ESP32-WROOM-32E라는 Arduino 패키지를 별도로 찾을 필요는 없습니다.

Espressif에서 제공하는 Arduino-ESP32 Core를 설치하면 됩니다.

일반적인 ESP32-WROOM-32E 기반 보드나 커스텀 PCB에서는 ESP32 Dev Module 설정을 사용할 수 있습니다.

이때 사용하는 FQBN은 다음과 같습니다.

esp32:esp32:esp32

FQBN은 Fully Qualified Board Name의 약자로 Arduino CLI가 정확히 어떤 플랫폼과 보드 설정을 사용할 것인지를 나타냅니다.


7. Espressif ESP32 Board Manager URL 등록

ESP32는 Arduino 기본 플랫폼이 아니므로 Espressif에서 제공하는 package index를 Arduino CLI에 알려줘야 합니다.

다음 명령을 실행합니다.

arduino-cli config add board_manager.additional_urls https://espressif.github.io/arduino-esp32/package_esp32_index.json

설정이 정상적으로 등록되었는지는 다음과 같이 확인합니다.

arduino-cli config dump

설정 내용에 다음과 같은 항목이 나타납니다.

board_manager:

additional_urls:

- https://espressif.github.io/arduino-esp32/package_esp32_index.json

한 번 설정해 두면 이후 명령마다 URL을 다시 입력할 필요가 없습니다.


8. ESP32 Package Index 업데이트

이제 사용 가능한 보드 패키지 정보를 갱신합니다.

arduino-cli core update-index

ESP32 Core가 검색되는지도 확인할 수 있습니다.

arduino-cli core search esp32

정상적으로 등록되어 있다면 다음과 비슷한 항목을 찾을 수 있습니다.

ID Name

esp32:esp32 esp32


9. Espressif Arduino-ESP32 Core 설치

이제 실제 ESP32 개발환경을 설치합니다.

arduino-cli core install esp32:esp32

이 과정에서는 ESP32 Arduino Core뿐 아니라 컴파일과 업로드에 필요한 compiler 및 관련 toolchain도 설치됩니다.

설치가 완료되면:

arduino-cli core list

를 실행합니다.

다음과 비슷하게 표시되면 설치가 완료된 것입니다.

ID Installed Latest Name

esp32:esp32 x.x.x x.x.x esp32


10. ESP32 Dev Module 확인하기

설치된 ESP32 보드 목록을 확인해 봅니다.

arduino-cli board listall | findstr ESP32

ESP32 Dev Module을 찾으려면:

arduino-cli board listall | findstr "ESP32 Dev"

일반적인 ESP32-WROOM-32E 기반 프로젝트에서 사용할 수 있는 설정은:

ESP32 Dev Module esp32:esp32:esp32

입니다.

따라서 이후 컴파일 명령에서 기억해야 할 FQBN은:

esp32:esp32:esp32

입니다.


11. USB로 연결된 ESP32 확인하기

ESP32 보드를 PC에 연결한 뒤:

arduino-cli board list

를 실행합니다.

예를 들어 보드가 COM5로 인식되었다면:

Port Protocol Type

COM5 serial Serial Port (USB)

와 같이 나타날 수 있습니다.

커스텀 ESP32-WROOM-32E 보드에서는 Arduino CLI가 정확한 보드 이름을 자동으로 알아내지 못할 수도 있습니다.

그 자체는 문제가 아닙니다.

중요한 것은 USB-UART 장치가 Windows에서 정상적으로 인식되어 COM 포트가 생성되는가입니다.

이 예에서는:

COM5

가 firmware를 업로드할 포트가 됩니다.


12. 전체 설치 과정 정리

처음 Windows PC에서 Arduino CLI와 ESP32-WROOM-32E 개발환경을 구축한다면 전체 과정은 다음과 같습니다.

Arduino CLI 다운로드

arduino-cli.exe 설치

Windows PATH 등록

arduino-cli config init

Espressif Package URL 등록

core update-index

esp32:esp32 Core 설치

ESP32 Dev Module 확인

ESP32 USB 연결

COM Port 확인

명령만 다시 정리하면:

arduino-cli version

 

arduino-cli config init

 

arduino-cli config add board_manager.additional_urls https://espressif.github.io/arduino-esp32/package_esp32_index.json

 

arduino-cli core update-index

 

arduino-cli core install esp32:esp32

 

arduino-cli core list

 

arduino-cli board listall | findstr "ESP32 Dev"

 

arduino-cli board list

여기까지 성공했다면 Windows Terminal만으로 ESP32-WROOM-32E firmware를 빌드할 수 있는 환경이 완성된 것입니다.

처음 설치할 때는 Arduino IDE보다 과정이 많아 보이지만 환경 설정은 한 번만 하면 됩니다. 이후에는 몇 개의 명령만으로 개발을 반복할 수 있습니다.

그리고 Arduino CLI의 장점은 단순히 IDE 없이 개발할 수 있다는 데 그치지 않습니다.

프로젝트가 커질수록 빌드 결과와 캐시를 활용해 변경되지 않은 Core와 라이브러리의 불필요한 반복 컴파일을 줄이고, PowerShell 등의 스크립트를 이용해 컴파일과 업로드를 자동화할 수 있다는 점이 중요해집니다.

다음 편에서는 실제 ESP32 프로젝트를 이용해 컴파일 → 업로드 → Serial Monitor → 라이브러리 관리를 수행하고, 반복적인 firmware 개발에서 빌드 시간을 줄이는 방법을 자세히 살펴보겠습니다.

 

#ArduinoCLI #ESP32 #아두이노 #펌웨어개발 #JLCPCB

 

___________________________________________________________________________

이 글이 도움이 되셨다면 제 홈페이지(댓글에 링크)를 방문해 보세요.

홈페이지에서는 다음과 같은 다양한 콘텐츠를 만나실 수 있습니다.

·         기술 블로그와 학습 자료

·         pcb 제작 강의와 최신 소식

·         ESP32 IoT 하드웨어 프로젝트

·         KiCad PCB 설계 템플릿 (Github, Gumroad)

·         펌웨어 개발

배우고, 만들고, 함께 성장하는 메이커들을 위한 공간으로 계속 발전시켜 나가겠습니다.

Arduino나 ESP32로 프로젝트를 만들다 보면 물체와의 거리를 측정해야 하는 경우가 꽤 많습니다.

로봇의 장애물 감지, 사람이나 물체의 접근 감지, 자동문, 비접촉 인터페이스, 탱크 수위 측정 등 활용 분야도 다양합니다.

가장 익숙한 방법으로는 초음파 거리 센서나 적외선(IR) 거리 센서가 있지만, 최근에는 빛이 왕복하는 시간을 직접 측정하는 ToF(Time of Flight) 방식의 센서도 쉽게 사용할 수 있습니다.

이번 글에서 살펴볼 제품은 Adafruit TMF8806 Time of Flight Distance Sensor입니다.

ams OSRAM의 TMF8806 칩을 기반으로 한 소형 breakout board로, 최대 약 5m 거리 측정, 최대 30Hz 측정 속도, I2C 통신을 지원합니다.

특히 Arduino부터 ESP32와 같은 32비트 MCU까지 비교적 간단하게 사용할 수 있다는 것이 특징입니다.


1. TMF8806는 어떤 센서인가?

TMF8806는 Direct Time-of-Flight(dToF) 방식의 거리 센서입니다.

주요 사양을 정리하면 다음과 같습니다.

  • 측정 거리: 약 20mm ~ 5m
  • 최대 측정 속도: 30Hz
  • 광원: 940nm VCSEL
  • Laser Safety: Class 1
  • 검출 방식: SPAD(Single-Photon Avalanche Diode)
  • 인터페이스: I2C
  • 단거리 저전력 모드: 약 200mm
  • Arduino / CircuitPython 지원
  • STEMMA QT / Qwiic 지원

센서 자체가 상당히 작기 때문에 로봇이나 IoT 기기처럼 공간이 제한된 프로젝트에도 적용하기 좋습니다.


2. dToF는 어떻게 거리를 측정할까?

TMF8806에서 가장 중요한 특징은 Direct Time-of-Flight, 즉 dToF 방식입니다.

일반적인 적외선 센서는 물체에서 반사되어 돌아오는 빛의 세기(Intensity)를 이용하여 거리를 추정하는 경우가 있습니다.

반면 ToF 센서는 빛을 물체에 발사하고, 그 빛이 다시 센서로 돌아오는 데 걸리는 시간을 측정합니다.

기본 원리는 간단합니다.

거리 = 빛의 속도 × 왕복 시간 ÷ 2

예를 들어 센서에서 레이저 펄스를 발사했다고 생각해 보겠습니다.

빛은 물체에 도달한 후 반사되어 다시 센서로 돌아옵니다. 센서는 이 왕복 시간을 매우 정밀하게 측정하고 이를 거리로 환산합니다.

문제는 빛의 속도가 약 30만 km/s로 엄청나게 빠르다는 것입니다.

따라서 실제 센서에서는 극도로 짧은 시간 차이를 검출해야 합니다.

TMF8806는 이를 위해 SPAD(Single-Photon Avalanche Diode) 검출기와 고감도 TDC(Time-to-Digital Converter) 구조를 사용합니다.


3. 940nm VCSEL 레이저 사용

TMF8806는 거리 측정을 위해 940nm VCSEL(Vertical-Cavity Surface-Emitting Laser)을 사용합니다.

매우 짧은 서브 나노초(sub-nanosecond) 펄스를 발사하고, 반사되어 돌아온 빛을 검출하여 거리를 계산합니다.

레이저를 사용한다고 하면 눈에 대한 안전성이 걱정될 수 있는데, TMF8806는 정상적인 사용 조건에서 Class 1 Eye Safety 등급으로 설계되어 있습니다.

또한 940nm는 적외선 영역이기 때문에 사람의 눈에는 센서가 발사하는 빛이 보이지 않습니다.


4. 기존 IR 거리 센서와 무엇이 다른가?

ToF 센서의 장점은 단순히 "레이저를 사용한다"는 데 있는 것이 아닙니다.

전통적인 반사광 세기 기반 IR 센서는 물체의 색상이나 표면 특성에 따라 반사되는 빛의 양이 달라질 수 있습니다.

예를 들어 같은 거리에 있는 물체라도 흰색 표면과 검은색 표면의 반사율은 상당히 다릅니다.

이 때문에 반사광의 세기를 거리로 환산하는 방식에서는 비선형성이나 측정 오차가 발생할 수 있습니다.

TMF8806와 같은 dToF 센서는 기본적으로 빛의 왕복 시간을 이용하기 때문에 이러한 문제를 줄일 수 있습니다.

물론 실제 ToF 센서도 물체의 반사율, 주변광, 측정 각도 등의 영향을 완전히 받지 않는 것은 아닙니다.

하지만 단순 반사광 세기 기반 센서에 비하면 훨씬 정교한 거리 측정이 가능합니다.


5. 초음파 센서와 비교하면?

Arduino를 처음 접했을 때 많이 사용하는 거리 센서 중 하나가 초음파 센서입니다.

초음파 센서는 소리를 발사하고 반사되어 돌아오는 시간을 측정한다는 점에서는 ToF 센서와 원리가 상당히 비슷합니다.

차이는 사용하는 매체입니다.

초음파 센서는 소리, TMF8806는 을 사용합니다.

초음파는 비교적 넓게 퍼지기 때문에 센서 앞에 여러 물체가 있는 환경에서는 원하는 물체만 정확하게 측정하기 어려운 경우가 있습니다.

TMF8806는 상대적으로 좁은 Field of View를 갖습니다.

  • 200mm 이하 단거리: 약 30°
  • 장거리 측정: 약 21°

따라서 센서 전방의 비교적 제한된 영역을 대상으로 거리 측정을 할 수 있습니다.

로봇이나 자동화 장비에서 특정 방향의 물체를 감지해야 할 때 유용한 특성입니다.


6. 최대 약 5m까지 측정

TMF8806의 실용적인 측정 범위는 약

20mm ~ 5m

입니다.

칩의 펌웨어에는 10m 관련 동작 모드가 언급되기도 하지만, 실제 안정적인 거리 측정 용도로는 최대 약 5m 정도를 기준으로 생각하는 것이 좋습니다.

최대 측정 속도는 약 30Hz이므로 1초에 최대 30번 정도 새로운 거리 데이터를 얻을 수 있습니다.

따라서 단순한 정적 거리 측정뿐 아니라 움직이는 물체의 거리 변화도 어느 정도 추적할 수 있습니다.


7. 200mm 단거리 저전력 모드

재미있는 기능 중 하나는 약 200mm 단거리 측정을 위한 저전력 모드입니다.

항상 5m까지 측정할 필요가 없는 애플리케이션도 많습니다.

예를 들어

  • 손 접근 감지
  • 뚜껑 개폐 감지
  • 기기 앞 사용자 감지
  • 소형 로봇 근접 센서
  • 비접촉 스위치

같은 용도에서는 수십 cm 정도만 측정하면 충분합니다.

이러한 경우 단거리 모드를 이용하여 보다 효율적으로 센서를 운용할 수 있습니다.

배터리 기반 IoT 프로젝트에서는 꽤 유용할 수 있는 기능입니다.


8. 작은 MCU에서도 사용하기 쉽다

TMF8806의 또 다른 장점은 비교적 작은 메모리 사용량입니다.

일부 ToF 센서는 부팅 과정에서 별도의 펌웨어 패치나 상당한 크기의 데이터를 센서에 전송해야 하는 경우가 있습니다.

반면 TMF8806는 5m 거리 측정을 위해 대용량 firmware patch를 다운로드할 필요가 없습니다.

덕분에 SRAM이 제한적인 MCU에서도 사용하기가 상대적으로 쉽습니다.

예를 들어

ATmega328 기반 Arduino Uno

같은 8비트 마이크로컨트롤러에서도 사용할 수 있습니다.

물론 ESP32, RP2040, SAMD 계열과 같은 현대적인 32비트 MCU에서도 사용할 수 있습니다.


9. 3.3V와 5V 시스템 모두 사용 가능

TMF8806 칩 자체는 기본적으로 3.3V 시스템을 기반으로 하지만, Adafruit breakout board에는 전압 레귤레이터와 레벨 시프팅 회로가 포함되어 있습니다.

따라서 약 3V~5V 전원 및 로직 환경에서 사용할 수 있습니다.

예를 들어

  • Arduino Uno
  • Adafruit Feather
  • ESP32
  • Raspberry Pi
  • RP2040 기반 보드

등과 연결하기 편리합니다.

특히 Arduino Uno처럼 5V 로직을 사용하는 시스템과 연결할 때 별도의 레벨 시프터를 추가하지 않아도 된다는 점은 프로토타이핑에서 큰 장점입니다.


10. STEMMA QT / Qwiic 지원

Adafruit breakout board답게 STEMMA QT / Qwiic 커넥터도 제공합니다.

보드 양쪽에 I2C 커넥터가 있어 호환 케이블을 이용하면 납땜 없이 센서를 연결할 수 있습니다.

즉,

MCU → Qwiic 케이블 → TMF8806

형태로 연결하여 빠르게 테스트할 수 있습니다.

또한 일반적인 breadboard용 핀도 제공되기 때문에 직접 점퍼선을 연결하거나 커스텀 PCB와 연결하는 것도 가능합니다.


11. Arduino와 CircuitPython 지원

통신 방식은 I2C입니다.

Adafruit에서는 TMF8806를 위한 소프트웨어 라이브러리와 예제를 제공하기 때문에 센서 레지스터를 처음부터 직접 제어할 필요가 없습니다.

대표적으로

  • Arduino C/C++
  • CircuitPython / Python 3

환경에서 사용할 수 있습니다.

따라서 센서를 구입한 뒤 예제 코드를 실행하여 실제 거리값을 확인하는 과정까지 비교적 빠르게 진행할 수 있습니다.


12. 크기와 무게

breakout board의 크기는 약

25.5 × 17.7 × 4.8mm

이며 무게는 약

1.7g

입니다.

센서 자체뿐 아니라 전압 레귤레이터, 레벨 시프터, I2C 커넥터까지 포함한 보드라는 점을 고려하면 상당히 작은 편입니다.

따라서 소형 로봇이나 휴대형 장치, IoT 센서 노드 등에 넣기에도 부담이 크지 않습니다.


13. TMF8806가 유용한 프로젝트

TMF8806의 특성을 생각해 보면 다음과 같은 프로젝트에 활용할 수 있습니다.

  • 로봇 장애물 감지
  • 물체 접근 감지
  • 비접촉 스위치
  • 자동문 및 스마트홈 센서
  • 탱크 및 용기의 수위 측정
  • 물체 위치 및 이동 감지
  • 소형 IoT 기기
  • 사용자 접근 감지
  • 간단한 제스처 인터페이스
  • 거리 변화 데이터 로깅

특히 초음파 센서보다 작은 크기와 좁은 감지 영역이 필요한 프로젝트에서 활용도가 높습니다.


마치며

TMF8806는 작은 크기의 breakout board이지만 상당히 흥미로운 기능을 갖춘 거리 센서입니다.

20mm부터 최대 약 5m까지의 거리 측정, 최대 30Hz 업데이트, 940nm VCSEL, SPAD 기반 dToF 측정, I2C 인터페이스, Arduino와 CircuitPython 지원이라는 구성이 특징입니다.

무엇보다 Adafruit breakout board에는 레귤레이터와 레벨 시프팅 회로, STEMMA QT/Qwiic 커넥터까지 포함되어 있기 때문에 ToF 기술을 직접 실험해 보고 싶은 메이커에게 접근성이 좋습니다.

기존의 초음파 센서나 단순 IR 거리 센서보다 조금 더 정밀하고 방향성이 있는 거리 측정이 필요하다면 한 번 사용해 볼 만한 센서입니다.

향후에는 많이 사용되는 STMicroelectronics의 VL53L4CD, VL53L4CX 계열 ToF 센서와 TMF8806를 비교해 보는 것도 재미있을 것 같습니다.

#TMF8806 #ToF센서 #거리센서 #Arduino #ESP32

센서 데이터를 수집하는 시스템을 만들려고 하면 보통 아두이노 IDE를 설치하고, 센서별 라이브러리를 찾고, 예제 코드를 수정한 뒤 배선과 납땜까지 해야 합니다.

여러 센서를 동시에 사용하거나 데이터를 클라우드로 전송하려면 작업은 더욱 복잡해집니다.

SparkFun DataLogger IoT(SKU: DEV-22462)는 이러한 과정을 크게 줄여주는 제로 코드(Zero-code) 데이터 로거입니다.

Qwiic 케이블로 센서를 연결하고 전원을 켜면 호환 센서를 자동으로 감지하고 설정해 데이터를 기록합니다. 복잡한 펌웨어를 직접 작성하지 않고도 환경 모니터링, 위치 추적, 장비 상태 기록과 같은 프로젝트를 빠르게 시작할 수 있습니다.

Qwiic 센서를 연결하면 자동으로 인식

SparkFun DataLogger IoT의 가장 큰 장점은 플러그 앤 플레이 방식의 자동 감지 기능입니다.

보드가 켜지면 Qwiic 버스에 연결된 센서를 검색하고, 지원되는 장치라면 자동으로 설정합니다.

Qwiic은 I²C 기반 연결 시스템으로, 커넥터 방향이 정해져 있어 배선 실수를 줄일 수 있고 납땜 없이 여러 센서를 연속으로 연결할 수 있습니다. 센서별 주소와 초기화 코드를 직접 관리해야 하는 부담도 줄어듭니다.

자동 감지를 지원하는 센서와 장치의 범위도 매우 넓습니다.

위치 및 GPS(GNSS)

u-blox의 ZED-F9P, NEO-M9N, MAX-M10S 등과 연결하면 위도, 경도, 고도, 이동 속도, 시간 정보를 기록할 수 있습니다.

이동체 추적, 야외 관측 장비, 현장 데이터 수집 시스템 등에 활용하기 좋습니다.

거리 및 움직임 감지

VL53L1X, VL53L5, TMF8820과 같은 ToF(Time-of-Flight) 센서 및 이미저를 이용하면 물체와의 거리, 움직임, 근접 여부, 공간 내 재실 상태 등을 측정할 수 있습니다.

환경 및 대기질 측정

BME280, CCS811, SGP40, SCD40, ENS160 등의 센서를 조합하면 온도, 습도, 기압, 이산화탄소, VOC 등 다양한 환경 정보를 기록할 수 있습니다.

실내 공기질 측정기, 스마트팜, 식물 생육환경 모니터, 창고 및 연구실 환경 기록 시스템을 비교적 간단하게 구성할 수 있습니다.

전문 측정 장치

이 밖에도 바이오메트릭 허브, NAU7802 기반 Qwiic 정밀 저울, 전력량계, 고정밀 ADC, RGB 인코더, RFID 및 Dynamic NFC/RFID Tag 등 다양한 전문 보드를 지원합니다.

지원 장치는 펌웨어 업데이트를 통해 추가될 수 있으므로, 실제 프로젝트를 시작하기 전에는 SparkFun이 제공하는 최신 호환 장치 목록을 확인하는 것이 좋습니다.

데이터는 microSD 카드에 CSV 또는 JSON으로 저장

측정된 데이터는 보드에 장착한 microSD 카드에 직접 저장할 수 있습니다.

최대 32GB 용량의 FAT16 또는 FAT32 형식 카드를 지원하며, 저장 형식은 CSV 또는 JSON 중에서 선택할 수 있습니다.

  • CSV: 엑셀, 구글 스프레드시트, Python, MATLAB 등으로 데이터를 분석할 때 편리합니다.
  • JSON: 웹 서비스, 서버, 데이터베이스 또는 애플리케이션과 연동할 때 유용합니다.

인터넷 연결이 불안정한 야외나 지하 공간에서는 SD 카드에 데이터를 보관하고, 네트워크에 연결할 수 있는 환경에서는 클라우드 전송 기능을 함께 사용하는 방식으로 시스템을 구성할 수 있습니다.

ESP32-WROOM-32E를 이용한 Wi-Fi 및 클라우드 연결

SparkFun DataLogger IoT에는 ESP32-WROOM-32E 모듈이 탑재되어 있습니다.

2.4GHz Wi-Fi를 통해 측정 데이터를 로컬에 저장하는 데 그치지 않고 여러 IoT 플랫폼과 서버로 전송할 수 있습니다.

지원하는 주요 연결 방식과 서비스는 다음과 같습니다.

  • MQTT Client 및 MQTT Secure Client
  • AWS IoT
  • Microsoft Azure IoT
  • ThingSpeak MQTT
  • Arduino Cloud
  • MachineChat
  • HTTP IoT

MQTT와 HTTP를 지원하므로 상용 IoT 플랫폼뿐 아니라 직접 구축한 서버나 대시보드와 연결하는 것도 가능합니다.

센서 데이터를 원격으로 확인하거나 여러 장소의 측정값을 한곳에 모아 관리하려는 프로젝트에 적합합니다.

초당 26회부터 하루 1회까지 기록 주기 설정

측정 주기는 프로젝트의 목적에 맞게 폭넓게 설정할 수 있습니다.

빠르게 변하는 현상을 관찰할 때는 초당 최대 약 26회까지 기록할 수 있으며, 장기간의 환경 변화를 확인할 때는 24시간에 한 번만 측정하도록 설정할 수도 있습니다.

예를 들어 다음과 같이 사용할 수 있습니다.

  • 움직임이나 장비 상태 변화: 짧은 간격으로 빠르게 기록
  • 실내 온습도와 공기질: 수분 또는 수십 분 간격으로 기록
  • 토양 수분과 식물 생육환경: 수십 분 또는 수시간 간격으로 기록
  • 야외 장기 관측: 하루 수회 또는 하루 1회 기록

기록 주기를 늘리면 데이터의 시간 해상도는 낮아지지만 전력 소비와 저장 공간 사용량을 줄일 수 있습니다.

따라서 실제 프로젝트에서는 필요한 변화 속도와 배터리 사용 시간을 함께 고려해야 합니다.

약 200µA의 초저전력 슬립 모드

슬립 모드가 활성화되었을 때 소비 전류는 약 200µA 수준입니다.

측정 사이에 보드를 슬립 상태로 두면 배터리 기반의 장기 모니터링 장치를 구성하는 데 유리합니다.

다만 실제 배터리 지속 시간은 연결한 센서의 수와 소비전력, Wi-Fi 접속 시간, 데이터 전송 빈도, 측정 주기, 배터리 용량 등에 따라 크게 달라질 수 있습니다.

특히 Wi-Fi 연결과 클라우드 전송은 순간적으로 비교적 큰 전류를 사용하므로, 장기 운용이 목적이라면 전송 횟수를 줄이고 데이터를 일정량 모아 한꺼번에 보내는 방식을 고려할 수 있습니다.

LiPo 충전 회로와 배터리 잔량 측정 기능 내장

보드에는 싱글셀 LiPo 배터리를 위한 MCP73831 충전 회로가 내장되어 있으며, 충전 전류는 약 500mA로 설정되어 있습니다.

또한 MAX17048 LiPo 연료 게이지를 통해 배터리 잔량을 모니터링할 수 있습니다.

전원은 다음과 같은 방식으로 공급할 수 있습니다.

  • USB Type-C
  • VIN 포트
  • LiPo 배터리 커넥터

USB-C로 개발과 설정을 진행한 뒤, 실제 설치 환경에서는 LiPo 배터리로 운용하는 구성이 가능합니다.

배터리 잔량까지 데이터로 관리할 수 있어 원격 설치 장비의 유지보수 시점을 판단하는 데도 도움이 됩니다.

시리얼 메뉴로 간단하게 설정

별도의 그래픽 프로그램을 설치하지 않아도 시리얼 터미널에서 주요 기능을 설정할 수 있습니다.

  1. 보드와 PC를 USB-C 케이블로 연결합니다.
  2. 시리얼 터미널을 열고 통신 속도를 115200 baud로 설정합니다.
  3. 키보드의 아무 키나 누릅니다.
  4. 화면에 표시되는 텍스트 기반 메뉴에서 센서, 기록 주기, 파일 형식, Wi-Fi 및 클라우드 연결 등을 설정합니다.

메뉴 방식이라 각종 설정값을 코드 안에서 찾아 수정하고 다시 컴파일하는 과정이 필요 없습니다.

코딩에 익숙하지 않은 사용자도 안내에 따라 데이터 로깅 시스템을 구성할 수 있고, 개발자에게는 초기 프로토타입 제작 시간을 줄여준다는 장점이 있습니다.

OTA와 microSD를 이용한 펌웨어 업데이트

새로운 센서 지원이나 기능이 추가되었을 때는 Wi-Fi를 이용한 OTA(Over-the-Air) 업데이트를 실행할 수 있습니다.

네트워크 사용이 어려운 경우에는 최신 펌웨어 파일을 microSD 카드에 저장한 뒤 보드를 부팅하는 방식으로도 업데이트할 수 있습니다.

직접 소스 코드를 내려받아 개발 환경을 구성하고 펌웨어를 빌드하지 않아도 되므로, 여러 대의 데이터 로거를 운용하거나 현장 장비를 관리할 때 특히 편리합니다.

어떤 프로젝트에 활용할 수 있을까?

SparkFun DataLogger IoT는 센서 조합에 따라 다양한 시스템의 중심 장치로 활용할 수 있습니다.

  • 온도·습도·CO₂·VOC를 기록하는 실내 공기질 모니터
  • 토양 수분·온습도·조도를 측정하는 식물 생육환경 기록 장치
  • GNSS와 환경 센서를 결합한 이동형 야외 관측 장비
  • ToF 센서를 이용한 거리·재실·움직임 모니터
  • 로드셀과 NAU7802를 이용한 무게 변화 기록 시스템
  • 전압·전류·전력 사용량을 기록하는 에너지 모니터
  • RFID/NFC와 센서를 결합한 시료 및 물품 관리 시스템

특히 센서 조합을 먼저 시험해 보고 싶은 연구자, 메이커, 교육자에게 유용합니다.

제로 코드 방식으로 측정 가능성을 빠르게 확인한 뒤, 필요에 따라 전용 하드웨어나 맞춤형 펌웨어로 발전시키는 프로토타이핑 도구로 사용할 수 있습니다.

마무리

SparkFun DataLogger IoT는 센서 자동 감지, SD 카드 기록, Wi-Fi 클라우드 전송, 저전력 동작, 배터리 관리 기능을 한 보드에 통합한 제품입니다.

Qwiic 센서를 연결하고 메뉴에서 필요한 항목을 설정하는 것만으로 데이터 수집을 시작할 수 있다는 점이 가장 큰 특징입니다.

아두이노 환경 설정과 라이브러리 관리, 센서 초기화 코드 작성에 시간을 들이기보다 실제 측정과 데이터 분석에 집중하고 싶다면 매력적인 선택지가 될 수 있습니다.

여러 종류의 센서를 빠르게 조합해 아이디어를 검증하려는 경우에도 활용 가치가 높습니다.

여러분이라면 이 데이터 로거에 어떤 센서를 연결해 보고 싶으신가요?

온습도와 CO₂를 이용한 실내 공기질 모니터, 토양 수분과 조도를 이용한 식물 환경 기록 장치, 또는 GNSS를 결합한 야외 관측 시스템도 흥미로운 프로젝트가 될 수 있습니다.

#SparkFun #DataLoggerIoT #데이터로거 #제로코드 #Qwiic #ESP32 #ESP32WROOM32E #IoT #사물인터넷 #센서 #센서데이터 #데이터수집 #환경모니터링 #스마트팜 #메이커 #아두이노 #MQTT #AWSIoT #AzureIoT #ThingSpeak #microSD #OTA #임베디드시스템 #전자공작

Espressif가 ESP32-C61-MINI-1과 ESP32-C61-MINI-1U 모듈의 판매를 시작했습니다.

ESP32-C61은 2.4GHz Wi-Fi 6(802.11ax)와 Bluetooth LE 5.3을 지원하는 저가형 RISC-V MCU입니다.

특히 새롭게 등장한 MINI 모듈은 크기가 작으면서도 Wi-Fi 6, BLE, USB Serial/JTAG, ADC 등 IoT 기기에 필요한 주요 기능을 갖추고 있습니다.

기사 작성 시점 기준으로 5개 묶음이 약 10.7달러에 판매되어, 모듈 하나당 약 2달러 수준이라는 점도 눈에 띕니다.


1. ESP32-C61이란?

ESP32-C61은 Espressif가 저가형 IoT 시장을 겨냥해 개발한 MCU입니다.

기본 구조는 다음과 같습니다.

  • 32비트 RISC-V 싱글코어
  • 최대 클럭 160MHz
  • SRAM 320KB
  • ROM 256KB
  • 최대 8MB Quad SPI Flash
  • 최대 8MB PSRAM
  • 2.4GHz Wi-Fi 6
  • Bluetooth LE 5.3
  • 최대 23 GPIO

기존 ESP32-C6와 비슷한 위치에 있지만 중요한 차이가 있습니다.

ESP32-C6가 Wi-Fi + BLE뿐 아니라 IEEE 802.15.4도 지원하는 반면, ESP32-C61에는 802.15.4 무선 기능이 없습니다. 따라서 Thread나 Zigbee가 필요하지 않고 Wi-Fi와 BLE만 사용하는 IoT 제품이라면 C61이 훨씬 흥미로운 선택지가 됩니다.


2. ESP32-C61-MINI-1과 MINI-1U

ESP32-C61 MINI 시리즈는 두 가지 안테나 버전으로 제공됩니다.

ESP32-C61-MINI-1

PCB 안테나가 모듈에 내장된 일반적인 형태입니다.

크기는 약

13.2 × 16.6 × 2.4mm

입니다.

별도의 외부 안테나가 필요하지 않으므로 일반적인 센서 노드, 스마트홈 기기, 소형 IoT 장치 등에 사용하기 편리합니다.

ESP32-C61-MINI-1U

기본 기능은 MINI-1과 거의 같지만 PCB 안테나 대신 외부 안테나 커넥터를 사용합니다.

공식 데이터시트 기준 모듈 본체 크기는 약

13.2 × 12.5 × 2.4mm

입니다.

따라서 금속 케이스 내부에 모듈을 설치하거나, 안테나 위치를 PCB와 분리해야 하거나, 외장 안테나를 사용해 RF 성능을 확보해야 하는 제품에 적합합니다.


3. CPU와 메모리

ESP32-C61의 CPU는

32-bit RISC-V Single Core / 최대 160MHz

입니다.

ESP32-S3처럼 고성능 듀얼코어 MCU는 아닙니다.

대신 센서 측정, Wi-Fi 통신, BLE 연결, MQTT, HTTP API, 스마트홈 장치 같은 일반적인 IoT 애플리케이션에는 충분한 수준입니다.

메모리는 다음과 같습니다.

항목
사양
CPU
32-bit RISC-V
Core
Single Core
최대 클럭
160MHz
SRAM
320KB
ROM
256KB
Flash
최대 8MB
PSRAM
최대 8MB

특히 최대 8MB PSRAM을 구성할 수 있다는 점은 작은 IoT 모듈치고 상당히 유용합니다.


4. 핵심은 Wi-Fi 6

ESP32-C61의 가장 중요한 특징은 저렴한 가격보다는 Wi-Fi 6 지원이라고 볼 수 있습니다.

2.4GHz 대역에서 IEEE 802.11ax를 지원하며 Wi-Fi 6 모드에서는 20MHz 채널을 사용합니다.

주요 기능에는 다음이 포함됩니다.

  • MCS0 ~ MCS9
  • Uplink OFDMA
  • Downlink OFDMA
  • Downlink MU-MIMO
  • Beamformee
  • CQI
  • DCM
  • Spatial Reuse
  • Target Wake Time(TWT)

특히 IoT 장치에서는 OFDMA와 TWT에 주목할 만합니다.


5. TWT가 IoT에서 중요한 이유

TWT(Target Wake Time)는 Wi-Fi 6에서 IoT 개발자에게 상당히 흥미로운 기능입니다.

기존 Wi-Fi IoT 장치는 AP와의 연결을 유지하기 위해 주기적으로 깨어나 통신해야 합니다.

TWT를 사용하면 AP와 장치가 "언제 깨어나서 통신할 것인가"를 미리 조정할 수 있습니다.

따라서 배터리 기반 센서 노드처럼 대부분의 시간을 절전 상태에서 보내고 필요할 때만 통신하는 장치에서 전력 소비를 줄이는 데 도움이 될 수 있습니다.

물론 실제 배터리 수명은 AP의 TWT 지원 여부, 펌웨어 구현, Wi-Fi 연결 시간, RF 환경, 센서 소비전력 등에 따라 크게 달라집니다.

따라서 단순히 "Wi-Fi 6이므로 배터리 수명이 길다"고 판단하기보다는 실제 제품 환경에서 측정해야 합니다.


6. 기존 Wi-Fi 공유기에서도 사용할 수 있을까?

가능합니다.

ESP32-C61은 Wi-Fi 6만 지원하는 것이 아니라 기존 IEEE 802.11b/g/n과도 호환됩니다.

Wi-Fi 4(802.11n)에서는 20MHz와 40MHz 대역폭을 지원하며 최대 데이터 속도는 150Mbps입니다.

따라서 반드시 Wi-Fi 6 공유기를 사용해야 하는 것은 아닙니다.

기존 2.4GHz Wi-Fi 네트워크에서도 사용할 수 있다는 의미입니다.


7. Bluetooth LE 5.3

ESP32-C61은 Bluetooth LE 5.3 인증을 지원합니다.

주요 기능은 다음과 같습니다.

  • BLE Mesh
  • 최대 20dBm High Power Mode
  • 125kbps
  • 500kbps
  • 1Mbps
  • 2Mbps
  • Advertising Extensions
  • Multiple Advertisement Sets
  • Channel Selection Algorithm #2
  • LE Power Control

Wi-Fi와 Bluetooth는 하나의 안테나를 공유하기 때문에 내부적으로 두 무선 시스템을 위한 coexistence 기능도 제공합니다.

이 구성은 특히 IoT 제품에 유용합니다.

예를 들어 초기 설정에서는 스마트폰과 BLE로 연결하고,

스마트폰 → BLE → ESP32-C61 → Wi-Fi 설정 → Cloud

방식으로 Wi-Fi SSID와 비밀번호를 전달한 뒤 이후에는 Wi-Fi를 통해 클라우드와 통신하는 구조를 만들 수 있습니다.


8. 사용할 수 있는 주변장치

작은 MINI 모듈이지만 MCU 주변장치는 상당히 다양합니다.

대표적으로 다음 기능을 사용할 수 있습니다.

  • GPIO
  • SPI
  • UART
  • I2C
  • I2S
  • LED PWM
  • USB Serial/JTAG
  • GDMA
  • JTAG Debug
  • ADC
  • 내부 Temperature Sensor
  • Analog Voltage Comparator
  • General-purpose Timer
  • System Timer
  • Watchdog Timer

센서 기반 IoT 장치를 만들기에는 충분한 구성입니다.


9. USB Serial/JTAG 지원

개발자 입장에서 반가운 부분 중 하나가 USB Serial/JTAG Controller입니다.

USB를 이용해 디버깅과 시리얼 통신을 구성할 수 있기 때문에, PCB 설계에 따라 별도의 USB-to-UART 칩 없이 개발 인터페이스를 구성할 수 있습니다.

ESP32 보드를 직접 설계하는 경우 CH340, CP2102 같은 별도 USB-UART IC의 필요성을 줄일 수 있어 PCB 공간과 BOM 비용을 절약할 가능성이 있습니다.

다만 실제 제품 PCB에서는 USB 회로, ESD 보호, 부트/다운로드 방식 등을 데이터시트와 Hardware Design Guideline에 맞춰 설계하는 것이 좋습니다.


10. 전원 조건

모듈의 권장 전원 범위는

3.0 ~ 3.6V

입니다.

따라서 일반적으로 3.3V 전원 시스템을 사용하면 됩니다.

동작 온도 범위는

-40°C ~ +85°C

입니다.

배터리 기반 제품을 설계한다면 단순히 MCU의 평균 소비전력만 볼 것이 아니라 Wi-Fi 송신 시 순간 전류를 충분히 공급할 수 있도록 전원 IC와 디커플링 커패시터를 설계해야 합니다.


11. 어떤 모듈을 선택해야 할까?

일반적인 IoT 제품이라면 우선 ESP32-C61-MINI-1을 고려할 수 있습니다.

PCB 안테나가 이미 내장되어 있기 때문에 외부 안테나와 커넥터가 필요하지 않습니다.

반면 다음과 같은 상황에서는 MINI-1U가 유리합니다.

  • 금속 케이스 사용
  • 외부 안테나 필요
  • PCB 위치 때문에 안테나 영역 확보가 어려움
  • 안테나를 제품 외부로 분리해야 함
  • 특정 방향으로 RF 성능을 확보해야 함

단, MINI-1의 PCB 안테나를 사용할 경우에는 모듈 주변의 copper keep-out과 PCB 배치 조건을 반드시 공식 권장 레이아웃에 맞춰야 합니다.


12. 개발 환경

현재 가장 확실한 개발 방법은 ESP-IDF입니다.

CNX Software에 따르면 ESP-IDF 6.0부터 ESP32-C61 지원이 포함되었습니다.

따라서 새로운 프로젝트를 시작한다면 ESP-IDF 기반 개발이 가장 자연스럽습니다.

Arduino도 지원되지만 현재는 일반 ESP32처럼 Arduino IDE에서 보드를 선택해 바로 사용하는 수준과는 조금 다릅니다.

기사에서 소개한 현재 방식은 Arduino-ESP32를 ESP-IDF Component로 사용

하거나 필요한 static library를 다시 빌드하는 방법입니다.

따라서 Arduino 중심의 초보 개발자라면 생태계가 조금 더 성숙할 때까지 기다리는 것도 방법입니다.


13. 개발을 시작하려면

처음부터 MINI 모듈로 PCB를 만드는 것보다는 개발보드로 시작하는 것이 편합니다.

현재 사용할 수 있는 보드 중 하나가 ESP32-C61-DevKitC-1-N8R2입니다.

기사에서는 해당 개발보드가 약 9달러 수준에 판매되고 있다고 소개합니다. CircuitPython 역시 해당 보드를 위한 alpha 버전이 확인되고 있습니다.

따라서 개발 순서는 대략

DevKit 구입 → ESP-IDF 테스트 → Wi-Fi/BLE 테스트 → 소비전력 측정 → Custom PCB 설계 순서가 안전합니다.


14. ESP32-C6와 무엇이 다른가?

ESP32-C61을 이해하는 가장 쉬운 방법은 ESP32-C6의 저가형 변형이라고 보는 것입니다.

ESP32-C6는 Wi-Fi 6와 BLE 외에도 IEEE 802.15.4를 지원하기 때문에 Zigbee와 Thread 기반 제품을 만들 수 있습니다.

반면 ESP32-C61은 802.15.4를 제거했습니다.

또한 SRAM도 C6의 512KB보다 작은 320KB입니다.

따라서 선택 기준은 비교적 명확합니다.

Matter over Thread / Zigbee 필요

→ ESP32-C6

Wi-Fi + BLE IoT 제품

→ ESP32-C61을 적극적으로 검토

즉, 사용하지 않는 802.15.4 기능을 빼고 비용을 낮춘 것이 C61의 핵심 포지션이라고 볼 수 있습니다.


15. 어떤 프로젝트에 적합할까?

ESP32-C61-MINI 시리즈는 특히 다음과 같은 장치에 잘 맞습니다.

  • 온습도 센서
  • 식물 모니터링 장치
  • 스마트홈 센서
  • Wi-Fi 데이터 로거
  • 환경 모니터링 장치
  • 스마트 플러그
  • BLE Provisioning이 필요한 Wi-Fi 제품
  • 배터리 기반 무선 센서
  • MQTT 센서 노드
  • 소형 IoT 제품

특히

Sensor → ESP32-C61 → Wi-Fi → Cloud

구조의 제품이라면 상당히 매력적인 선택입니다.

BLE를 함께 사용할 수 있으므로

BLE로 초기 설정 → Wi-Fi로 클라우드 연결

이라는 상용 IoT 제품에서 흔히 사용하는 구조도 구현할 수 있습니다.


16. ESP32-C61의 진짜 의미

ESP32-C61-MINI 시리즈의 가장 흥미로운 부분은 단순히 새로운 ESP32가 하나 더 등장했다는 것이 아닙니다.

저가 IoT MCU의 기본 무선 규격이 Wi-Fi 6로 이동하고 있다는 것에 더 큰 의미가 있습니다.

160MHz RISC-V CPU, Wi-Fi 6, BLE 5.3, USB Serial/JTAG, 최대 8MB Flash와 8MB PSRAM을 지원하는 모듈이 약 2달러 수준까지 내려온다면 저가형 IoT 제품에서도 굳이 오래된 Wi-Fi MCU를 사용할 이유가 점차 줄어들 수 있습니다.

다만 현재는 ESP-IDF 쪽이 가장 안정적인 개발 경로이고 Arduino 지원은 아직 일반적인 ESP32만큼 간단하지 않습니다.

따라서 지금 당장 기존 ESP32 제품을 모두 C61로 변경하기보다는 새로운 Wi-Fi/BLE IoT 제품을 설계할 때 차세대 저가형 후보로 평가해 볼 만한 모듈이라고 보는 것이 적절합니다.

특히 앞으로 Arduino 지원, 인증 현황, 실제 저전력 성능, 모듈 공급가격이 안정화된다면 ESP32-C61은 ESP32-C3/C6 계열과 함께 상당히 많이 사용되는 IoT용 MCU가 될 가능성이 있습니다.

___________________________________________________________________________

이 글이 도움이 되셨다면 제 홈페이지(댓글에 링크)를 방문해 보세요.

홈페이지에서는 다음과 같은 다양한 콘텐츠를 만나실 수 있습니다.

·        기술 블로그와 학습 자료

·        pcb 제작 강의와 최신 소식

·        ESP32 IoT 하드웨어 프로젝트

·        KiCad PCB 설계 템플릿 (Github, Gumroad)

·        펌웨어 개발

배우고, 만들고, 함께 성장하는 메이커들을 위한 공간으로 계속 발전시켜 나가겠습니다.



 

#Espressif #ESP32C6 #ESP32C61 #개발보드 #DIY #MCU

아두이노나 ESP32 같은 마이크로컨트롤러를 이용해 프로젝트를 만들다 보면 스마트폰과 데이터를 간단하게 주고받고 싶을 때가 있습니다.

블루투스나 WiFi를 사용할 수도 있지만, 단순히 스마트폰을 장치에 가까이 가져가는 것만으로 데이터를 읽거나 설정을 전달하고 싶다면 NFC(Near Field Communication)가 상당히 편리한 방법입니다.

특히 이번에 소개할 SparkFun Qwiic Dynamic NFC/RFID Tag (SEN-21274)는 일반적인 NFC 태그보다 훨씬 다양한 기능을 제공합니다.

단순히 URL이나 텍스트를 저장해 놓는 수동형 NFC 태그가 아니라, 마이크로컨트롤러와 I2C로 연결해 데이터를 변경할 수 있고 스마트폰과 무선으로 데이터를 주고받을 수도 있는 Dynamic NFC Tag입니다.

더 흥미로운 점은 메인 시스템의 전원이 꺼져 있어도 스마트폰이나 NFC 리더에서 태그의 데이터를 읽고 쓸 수 있다는 것입니다.


SparkFun Qwiic Dynamic NFC/RFID Tag란?

SparkFun Qwiic Dynamic NFC/RFID Tag는 STMicroelectronics의 ST25DV64KC 칩을 기반으로 제작된 NFC/RFID 개발 보드입니다.

ST25DV64KC에는 64-kbit, 즉 8kByte EEPROM 메모리가 내장되어 있습니다.

이 메모리는 두 가지 방법으로 접근할 수 있습니다.

하나는 아두이노나 ESP32 같은 마이크로컨트롤러에서 사용하는 I2C 인터페이스이고, 다른 하나는 스마트폰이나 RFID 리더에서 사용하는 NFC/RFID 무선 인터페이스입니다.

즉,

MCU ↔ I2C ↔ NFC Tag ↔ NFC ↔ 스마트폰

과 같은 구조를 만들 수 있습니다.

이 때문에 단순 NFC 태그뿐 아니라 마이크로컨트롤러와 스마트폰 사이에서 데이터를 전달하는 일종의 무선 데이터 브리지로 활용할 수 있습니다.


전원이 없어도 데이터를 읽고 쓸 수 있다

이 제품의 가장 흥미로운 특징 중 하나입니다.

일반적으로 ESP32나 아두이노 같은 전자 장치는 전원이 꺼지면 외부에서 데이터를 읽기 어렵습니다.

하지만 NFC 태그는 스마트폰이나 NFC 리더에서 발생하는 RF 전자기장을 이용해 동작할 수 있습니다.

따라서 SparkFun Dynamic NFC Tag가 연결된 메인 장치의 전원이 완전히 꺼져 있더라도 스마트폰을 태그에 가까이 가져가면 EEPROM에 저장된 데이터를 읽거나 쓸 수 있습니다.

예를 들어 배터리가 방전된 장치에서도 다음과 같은 정보를 확인하도록 만들 수 있습니다.

제품 일련번호, 장치 설정 정보, 마지막 측정값, 설치 정보, 사용 설명서 URL, 유지보수 기록 등을 NFC로 확인할 수 있습니다.

IoT 장치를 만든다면 상당히 재미있는 기능입니다.


주요 하드웨어 구성

SparkFun Qwiic Dynamic NFC/RFID Tag에는 개발에 필요한 여러 인터페이스가 기본적으로 준비되어 있습니다.

Qwiic 커넥터

보드에는 SparkFun의 Qwiic 커넥터 두 개가 장착되어 있습니다.

Qwiic 시스템은 I2C 기반이므로 SDA, SCL, 전원, GND를 케이블 하나로 연결할 수 있습니다.

따라서 Qwiic을 지원하는 아두이노, ESP32 개발보드 또는 다른 센서 모듈과 연결할 경우 별도의 납땜 없이 바로 개발을 시작할 수 있습니다.

다만 Qwiic 시스템은 기본적으로 3.3V 로직을 사용하므로 Qwiic을 통해 연결할 때에는 3.3V 환경을 사용하는 것이 좋습니다.


0.1인치 PTH 헤더

보드에는 일반적인 0.1인치 간격의 PTH(Pin Through Hole)도 제공됩니다.

따라서 브레드보드나 점퍼 케이블을 이용해 직접 연결할 수도 있습니다.

여기에서는 단순히 전원과 I2C뿐 아니라 다음과 같은 기능도 사용할 수 있습니다.

VEH : Energy Harvesting 출력

GPO : General Purpose Output

이 핀들을 활용하면 단순 NFC 메모리 이상의 응용이 가능합니다.


PCB 안테나 내장

NFC 통신을 위한 안테나가 PCB 자체에 포함되어 있습니다.

따라서 별도의 외부 안테나를 연결할 필요가 없습니다.

일반적인 스마트폰 NFC 리더를 사용하면 대략 수 센티미터 거리에서 태그를 인식할 수 있습니다.

NFC 특성상 장거리 통신을 위한 기술은 아니지만 장치에 스마트폰을 가져다 대어 데이터를 읽거나 설정하는 용도로는 매우 편리합니다.


주요 기술 사양

SparkFun Qwiic Dynamic NFC/RFID Tag의 핵심 사양은 다음과 같습니다.

  • 사용 IC : STMicroelectronics ST25DV64KC
  • 메모리 : 64-kbit EEPROM
  • 실제 용량 : 8kByte
  • 공급 전압 : 약 1.8V ~ 5.5V
  • Qwiic 사용 시 : 3.3V
  • 통신 인터페이스 : I2C + NFC/RFID
  • NFC 규격 : ISO/IEC 15693
  • NFC Forum : Type 5 Tag
  • Data Mailbox : 256Byte
  • EEPROM 데이터 보존 기간 : 최대 약 40년
  • 쓰기 내구성 : 환경에 따라 약 40만 ~ 100만 회

I2C를 이용하면 EEPROM을 바이트 단위로 접근할 수 있으며 RF 인터페이스에서는 기본적으로 4바이트 블록 단위로 접근합니다.

쓰기 시간은 일반적인 EEPROM과 비슷하게 수 ms 정도가 필요합니다.


I2C 주소

ST25DV64KC는 기능에 따라 여러 I2C 주소를 사용합니다.

User Memory : 0x53

System Memory : 0x57

RF Switch Off : 0x51

RF Switch On : 0x55

일반적으로 아두이노에서 사용자 데이터를 읽고 쓰는 경우에는 User Memory 영역을 가장 많이 사용하게 됩니다.


스마트폰으로 URL을 바로 열 수 있는 NDEF

이 보드가 특히 재미있는 이유 중 하나는 NDEF(NFC Data Exchange Format)를 지원한다는 것입니다.

NDEF는 스마트폰 NFC에서 널리 사용하는 표준 데이터 형식입니다.

이를 이용하면 스마트폰에 별도의 전용 애플리케이션을 설치하지 않아도 NFC 태그를 인식했을 때 특정 동작을 수행하게 만들 수 있습니다.

대표적으로 다음과 같은 정보를 저장할 수 있습니다.

웹사이트 URL

태그에 웹사이트 주소를 저장해 놓으면 사용자가 스마트폰을 가져다 대는 것만으로 해당 웹페이지를 열 수 있습니다.

제품 설명 페이지, 매뉴얼, 설정 페이지, 회사 홈페이지, 이벤트 페이지 등으로 연결하는 데 사용할 수 있습니다.

예를 들어 제품 외부에 NFC 로고를 표시해 놓고 사용자가 스마트폰을 가져다 대면 온라인 사용 설명서가 바로 열리도록 만들 수 있습니다.


WiFi 정보를 NFC로 전달

WiFi 네트워크 정보를 NDEF 형식으로 저장하는 것도 가능합니다.

SSID와 비밀번호 등의 정보를 저장해 놓으면 NFC를 지원하는 스마트폰에서 네트워크 정보를 쉽게 전달할 수 있습니다.

집이나 사무실 방문객에게 WiFi 정보를 제공하거나 IoT 장치 설치 과정에서 네트워크 설정을 전달하는 용도로 활용할 수 있습니다.

복잡한 WiFi 비밀번호를 직접 입력할 필요가 없다는 것이 장점입니다.


일반 텍스트 전달

간단한 텍스트 정보도 저장할 수 있습니다.

예를 들면 다음과 같습니다.

제품 이름

장치 ID

연락처

간단한 사용 설명

장비 상태

설치 위치

점검 기록

이런 정보를 NFC로 제공하면 QR 코드와는 또 다른 형태의 장치 인터페이스를 만들 수 있습니다.


Dynamic NFC Tag가 특별한 이유: MCU가 내용을 변경할 수 있다

일반적인 NFC 스티커는 한 번 정보를 저장한 뒤 동일한 데이터를 계속 제공하는 경우가 많습니다.

하지만 Dynamic NFC Tag는 이름 그대로 내용을 동적으로 변경할 수 있습니다.

마이크로컨트롤러가 I2C를 통해 EEPROM 내용을 변경하면 스마트폰에서 읽는 NFC 정보도 달라질 수 있습니다.

예를 들어 센서 장치를 만들었다고 생각해 보겠습니다.

ESP32가 센서를 측정한 뒤 마지막 측정값을 NFC 메모리에 기록합니다.

그 후 장치가 Deep Sleep 상태로 들어가거나 배터리가 방전되더라도 사용자는 스마트폰을 태그에 가져다 대어 마지막 측정 정보를 확인할 수 있습니다.

이런 구조는 초저전력 IoT 장치를 만들 때 상당히 흥미로운 활용 방법이 될 수 있습니다.


Data Mailbox 기능

ST25DV64KC에는 256Byte Data Mailbox 기능이 있습니다.

Data Mailbox는 MCU와 NFC 리더 사이에서 데이터를 빠르게 주고받을 수 있도록 만들어진 버퍼입니다.

즉,

스마트폰 → NFC → Mailbox → MCU

또는

MCU → Mailbox → NFC → 스마트폰

형태의 데이터 전송이 가능합니다.

EEPROM에 데이터를 계속 기록하는 방식보다 빠르게 정보를 교환할 수 있기 때문에 스마트폰을 장치의 간단한 설정 인터페이스처럼 사용하는 것도 가능합니다.

예를 들어 스마트폰에서 설정값을 전달하고 MCU가 해당 값을 읽어 장치 동작을 변경하는 시스템을 만들 수 있습니다.


RF Energy Harvesting 기능

ST25DV64KC는 NFC의 RF 필드에서 일부 에너지를 얻어 사용할 수 있는 Energy Harvesting 기능도 지원합니다.

스마트폰이나 NFC 리더를 태그 가까이에 가져가면 RF 전자기장이 형성됩니다.

이 에너지의 일부를 수확하여 VEH 핀을 통해 외부 회로에 공급할 수 있습니다.

출력 가능한 전력은 매우 작아 일반적인 ESP32 같은 장치를 그대로 구동하기에는 부족하지만, 초저전력 회로나 간단한 센서 회로에는 활용 가능성이 있습니다.

즉, 배터리를 사용하지 않는 초저전력 센서나 NFC 기반 인터랙티브 장치를 연구할 때 흥미로운 기능입니다.


GPO 인터럽트 기능

보드의 GPO(General Purpose Output) 핀을 이용하면 NFC 관련 이벤트를 MCU에 전달할 수 있습니다.

예를 들어 스마트폰이 태그 근처에 접근했을 때 이를 감지하도록 만들 수 있습니다.

RF Field 감지

RF 데이터 접근

I2C 쓰기

Mailbox 이벤트

등의 상황에서 마이크로컨트롤러에 인터럽트를 전달할 수 있습니다.

이를 이용하면 평소에는 MCU를 저전력 상태로 유지하다가 스마트폰이 NFC 태그에 접근했을 때 특정 기능을 수행하도록 만드는 것도 가능합니다.


데이터 보안 기능

ST25DV64KC에는 비교적 강력한 메모리 보호 기능도 포함되어 있습니다.

사용자 메모리를 최대 4개의 영역으로 나누고 각 영역에 서로 다른 접근 정책을 설정할 수 있습니다.

RF 접근에는 여러 개의 64비트 패스워드를 사용할 수 있으며 I2C 접근에도 별도의 비밀번호를 설정할 수 있습니다.

시스템 설정 영역 역시 RF와 I2C 접근에 대한 쓰기 보호가 가능합니다.

따라서 단순 공개 정보뿐 아니라 장치 설정값이나 관리용 데이터처럼 제한된 정보도 영역을 나누어 관리할 수 있습니다.


어디에 활용할 수 있을까?

Dynamic NFC Tag의 장점은 단순 NFC 태그와 MCU 연결 기능을 동시에 사용할 수 있다는 점입니다.

특히 다음과 같은 프로젝트에 활용하기 좋습니다.

1. 스마트 제품 설명서

제품에 NFC를 내장하고 스마트폰을 가져다 대면 사용 설명서나 설정 페이지가 바로 열리도록 만들 수 있습니다.

QR 코드와 비슷하지만 카메라를 실행할 필요 없이 스마트폰을 가까이 가져가는 것만으로 동작합니다.


2. WiFi 접속 정보 제공

카페, 사무실, 전시장 또는 IoT 장치 설치 과정에서 WiFi 정보를 NFC로 제공할 수 있습니다.

긴 WiFi 비밀번호를 직접 입력하는 불편을 줄일 수 있습니다.


3. 스마트 재고 관리

제품이나 장비 내부에 NFC Tag를 설치하면 전원이 없는 상태에서도 제품 정보를 확인할 수 있습니다.

제품 번호, 생산 날짜, 유지보수 기록, 설치 정보 등을 EEPROM에 저장할 수 있습니다.

장비가 창고에 보관되어 전원이 없는 상태에서도 RFID 리더나 스마트폰으로 정보를 읽을 수 있다는 장점이 있습니다.


4. IoT 장치 설정

스마트폰을 장치에 가까이 가져가 설정값을 전달하는 방식으로 사용할 수 있습니다.

예를 들어 장치 ID, WiFi 설정, 센서 설정값, 측정 주기 등을 NFC를 통해 전달할 수 있습니다.

별도의 디스플레이나 버튼을 장치에 설치하지 않아도 되기 때문에 IoT 제품의 사용자 인터페이스를 단순화할 수 있습니다.


5. 초저전력 데이터 로거

센서 데이터를 주기적으로 EEPROM에 기록한 뒤 장치가 Deep Sleep에 들어가는 구조를 만들 수 있습니다.

사용자는 필요할 때 스마트폰으로 데이터를 읽을 수 있습니다.

장치가 꺼져 있거나 배터리가 부족한 상태에서도 저장된 데이터를 읽을 수 있다는 것이 큰 장점입니다.


6. 인터랙티브 전시 및 미디어 아트

관람객이 스마트폰을 작품 가까이에 가져가면 웹페이지, 영상, 설명 또는 특정 콘텐츠가 나타나는 인터랙티브 전시물을 만들 수 있습니다.

GPO나 Data Mailbox 기능까지 이용하면 단순 정보 제공을 넘어 스마트폰과 작품이 서로 데이터를 주고받는 구조도 구현할 수 있습니다.


Arduino 라이브러리

SparkFun에서는 ST25DV64KC를 쉽게 사용할 수 있도록 공식 Arduino 라이브러리를 제공합니다.

라이브러리 이름은

SparkFun_ST25DV64KC_Arduino_Library

입니다.

이 라이브러리를 이용하면 복잡한 ST25DV64KC 레지스터를 직접 제어하지 않아도 주요 기능을 사용할 수 있습니다.

특히 다음과 같은 NDEF 데이터 생성 기능이 제공되기 때문에 NFC 프로젝트를 처음 시작할 때 유용합니다.

URI / 웹사이트 URL

WiFi 자격증명

Text Record

EEPROM 읽기/쓰기

메모리 영역 설정

패스워드 설정

등을 비교적 간단하게 구현할 수 있습니다.


스마트폰 테스트용 앱

NFC 데이터를 직접 확인하거나 테스트하고 싶다면 스마트폰 NFC 앱을 사용하는 것이 편리합니다.

대표적으로 다음 두 가지 앱을 사용할 수 있습니다.

STMicroelectronics NFC Tap

ST에서 제공하는 공식 NFC 애플리케이션입니다.

ST25 계열 NFC 태그를 테스트하거나 설정할 때 특히 편리합니다.

NFC Tools

wakdev에서 개발한 범용 NFC 앱으로 Android와 iOS에서 널리 사용됩니다.

NDEF 데이터를 읽거나 URL, Text 등의 정보를 기록할 때 편리합니다.


SparkFun DataLogger IoT와 연결

SparkFun의 DataLogger IoT 시스템과 함께 사용하는 것도 가능합니다.

Qwiic 인터페이스를 이용하면 복잡한 배선 없이 장치를 연결할 수 있으며, SparkFun의 생태계를 이용해 센서 데이터 기록과 NFC 기능을 함께 구성할 수 있습니다.

Qwiic 센서들을 많이 사용하는 프로젝트라면 상당히 편리한 조합입니다.


일반 NFC 태그와 Dynamic NFC Tag의 차이

일반 NFC 태그는 주로 미리 저장된 정보를 전달하는 용도로 사용됩니다.

반면 Dynamic NFC Tag는 MCU와 연결되어 데이터를 계속 변경할 수 있습니다.

일반 NFC 태그가

스마트폰 → NFC 태그

형태라면 Dynamic NFC Tag는

스마트폰 ↔ NFC 태그 ↔ 마이크로컨트롤러

구조를 만들 수 있습니다.

이 차이 때문에 단순한 URL 태그를 넘어 IoT 장치의 설정, 데이터 확인, 유지보수 인터페이스 등으로 활용할 수 있습니다.


마무리

SparkFun Qwiic Dynamic NFC/RFID Tag는 단순한 NFC 태그라기보다는 스마트폰과 마이크로컨트롤러를 연결해 주는 작은 무선 인터페이스에 가깝습니다.

8kByte EEPROM, I2C, NFC Forum Type 5, NDEF, 256Byte Data Mailbox, Energy Harvesting, GPO 인터럽트, 메모리 보안 기능을 하나의 작은 보드에서 사용할 수 있습니다.

특히 흥미로운 점은 장치의 전원이 꺼져 있어도 스마트폰으로 저장된 정보를 확인할 수 있다는 것입니다.

그래서 IoT 센서, 데이터 로거, 스마트 제품, 재고 관리, 장비 유지보수, 전시 시스템, WiFi 설정 장치 등 여러 프로젝트에서 활용 가능성이 높습니다.

ESP32나 아두이노 프로젝트에서 Bluetooth나 WiFi까지 사용할 정도로 복잡한 통신은 필요 없지만, 스마트폰과 간단하게 데이터를 주고받을 방법이 필요하다면 Dynamic NFC Tag는 상당히 재미있는 선택지가 될 수 있습니다.


참고 자료

SparkFun Qwiic Dynamic NFC/RFID Tag Hookup Guide

https://learn.sparkfun.com/tutorials/qwiic-dynamic-nfcrfid-tag-hookup-guide

SparkFun ST25DV64KC Arduino Library

https://github.com/sparkfun/SparkFun_ST25DV64KC_Arduino_Library

SparkFun Qwiic Dynamic NFC/RFID Tag Schematic

https://cdn.sparkfun.com/assets/c/a/a/7/b/Qwiic_RFID_Tag.pdf

STMicroelectronics ST25DV64KC Datasheet

https://cdn.sparkfun.com/assets/f/5/4/e/d/st25dv04kc-2450072.pdf

※ 제품 사용 전에는 최신 데이터시트와 SparkFun의 공식 Hookup Guide에서 전원 조건, 핀 구성 및 RF 관련 설정을 다시 확인하는 것을 권장합니다.

#SparkFun #NFC #RFID #DynamicNFC #NFC태그 #RFID태그 #ST25DV64KC #Qwiic #Arduino #아두이노 #ESP32 #IoT #사물인터넷 #전자공학 #전자부품 #개발보드 #메이커 #메이커프로젝트 #임베디드 #임베디드시스템 #NDEF #NFC통신 #I2C #EEPROM #에너지하베스팅 #EnergyHarvesting #스마트폰연동 #와이파이설정 #센서프로젝트 #DIY전자공학

지금까지 약 1년간 기록한 호야와 스킨답서스 데이터를 여러 방향으로 살펴봤습니다.

그리고 한 가지 중요한 사실을 발견했습니다.

식물의 물주기는 고정된 일정이 아니라 반복되는 패턴에 가깝습니다.

식물마다 물주기 주기가 다르고, 같은 식물도 환경에 따라 건조 속도가 달라집니다.

그런데 여러 번의 물주기 기록이 쌓이면 그 식물이 평소 어떻게 마르는지도 조금씩 알 수 있게 됩니다.

그렇다면 마지막으로 이런 질문을 해볼 수 있습니다.

과거의 물주기와 건조 패턴을 이용하면 다음 물주기 날짜를 미리 예상할 수 있을까?

그것도 흙이 거의 다 마른 뒤가 아니라, 7일, 10일 전부터 말입니다.

1. 사실 2~3일 뒤의 물주기는 예측하기 어렵지 않다

토양 수분 그래프를 계속 보고 있으면 어느 정도 감이 생깁니다.

예를 들어 토양 수분이 며칠 동안

1600 → 1450 → 1300 → 1150

처럼 감소하고 있고 평소 1000 부근에서 물을 준다면,

"아마 하루 이틀 뒤에는 물을 줘야겠구나."

라고 사람이 직접 예상할 수 있습니다.

센서 데이터를 이용해 최근 감소 속도를 계산해도 마찬가지입니다.

현재 수분에서 물주기 기준까지 얼마나 남았는지를 최근 건조 속도로 나누면 됩니다.

문제는 이것이 그다지 놀라운 기능이 아니라는 것입니다.

그래프만 봐도 어느 정도 알 수 있기 때문입니다.

제가 더 궁금했던 것은 이것입니다.

물을 준 지 얼마 되지 않았을 때도 다음 물주기가 언제쯤 필요할지 알 수 있을까?

2. 가장 간단한 방법은 현재 건조 속도를 그대로 연장하는 것이다

먼저 아주 단순한 방법을 시험했습니다.

최근 3~4개의 토양 수분값으로 현재 화분이 하루에 얼마나 빠르게 마르고 있는지를 계산합니다.

그리고 그 속도가 앞으로도 계속된다고 가정합니다.

예를 들어 현재 수분값이 2000이고 다음 물주기 기준이 1000이라고 하겠습니다.

최근 건조 속도가 하루 100 ADC라면,

남은 수분 범위는 1000 ADC이므로

약 10일 후

라고 예상할 수 있습니다.

간단하고 직관적인 방법입니다.

그런데 실제 과거 데이터에 적용해보니 큰 문제가 나타났습니다.

3. 물을 준 직후에는 이 방법이 거의 맞지 않았다

물주기 사이클을 진행률에 따라 네 구간으로 나누어 예측 오차를 계산했습니다.

건조 진행률
평균 예측오차(MAE)
±2일 이내 예측
0~25%
15.17일
26.8%
25~50%
3.18일
44.2%
50~75%
1.27일
85.5%
75~100%
0.61일
98.3%

굉장히 극단적인 결과입니다.

물을 준 직후인 0~25% 구간에서는 평균 예측오차가 무려 15.17일이었습니다.

사실상 장기 예측에 사용하기 어려운 수준입니다.

그런데 건조 사이클의 절반을 지나면 평균오차가 1.27일까지 줄어듭니다.

마지막 25% 구간에서는 불과 0.61일입니다.

왜 이런 일이 생겼을까요?

4. 물을 준 직후의 '속도'는 미래를 대표하지 못한다

5편에서 살펴본 정규화 건조곡선을 떠올려보면 이유를 이해할 수 있습니다.

물을 준 직후의 토양 수분 변화는 이후 전체 건조 과정과 완전히 같은 속도로 진행되지 않습니다.

초기 몇 개 데이터만 가지고 직선을 그은 뒤 그것을 10일 이상 연장하면 작은 기울기 오차도 미래에는 큰 날짜 오차가 됩니다.

반대로 사이클이 절반 이상 진행되면 실제로 이번 화분이 어떻게 마르고 있는지 충분한 정보가 쌓입니다.

그래서 최근 건조 속도가 강력한 예측 정보가 됩니다.

즉,

최근 건조 속도는 단기 예측에는 매우 유용하지만 장기 예측에는 오히려 불안정합니다.

그렇다면 물을 준 직후에는 무엇을 이용해야 할까요?

5. 답은 현재가 아니라 '과거'에 있었다

물을 준 직후에는 이번 사이클의 정보가 거의 없습니다.

하지만 센서를 몇 달 동안 사용했다면 다른 정보가 있습니다.

이 식물의 과거입니다.

이 식물은 이전에 평균적으로 며칠 만에 다시 물을 주었는가?

보통 어느 정도 범위에서 물주기 주기가 변했는가?

같은 계절에는 어떤 패턴을 보였는가?

5편에서 본 것처럼 평소 건조곡선의 형태는 어떠했는가?

현재 사이클의 데이터가 부족할 때는 이런 과거의 물주기 이력(historical cycle)을 이용할 수 있습니다.

예를 들어 이 식물이 과거에 대체로 9~12일 정도의 물주기 주기를 보였다면 물을 준 직후에는 "다음 물주기는 약 9~12일 후로 예상됩니다."라고 시작하는 것입니다.

정확한 하루를 맞히려고 하지 않고 가능성이 높은 범위를 알려주는 것입니다.

6. 그리고 시간이 지나면 현재 식물의 행동을 반영한다

여기서 중요한 아이디어가 하나 나옵니다.

처음부터 끝까지 같은 방법으로 예측할 필요가 없습니다.

물을 준 직후에는 과거 이력이 더 중요합니다.

시간이 지나면서 이번 사이클의 실제 데이터가 쌓이면 현재 건조 속도가 점점 더 중요해집니다.

그래서 다음과 같은 방식으로 예측할 수 있습니다.

0~25%

이번 사이클의 정보가 부족하므로 과거 물주기 이력을 중심으로 예측

25~50%

과거 이력 + 현재 건조 속도를 함께 사용

50~75%

현재 건조 속도의 비중을 더 높임

75~100%

현재 건조 속도를 중심으로 다음 물주기 시점을 예측

쉽게 말하면,

처음에는 기억으로 예측하고, 시간이 지나면 관찰한 현실로 수정하는 방식입니다.

7. 실제 과거 데이터로 시험해봤다

이 방법이 실제로 효과가 있는지 확인하기 위해 과거 데이터를 이용한 walk-forward 방식의 백테스트를 했습니다.

방법은 실제 제품을 사용하는 상황과 비슷하게 만들었습니다.

어떤 물주기 사이클을 예측할 때 미래의 데이터는 전혀 보여주지 않고, 그 시점 이전에 이미 기록된 사이클만 학습에 사용했습니다.

그리고 세 가지 방법을 비교했습니다.

첫 번째는 과거 물주기 주기만 사용하는 방법입니다.

두 번째는 최근 건조 속도만 사용하는 방법입니다.

세 번째는 두 가지의 비중을 건조 진행률에 따라 바꾸는 adaptive hybrid 방식입니다.

결과는 다음과 같았습니다.

예측 방법
평균오차(MAE)
중앙 절대오차
±2일 이내
과거 주기만
2.51일
2.00일
55.1%
최근 건조속도만
4.82일
2.00일
50.7%
Adaptive hybrid
2.07일
1.59일
62.6%

과거 주기만 이용해도 평균오차는 약 2.51일이었습니다.

하지만 현재 건조 상태까지 점진적으로 반영하는 adaptive hybrid에서는 2.07일로 감소했습니다.

약 17% 개선된 결과입니다.

8. 재미있는 것은 '어느 모델이 최고인가'가 아니었다

처음에는 가장 정확한 예측 방법 하나를 찾아서 처음부터 끝까지 사용하는 것이 좋을 것이라고 생각했습니다.

그런데 실제 결과는 달랐습니다.

물주기 직후에는 오히려 과거 이력만 사용하는 방법이 유리했습니다.

현재 건조 속도는 데이터가 충분히 쌓이지 않았기 때문입니다.

반대로 사이클 후반으로 갈수록 현재의 실제 건조 속도가 훨씬 유용해집니다.

즉 가장 좋은 예측 정보가 시간에 따라 바뀝니다.

그래서 하나의 고정된 예측식을 찾는 것보다,

식물이 마르는 과정에 따라 어떤 정보를 믿을지를 바꾸는 것

이 더 합리적이었습니다.

9. 그러면 7~10일 전에 정확한 날짜를 맞힐 수 있을까?

여기서는 조금 신중하게 답해야 합니다.

현재 데이터만으로

"10일 전에 다음 물주기 날짜를 ±1일로 정확하게 맞힐 수 있다."

고 말할 수는 없습니다.

특히 물을 준 직후에는 이번 사이클이 평소보다 빠르게 진행될지, 느리게 진행될지 아직 알 수 없습니다.

하지만 정확한 날짜 대신 예상 범위를 제공하는 것은 가능합니다.

예를 들어 물을 준 직후에는

다음 물주기 예상: 9~12일 후

라고 시작합니다.

며칠 뒤 현재 건조 데이터가 쌓이면

예상: 7~9일 후

다시 며칠이 지나면

예상: 3~4일 후

마지막에는

예상: 내일~모레

처럼 범위를 계속 좁혀가는 것입니다.

 

이렇게 생각하면 장기 예측에서 중요한 것은 처음부터 정확한 날짜 하나를 맞히는 것이 아닙니다.

처음에는 넓게 예상하고, 식물을 계속 관찰하면서 예측의 불확실성을 줄여가는 것입니다.

위 그래프는 Adaptive hybrid 모델이 예측한 다음 물주기까지의 남은 날짜와 실제 남은 날짜를 비교한 결과입니다.

각 점의 가로축은 실제로 다음 물주기까지 남아 있었던 일수이고, 세로축은 그 시점까지의 데이터만 이용해 모델이 예측한 남은 일수입니다. 대각선은 예측과 실제가 정확히 일치하는 경우를 나타내므로 점이 이 선에 가까울수록 예측이 정확합니다.

전체적으로 물주기 시점이 가까운 구간에서는 점들이 대각선 주변에 비교적 모여 있는 반면, 실제 남은 기간이 길어질수록 분산이 커지는 모습을 볼 수 있습니다. 이는 물주기 직후의 장기 예측에는 아직 불확실성이 크지만, 새로운 토양 수분 데이터가 계속 쌓이면서 물주기 시점이 가까워질수록 예측을 보다 정확하게 수정할 수 있음을 보여줍니다.

10. 그렇다면 AI가 필요한가?

여기까지 분석하면서 저도 궁금했습니다.

이런 예측을 하려면 결국 AI가 필요한 것이 아닐까?

현재 데이터에서 얻은 답은 의외로 '아직은 아니다'에 가깝습니다.

각 식물에 대해

평소 젖은 상태,

평소 다시 물을 주는 상태,

평균 물주기 주기,

건조곡선,

최근 건조 속도

를 계속 업데이트하는 것만으로도 개인화된 예측 알고리즘을 만들 수 있습니다.

그리고 이번 분석에서 adaptive hybrid 방식은 실제로 단순한 과거 주기 예측보다 성능이 좋아졌습니다.

따라서 현재 단계에서는 복잡한 AI보다 설명할 수 있고 검증하기 쉬운 적응형 알고리즘부터 시작하는 것이 더 합리적으로 보입니다.

나중에 수백, 수천 개 식물의 데이터가 쌓인다면 이야기가 달라질 수 있습니다.

새로 등록된 식물처럼 과거 데이터가 없는 경우 비슷한 식물들의 데이터를 이용해 초기 예측을 만들고, 이후 그 식물 자신의 데이터가 쌓이면서 개인화하는 방식으로 AI를 활용할 수 있을 것입니다.

발견 6: 물주기 예측은 '한 번 맞히는 것'이 아니라 '계속 수정하는 것'이다

처음 이 분석을 시작했을 때 제가 생각한 물주기 예측은 단순했습니다.

현재 토양 수분과 건조 속도를 측정해서

"앞으로 7일 뒤에 물을 주세요."

라고 계산하면 될 것이라고 생각했습니다.

하지만 약 1년의 데이터를 분석해보니 실제로는 조금 달랐습니다.

물을 준 직후에는 현재 건조 속도보다 그 식물의 과거가 더 유용했습니다.

시간이 지나면서 이번 사이클의 데이터가 쌓이면 현재의 실제 건조 속도가 더 중요해졌습니다.

그래서 장기적인 물주기 예측은 한 번 계산하고 끝나는 숫자가 아니라,

과거의 패턴으로 미래를 먼저 예상하고, 현재의 데이터를 관찰하면서 그 예측을 계속 수정하는 과정에 더 가까웠습니다.

1년 동안 식물을 기록하고 나서

처음 센서 데이터를 기록한 목적은 단순했습니다.

흙이 말랐는지 알고 싶었습니다.

그런데 약 1년 동안 데이터를 모으고 분석하면서 질문이 조금씩 바뀌었습니다.

'현재 흙이 얼마나 말랐는가?'에서

'이 식물은 평소 어떻게 마르는가?'

그리고 다시

지금 속도라면 앞으로 언제 물이 필요할까?'로 바뀌었습니다.

1편에서는 호야와 스킨답서스의 물주기 리듬이 다르다는 것을 보았습니다.

2편에서는 물주기 사이에 반복되는 건조 사이클을 관찰했습니다.

3편과 4편에서는 환경과 건조 속도의 관계를 살펴봤습니다.

5편에서는 서로 다른 두 식물도 정규화하면 상당히 비슷한 건조 패턴을 보일 수 있다는 것을 발견했습니다.

그리고 마지막 6편에서는 그 반복되는 과거의 패턴과 현재의 건조 상태를 결합하면 다음 물주기를 미리 예상할 가능성이 있다는 것을 확인했습니다.

그래서 이 1년간의 관찰에서 제가 얻은 가장 큰 결론은 이것입니다.

식물에게 필요한 것은 정해진 물주기 달력이 아니라, 그 식물 자신의 기록일지도 모릅니다.

센서는 오늘의 숫자를 보여주는 데서 끝날 필요가 없습니다.

오랫동안 기록하면 그 숫자는 그 식물의 습관이 되고,

그 습관을 이해하기 시작하면 센서는 현재를 보여주는 장치에서 미래를 예상하는 장치로 바뀔 수 있습니다.

#식물관찰 #식물데이터 #물주기 #호야 #스킨답서스 #토양수분 #물주기예측 #식물센서 #스마트화분

 

지금까지 호야와 스킨답서스의 데이터를 살펴보면서 두 식물이 꽤 다르다는 것을 확인했습니다.

물주기 간격도 달랐고, 물을 준 직후의 토양 수분 센서값도 달랐습니다.

화분이 마르는 속도도 달랐습니다.

그런데 여기서 한 가지 생각이 들었습니다.

두 식물의 숫자가 다른 것은 당연한데, 혹시 '마르는 과정의 모양'은 비슷하지 않을까?

그래서 이번에는 숫자의 크기를 비교하는 대신, 두 식물의 물주기 사이클을 같은 출발점과 도착점으로 맞춰서 겹쳐봤습니다.

결과는 예상보다 흥미로웠습니다.

1. 먼저 두 식물은 숫자만 보면 상당히 다르다

같은 방식으로 측정했지만 호야와 스킨답서스의 토양 수분 센서값은 상당히 달랐습니다.

대표적인 물주기 직후의 센서값은

호야 약 2507 ADC

스킨답서스 약 2031 ADC

였습니다.

다음 물주기 직전에는 각각 약 1090과 964 정도였습니다.

한 번의 물주기 사이클에서 감소하는 센서값의 범위도 달랐습니다.

호야는 약 1403 ADC, 스킨답서스는 약 1065 ADC였습니다.

건조 속도도 달랐습니다.

호야는 대표적으로 약 133 ADC/day, 스킨답서스는 약 166 ADC/day로 스킨답서스가 더 빠르게 마르는 모습을 보였습니다.

숫자만 보면 상당히 다른 두 화분입니다.

2. 그래서 절대적인 센서값만 비교하면 문제가 생긴다

예를 들어 두 화분의 토양 수분 센서가 똑같이 1800을 가리키고 있다고 생각해보겠습니다.

같은 센서값이니 두 식물의 수분 상태도 같다고 생각하기 쉽습니다.

하지만 그렇지 않습니다.

호야에서 1800은 자신의 건조 범위에서 대략 중간 정도까지 진행된 상태일 수 있습니다.

반면 스킨답서스에서는 상대적으로 더 젖어 있는 상태일 수 있습니다.

즉, ADC 1800이라는 숫자 자체보다 중요한 것은 그 숫자가 '그 식물의 평소 범위에서 어디쯤인가'입니다.

이 문제를 해결하기 위해 데이터를 조금 다른 방식으로 바꿔봤습니다.

3. 모든 물주기 사이클을 0~100%로 바꿔보자

방법은 생각보다 간단합니다.

먼저 물을 준 직후의 상태를

건조 진행률 0%

로 놓습니다.

그리고 다음 물주기 직전의 가장 마른 상태를

건조 진행률 100%

로 놓습니다.

그 사이의 토양 수분값은 모두 0~100% 사이의 값으로 변환합니다.

예를 들어 한 사이클에서

물주기 직후 = 2500

다음 물주기 직전 = 1000

이었다고 해보겠습니다.

현재 센서값이 1750이라면 전체 건조 범위의 절반 정도를 지나온 셈입니다.

즉, 건조 진행률 약 50%입니다.

이렇게 하면 호야의 ADC 1800과 스킨답서스의 ADC 1800을 직접 비교하는 대신,

호야의 건조 진행률 50%와 스킨답서스의 건조 진행률 50%를 비교할 수 있습니다.

4. 시간도 0~100%로 바꿨다

시간도 같은 방식으로 정규화했습니다.

호야의 어떤 물주기 사이클이 14일이었다고 하고, 스킨답서스의 어떤 사이클이 8일이었다고 해보겠습니다.

절대적인 날짜로 비교하면 두 사이클의 길이가 다르기 때문에 직접 겹쳐보기 어렵습니다.

그래서

물을 준 순간 = cycle progress 0%

다음 물주기 직전 = cycle progress 100%

로 바꿨습니다.

그러면 14일짜리 사이클과 8일짜리 사이클도 같은 축 위에 놓을 수 있습니다.

결국 그래프의 가로축과 세로축이 모두 0~100%가 됩니다.

가로축: 물주기 사이클이 얼마나 진행되었는가

세로축: 토양 건조가 얼마나 진행되었는가

이제 식물마다 다른 ADC값과 서로 다른 물주기 기간을 걷어내고 '마르는 과정의 모양' 자체를 비교할 수 있습니다.

5. 그런데 두 곡선을 겹쳐보니 놀랍게도 비슷했다

그 결과가 다음 그래프입니다.

그래프에는 호야의 평균 건조곡선과 스킨답서스의 평균 건조곡선이 함께 표시되어 있습니다.

그리고 비교를 위해 y = x인 직선도 함께 표시했습니다.

만약 건조가 사이클 진행시간에 거의 비례해서 진행된다면 이 직선에 가까운 모양이 됩니다.

결과를 보면 호야의 평균 건조곡선은 거의 이 직선에 가깝습니다.

그런데 더 흥미로운 것은 스킨답서스입니다.

두 식물의 곡선이 상당히 비슷합니다.

절대적인 센서값도 다르고,

물주기 주기도 다르고,

건조 속도도 다른데,

각자의 범위에서 0~100%로 바꾸자 상당히 비슷한 궤적이 나타난 것입니다.

6. 완전히 똑같은 것은 아니다

물론 두 곡선이 완전히 일치하는 것은 아닙니다.

사이클 진행 단계별로 비교하면 다음과 같습니다.

물주기 사이클 진행
호야 건조 진행
스킨답서스 건조 진행
10%
8.3%
9.8%
25%
23.3%
27.2%
50%
50.8%
55.9%
75%
76.8%
81.5%
90%
91.9%
93.8%

차이가 가장 커지는 것은 사이클 중간 부분입니다.

사이클의 50% 지점에서 호야는 평균적으로 50.8% 정도 건조되어 있었지만 스킨답서스는 55.9%까지 진행되어 있었습니다.

약 5.1 percentage point 차이입니다.

즉 스킨답서스가 사이클 중반부에서 조금 더 앞서 마르는 경향이 있습니다.

하지만 사이클의 시작과 끝에서는 다시 차이가 작아집니다.

두 평균 건조곡선 전체의 차이를 RMSE로 계산하면 약 3.97 percentage point였습니다.

서로 다른 두 식물이라는 점을 생각하면 상당히 비슷한 형태입니다.

7. 이것은 꽤 중요한 결과일지도 모른다

처음에는 식물마다 전혀 다른 건조곡선을 가질 것이라고 생각할 수도 있습니다.

실제로 절대적인 센서값을 보면 그렇게 보입니다.

하지만 정규화하고 나니 다른 모습이 나타났습니다.

절대값은 다르지만 상대적인 건조 과정은 비슷했습니다.

이것은 식물 데이터를 바라보는 방법에 중요한 힌트를 줍니다.

모든 식물에게

"ADC 1000이 되면 물을 주세요."

같은 하나의 절대 기준을 적용하는 것은 적절하지 않을 수 있습니다.

대신 각각의 식물이 평소에 보여주는 가장 젖은 상태와 다시 물을 주는 상태를 학습한 뒤,

현재 그 범위에서 몇 %까지 진행되었는지를 보는 방법이 더 합리적입니다.

예를 들어 "현재 토양 수분 1673"이라고 보여주는 것보다,

"현재 이 식물은 평소 건조 사이클의 약 65%까지 진행되었습니다."

라고 표현하는 것이 실제 관리에는 더 의미 있는 정보가 될 수 있습니다.

8. 그렇다면 모든 식물에 공통된 '건조곡선'이 있을까?

여기서 더 흥미로운 질문이 생깁니다.

호야와 스킨답서스처럼 서로 다른 식물을 정규화했는데도 비슷한 곡선이 나타났다면,

모든 식물에 적용할 수 있는 공통적인 건조곡선이 존재하는 것은 아닐까요?

가장 단순한 형태는

건조 진행률 = 물주기 사이클 진행률

즉 D(P) = P입니다.

이번 호야 데이터는 실제로 이 직선에 상당히 가까웠고, 스킨답서스도 약간의 차이는 있지만 비슷한 형태를 보였습니다.

조금 더 발전시키면 식물마다 곡선의 형태를 나타내는 작은 보정값 하나만 학습하는 방법도 생각할 수 있습니다.

그러면 복잡한 모델 없이도 각 식물의 젖은 상태, 마른 상태, 평균 물주기 기간, 건조곡선의 모양 정도만 학습해서 식물마다 다른 물주기 패턴을 표현할 수 있을지도 모릅니다.

9. 하지만 아직 '모든 식물의 보편 법칙'이라고 말할 수는 없다

여기서는 특히 조심할 필요가 있습니다.

현재 비교한 것은 사실상 호야 한 개체와 스킨답서스 한 개체입니다.

따라서 이 결과만으로

"모든 식물은 같은 건조곡선을 가진다."

라고 말할 수는 없습니다.

화분 크기, 토양 종류, 식물 크기, 뿌리의 양, 센서 위치, 물을 주는 양 등이 달라지면 결과도 달라질 수 있습니다.

종 수준의 차이를 이야기하려면 같은 종의 여러 독립적인 개체도 비교해야 합니다.

그래서 현재 단계에서 말할 수 있는 것은 이 정도입니다.

'호야와 스킨답서스의 절대적인 토양 수분 범위와 물주기 리듬은 달랐지만, 각자의 물주기 사이클을 정규화하자 평균 건조곡선은 상당히 비슷해졌다.'

이것만으로도 충분히 흥미로운 결과입니다.

발견 5: 식물마다 숫자는 달라도 '마르는 과정의 모양'은 비슷할 수 있다

이번 분석에서 가장 재미있는 것은 처음과 마지막의 대비입니다.

호야와 스킨답서스는 분명 다릅니다.

물주기 간격도 다르고,

센서의 절대값도 다르고,

건조 속도도 다릅니다.

그런데 각 식물이 가진 범위 안에서

시간을 0~100%,

건조 정도를 0~100%

로 바꾸자 두 식물의 차이가 크게 줄어들었습니다.

그래서 다섯 번째 발견은 이것입니다.

식물마다 절대적인 물주기 리듬은 달라도, 상대적인 건조 진행 패턴에는 공통된 형태가 존재할 가능성이 있다.

그리고 이것은 마지막 질문으로 이어집니다.

지금까지 우리는 이미 끝난 물주기 사이클을 분석했습니다.

그렇다면 이 반복되는 패턴을 이용해서 아직 오지 않은 다음 물주기 시점을 미리 예상할 수 있을까요?

단순히 흙이 마른 뒤

"이제 물을 주세요."

라고 알려주는 것이 아니라,

물을 준 직후부터

"이 식물은 평소 패턴이라면 약 10일 후 다시 물이 필요할 가능성이 있습니다."

라고 예상하는 것입니다.

그리고 시간이 지나 실제 건조 데이터가 쌓이면 그 예측을 계속 수정할 수도 있습니다.

다음 글에서는 지금까지 발견한 건조 패턴을 이용해 실제로 다음 물주기까지 남은 날짜를 예측해보고, 그 예측이 얼마나 정확했는지 살펴보겠습니다.

식물 관찰기 6편 — 다음 물주기를 7~10일 전에 예측할 수 있을까?

#식물관찰 #식물데이터 #호야 #스킨답서스 #토양수분 #물주기 #건조곡선 #식물센서 #스마트화분

+ Recent posts