Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Avaliando Saúde de Plantas com TinyML: Guia Prático

Componentes e Materiais

Componente Quantidade
Arduino Nano 33 BLE Sense 1
Motor de Passo Digilent 1
Driver DRV8825 para Motores de Passo (Theremino) 1

Ferramentas Necessárias

Aplicativos e Serviços Online

Sobre o Projeto

A Premissa

Assim como humanos, plantas também adoecem. E assim como você pode desenvolver erupção cutânea por infecção, as folhas de uma planta podem ficar amareladas e/ou manchadas por fungos ou patógenos. Aproveitando machine learning, cores podem ser escaneadas e usadas para treinar modelo que detecta quando a cor da folha está anormal.

O Hardware

O cérebro é o Arduino Nano 33 BLE Sense, escolhido por seus sensores poderosos: IMU 9DoF, APDS-9960 (cor, gesto, proximidade, brilho), microfone, sensor temperatura/umidade/pressão. Para mover a placa pela folha e tomar medições, usa-se par de motores de passo com drivers DRV8825.

Configurando TinyML

Para este projeto, os sensores embutidos listados para o Nano 33 BLE Sense no Edge Impulse não funcionam (só acelerômetro e microfone listados). Por isso, usa-se o data forwarder em vez do serial daemon. Criei novo projeto, instalei Edge Impulse CLI (Node.js + NPM, depois npm install -g edge-impulse-cli), adicionei ao PATH se necessário. Rodei edge-impulse-data-forwarder para testar.

Lendo Cor

O APDS-9960 lê cor refletindo luz infravermelha na superfície e lendo comprimentos de onda não absorvidos. Para comunicar, instale a biblioteca Arduino APDS9960. No código, inicializa APDS-9960 e entra no loop. Aguarda dados de cor disponíveis. Se leitura disponível, lê cor com APDS.readColor() junto com proximidade. Cada componente RGB convertido de 0-65535 para razão do valor sobre a soma.

O Equipamento de Escaneamento

Escaneia cor da folha movendo equipamento em dois eixos para passar várias localizações da folha sob o APDS-9960. Cada eixo movido girando parafuso líder horário/anti-horário para transladar bloco. Sistema projetado no Fusion 360. Peças impressas em PLA com ~45% preenchimento.

Coletando Dados

Na inicialização, motores não sabem posição, então fazem homing movendo ao origem passo a passo até atingir fim de curso. Inicializa APDS-9960. Define bounding box com dois arrays de dois elementos (cantos opostos). Escolhe ponto aleatório entre estas localizações, move steppers para lá lendo cores no caminho.

Processando e Enviando Informações de Cor

Cores lidas com APDS.readColor(). Após calcular soma, calcula porcentagem e envia via USB com Serial.printf(). Valores separados por vírgula, cada leitura por nova linha. Data forwarder envia para projeto Edge Impulse na nuvem como dados de treino com rótulo (saudável ou não saudável).

Treinando Modelo

Após coletar dados de treino, cria modelo para diferenciar folhas saudáveis e não saudáveis. Usei impulso com série temporal de três eixos, bloco de análise espectral e bloco Keras.

Testando

Para testar, coletei novos dados de teste com folha não saudável. Precisão do modelo ~63%, classificando corretamente na maioria das vezes. Precisão pode melhorar com mais dados de treino e velocidade de treino mais lenta.

Código

leafReader.ino

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

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

Peças para Impressão 3D

Arquivo CAD disponível no Thingiverse.

Esquemático

Diagrama de ligação disponível na seção de esquemáticos.

Processo de manufatura

  1. Sensor K30 CO₂: Monitoramento de Qualidade do Ar Interno em Tempo Real
  2. Facilitando Comunicação Surdo-Cego com 1Sheeld e Arduino
  3. Mealheiro Inteligente: Controlar Aceitador de Moedas com Arduino Nano
  4. Controlar um LED via Bluetooth com Arduino – Guia DIY Simples
  5. Integrando Sensor de Impressão Digital Capacitivo DFRobot com Arduino ou ESP8266
  6. Projeto HMI Interativo com Nextion, Arduino Mega e Sensores
  7. Braço Robótico 6 GDL Controlado por Nunchuk com Arduino Mega
  8. Controle Dois Motores de Passo com Arduino Nano e Joystick – Tutorial Simples
  9. Medição Precisa de Radiação Solar com Arduino UNO e Ethernet Shield
  10. Sistema Radar Compacto com Arduino Nano, Sensor HC-SR04 e Display 1.8"