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

TinyML로 식물 상태 확인

구성품 및 소모품

Arduino Nano 33 BLE 감지
× 1
Digilent 스테퍼 모터
× 1
Theremino 시스템용 스테퍼 모터용 Theremino 드라이버 DRV8825
× 1

필요한 도구 및 기계

3D 프린터(일반)
납땜 인두(일반)

앱 및 온라인 서비스

Microsoft VS 코드
Arduino IDE
Edge Impulse Studio

이 프로젝트 정보

전제

인간과 마찬가지로 식물도 질병에 걸릴 수 있습니다. 피부 감염으로 인해 발진이 생기는 것과 마찬가지로 식물의 잎은 곰팡이나 다른 병원체로 인해 노랗게 변하거나 얼룩덜룩해질 수 있습니다. 따라서 머신 러닝의 힘을 활용하여 색상을 스캔한 다음 잎의 색상이 꺼져 있을 때 이를 감지할 수 있는 모델을 훈련하는 데 사용할 수 있습니다.

하드웨어

이 프로젝트의 두뇌는 Arduino Nano 33 BLE Sense이며 여러 가지 이유로 선택되었습니다. 첫째, 9DoF IMU, APDS-9960(색상, 제스처, 근접성 및 밝기), 마이크, 온도/습도/압력 센서 콤보를 포함한 강력한 센서 세트가 풍부합니다. 보드를 식물 잎 주위로 이동하고 측정하기 위해 한 쌍의 스테퍼 모터가 한 쌍의 DRV8825 드라이버 보드와 함께 사용됩니다.

TinyML 설정

이 프로젝트의 경우 에지 임펄스의 Arduino Nano 33 BLE 감지에 대해 나열된 내장 센서는 작동하지 않습니다. 가속기와 마이크만 나열되기 때문입니다. 이는 직렬 데몬 대신 데이터 전달자를 사용해야 함을 의미합니다. 시작하려면 새 프로젝트를 만들고 이름을 지정했습니다. 다음으로 Node.js와 NPM을 설치하고 npm install -g edge-impulse-cli를 실행하여 Edge Impulse CLI를 설치했습니다. . 찾을 수 없는 경우 PATH 환경 변수에 설치 경로를 추가해야 할 수도 있습니다. 다음으로 edge-impulse-data-forwarder를 실행합니다. 작동하는지 확인한 다음 Ctrl+C를 사용하여 종료합니다.

색상 읽기

APDS-9960은 표면에서 적외선을 반사하고 재료에 흡수되지 않는 파장을 읽어 색상을 읽습니다. 센서와 통신하려면 몇 가지 유용한 기능에 액세스할 수 있는 Arduino APDS9960 라이브러리를 설치하는 것이 가장 좋습니다. 코드에서 APDS-9960이 먼저 초기화된 다음 프로그램이 루프 기능으로 들어갑니다. 거기에서 색상 데이터가 있을 때까지 기다립니다. 판독이 가능한 경우 APDS.readColor()로 색상을 읽습니다. 표면에 대한 근접성과 함께. 각 RGB 구성 요소는 0-2^16-1 숫자에서 합에 대한 값의 비율로 변환됩니다.

스캐닝 장비

나뭇잎의 색상을 스캔하는 것은 두 축으로 장비를 움직여 온보드 APDS-9960 아래 나뭇잎의 다양한 위치를 통과함으로써 이루어집니다. 각 축은 리드 스크류를 시계 방향 또는 반시계 방향으로 회전시켜 블록을 어느 방향으로든 이동시킵니다. 전체 시스템은 Fusion 360으로 설계되었으며 다음은 설계의 일부 렌더링입니다.

X축은 Y축의 상단에 위치하므로 상단 블록이 두 축에서 모두 이동할 수 있습니다. 스테퍼 모터의 무게를 지지하기 위해 Y축에 추가 V-휠이 있습니다. 부품은 약 45% 충전된 PLA 플라스틱을 사용하여 인쇄되었습니다.

데이터 수집

시스템이 처음 시작될 때 스테퍼 모터는 위치를 알지 못하므로 두 축은 리미트 스위치에 도달할 때까지 단계적으로 원점으로 이동하여 홈으로 돌아갑니다. 다음으로 APDS-9960이 초기화됩니다. 상자의 반대쪽 모서리를 포함하는 두 개의 요소 배열로 정의된 경계 상자가 있습니다. 이 두 위치 사이에서 임의의 지점이 선택되고 그 사이의 색상을 읽는 동안 스테퍼가 해당 위치로 실행됩니다.

색상 정보 처리 및 보내기

색상은 APDS.readColor()로 읽습니다. , 앞서 언급했듯이. 합계가 계산된 후 백분율이 계산된 다음 Serial.printf()를 호출하여 USB를 통해 전송됩니다. 방법. 값은 쉼표로 구분되며 각 판독값은 개행 문자로 구분됩니다. 데이터 전달 프로그램이 데이터를 수신하면 지정된 레이블(정상 또는 비정상)이 있는 교육 데이터로 Edge Impulse 클라우드 프로젝트에 전송됩니다.

모델 교육

모든 훈련 데이터가 수집되면 건강한 잎과 건강하지 않은 잎을 구별할 수 있는 모델을 만들 차례입니다. 3축 시계열, 스펙트럼 분석 블록, 케라스 블록으로 구성된 임펄스를 사용했습니다. 데이터에서 기능을 생성한 방법에 대한 스크린샷은 아래에서 볼 수 있습니다.

테스트

내 새 모델을 테스트하기 위해 이번에는 건강에 해로운 잎사귀의 새로운 테스트 데이터를 수집했습니다. 모델의 정확도는 약 63%였으며 몇 가지 테스트 기능을 보낸 후 대부분의 시간 동안 잎사귀를 올바르게 분류할 수 있었습니다.

이 정확도는 더 많은 훈련 데이터를 추가하고 훈련 속도를 낮추면 향상될 수 있습니다.

<섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

코드

<울>
  • leafReader.ino
  • pinDefs.h
  • leafReader.inoC/C++
    #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 스테퍼;// 경계 상자 내에서 임의의 위치가 선택됩니다. const long boundingBox[2][2] ={ {0, 0 }, {40, 40}}; 무효 설정(){ Serial.begin(115200); 동안(! 직렬); if(!APDS.begin()) { Serial.println("APDS9960을 초기화할 수 없습니다."); 동안(1); } 핀모드(X_AXIS_HOMING_SW, INPUT_PULLUP); 핀모드(Y_AXIS_HOMING_SW, INPUT_PULLUP); //Serial.println(digitalRead(X_AXIS_HOMING_SW) + digitalRead(Y_AXIS_HOMING_SW)); xStepper.setPinsInverted(X_AXIS_DIR); yStepper.setPinsInverted(Y_AXIS_DIR); xStepper.setMaxSpeed(150); yStepper.setMaxSpeed(150); steppers.addStepper(xStepper); steppers.addStepper(yStepper); homeMotors();} 무효 루프(){ 긴 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()){} else { APDS.readColor(r, g, b, c); 합계 =r + g + b; p =APDS.readProximity(); if(!p &&c> 10 &&sum>=0) { float rr =r / sum, gr =g / sum, br =b / sum; Serial.printf("%1.3f,%1.3f,%1.3f\n", rr, gr, br); } } }}void homeMotors(){ // 홈 x //Serial.println("이제 homing x"); 동안(digitalRead(X_AXIS_HOMING_SW)) xStepper.move(-1); // 홈 y //Serial.println("지금 홈으로 y"); while(digitalRead(Y_AXIS_HOMING_SW)) yStepper.move(-1); xStepper.setCurrentPosition(0); yStepper.setCurrentPosition(0);}
    pinDefs.hC/C++
    <사전>#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 MMEP_6CROSTFalse 반전된 경우 true#define#False

    맞춤형 부품 및 인클로저

    3D 프린트용 부품
    thingiverse.com의 CAD 파일

    회로도


    제조공정

    1. K30 센서로 CO2 모니터링
    2. 1Sheeld/Arduino를 사용한 청각 장애인용 통신
    3. Arduino로 코인 억셉터 제어
    4. Bluetooth가 탑재된 Arduino로 LED 제어!
    5. Arduino 또는 ESP8266이 있는 정전 용량 지문 센서
    6. Nextion 디스플레이로 재생
    7. Nunchuk 제어 로봇 팔(Arduino 포함)
    8. Arduino Nano:조이스틱으로 2개의 스테퍼 모터 제어
    9. Arduino로 태양 복사열 측정
    10. Arduino가 있는 미니 레이더