DÍA 263 DE 365

Fase 5: Diseño Industrial y Proyecto Final

📖 Teoría a Estudiar

El Paradigma Edge AI y TinyML

Una bomba industrial de Gas LP tiene rodamientos mecánicos. Cuando estos rodamientos empiezan a desgastarse por falta de lubricación, no fallan de un segundo a otro. Comienzan a generar micro-vibraciones en frecuencias específicas (Ej. 400 Hz) que el oído humano no percibe, pero un Acelerómetro MEMS sí.

El Error Común: Intentar enviar las lecturas puras del acelerómetro XYZ (miles de floats por segundo) a la nube. Si la planta no tiene internet, te quedas ciego. Y el servidor de AWS te cobraría una fortuna por Ingesta de Datos (Data Ingestion).

La Solución Industrial (TinyML): Usamos herramientas como TensorFlow Lite for Microcontrollers (TFLM) o Edge Impulse. Entrenamos el modelo en Python usando computadoras potentes, lo Cuantizamos a INT8 (convertimos los pesados números flotantes de la red neuronal en enteros de 8 bits), y lo exportamos como un simple archivo .c y .h. El STM32 ya no envía gigabytes de vibración; solo analiza los datos localmente y envía un mensaje MQTT de 10 bytes: {"Alarma": "Rodamiento desgastado 87%"}.

El Flujo (Pipeline) de Mantenimiento Predictivo

  1. Muestreo (Sampling): El STM32 lee el Acelerómetro vía SPI a 1000 Hz durante 1 segundo, creando una "Ventana" (Window) temporal en la RAM.
  2. DSP (Procesamiento de Señal): Antes de la IA, usamos la FFT (Transformada Rápida de Fourier) para convertir el tiempo en frecuencias. Las Redes Neuronales son terribles con datos crudos ruidosos, pero son mágicas interpretando picos de frecuencia.
  3. Inferencia: Pasamos el espectro de frecuencias a la Red Neuronal (clasificador de anomalías).
  4. Acción: El modelo nos devuelve un porcentaje. Si supera el umbral, iluminamos la Baliza Ámbar (Mantenimiento) y enviamos el reporte a AWS.
PIPELINE DE MANTENIMIENTO PREDICTIVO (TINYML EN EL BORDE) ENTORNO FÍSICO Motor / Bomba IMU SPI STM32 MCU (EDGE COMPUTING) 1. DMA Sampling Ventana: 1 Segundo (1000 muestras XYZ) 2. Bloque DSP CMSIS-DSP FFT Análisis Espectral 3. TFLite Micro 4. Clasificación y Toma de Decisiones Sano: 12% Desgaste Eje: 88% IF > 80% DISPARAR ALERTA AWS IOT CORE {"err": "BEARING_WEAR", "conf": 0.88} HMI LOCAL BALIZA AMBAR

⚙️ Ejercicios Prácticos

El Hardware IMU (Unidad de Medición Inercial): No conectaremos sensores de juguete como el MPU6050 (que se satura rápido y es ruidoso). Para mantenimiento predictivo industrial se usa un sensor como el ISM330DHCX de STMicroelectronics, que posee un ancho de banda altísimo y se monta directamente sobre la carcasa del motor o la bomba mediante un tornillo, conectándose a la PCB principal vía un bus SPI protegido diferencialmente.

Ejercicio 1: La Tarea de Inferencia C/C++ (FreeRTOS). Las librerías de Edge Impulse o TFLM generan un paquete de código fuente que se compila junto con tu programa C. Programaremos el Hilo de FreeRTOS que toma la ventana de datos, invoca a la Red Neuronal, y actúa según el nivel de confianza.


/**
 * @file task_tinyml_predictive.cpp
 * @brief Inferencia de Mantenimiento Predictivo (TinyML / Edge Impulse Wrapper)
 */

// NOTA: TinyML suele requerir compilador C++ (g++), por eso este archivo es .cpp
#include "stm32f401xe.h"
#include "cmsis_os2.h"
#include <stdint.h>

// Inclusión de las librerías generadas por Edge Impulse / TFLM
#include "edge-impulse-sdk/classifier/ei_run_classifier.h"

// =========================================================================
// DEFINICIONES DE LA VENTANA DE DATOS
// =========================================================================
// El modelo fue entrenado con ventanas de 1 segundo a 100Hz = 100 muestras XYZ
#define SAMPLES_PER_WINDOW      (100U)
#define AXES_COUNT              (3U) // X, Y, Z
#define TOTAL_FEATURES          (SAMPLES_PER_WINDOW * AXES_COUNT) // 300 flotantes

// Buffer global donde el DMA de SPI depositará las muestras crudas
// En un sistema real, usamos "Ping-Pong Buffers" para no bloquear la lectura
float raw_vibration_features[TOTAL_FEATURES];

// Dependencias externas
extern void Balizas_Activar_Mantenimiento(void);
extern void MQTT_Encolar_Alerta(const char* alerta, float confianza);
extern bool Sensor_IMU_Leer_Ventana(float* buffer);

// =========================================================================
// CALLBACK WRAPPER PARA EL CLASIFICADOR
// =========================================================================
/**
 * @brief El motor de TinyML usará esta función para extraer secuencialmente
 *        los datos de nuestro buffer de RAM.
 */
int get_signal_data(size_t offset, size_t length, float *out_ptr) {
    for (size_t i = 0; i < length; i++) {
        out_ptr[i] = raw_vibration_features[offset + i];
    }
    return 0; // 0 significa éxito
}

// =========================================================================
// TAREA RTOS (EL CEREBRO DEL BORDE)
// =========================================================================
/**
 * @brief Tarea de baja prioridad. Toma datos, extrae características (FFT) 
 *        y corre la red neuronal para detectar anomalías en la bomba de gas.
 */
void Task_TinyML_Predictive(void *argument) {
    
    // 1. Estructura de señal y resultado esperada por el SDK
    signal_t signal;
    ei_impulse_result_t result = {0};
    
    // Lazo infinito de RTOS
    for(;;) {
        
        // 2. Esperar a que el Hardware SPI+DMA llene la ventana de 1 segundo.
        // Esto es bloqueante: el RTOS suspende esta tarea hasta que haya datos nuevos.
        if (Sensor_IMU_Leer_Ventana(raw_vibration_features)) {
            
            // Asignar el callback a la señal
            signal.total_length = TOTAL_FEATURES;
            signal.get_data = &get_signal_data;
            
            // 3. LA INFERENCIA MAGISTRAL
            // Este es el momento donde la Red Neuronal (Cortex-M4 DSP) ejecuta 
            // miles de multiplicaciones de matrices (MAC) en milisegundos.
            // true = habilitar impresiones de debug (falso en prod).
            EI_IMPULSE_ERROR res = run_classifier(&signal, &result, false);
            
            if (res == EI_IMPULSE_OK) {
                
                // 4. ANÁLISIS DEL RESULTADO (Clasificador Softmax)
                // El modelo nos devuelve un arreglo de probabilidades que suman 1.0 (100%)
                // Suponemos que la clase 0 = Normal, Clase 1 = Falla de Rodamiento
                
                float prob_normal = result.classification[0].value;
                float prob_falla  = result.classification[1].value;
                
                // Si la red neuronal está más de 85% segura de que la máquina se va a romper...
                if (prob_falla > 0.85f) {
                    
                    // ACCIÓN INMEDIATA SIN INTERNET
                    Balizas_Activar_Mantenimiento(); // Día 248: Luz Ámbar Poka-Yoke
                    
                    // ESCALAMIENTO CLOUD
                    MQTT_Encolar_Alerta("WARN_BEARING_WEAR", prob_falla);
                    
                    // Enfriamiento: Dormir la tarea un buen rato para no saturar 
                    // de alertas la nube por el mismo problema.
                    osDelay(pdMS_TO_TICKS(60000U)); // Dormir 1 minuto
                }
            }
        }
        
        // Si no hay datos, o ya procesamos, ceder CPU
        osDelay(pdMS_TO_TICKS(100U));
    }
}
        

🚀 Avance del Proyecto Tesis: Despachador de Gas LP

Objetivo del día: Transición de Mantenimiento Reactivo a Predictivo mediante IA Descentralizada.

Imagina a tu cliente, el dueño de una red de 50 gasolineras corporativas. Su mayor pérdida económica no es el robo de gas; es el Tiempo de Inactividad (Downtime). Si la bomba principal se quiebra en un viernes de quincena, perderá miles de dólares en ventas durante todo el fin de semana esperando un repuesto.

Al incrustar una Red Neuronal Convolucional (CNN) Cuantizada directamente en el STM32 (TinyML), has transformado un "tubo de acero con válvulas" en una entidad consciente de su propio deterioro mecánico. La máquina ya no envía gigabytes de ruido al servidor; extrae silenciosamente la FFT de las vibraciones, pasa la matriz por los pesos matemáticos incrustados en su Flash y, al detectar un patrón de desgaste incipiente, levanta la mano. El dueño recibe una alerta de AWS el lunes por la mañana: "Bomba Estación 14: 88% probabilidad de fallo en 7 días". Puede agendar el mantenimiento preventivo el martes a las 3:00 AM, evitando la detención del servicio. Este es el diferenciador que separa a un proyecto escolar del equipo más caro del catálogo industrial.

📝 Resumen del Día