Torreta AI con XIAO ESP32S3 Sense

Plataforma de visión artificial y seguimiento (tracking Pan/Tilt) en dos ejes basada en la Seeed XIAO ESP32S3 Sense, ejecutando inferencia en el borde (Edge AI) con un modelo entrenado en Edge Impulse y activación manual de mecanismo de prueba.

Dificultad: avanzada Visión Artificial + IA XIAO ESP32S3 Edge Impulse Pan / Tilt
Ejes
2 (Pan / Tilt)
MCU
Seeed XIAO ESP32S3
Cámara
OV2640 (160×120 QQVGA)
Rev
1.0

Demostración en video

Cómo funciona

Este proyecto combina visión artificial en tiempo real y robótica de precisión en un factor de forma ultra compacto:

1. Captura y procesamiento visual: La cámara integrada del módulo Sense captura fotogramas continuos en formato RGB565 (160×120 píxeles). La función fmt2rgb888() convierte el búfer a RGB888 sin compresión JPEG, y el SDK de Edge Impulse realiza el recorte e interpolación necesarios para alimentar la red neuronal.

2. Inferencia en el borde (Edge AI): El microprocesador dual-core ESP32-S3 corre el modelo de detección de objetos (bounding boxes) directamente en local. El modelo busca etiquetas específicas (como "Ricardo"). Cuando detecta el objetivo con suficiente certeza, calcula el centro de la caja delimitadora respecto al centro del encuadre óptico.

3. Algoritmo de Tracking suavizado: Para evitar vibraciones bruscas o jitter en los servomotores, las coordenadas pasan por un filtro pasa-bajas exponencial (alpha = 0.35). Si el objetivo sale de la zona muerta (DEADZONE_PX = 5), el algoritmo calcula los pasos de corrección angular (stepX, stepY) y posiciona suavemente los servos Pan y Tilt para mantener el objetivo en el centro.

4. Activación manual del mecanismo: Por diseño y seguridad, el firmware no vincula automáticamente el disparo o activación del mecanismo con la detección visual. La activación del servo continuo auxiliar se realiza únicamente de forma manual mediante un botón físico conectado a GPIO4 o enviando la tecla F por el Monitor Serial (activación controlada durante 2 segundos).

Ver diagrama de conexión → Descargar código (.ino) ☕ Invítame un café

Lista de materiales

Cant.ComponenteNotas
1Seeed Studio XIAO ESP32S3 SenseMicrocontrolador con placa de expansión de cámara y micrófono
2Servomotores estándar (SG90 o MG90S)Para el movimiento de los ejes Pan (horizontal) y Tilt (vertical)
1Servo de rotación continua (o actuador equivalente)Para el mecanismo auxiliar de prueba de 2 segundos
1Fuente de alimentación externa 5V (2A+)Para alimentar exclusivamente los servomotores (¡nunca desde el pin 3.3V!)
1Pulsador momentáneoBotón de activación manual (GPIO4 hacia GND)
1Estructura mecánica Pan/TiltPiezas impresas en 3D o soporte comercial para 2 servos
Cables Dupont hembra-macho / protoboardPara interconexión de señales y tierra común

Diagrama de Cableado y Fuentes de Voltaje

Separación de la alimentación lógica (USB-C de la XIAO) y la alimentación de potencia (fuente externa de 5V 2A+ para los servomotores), compartiendo la línea de tierra común (GND):

SEEED XIAO ESP32S3 SENSE CÁMARA OV2640 D0 / GPIO1 Pan (X) D1 / GPIO2 Tilt (Y) D2 / GPIO3 Gatillo D3 / GPIO4 Botón manual 5V (USB-In) GND 3V3 (¡No Servos!) PUERTO USB-C BOTÓN ACTIVACIÓN MANUAL Pulsador momentáneo (2 s) Pin D3 GND FUENTE EXTERNA DE 5V Adaptador 5V 2A / 3A (Servos) +5V (VCC) GND (-) BUS +5V (ALIMENTACIÓN SERVOS) BUS GND (TIERRA COMÚN) SERVO X — PAN (HORIZONTAL) Giro lateral de torreta (SG90 / MG90S) SIG (Naranja): D0 5V (Rojo) GND SERVO Y — TILT (VERTICAL) Inclinación arriba/abajo (SG90 / MG90S) SIG (Amarillo): D1 5V (Rojo) GND SERVO GATILLO (ROTACIÓN CONTINUA) Mecanismo auxiliar de prueba (2 s) SIG (Naranja): D2 5V (Rojo) GND CÓDIGO DE COLORES Y SEÑALES: Señal Servo X (D0 / GPIO1) Señal Servo Y (D1 / GPIO2) Señal Gatillo (D2 / GPIO3) Botón Manual (D3 / GPIO4) Línea +5V Externa (Potencia) Tierra Común (GND de fuente + GND de XIAO)
Abrir plano de cableado completo y tabla de voltajes →

Paso a Paso: Entrenamiento del Modelo en Edge Impulse

Edge Impulse permite entrenar redes neuronales optimizadas para microcontroladores (TinyML) de forma 100% gratuita. Sigue este procedimiento para crear tu propio modelo de detección:

  1. 1. Crear proyecto en Edge Impulse: Regístrate gratis en edgeimpulse.com y crea un nuevo proyecto. En el asistente inicial, selecciona el tipo de proyecto: ImagesObject Detection (Bounding Boxes).
  2. 2. Recolección del Dataset (Imágenes): Tienes dos formas sumamente sencillas de recolectar las fotos para entrenar:
    • Con la Seeed XIAO ESP32S3 Sense vía WebUSB: Conecta tu placa a la PC por USB-C y accede a la herramienta web oficial de Seeed Studio: SenseCraft AI o a la pestaña Devices → Connect via WebUSB en Edge Impulse para capturar fotos en vivo directo con la cámara OV2640.
    • Con tu teléfono celular: En Edge Impulse ve a Devices → Connect a mobile phone y escanea el código QR. Tu teléfono se convertirá en una cámara conectada al proyecto.
    Consejo: Captura entre 50 y 100 fotos de la persona ("Ricardo") y objetos secundarios ("Tel*"), variando las distancias, ángulos e iluminación del entorno.
  3. 3. Etiquetado (Labeling Queue): Ve a Data acquisition → Labeling queue. En cada fotografía, dibuja con el mouse un recuadro (bounding box) sobre el rostro o la persona y asígnale la etiqueta Ricardo. Si tienes objetos secundarios, etiquétalos como Tel.
  4. 4. Diseñar el Impulse (Arquitectura FOMO): En el menú lateral ve a Create Impulse:
    • Image data: Ajusta el tamaño de entrada a 160 × 120 (o 96 × 96) píxeles. En Color depth selecciona RGB.
    • Processing block: Agrega el bloque Image.
    • Learning block: Agrega Object Detection (Images).
    En la configuración del bloque de detección, selecciona el modelo FOMO (Faster Objects, More Objects) con MobileNetV2 0.35. FOMO es un avance clave para microcontroladores: consume hasta 30 veces menos memoria RAM que YOLO o SSD MobileNet, permitiendo procesar más de 15 fotogramas por segundo en tiempo real en la XIAO.
  5. 5. Entrenar y Validar la Red: Ve a Object detection → Parameters, deja 60 epochs y un Learning Rate de 0.001. Haz clic en Start training. Una vez completado, revisa la matriz de confusión y el F1-Score (debe superar el 85-90%). Luego ve a Model testing para validar el modelo con imágenes de prueba.
  6. 6. Exportar como Biblioteca de Arduino: Ve a la pestaña Deployment. En la sección Search deployment options selecciona Arduino library. Activa el optimizador EON Compiler (reduce el consumo de memoria a la mitad) y haz clic en el botón Build al final de la página. Se descargará un archivo comprimido .ZIP (por ejemplo, nadaquehacer-project-1_inferencing.zip).

Carga y Configuración en Arduino IDE

Sigue estos pasos para instalar el firmware exportado y flashear tu Seeed XIAO ESP32S3 Sense:

  1. Instalar la biblioteca de Edge Impulse: Abre Arduino IDE y dirígete al menú Programa → Incluir biblioteca → Añadir biblioteca .ZIP... y selecciona el archivo .ZIP que descargaste de Edge Impulse.
  2. Instalar la biblioteca de servomotores: En el Gestor de Bibliotecas (Ctrl + Shift + I) busca e instala ESP32Servo (por Kevin Harrington).
  3. Ajustes obligatorios de la placa Seeed XIAO ESP32S3: En el menú Herramientas, asegúrate de configurar los siguientes parámetros con precisión:
    • Placa: Seeed XIAO ESP32S3 (del paquete esp32 de Espressif).
    • PSRAM: "OPI PSRAM" (¡Crítico! La cámara OV2640 y los búferes de inferencia neuronal requieren la memoria PSRAM externa. Si está desactivada, la placa se reiniciará en bucle).
    • Flash Size: 8MB (64Mb).
    • USB CDC On Boot: "Enabled" (permite que los mensajes de diagnóstico y coordenadas salgan directamente por el puerto USB-C hacia el Monitor Serial).
    • Upload Speed: 921600.
  4. Verificar nombre del Header y Subir: Abre el archivo torreta_ai_esp32s3.ino. Revisa que la primera línea de inclusión (#include <nadaquehacer-project-1_inferencing.h>) coincida exactamente con el nombre de tu proyecto en Edge Impulse. Conecta tu XIAO por USB-C, selecciona el puerto COM detectado y presiona Subir (Upload).

Código fuente (Arduino)

El sketch completo gestiona la inicialización de la cámara OV2640, el clasificador de Edge Impulse, la cinemática de los servos y el temporizador no bloqueante del mecanismo de prueba.

torreta_ai_esp32s3.ino (Código fuente completo)
// --- Asignación de pines y parámetros principales ---
#define PIN_SERVO_X       1  // D0 (Pan)
#define PIN_SERVO_Y       2  // D1 (Tilt)
#define PIN_GATILLO       3  // D2 (Servo continuo / mecanismo)
#define PIN_BOTON_FIRE    4  // Botón manual a GND

#define UMBRAL_DISPARO    0.70f
#define DEADZONE_PX       5      // Zona muerta en píxeles
#define MAX_STEP_DEG      4      // Grados máximos por ciclo de tracking
#define DISPARO_MS        2000   // Duración de activación manual (2 segundos)

// Algoritmo de suavizado con filtro exponencial (alpha = 0.35)
objetivoX_f = alpha * objetivoX + (1.0f - alpha) * objetivoX_f;
objetivoY_f = alpha * objetivoY + (1.0f - alpha) * objetivoY_f;

Calibración y resolución de problemas

  1. Calibración del punto neutro (STOP): Para el servo de rotación continua, la posición de parada puede no ser exactamente 90°. Ajusta SERVO_CONT_STOP en valores entre 85° y 95° hasta encontrar el reposo absoluto.
  2. Reinicio espontáneo al mover servos: Ocurre cuando los servomotores se alimentan del mismo pin de la XIAO o sufren caídas de tensión. Alimenta siempre los servos desde una fuente externa de 5V de al menos 2A y une sus tierras (GND común).
  3. Error en fmt2rgb888: Asegúrate de que el frame de la cámara esté fijado en FRAMESIZE_QQVGA (160×120) y que img_converters.h esté incluido.
  4. Seguridad de funcionamiento: Realiza siempre las primeras pruebas con el mecanismo desacoplado de cualquier proyectil o carga mecánica peligrosa.

Recursos y Enlaces Relacionados

Documentación técnica, plataformas y herramientas para entrenar y cargar la IA:

☕ Apoya este proyecto (Invítame un café)

¿Te gustó este desarrollo de visión artificial con la XIAO ESP32S3 y Edge Impulse? Todo el diseño, pruebas de redes neuronales y código libre requieren muchas horas de experimentación. Si este proyecto te sirve o te inspira, ¡un café es una magnífica forma de apoyar el canal!

$20 MXN $50 MXN $100 MXN Monto libre
☕ Invitar un café (Apoyar) →