Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Bestimmung der Pflanzengesundheit mit TinyML

Komponenten und Verbrauchsmaterialien

Arduino Nano 33 BLE Sense
× 1
Digilent-Schrittmotor
× 1
Theremino-Treiber DRV8825 für Schrittmotoren für Theremino-System
× 1

Notwendige Werkzeuge und Maschinen

3D-Drucker (generisch)
Lötkolben (generisch)

Apps und Onlinedienste

Microsoft VS-Code
Arduino-IDE
Edge Impulse Studio

Über dieses Projekt

Die Prämisse

Genau wie Menschen können auch Pflanzen erkranken. Und genau wie bei einer Hautinfektion können die Blätter einer Pflanze durch einen Pilz oder einen anderen Krankheitserreger vergilbt und/oder fleckig werden. Durch Nutzung der Leistungsfähigkeit des maschinellen Lernens können Farben gescannt und dann verwendet werden, um ein Modell zu trainieren, das erkennt, wenn die Farbe eines Blattes nicht mehr richtig ist.

Die Hardware

Das Gehirn dieses Projekts ist der Arduino Nano 33 BLE Sense und wurde aus mehreren Gründen ausgewählt. Erstens verfügt es über einen umfangreichen Satz leistungsstarker Sensoren, darunter eine 9DoF-IMU, APDS-9960 (Farbe, Geste, Nähe und Helligkeit), Mikrofon und eine Temperatur-/Feuchtigkeits-/Drucksensor-Kombination. Um die Platine um das Blatt der Pflanze zu bewegen und Messungen durchzuführen, werden ein Paar Schrittmotoren in Verbindung mit einem Paar DRV8825-Treiberplatinen verwendet.

TinyML einrichten

Für dieses Projekt funktionieren die für den Arduino Nano 33 BLE Sense auf Edge Impulse aufgeführten eingebauten Sensoren nicht, da nur der Beschleuniger und das Mikrofon aufgeführt sind. Dies bedeutet, dass anstelle des seriellen Daemons die Datenweiterleitung verwendet werden muss. Zu Beginn habe ich ein neues Projekt erstellt und es benannt. Als nächstes installierte ich die Edge Impulse CLI, indem ich Node.js und NPM installierte und dann npm install -g edge-impulse-cli . ausführte . Möglicherweise müssen Sie den Installationspfad Ihrer PATH-Umgebungsvariablen hinzufügen, wenn sie nicht gefunden werden kann. Führen Sie als Nächstes edge-impulse-data-forwarder . aus und vergewissern Sie sich, dass es funktioniert, und verwenden Sie dann Strg+C zum Beenden.

Farbe lesen

Der APDS-9960 liest Farben, indem er Infrarotlicht von der Oberfläche reflektiert und die Wellenlängen liest, die nicht vom Material absorbiert werden. Um mit dem Sensor zu kommunizieren, installieren Sie am besten die Arduino APDS9960-Bibliothek, die Zugriff auf mehrere nützliche Funktionen bietet. Im Code wird zuerst der APDS-9960 initialisiert und dann tritt das Programm in die Schleifenfunktion ein. Dort wartet es, bis Farbdaten vorhanden sind. Wenn ein Messwert vorhanden ist, wird die Farbe mit APDS.readColor() . gelesen zusammen mit der Nähe zur Oberfläche. Jede RGB-Komponente wird von einer 0-2^16-1-Zahl in ein Verhältnis ihres Wertes zur Summe umgewandelt.

Das Scanning-Rig

Das Scannen der Farbe eines Blattes wird erreicht, indem ein Rig in zwei Achsen bewegt wird, um verschiedene Stellen des Blattes unter dem integrierten APDS-9960 zu passieren. Jede Achse wird durch Drehen einer Leitspindel im oder gegen den Uhrzeigersinn bewegt, um einen Block in eine der beiden Richtungen zu verschieben. Das gesamte System wurde in Fusion 360 entworfen, und hier sind einige Renderings des Designs unten:

Die X-Achse ruht auf der Y-Achse, sodass sich der obere Block in beiden Achsen bewegen kann. Auf der Y-Achse befindet sich ein zusätzliches V-Rad, um das Gewicht des Schrittmotors zu tragen. Die Teile wurden mit PLA-Kunststoff mit etwa 45 % Füllung gedruckt.

Sammeln von Daten

Beim ersten Start des Systems wissen die Schrittmotoren nicht, wo sie sich befinden, also fahren die beiden Achsen schrittweise zum Ursprung, bis sie den Endschalter treffen. Als nächstes wird das APDS-9960 initialisiert. Es gibt eine Begrenzungsbox, die als zwei Arrays mit zwei Elementen definiert ist, die gegenüberliegende Ecken einer Box enthalten. Zwischen diesen beiden Positionen wird ein zufälliger Punkt ausgewählt, und dann werden die Stepper zu dieser Position gefahren, während die Farben dazwischen gelesen werden.

Verarbeiten und Senden der Farbinformationen

Farben werden mit APDS.readColor() . gelesen , wie vorab erwähnt. Nachdem die Summe berechnet wurde, wird ein Prozentsatz berechnet und dann über USB gesendet, indem Serial.printf() . aufgerufen wird Methode. Die Werte werden durch Kommas getrennt, und jeder Messwert wird durch ein Zeilenumbruchzeichen getrennt. Wenn die Daten vom Datenweiterleitungsprogramm empfangen werden, werden sie als Trainingsdaten mit dem angegebenen Label (entweder als gesund oder ungesund) an das Edge Impulse Cloud-Projekt gesendet.

Ein Modell trainieren

Nachdem alle Trainingsdaten gesammelt wurden, ist es an der Zeit, ein Modell zu erstellen, das zwischen gesunden und ungesunden Blättern unterscheiden kann. Ich habe einen Impuls verwendet, der aus der dreiachsigen Zeitreihe, einem Spektralanalyseblock und einem Keras-Block besteht. Sie können den Screenshot unten sehen, um zu sehen, wie ich die Funktionen aus den Daten generiert habe:

Testen

Um mein neues Modell zu testen, habe ich einige neue Testdaten gesammelt, diesmal von einem ungesunden Blatt. Die Genauigkeit des Modells lag bei etwa 63 %, und nachdem es einige Testfunktionen durchlaufen hatte, konnte es das Blatt die meiste Zeit richtig klassifizieren.

Diese Genauigkeit kann verbessert werden, indem mehr Trainingsdaten hinzugefügt und die Trainingsgeschwindigkeit verlangsamt werden.

Code

  • 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-Stepper;// eine zufällige Position wird innerhalb der Begrenzungsbox gewähltconst long BoundingBox[2][2] ={ {0, 0 }, {40, 40}};void setup () { Serial.begin (115200); while(!Seriell); if (!APDS.begin ()) {Serial.println ( "Konnte APDS9960 nicht initieren"); während(1); } pinMode (X_AXIS_HOMING_SW, INPUT_PULLUP); pinMode (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();}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); Summe =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 () {// home x // Serial.println ( "Jetzt homing x"); while(digitalRead(X_AXIS_HOMING_SW)) xStepper.move(-1); // home y //Serial.println("Jetzt referenziere 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// true wenn invertiert#define X_AXIS_DIRMIC 1#define YPSMIC false#define YSTEPAX 

Kundenspezifische Teile und Gehäuse

Teile für den 3D-Druck
CAD-Datei auf thingiverse.com

Schaltpläne


Herstellungsprozess

  1. CO2-Überwachung mit K30-Sensor
  2. taubblinde Kommunikation mit 1Sheeld/Arduino
  3. Münzprüfer mit Arduino steuern
  4. Arduino mit Bluetooth zur Steuerung einer LED!
  5. Kapazitiver Fingerabdrucksensor mit einem Arduino oder ESP8266
  6. Mit Nextion Display spielen
  7. Nunchuk-gesteuerter Roboterarm (mit Arduino)
  8. Arduino Nano:Steuerung von 2 Schrittmotoren mit Joystick
  9. Messung der Sonneneinstrahlung mit Arduino
  10. Mini-Radar mit Arduino