Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Determinación de la salud de una planta con TinyML

Componentes y suministros

Arduino Nano 33 BLE Sense
× 1
Motor paso a paso Digilent
× 1
Controlador Theremino DRV8825 para motores paso a paso para sistema Theremino
× 1

Herramientas y máquinas necesarias

Impresora 3D (genérica)
Soldador (genérico)

Aplicaciones y servicios en línea

Microsoft VS Code
Arduino IDE
Edge Impulse Studio

Acerca de este proyecto

La premisa

Al igual que los humanos, las plantas también pueden enfermarse. Y al igual que puede desarrollar un sarpullido por una infección de la piel, las hojas de una planta pueden volverse amarillentas y / o manchadas por un hongo u otro patógeno. Entonces, al aprovechar el poder del aprendizaje automático, los colores se pueden escanear y luego usar para entrenar un modelo que puede detectar cuando el color de una hoja está apagado.

El hardware

El cerebro de este proyecto es el Arduino Nano 33 BLE Sense, y fue elegido por varias razones. Primero, tiene un rico conjunto de sensores potentes, que incluyen una IMU de 9DoF, APDS-9960 (color, gesto, proximidad y brillo), micrófono y un combo de sensor de temperatura / humedad / presión. Para mover la placa alrededor de la hoja de la planta y tomar medidas, se utilizan un par de motores paso a paso junto con un par de placas de controlador DRV8825.

Configuración de TinyML

Para este proyecto, los sensores incorporados enumerados para Arduino Nano 33 BLE Sense en Edge Impulse no funcionarán, ya que solo se enumeran el acelerador y el micrófono. Esto significa que se deberá utilizar el reenviador de datos en lugar del demonio en serie. Para empezar, creé un nuevo proyecto y lo nombré. A continuación, instalé la CLI de Edge Impulse instalando Node.js y NPM, y luego ejecuté npm install -g edge-impulse-cli . Es posible que deba agregar su ruta de instalación a su variable de entorno PATH si no se puede encontrar. A continuación, ejecute edge-impulse-data-forwarder y asegúrese de que funcione, luego use Ctrl + C para salir.

Color de lectura

El APDS-9960 lee el color haciendo rebotar la luz infrarroja en la superficie y leyendo las longitudes de onda que no son absorbidas por el material. Para comunicarse con el sensor, es mejor instalar la biblioteca Arduino APDS9960, que da acceso a varias funciones útiles. En el código, el APDS-9960 se inicializa primero y luego los programas ingresan a la función de bucle. Allí, espera hasta que haya datos de color. Si hay una lectura disponible, el color se lee con APDS.readColor () junto con la proximidad a la superficie. Cada componente RGB se convierte de un número 0-2 ^ 16-1 en una proporción de su valor sobre la suma.

La plataforma de escaneo

El escaneo del color de una hoja se logra moviendo un equipo en dos ejes para pasar varias ubicaciones de la hoja debajo del APDS-9960 a bordo. Cada eje se mueve girando un tornillo de avance en sentido horario o antihorario para trasladar un bloque en cualquier dirección. Todo el sistema fue diseñado en Fusion 360, y aquí hay algunas versiones del diseño a continuación:

El eje X descansa sobre el eje Y, dejando que el bloque superior se mueva en ambos ejes. Hay una rueda en V adicional en el eje Y para soportar el peso del motor paso a paso. Las piezas se imprimieron con plástico PLA con un relleno de alrededor del 45%.

Recopilación de datos

Cuando el sistema se inicia por primera vez, los motores paso a paso no saben dónde están, por lo que los dos ejes se mueven al origen paso a paso hasta que alcanzan el interruptor de límite. A continuación, se inicializa el APDS-9960. Hay un cuadro delimitador que se define como dos matrices de dos elementos que contienen esquinas opuestas de un cuadro. Se elige un punto aleatorio entre estas dos ubicaciones, y luego se ejecutan los pasos a esa posición mientras se leen los colores intermedios.

Procesamiento y envío de la información de color

Los colores se leen con APDS.readColor () , como se mencionó anteriormente. Una vez calculada la suma, se calcula un porcentaje y luego se envía a través de USB llamando al Serial.printf () método. Los valores están separados por comas y cada lectura está separada por un carácter de nueva línea. Cuando el programa de reenvío de datos recibe los datos, se envían al proyecto en la nube de Edge Impulse como datos de entrenamiento con la etiqueta dada (ya sea en buen estado o en mal estado).

Entrenamiento de un modelo

Una vez que se hayan recopilado todos los datos de entrenamiento, es hora de crear un modelo que pueda diferenciar entre hojas saludables y no saludables. Usé un impulso compuesto por la serie de tiempo de tres ejes, un bloque de análisis espectral y un bloque de Keras. Puede ver la captura de pantalla a continuación para ver cómo generé las características a partir de los datos:

Probando

Para probar mi nuevo modelo, reuní algunos datos de prueba nuevos, esta vez de una hoja enferma. La precisión del modelo fue de alrededor del 63% y, después de enviar algunas funciones de prueba, pudo clasificar correctamente la hoja la mayor parte del tiempo.

Esta precisión se puede mejorar agregando más datos de entrenamiento y disminuyendo la velocidad de entrenamiento.

Código

  • leafReader.ino
  • pinDefs.h
leafReader.ino C / C ++
 #include  #include  #include  #include "pinDefs.h" int r, g, b, c, p; suma flotante; AccelStepper xStepper (AccelStepper::DRIVER, STEPPER_1_STEP, STEPPER_1_DIR); AccelStepper yStepper (AccelStepper ::DRIVER, STEPPER_2_STEP, STEPPER_2_DIR); Steppers de MultiStepper; // se elegirá una ubicación aleatoria dentro del cuadro delimitadorconst long boundingBox [2] [0] }, {40, 40}}; configuración vacía () {Serial.begin (115200); mientras (! Serial); if (! APDS.begin ()) {Serial.println ("No se pudo iniciar APDS9960"); mientras (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 ();} bucle vacío () {posiciones aleatorias largas [2]; randomPos [0] =aleatorio (delimitador [0] [0], delimitador [1] [0]) * STEPS_PER_MM; randomPos [1] =aleatorio (delimitador [0] [1], delimitador [1] [1]) * STEPS_PER_MM; steppers.moveTo (randomPos); while (steppers.run ()) {if (! APDS.colorAvailable () ||! APDS.proximityAvailable ()) {} else {APDS.readColor (r, g, b, c); suma =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 () {// inicio x //Serial.println("Now homing x "); while (digitalRead (X_AXIS_HOMING_SW)) xStepper.move (-1); // inicio y //Serial.println("Now homing y "); 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 // verdadero si está invertido # define X_AXISDIR_STEP_STEP 4 # define STEPPER_2_DIR 5 # define X_AXIS_HOMING_SW 7 // verdadero si está invertido # define X_AXISDIR_STEP_STEP_160 # definir falso 

Piezas y carcasas personalizadas

Piezas para imprimir en 3D
Archivo CAD en thingiverse.com

Esquemas


Proceso de manufactura

  1. Monitoreo de CO2 con sensor K30
  2. Comunicación para personas sordociegas con 1Sheeld / Arduino
  3. Controlar el aceptador de monedas con Arduino
  4. ¡Arduino con Bluetooth para controlar un LED!
  5. Sensor capacitivo de huellas dactilares con Arduino o ESP8266
  6. Jugando con Nextion Display
  7. Brazo robótico controlado por Nunchuk (con Arduino)
  8. Arduino Nano:Controla 2 motores paso a paso con joystick
  9. Medición de la radiación solar con Arduino
  10. Mini radar con Arduino
  11. Cómo hacer música con un Arduino