TinyML 키워드 감지로 RGB 조명 제어하기 (아두이노 나노 33 BLE Sense)
부품 및 소모품
| 부품 | 수량 |
| 아두이노 나노 33 BLE Sense | 1 |
앱 및 온라인 서비스
프로젝트 개요
에지 임펄스(Edge Impulse)를 이용해 아두이노 나노 33 BLE Sense의 내장 마이크로폰으로 음성 키워드("on", "off", "red", "green", "blue")를 인식하고, 내장 RGB LED 색상을 제어하는 TinyML 프로젝트입니다. 별도 하드웨어 없이 보드 하나로 머신러닝 추론이 가능합니다.
하드웨어
아두이노 나노 33 BLE Sense는 nRF52840 MCU(64MHz, 1MB 플래시, 256KB RAM)와 마이크, 9축 IMU, 환경 센서, APDS-9960 근접/제스처/컬러/조도 센서를 내장합니다. 이 프로젝트에서는 마이크와 RGB LED만 사용합니다.
Edge Impulse 설정 및 데이터 수집
- Edge Impulse 프로젝트 생성 후 CLI 툴 설치 및 보드 펌웨어 플래싱 (
flash_windows.bat)
edge-impulse-daemon 실행으로 디바이스 연결
- 키워드 5종(on, off, red, green, blue) 각각 약 1분간 녹음 (1-2초 간격 반복)
- 배경 소음 및 'unknown' 단어 데이터는 Edge Impulse 제공 프리빌트 데이터셋 활용
- 훈련/테스트 데이터 80:20 비율로 분할
모델 훈련
- 입력: 1초 윈도우, 500ms 스트라이드 오디오 시계열 데이터
- 처리 블록: MFCC (멜 주파수 케프스트럼 계수)
- 학습 블록: 케라스 신경망 (신뢰도 임계값 0.70, 노이즈 증강 및 타임 마스킹 적용으로 과적합 방지)
아두이노 배포 및 추론 코드
훈련된 모델을 아두이노 라이브러리로 내보내 IDE에 추가 후 컴파일/업로드. 보드는 지속적으로 오디오를 샘플링해 키워드 감지 시 해당 인덱스로 LED 색상 변경.
주요 코드 구조 (RGBLEDKeywordDetection.ino)
#include
#include
#define CONFIDENCE_THRESHOLD 0.7
#define EI_CLASSIFIER_SLICES_PER_MODEL_WINDOW 3
enum Actions { LED_ON=1, LED_OFF=0, LED_RED=2, LED_GREEN=3, LED_BLUE=4, NONE=5 };
enum Functions { CHANGE_LED_ON_OFF=0, CHANGE_LED_COLOR=1, CHANGE_LED_NONE=2 };
const uint8_t redPin=22, greenPin=23, bluePin=24;
std::map actionToFunctionMap = { ... };
std::map labelToActionMap = {
{"on", LED_ON}, {"off", LED_OFF}, {"red", LED_RED},
{"green", LED_GREEN}, {"blue", LED_BLUE}, {"unknown", NONE}, {"noise", NONE}
};
// PDM 마이크 버퍼 관리, 추론 루프, 액션 수행 함수 등 구현
// performAction()에서 라벨에 따라 setPixelColor() 호출
결과
보드에 "on"/"off" 말하면 LED 켜짐/꺼짐, "red"/"green"/"blue" 말하면 해당 색상 점등. 임계값 0.7 이상일 때만 동작해 오작동 최소화.