Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Plantengezondheid Beoordelen met TinyML: Een Praktische Gids

Onderdelen en benodigdheden

Arduino Nano 33 BLE Sense 1
Digilent Stapelmotor 1
Theremino Driver DRV8825 voor Stapelmotoren 1

Benodigde tools en machines

  • 3D Printer
  • Solderbout

Apps en online diensten

  • Microsoft VS Code
  • Arduino IDE
  • Edge Impulse Studio

Over dit project

De Premisse

Net als mensen kunnen ziekten krijgen. En net zoals je een uitslag kunt krijgen van een huginfectie, kunnen de bladeren van een plant geel en/vlekkerig worden door een schimmel of andere ziekteverwekker. Door de kracht van machine learning te benutten, kunnen kleuren gescand worden en gebruikt om een model te trainen dat detecteert wanneer de kleur van een blad afwijkt.

De Hardware

De "hersenen" van dit project is de Arduino Nano 33 BLE Sense, gekozen om meerdere redenen. Eerst heeft het een rijke set krachtige sensoren, waaronder een 9DoF IMU, APDS-9960 (kleur, gebaar, nabijheid, helderheid), microfoon, en een temperatuur/vochtigheid/luchtdruk sensor combo. Om het bordje over het blad van de plant te bewegen en metingen te doen, worden een paar stapelmotoren gebruikt in combinatie met een paar DRV8825 driver bordjes.

Plantengezondheid Beoordelen met TinyML: Een Praktische Gids
Plantengezondheid Beoordelen met TinyML: Een Praktische Gids

TinyML Opzetten

Voor dit project werken de ingebouwde sensoren van de Arduino Nano 33 BLE Sense op Edge Impulse niet, aangezien alleen de accelerometer en microfoon gelist zijn. Dit betekent dat de data forwarder gebruikt moet worden in plaats van de serial daemon.

  1. Maak een nieuw project aan en geef het een naam
  2. Installeer Edge Impulse CLI: installeer Node.js en NPM, dan run npm install -g edge-impulse-cli. Voeg het installatiepad toe aan je PATH omgevingsvariabele als het niet gevonden wordt.
  3. Run edge-impulse-data-forwarder en check of het werkt, dan Ctrl+C om te stoppen.
Plantengezondheid Beoordelen met TinyML: Een Praktische Gids

Kleur Uitlezen

De APDS-9960 leest kleur door infrarood licht van het oppervlak te laten weerkaatsen en de golflengtes te meten die niet geabsorbeerd worden door het materiaal. Om met de sensor te communiceren, installeer je best de Arduino APDS9960 library, die toegang geeft tot nuttige functies.

In de code wordt de APDS-9960 eerst geïnitialiseerd en gaat het programma naar de loop functie. Daar wacht het tot er kleurdata beschikbaar is. Als een meting beschikbaar is, wordt de kleur gelezen met APDS.readColor() samen met de nabijheid. Elke RGB component wordt omgerekend van een 0-2^16-1 getal naar een verhouding van de waarde over de som.

De Scangerig

Het scannen van de kleur van een blad gebeurt door een rig in twee assen te bewegen om verschillende locaties van het blad onder de onboard APDS-9960 te halen. Elke as wordt bewogen door een spindel in kloksgewijs of tegenkloksgewijs richting te draaien om een blok in elke richting te translateren. Het hele systeem is ontworpen in Fusion 360:

Plantengezondheid Beoordelen met TinyML: Een Praktische Gids
Plantengezondheid Beoordelen met TinyML: Een Praktische Gids
Plantengezondheid Beoordelen met TinyML: Een Praktische Gids

De X-as rust op de Y-as, zodat het bovenste blok in beide assen kan bewegen. Er is een extra V-wiel op de Y-as om het gewicht van de stapelmotor te ondersteunen. Onderdelen geprint met PLA met ongeveer 45% infill.

Plantengezondheid Beoordelen met TinyML: Een Praktische Gids

Data Verzamelen

Bij opstart weten de stapelmotoren niet waar ze zijn, dus de twee assen "homen" door stap voor stap naar de oorsprong te bewegen tot ze de limietschakelaar raken. Vervolgens wordt de APDS-9960 geïnitialiseerd. Er is een begrenzingsvak gedefinieerd als twee twee-element arrays met tegenoverliggende hoekpunten. Een willekeurig punt wordt gekozen tussen deze twee locaties, en de steppers bewegen naar die positie terwijl ze de kleuren ertussen lezen.

Kleurinformatie Verwerken en Versturen

Kleuren worden gelezen met APDS.readColor(). Na berekening van de som wordt een percentage berekend en via USB verstuurd met Serial.printf(). Waarden worden gescheiden door komma's, elke meting door een newline. Wanneer de data forwarder de data ontvangt, wordt het naar het Edge Impulse cloud project gestuurd als trainingsdata met het gegeven label (gezond of ongezond).

Plantengezondheid Beoordelen met TinyML: Een Praktische Gids
Plantengezondheid Beoordelen met TinyML: Een Praktische Gids

Een Model Trainen

Na verzamelen van alle trainingsdata, maken we een model dat kan differentiëren tussen gezonde en ongezonde bladeren. Ik gebruikte een impulse bestaande uit drie-as tijdreeks, een spectrale analyse blok, en een Keras blok. Hieronder een screenshot van hoe ik features genereerde uit de data:

Plantengezondheid Beoordelen met TinyML: Een Praktische Gids
Plantengezondheid Beoordelen met TinyML: Een Praktische Gids

Testen

Om het model te testen, verzamelde ik nieuwe testdata van een ongezond blad. De nauwkeurigheid was ongeveer 63%, en na doorlaten van testfeatures kon het het blad meestal correct classificeren.

Plantengezondheid Beoordelen met TinyML: Een Praktische Gids

Deze nauwkeurigheid kan verbeterd worden door meer trainingsdata toe te voegen en de trainingsnelheid te verlagen.

Code

leafReader.ino (C/C++)

#include <Arduino_APDS9960.h>
#include <AccelStepper.h>
#include <MultiStepper.h>
#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;

// Willekeurige locatie binnen het begrenzingsvak
const long boundingBox[2][2] = { {0, 0}, {40, 40} };

void setup() {
  Serial.begin(115200);
  while(!Serial);
  
  if(!APDS.begin()) {
    Serial.println("Kon APDS9960 niet initialiseren");
    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()) {}
    else {
      APDS.readColor(r, g, b, c);
      sum = 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() {
  while(digitalRead(X_AXIS_HOMING_SW)) xStepper.move(-1);
  while(digitalRead(Y_AXIS_HOMING_SW)) yStepper.move(-1);
  xStepper.setCurrentPosition(0);
  yStepper.setCurrentPosition(0);
}

pinDefs.h (C/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 X_AXIS_DIR false
#define Y_AXIS_DIR false

#define MICROSTEPS 1
#define STEPS_PER_MM 160 * MICROSTEPS

Custom onderdelen en behuizingen

CAD bestand op thingiverse.com

Schema's

Plantengezondheid Beoordelen met TinyML: Een Praktische Gids

Productieproces

  1. K30 CO2-sensor: Real-time binnenluchtkwaliteitmonitoring met Arduino
  2. Communicatie voor doofblinden vergemakkelijken met 1Sheeld en Arduino
  3. Slimme spaarpot bouwen: Muntenacceptor besturen met Arduino Nano
  4. Een LED bedienen via Bluetooth met Arduino – Eenvoudige DIY Handleiding
  5. Een DFRobot Capacitieve Vingerafdruksensor integreren met Arduino of ESP8266
  6. Interactief Nextion HMI-weerstation met Arduino Mega en sensoren
  7. Arduino-gebaseerde 6-DoF Robotarm Gestoeerd met Wii Nunchuk
  8. Twee Stappenmotors Sturen met Arduino Nano & Joystick – Simpele Tutorial
  9. Accurate zonnestralingsmeting met Arduino UNO en Ethernet Shield
  10. Compact Arduino Radarsysteem met HC-SR04 Ultrasonische Sensor & 1.8" Display
  11. Maak Muzikale Tonen met Arduino: Stapsgewijze Handleiding