Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Détermination de la santé des plantes avec TinyML

Composants et fournitures

Arduino Nano 33 BLE Sense
× 1
Moteur pas à pas Digilent
× 1
Pilote Theremino DRV8825 pour moteurs pas à pas pour système Theremino
× 1

Outils et machines nécessaires

Imprimante 3D (générique)
Fer à souder (générique)

Applications et services en ligne

Microsoft VS Code
Arduino IDE
Edge Impulse Studio

À propos de ce projet

La Prémisse

Tout comme les humains, les plantes peuvent aussi devenir malades. Et tout comme vous pourriez développer une éruption cutanée à la suite d'une infection cutanée, les feuilles d'une plante peuvent devenir jaunies et/ou tachetées à cause d'un champignon ou d'un autre agent pathogène. Ainsi, en tirant parti de la puissance de l'apprentissage automatique, les couleurs peuvent être numérisées, puis utilisées pour entraîner un modèle capable de détecter le moment où la couleur d'une feuille est désactivée.

Le matériel

Le cerveau de ce projet est l'Arduino Nano 33 BLE Sense, et il a été choisi pour plusieurs raisons. Tout d'abord, il dispose d'un riche ensemble de capteurs puissants, notamment une IMU 9DoF, un APDS-9960 (couleur, geste, proximité et luminosité), un microphone et un ensemble de capteurs de température/humidité/pression. Afin de déplacer la carte autour de la feuille de la plante et de prendre des mesures, une paire de moteurs pas à pas est utilisée conjointement avec une paire de cartes de commande DRV8825.

Configuration de TinyML

Pour ce projet, les capteurs intégrés répertoriés pour l'Arduino Nano 33 BLE Sense sur Edge Impulse ne fonctionneront pas, car seuls l'accélérateur et le microphone sont répertoriés. Cela signifie que le transmetteur de données devra être utilisé à la place du démon série. Pour commencer, j'ai créé un nouveau projet et je l'ai nommé. Ensuite, j'ai installé la CLI Edge Impulse en installant Node.js et NPM, puis en exécutant npm install -g edge-impulse-cli . Vous devrez peut-être ajouter son chemin d'installation à votre variable d'environnement PATH s'il est introuvable. Ensuite, exécutez edge-impulse-data-forwarder et assurez-vous que cela fonctionne, puis utilisez Ctrl+C pour quitter.

Couleur de lecture

L'APDS-9960 lit la couleur en faisant rebondir la lumière infrarouge sur la surface et en lisant les longueurs d'onde qui ne sont pas absorbées par le matériau. Pour communiquer avec le capteur, il est préférable d'installer la librairie Arduino APDS9960, qui donne accès à plusieurs fonctions utiles. Dans le code, l'APDS-9960 est d'abord initialisé, puis les programmes entrent dans la fonction de boucle. Là, il attend qu'il y ait des données de couleur. Si une lecture est disponible, la couleur est lue avec APDS.readColor() ainsi que la proximité de la surface. Chaque composante RVB est convertie d'un nombre 0-2^16-1 en un rapport de sa valeur sur la somme.

La plate-forme de numérisation

La numérisation de la couleur d'une feuille s'effectue en déplaçant une plate-forme sur deux axes pour passer divers emplacements de la feuille sous l'APDS-9960 embarqué. Chaque axe est déplacé en tournant une vis-mère dans le sens horaire ou antihoraire pour translater un bloc dans les deux sens. L'ensemble du système a été conçu dans Fusion 360, et voici quelques rendus de la conception ci-dessous :

L'axe X repose sur l'axe Y, laissant le bloc supérieur se déplacer dans les deux axes. Il y a une roue en V supplémentaire sur l'axe Y pour supporter le poids du moteur pas à pas. Les pièces ont été imprimées à l'aide de plastique PLA avec environ 45 % de remplissage.

Collecte de données

Lorsque le système démarre pour la première fois, les moteurs pas à pas ne savent pas où ils se trouvent. Ensuite, l'APDS-9960 est initialisé. Il existe une boîte englobante définie comme deux tableaux à deux éléments contenant les coins opposés d'une boîte. Un point aléatoire est choisi entre ces deux emplacements, puis les steppers sont dirigés vers cette position tout en lisant les couleurs entre les deux.

Traitement et envoi des informations de couleur

Les couleurs sont lues avec APDS.readColor() , comme mentionné précédemment. Une fois la somme calculée, un pourcentage est calculé puis envoyé via USB en appelant le Serial.printf() méthode. Les valeurs sont séparées par des virgules et chaque lecture est séparée par un caractère de nouvelle ligne. Lorsque les données sont reçues par le programme de transfert de données, elles sont envoyées au projet cloud Edge Impulse en tant que données d'entraînement avec l'étiquette donnée (comme saine ou non saine).

Former un modèle

Une fois que toutes les données d'entraînement ont été collectées, il est temps de créer un modèle qui puisse différencier les feuilles saines des feuilles malsaines. J'ai utilisé une impulsion composée de la série temporelle à trois axes, d'un bloc d'analyse spectrale et d'un bloc Keras. Vous pouvez voir la capture d'écran ci-dessous pour savoir comment j'ai généré les fonctionnalités à partir des données :

Tests

Pour tester mon nouveau modèle, j'ai rassemblé de nouvelles données de test, cette fois d'une feuille malsaine. La précision du modèle était d'environ 63 %, et après avoir envoyé certaines fonctionnalités de test, il a été en mesure de classer correctement la feuille la plupart du temps.

Cette précision peut être améliorée en ajoutant plus de données d'entraînement et en ralentissant la vitesse d'entraînement.

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;// un emplacement aléatoire sera choisi dans le cadre de délimitationconst long boundingBox[2][2] ={ {0, 0 }, {40, 40}};void setup(){ Serial.begin(115200); while(!Série); if(!APDS.begin()) { Serial.println("Impossible d'initialiser APDS9960"); tandis que (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); somme =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("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.setPositionCurrent(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 si inversé#define X_AXIS_DIR false#define Y_AXIS MM False#_define Y_AXTE 

Pièces et boîtiers personnalisés

Pièces à imprimer en 3D
Fichier CAO sur thingverse.com

Schémas


Processus de fabrication

  1. Surveillance du CO2 avec le capteur K30
  2. Communication sourds-aveugles avec 1Sheeld/Arduino
  3. Contrôler l'accepteur de pièces avec Arduino
  4. Arduino avec Bluetooth pour contrôler une LED !
  5. Capteur d'empreintes digitales capacitif avec un Arduino ou ESP8266
  6. Jouer avec Nextion Display
  7. Bras robotique contrôlé par Nunchuk (avec Arduino)
  8. Arduino Nano :contrôler 2 moteurs pas à pas avec joystick
  9. Mesure du rayonnement solaire avec Arduino