산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

TinyML로 식물 건강 평가하기 - 아두이노 나노 33 BLE 센스 실전 가이드

부품 및 소모품

부품 수량 비고
아두이노 나노 33 BLE 센스 (Arduino Nano 33 BLE Sense) 1 내장 센서: 9DoF IMU, APDS-9960, 마이크, 온습도/기압
스테퍼 모터 (Digilent) 1 X, Y 축 이동용 2개 필요
DRV8825 스테퍼 모터 드라이버 2 각 모터당 1개

필요 도구

앱 및 온라인 서비스

프로젝트 소개

배경

식물도 인간처럼 병듭니다. 피부 감염으로 발진이 생기듯, 곰팡이나 병원체 감염 시 식물의 잎이 누렇게 변하거나 반점이 생깁니다. 머신러닝을 활용해 잎의 색상을 스캔하고, 정상/비정상 색상을 판별하는 모델을 훈련시킬 수 있습니다.

하드웨어 구성

이 프로젝트의 두뇌는 아두이노 나노 33 BLE 센스입니다. 선택 이유는:

TinyML로 식물 건강 평가하기 - 아두이노 나노 33 BLE 센스 실전 가이드
스캐닝 릭 조립체
TinyML로 식물 건강 평가하기 - 아두이노 나노 33 BLE 센스 실전 가이드
완성된 식물 건강 스캐너

TinyML 환경 설정 (Edge Impulse)

Edge Impulse에 내장된 아두이노 나노 33 BLE 센스 센서 중 가속도계와 마이크만 지원하므로, APDS-9960 색상 센서 데이터를 사용하려면 데이터 포워더(Data Forwarder)를 사용해야 합니다.

  1. 새 프로젝트 생성
  2. Node.js와 NPM 설치 후 npm install -g edge-impulse-cli로 CLI 설치
  3. PATH 환경 변수에 설치 경로 추가 (필요시)
  4. edge-impulse-data-forwarder 실행 후 작동 확인, Ctrl+C로 종료
TinyML로 식물 건강 평가하기 - 아두이노 나노 33 BLE 센스 실전 가이드
데이터 포워더 실행 화면

색상 읽기 (APDS-9960)

APDS-9960은 적외선을 표면에 반사시켜 흡수되지 않은 파장(색상)을 읽습니다. Arduino_APDS9960 라이브러리 설치 후 APDS.readColor()로 RGB 값과 근접도 읽기. 각 RGB 성분을 0~65535 값에서 합계 대비 비율(0~1)로 정규화합니다.

스캐닝 릭 (3D 프린팅)

리드 스크류를 시계/반시계 방향으로 회전시켜 X, Y 축으로 블록을 이동하며 잎의 여러 위치를 스캔합니다. Fusion 360으로 설계했으며 주요 렌더링 이미지:

TinyML로 식물 건강 평가하기 - 아두이노 나노 33 BLE 센스 실전 가이드
전체 어셈블리 렌더링
TinyML로 식물 건강 평가하기 - 아두이노 나노 33 BLE 센스 실전 가이드
X축/Y축 분해도
TinyML로 식물 건강 평가하기 - 아두이노 나노 33 BLE 센스 실전 가이드
상세 치수

X축이 Y축 위에 얹혀져 있어 상단 블록이 양축 이동 가능. Y축에 추가 V-휠로 스테퍼 모터 무게 지지. PLA 필라멘트, 45% 인필로 출력.

TinyML로 식물 건강 평가하기 - 아두이노 나노 33 BLE 센스 실전 가이드
3D 프린팅된 부품들

데이터 수집

시작 시 스테퍼 모터 위치를 모르므로, 리미트 스위치에 닿을 때까지 단계적으로 이동해 원점(홈) 설정. APDS-9960 초기화 후 바운딩 박스(두 대각 꼭짓점) 내 랜덤 포인트 선택, 해당 위치로 이동하며 중간 색상 데이터 수집.

색상 데이터 처리 및 전송

APDS.readColor()로 RGB 읽기 → 합계 계산 → 각 성분 비율 계산 → Serial.printf()로 "R비율,G비율,B비율\n" 형식으로 USB 전송. 데이터 포워더가 이를 Edge Impulse 클라우드로 전송, 라벨(정상/비정상) 부여해 훈련 데이터로 저장.

TinyML로 식물 건강 평가하기 - 아두이노 나노 33 BLE 센스 실전 가이드
Edge Impulse 데이터 수집 화면
TinyML로 식물 건강 평가하기 - 아두이노 나노 33 BLE 센스 실전 가이드
수집된 색상 데이터 샘플

모델 훈련

훈련 데이터 수집 완료 후, 정상/비정상 잎을 분류하는 모델 생성. 임펄스 구성: 3축 시계열 → 스펙트럴 분석 블록 → Keras 블록.

TinyML로 식물 건강 평가하기 - 아두이노 나노 33 BLE 센스 실전 가이드
임펄스 구조: 스펙트럴 분석 + Keras 분류기
TinyML로 식물 건강 평가하기 - 아두이노 나노 33 BLE 센스 실전 가이드
스펙트럴 특성 생성 결과

테스트

비정상 잎으로 새 테스트 데이터 수집 후 평가. 모델 정확도 약 63%. 테스트 특성 통과 시 대부분 올바르게 분류됨.

TinyML로 식물 건강 평가하기 - 아두이노 나노 33 BLE 센스 실전 가이드
모델 테스트 결과 (정확도 63%)

훈련 데이터 추가와 학습 속도 조절로 정확도 향상 가능.

코드

leafReader.ino (메인 스케치)

#include 
#include 
#include 
#include "pinDefs.h"

int r, g, b, c, p;
float sum;

AccelStepper xStepper(AccelStepper::DRIVER, STEPPER_1_STEP, STEPPER_1_DIR);
AccelStepper yStepper(AccelStepper::DRIVER, STEPPER_2_STEP, STEPPER_2_DIR);
MultiStepper steppers;

// 스캔 영역 바운딩 박스 (mm 단위, 스텝으로 변환됨)
const long boundingBox[2][2] = { {0, 0}, {40, 40} };

void setup() {
  Serial.begin(115200);
  while(!Serial);
  
  if(!APDS.begin()) {
    Serial.println("Could not init APDS9960");
    while(1);
  }
  
  pinMode(X_AXIS_HOMING_SW, INPUT_PULLUP);
  pinMode(Y_AXIS_HOMING_SW, INPUT_PULLUP);
  
  xStepper.setPinsInverted(X_AXIS_DIR);
  yStepper.setPinsInverted(Y_AXIS_DIR);
  xStepper.setMaxSpeed(150);
  yStepper.setMaxSpeed(150);
  
  steppers.addStepper(xStepper);
  steppers.addStepper(yStepper);
  
  homeMotors();
}

void loop() {
  long randomPos[2];
  randomPos[0] = random(boundingBox[0][0], boundingBox[1][0]) * STEPS_PER_MM;
  randomPos[1] = random(boundingBox[0][1], boundingBox[1][1]) * STEPS_PER_MM;
  
  steppers.moveTo(randomPos);
  
  while(steppers.run()) {
    if(!APDS.colorAvailable() || !APDS.proximityAvailable()) continue;
    
    APDS.readColor(r, g, b, c);
    sum = r + g + b;
    p = APDS.readProximity();
    
    // 근접 센서 감지되고, 명확한 색상 데이터일 때만 전송
    if(!p && c > 10 && sum >= 0) {
      float rr = r / sum;
      float gr = g / sum;
      float br = b / sum;
      Serial.printf("%1.3f,%1.3f,%1.3f\n", rr, gr, br);
    }
  }
}

void homeMotors() {
  // X축 홈
  while(digitalRead(X_AXIS_HOMING_SW)) xStepper.move(-1);
  // Y축 홈
  while(digitalRead(Y_AXIS_HOMING_SW)) yStepper.move(-1);
  xStepper.setCurrentPosition(0);
  yStepper.setCurrentPosition(0);
}

pinDefs.h (핀 정의 헤더)

#define STEPPER_1_STEP 2
#define STEPPER_1_DIR  3
#define STEPPER_2_STEP 4
#define STEPPER_2_DIR  5
#define X_AXIS_HOMING_SW 6
#define Y_AXIS_HOMING_SW 7

// 방향 반전 여부 (모터 장착 방향에 따라)
#define X_AXIS_DIR false
#define Y_AXIS_DIR false

#define MICROSTEPS 1
#define STEPS_PER_MM 160 * MICROSTEPS  // 1mm당 스텝 수

3D 프린팅 파일

Thingiverse에서 CAD 파일 다운로드 가능 ( 외부 링크)

회로도

TinyML로 식물 건강 평가하기 - 아두이노 나노 33 BLE 센스 실전 가이드
아두이노 나노 33 BLE 센스, DRV8825 x2, 스테퍼 모터 x2, 리미트 스위치 연결도

핵심 포인트 요약

제조공정

  1. K30 CO2 센서: 실시간 실내 공기질 모니터링
  2. 1Sheeld와 아두이노로 시각/청각 장애인 간 소통 돕기
  3. 스마트 저금통 만들기: 아두이노 나노로 동전 인식기 제어하기
  4. 아두이노 블루투스로 LED 제어하기 - HC-05 & MIT App Inventor 입문 가이드
  5. DFRobot 정전식 지문 인식 센서 아두이노/ESP8266 연동 가이드
  6. 아두이노 메가와 센서를 활용한 인터랙티브 넥시온 HMI 프로젝트
  7. 아두이노 메가 기반 닌텐도 눙크 컨트롤 6자유도 로봇 암 키트
  8. 아두이노 나노와 조이스틱으로 2개 스테퍼 모터 제어하기 – 비주이노(Visuino) 튜토리얼
  9. 아두이노 우노와 이더넷 실드로 정확한 태양광 복사량 측정하기
  10. 컴팩트 아두이노 레이더 시스템: HC-SR04 초음파 센서 & 1.8인치 디스플레이