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

Evaluación de la salud de plantas con TinyML: Guía práctica

Componentes y materiales

Componente Cantidad
Arduino Nano 33 BLE Sense 1
Motor paso a paso Digilent 1
Driver DRV8825 para motores paso a paso 1

Herramientas necesarias

Aplicaciones y servicios en línea

Sobre el proyecto

La premisa

Al igual que los humanos, las plantas también enferman. Y igual que puedes desarrollar una erupción por una infección cutánea, las hojas de una planta pueden ponerse amarillas o manchadas por hongos u otros patógenos. Aprovechando el machine learning, los colores pueden escanearse y usarse para entrenar un modelo que detecte cuando el color de una hoja es anómalo.

El hardware

El cerebro es el Arduino Nano 33 BLE Sense, elegido por su rico conjunto de sensores: IMU 9DoF, APDS-9960 (color, gestos, proximidad, brillo), micrófono y sensor de temperatura/humedad/presión. Para mover la placa sobre la hoja y tomar medidas, se usan dos motores paso a paso con drivers DRV8825.

Evaluación de la salud de plantas con TinyML: Guía práctica
Evaluación de la salud de plantas con TinyML: Guía práctica

Configurando TinyML

Los sensores integrados listados para Nano 33 BLE Sense en Edge Impulse no funcionan (solo acelerómetro y micrófono están listados). Hay que usar el data forwarder en lugar del daemon serie. Pasos:

  1. Crear nuevo proyecto en Edge Impulse.
  2. Instalar Edge Impulse CLI: npm install -g edge-impulse-cli (añadir al PATH si hace falta).
  3. Ejecutar edge-impulse-data-forwarder y verificar que funciona.
Evaluación de la salud de plantas con TinyML: Guía práctica

Lectura de color

El APDS-9960 lee color rebotando luz infrarroja en la superficie y midiendo longitudes de onda no absorbidas. Se usa la librería Arduino APDS9960. En el código, se inicializa y en el loop espera datos de color. Si hay lectura, usa APDS.readColor() junto con proximidad. Cada componente RGB se convierte de 0-65535 a ratio sobre la suma.

El escáner

El escaneo de color de la hoja se logra moviendo un rig en dos ejes para pasar varias zonas de la hoja bajo el APDS-9960. Cada eje mueve un husillo en sentido horario/antihorario para trasladar un bloque. Todo diseñado en Fusion 360.

Evaluación de la salud de plantas con TinyML: Guía práctica
Evaluación de la salud de plantas con TinyML: Guía práctica
Evaluación de la salud de plantas con TinyML: Guía práctica

El eje X descansa sobre el Y, permitiendo mover el bloque superior en ambos ejes. Hay una rueda V adicional en el eje Y para soportar el peso del motor. Piezas impresas en PLA con ~45% relleno.

Evaluación de la salud de plantas con TinyML: Guía práctica

Recopilación de datos

Al inicio, los motores no saben su posición, así que hacen homing moviéndose al origen paso a paso hasta tocar el final de carrera. Luego se inicializa el APDS-9960. Se define una caja delimitadora (bounding box) con dos esquinas opuestas. Se elige un punto aleatorio dentro y los steppers se mueven allí leyendo colores en el camino.

Procesamiento y envío de información de color

Los colores se leen con APDS.readColor(). Tras calcular la suma, se calcula un porcentaje y se envía por USB con Serial.printf(). Valores separados por comas, cada lectura en nueva línea. El data forwarder los envía a Edge Impulse como datos de entrenamiento con etiqueta (sano/enfermo).

Evaluación de la salud de plantas con TinyML: Guía práctica
Evaluación de la salud de plantas con TinyML: Guía práctica

Entrenamiento del modelo

Con todos los datos de entrenamiento, se crea un modelo para diferenciar hojas sanas/enfermas. Usé un impulso con serie temporal de 3 ejes, bloque de análisis espectral y bloque Keras. Capturas muestran la generación de características.

Evaluación de la salud de plantas con TinyML: Guía práctica
Evaluación de la salud de plantas con TinyML: Guía práctica

Pruebas

Para testar, recopilé nuevos datos de hoja enferma. Precisión ~63%, clasificando correctamente la mayoría de veces. Se puede mejorar añadiendo más datos y reduciendo velocidad de entrenamiento.

Evaluación de la salud de plantas con TinyML: Guía práctica

Código

leafReader.ino

#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;

const long boundingBox[2][2] = { {0, 0}, {40, 40} };

void setup() {
  Serial.begin(115200);
  while(!Serial);
  if(!APDS.begin()) {
    Serial.println("Could not init APDS9960");
    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

#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

Partes personalizadas y envolventes

Archivos CAD para imprimir en 3D disponibles en Thingiverse.

Esquemáticos

Evaluación de la salud de plantas con TinyML: Guía práctica

Proceso de manufactura

  1. Sensor K30 CO₂: Monitorización en tiempo real de la calidad del aire interior
  2. Facilitar la comunicación sordo‑ciego usando 1Sheeld y Arduino
  3. Alcancía Inteligente: Controla un Aceptador de Monedas con Arduino Nano
  4. Controla un LED por Bluetooth con Arduino – Guía DIY paso a paso
  5. Integración del sensor de huella capacitivo DFRobot (ID809) con Arduino o ESP8266
  6. Proyecto HMI Interactivo con Nextion, Arduino Mega y Múltiples Sensores
  7. Brazo Robótico de 6 Grados de Libertad Controlado por Nunchuk con Arduino
  8. Controla Dos Motores Paso a Paso con Arduino Nano y Joystick - Tutorial Sencillo
  9. Medición Precisa de Radiación Solar con Arduino UNO y Shield Ethernet
  10. Sistema Radar Compacto con Arduino Nano, Sensor HC-SR04 y Pantalla 1.8"
  11. Genera Tonos Musicales con Arduino: Guía Paso a Paso