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

De gezondheid van planten bepalen met TinyML

Componenten en benodigdheden

Arduino Nano 33 BLE Sense
× 1
Digilent stappenmotor
× 1
Theremino Driver DRV8825 voor stappenmotoren voor Theremino-systeem
× 1

Benodigde gereedschappen en machines

3D-printer (algemeen)
Soldeerbout (algemeen)

Apps en online services

Microsoft VS-code
Arduino IDE
Edge Impulse Studio

Over dit project

Het pand

Net als mensen kunnen ook planten ziek worden. En net zoals je huiduitslag kunt krijgen door een huidinfectie, kunnen de bladeren van een plant vergeeld en/of vlekkerig worden door een schimmel of een andere ziekteverwekker. Dus door gebruik te maken van de kracht van machine learning, kunnen kleuren worden gescand en vervolgens worden gebruikt om een ​​model te trainen dat kan detecteren wanneer de kleur van een blad uit is.

De hardware

Het brein van dit project is de Arduino Nano 33 BLE Sense, en het werd om verschillende redenen gekozen. Ten eerste heeft het een uitgebreide reeks krachtige sensoren, waaronder een 9DoF IMU, APDS-9960 (kleur, gebaar, nabijheid en helderheid), microfoon en een combinatie van temperatuur/vochtigheid/druksensor. Om het bord rond het blad van de plant te verplaatsen en metingen uit te voeren, wordt een paar stappenmotoren gebruikt in combinatie met een paar DRV8825-stuurprogrammaborden.

TinyML instellen

Voor dit project werken de ingebouwde sensoren die worden vermeld voor de Arduino Nano 33 BLE Sense on Edge Impulse niet, omdat alleen het gaspedaal en de microfoon worden vermeld. Dit betekent dat de data forwarder zal moeten worden gebruikt in plaats van de seriële daemon. Om te beginnen heb ik een nieuw project gemaakt en het een naam gegeven. Vervolgens installeerde ik de Edge Impulse CLI door Node.js en NPM te installeren en vervolgens npm install -g edge-impulse-cli uit te voeren . Mogelijk moet u het installatiepad toevoegen aan uw PATH-omgevingsvariabele als deze niet kan worden gevonden. Voer vervolgens edge-impulse-data-forwarder . uit en zorg ervoor dat het werkt, gebruik dan Ctrl+C om af te sluiten.

Kleur lezen

De APDS-9960 leest kleur door infrarood licht van het oppervlak te laten weerkaatsen en de golflengten te lezen die niet door het materiaal worden geabsorbeerd. Om met de sensor te communiceren, installeer je best de Arduino APDS9960-bibliotheek, die toegang geeft tot verschillende handige functies. In de code wordt de APDS-9960 eerst geïnitialiseerd en vervolgens gaan de programma's naar de lusfunctie. Daarin wacht het tot er kleurgegevens zijn. Als er een meting beschikbaar is, wordt de kleur gelezen met APDS.readColor() samen met de nabijheid van het oppervlak. Elke RGB-component wordt omgezet van een 0-2^16-1 getal in een verhouding van zijn waarde over de som.

De scaninstallatie

Het scannen van de kleur van een blad wordt bereikt door een tuig in twee assen te verplaatsen om verschillende locaties van het blad onder de ingebouwde APDS-9960 te passeren. Elke as wordt bewogen door een spindel in een beweging met de klok mee of tegen de klok in te draaien om een ​​blok in beide richtingen te verplaatsen. Het hele systeem is ontworpen in Fusion 360, en hier zijn enkele weergaven van het ontwerp hieronder:

De X-as rust bovenop de Y-as, waardoor het bovenste blok in beide assen kan bewegen. Er is een extra V-wiel op de Y-as om het gewicht van de stappenmotor te ondersteunen. Onderdelen zijn bedrukt met PLA-plastic met ongeveer 45% vulling.

Gegevens verzamelen

Wanneer het systeem voor het eerst opstart, weten de stappenmotoren niet waar ze zijn, dus de twee assen gaan naar huis door stap voor stap naar de oorsprong te gaan totdat ze de eindschakelaar raken. Vervolgens wordt de APDS-9960 geïnitialiseerd. Er is een selectiekader dat is gedefinieerd als twee arrays van twee elementen die tegenoverliggende hoeken van een kader bevatten. Er wordt een willekeurig punt gekozen tussen deze twee locaties, en dan worden de steppers naar die positie gebracht terwijl ze de kleuren ertussen lezen.

De kleurinformatie verwerken en verzenden

Kleuren worden gelezen met APDS.readColor() , zoals eerder vermeld. Nadat de som is berekend, wordt een percentage berekend en vervolgens via USB verzonden door de Serial.printf() aan te roepen methode. Waarden worden gescheiden door komma's en elke aflezing wordt gescheiden door een teken voor een nieuwe regel. Wanneer de gegevens worden ontvangen door het gegevensdoorstuurprogramma, worden ze naar het Edge Impulse-cloudproject gestuurd als trainingsgegevens met het opgegeven label (als gezond of ongezond).

Een model trainen

Nadat alle trainingsgegevens zijn verzameld, is het tijd om een ​​model te maken dat onderscheid kan maken tussen gezonde en ongezonde bladeren. Ik gebruikte een impuls bestaande uit de drie-assige tijdreeks, een spectrale analyseblok en een Keras-blok. U kunt de onderstaande schermafbeelding zien voor hoe ik de functies uit de gegevens heb gegenereerd:

Testen

Om mijn nieuwe model te testen, heb ik wat nieuwe testgegevens verzameld, dit keer van een ongezond blad. De nauwkeurigheid van het model was ongeveer 63% en na het doorsturen van enkele testfuncties was het meestal in staat om het blad correct te classificeren.

Deze nauwkeurigheid kan worden verbeterd door meer trainingsgegevens toe te voegen en de trainingssnelheid te verlagen.

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 steppers;// er wordt een willekeurige locatie gekozen binnen het selectiekaderconst long boundingBox {[2][2] ={[2][2] ={ }, {40, 40}}; ongeldige setup(){ Serial.begin(115200); while(!Serial); if(!APDS.begin()) { Serial.println("Kon APDS9960 niet starten"); terwijl(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(){ lange willekeurigePos[2]; randomPos[0] =willekeurig(boundingBox[0][0], boundingBox[1][0]) * STEPS_PER_MM; randomPos[1] =willekeurig(boundingBox[0][1], boundingBox[1][1]) * STEPS_PER_MM; steppers.moveTo(willekeurigePos); while(steppers.run()) { if(!APDS.colorAvailable() || !APDS.proximityAvailable()){} else { APDS.readColor(r, g, b, c); som =r + g + b; p =APDS.readProximity(); if(!p &&c> 10 &&sum>=0) { float rr =r / som, gr =g / som, br =b / som; Serial.printf("%1.3f,%1.3f,%1.3f\n", rr, gr, br); } } }}void homeMotors(){ // home x //Serial.println("Now homing x"); while(digitalRead(X_AXIS_HOMING_SW)) xStepper.move(-1); // home y //Serial.println ("Now homing 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 indien omgekeerd_define X_AXIS_DIR false 

Aangepaste onderdelen en behuizingen

Onderdelen voor 3D-printen
CAD-bestand op thingiverse.com

Schema's


Productieproces

  1. CO2-monitoring met K30-sensor
  2. Doofblinde communicatie met 1Sheeld/Arduino
  3. Bedien muntvangers met Arduino
  4. Arduino met Bluetooth om een ​​LED te bedienen!
  5. Capacitieve vingerafdruksensor met een Arduino of ESP8266
  6. Spelen met Nextion Display
  7. Nunchuk-gestuurde robotarm (met Arduino)
  8. Arduino Nano:bedien 2 stappenmotoren met joystick
  9. Zonnestraling meten met Arduino
  10. Mini-radar met Arduino
  11. Muziek maken met een Arduino