Skip to main content

Usando XIAO ESP32S3 Sense como un Sensor de IA con SenseCraft AI

Esta wiki proporciona una guía paso a paso sobre cómo configurar la salida de un modelo en SenseCraft AI y usar el XIAO ESP32S3 Sense como un sensor de IA. Siguiendo estas instrucciones, aprenderás cómo conectar el XIAO ESP32S3 Sense a tu computadora, seleccionar el método de salida apropiado y recuperar los datos del modelo usando diferentes protocolos de comunicación como UART, I2C y SPI.

Prerrequisitos

Antes de proceder, asegúrate de tener lo siguiente:

  • XIAO ESP32S3 Sense
  • Una placa XIAO adicional (ej., XIAO ESP32C3) para recibir los datos del modelo
  • Cable de datos USB-C para conectar el XIAO ESP32S3 Sense a tu computadora
  • Arduino IDE con la librería Seeed_Arduino_SSCMA instalada
XIAO ESP32S3 Sense

Paso 1. Acceder al Espacio de Trabajo de SenseCraft AI Vision y conectar el XIAO ESP32S3 Sense

Abre tu navegador web y navega a la página del Espacio de Trabajo de SenseCraft AI Vision.


Selecciona la placa XIAO ESP32S3 Sense de los dispositivos disponibles.

Usando el cable USB-C, conecta tu placa XIAO ESP32S3 Sense a tu computadora. Una vez conectada, haz clic en el botón Conectar ubicado en la esquina superior izquierda de la página del Espacio de Trabajo de SenseCraft AI Vision.

Paso 2. Asegurar que un Modelo esté Cargado en el XIAO ESP32S3 Sense

Antes de continuar, asegúrate de que tu placa XIAO ESP32S3 Sense tenga un modelo entrenado cargado. Si aún no has cargado un modelo, consulta la documentación de SenseCraft AI sobre cómo entrenar e implementar modelos en tu dispositivo.

Si quieres usar tu propio modelo entrenado, puedes consultar los siguientes dos Wikis.

Paso 3. Preparar la forma y el programa que quieres usar

XIAO soporta la salida de resultados del modelo vía UART, IIC o SPI, puedes elegir cómo quieres obtener los resultados según la situación actual.

Opción 1. Comunicación UART

Conecta los pines TX y RX de las dos placas XIAO juntos. Para el Sensor AI (ya modelado) XIAO ESP32S3 Sense, los pines de salida se definen como:

  • TX: GPIO43
  • RX: GPIO44

Descarga la librería Seeed_Arduino_SSCMA de GitHub y agrégala a tu entorno de Arduino.


Usa el código del siguiente ejemplo:

note

Configura la velocidad de baudios a 921600 con 8 bits de datos, sin paridad, y 1 bit de parada (8N1).

#include <Seeed_Arduino_SSCMA.h>

#ifdef ESP32
#include <HardwareSerial.h>

// Define two Serial devices mapped to the two internal UARTs
HardwareSerial atSerial(0);

#else
#define atSerial Serial1
#endif

SSCMA AI;

void setup()
{
Serial.begin(9600);
AI.begin(&atSerial);
}

void loop()
{
if (!AI.invoke(1,false,true))
{
Serial.println("invoke success");
Serial.print("perf: prepocess=");
Serial.print(AI.perf().prepocess);
Serial.print(", inference=");
Serial.print(AI.perf().inference);
Serial.print(", postpocess=");
Serial.println(AI.perf().postprocess);

for (int i = 0; i < AI.boxes().size(); i++)
{
Serial.print("Box[");
Serial.print(i);
Serial.print("] target=");
Serial.print(AI.boxes()[i].target);
Serial.print(", score=");
Serial.print(AI.boxes()[i].score);
Serial.print(", x=");
Serial.print(AI.boxes()[i].x);
Serial.print(", y=");
Serial.print(AI.boxes()[i].y);
Serial.print(", w=");
Serial.print(AI.boxes()[i].w);
Serial.print(", h=");
Serial.println(AI.boxes()[i].h);
}
for (int i = 0; i < AI.classes().size(); i++)
{
Serial.print("Class[");
Serial.print(i);
Serial.print("] target=");
Serial.print(AI.classes()[i].target);
Serial.print(", score=");
Serial.println(AI.classes()[i].score);
}
for (int i = 0; i < AI.points().size(); i++)
{
Serial.print("Point[");
Serial.print(i);
Serial.print("]: target=");
Serial.print(AI.points()[i].target);
Serial.print(", score=");
Serial.print(AI.points()[i].score);
Serial.print(", x=");
Serial.print(AI.points()[i].x);
Serial.print(", y=");
Serial.println(AI.points()[i].y);
}
for (int i = 0; i < AI.keypoints().size(); i++)
{
Serial.print("keypoint[");
Serial.print(i);
Serial.print("] target=");
Serial.print(AI.keypoints()[i].box.target);
Serial.print(", score=");
Serial.print(AI.keypoints()[i].box.score);
Serial.print(", box:[x=");
Serial.print(AI.keypoints()[i].box.x);
Serial.print(", y=");
Serial.print(AI.keypoints()[i].box.y);
Serial.print(", w=");
Serial.print(AI.keypoints()[i].box.w);
Serial.print(", h=");
Serial.print(AI.keypoints()[i].box.h);
Serial.print("], points:[");
for (int j = 0; j < AI.keypoints()[i].points.size(); j++)
{
Serial.print("[");
Serial.print(AI.keypoints()[i].points[j].x);
Serial.print(",");
Serial.print(AI.keypoints()[i].points[j].y);
Serial.print("],");
}
Serial.println("]");
}
if(!AI.last_image().isEmpty())
{
Serial.print("Last image:");
Serial.println(AI.last_image().c_str());
}
}
}

Si todo va bien, verás el mensaje de salida del resultado del modelo como se muestra a continuación.

Opción 2. Comunicación I2C

Conecta los pines SDA y SCL de las dos placas XIAO juntos. Para el Sensor AI (ya modelado) XIAO ESP32S3 Sense, los pines de salida se definen como:

  • SDA: GPIO5 (con resistencia pull-up)
  • SCL: GPIO6 (con resistencia pull-up)
  • Dirección esclavo I2C a 0x62

Descarga la librería Seeed_Arduino_SSCMA desde GitHub y agrégala a tu entorno Arduino.


Usa el código del siguiente ejemplo:

note

Usa el siguiente protocolo para la comunicación I2C:

  • READ: Envía bytes 0x10, 0x01, LEN << 8, LEN & 0xff
  • WRITE: Envía bytes 0x10, 0x02, LEN << 8, LEN & 0xff
  • AVAIL (para verificar disponibilidad de datos): Envía bytes 0x10, 0x03
  • RESET (para limpiar buffer): Envía bytes 0x10, 0x06
#include <Seeed_Arduino_SSCMA.h>
#include <Wire.h>

SSCMA AI;

void setup()
{
Wire.begin();
AI.begin(&Wire);
Serial.begin(9600);
}

void loop()
{
if (!AI.invoke())
{
Serial.println("invoke success");
Serial.print("perf: prepocess=");
Serial.print(AI.perf().prepocess);
Serial.print(", inference=");
Serial.print(AI.perf().inference);
Serial.print(", postpocess=");
Serial.println(AI.perf().postprocess);

for (int i = 0; i < AI.boxes().size(); i++)
{
Serial.print("Box[");
Serial.print(i);
Serial.print("] target=");
Serial.print(AI.boxes()[i].target);
Serial.print(", score=");
Serial.print(AI.boxes()[i].score);
Serial.print(", x=");
Serial.print(AI.boxes()[i].x);
Serial.print(", y=");
Serial.print(AI.boxes()[i].y);
Serial.print(", w=");
Serial.print(AI.boxes()[i].w);
Serial.print(", h=");
Serial.println(AI.boxes()[i].h);
}
for (int i = 0; i < AI.classes().size(); i++)
{
Serial.print("Class[");
Serial.print(i);
Serial.print("] target=");
Serial.print(AI.classes()[i].target);
Serial.print(", score=");
Serial.println(AI.classes()[i].score);
}
for (int i = 0; i < AI.points().size(); i++)
{
Serial.print("Point[");
Serial.print(i);
Serial.print("]: target=");
Serial.print(AI.points()[i].target);
Serial.print(", score=");
Serial.print(AI.points()[i].score);
Serial.print(", x=");
Serial.print(AI.points()[i].x);
Serial.print(", y=");
Serial.println(AI.points()[i].y);
}
for (int i = 0; i < AI.keypoints().size(); i++)
{
Serial.print("keypoint[");
Serial.print(i);
Serial.print("] target=");
Serial.print(AI.keypoints()[i].box.target);
Serial.print(", score=");
Serial.print(AI.keypoints()[i].box.score);
Serial.print(", box:[x=");
Serial.print(AI.keypoints()[i].box.x);
Serial.print(", y=");
Serial.print(AI.keypoints()[i].box.y);
Serial.print(", w=");
Serial.print(AI.keypoints()[i].box.w);
Serial.print(", h=");
Serial.print(AI.keypoints()[i].box.h);
Serial.print("], points:[");
for (int j = 0; j < AI.keypoints()[i].points.size(); j++)
{
Serial.print("[");
Serial.print(AI.keypoints()[i].points[j].x);
Serial.print(",");
Serial.print(AI.keypoints()[i].points[j].y);
Serial.print("],");
}
Serial.println("]");
}
}
}

Si todo va bien, verás el mensaje de salida del resultado del modelo como se muestra a continuación.

Opción 3. Comunicación SPI

  1. Conecta los siguientes pines de las dos placas XIAO juntos. Para el Sensor AI (ya modelado) XIAO ESP32S3 Sense, los pines de salida se definen como:
  • MOSI: GPIO9 (con resistencia pull-up)
  • MISO: GPIO8
  • SCLK: GPIO7 (con resistencia pull-up)
  • CS: GPIO4 (con resistencia pull-up)
  1. Descarga la librería Seeed_Arduino_SSCMA desde GitHub y agrégala a tu entorno de Arduino.

  1. Modifica el código de los ejemplos proporcionados para usar comunicación SPI.
note

Usa el siguiente protocolo para comunicación SPI:

  • READ: Envía bytes 0x10, 0x01, LEN << 8, LEN & 0xff
  • WRITE: Envía bytes 0x10, 0x02, LEN << 8, LEN & 0xff
  • AVAIL (para verificar disponibilidad de datos): Envía bytes 0x10, 0x03
  • RESET (para limpiar buffer): Envía bytes 0x10, 0x06
#include <Seeed_Arduino_SSCMA.h>
#include <SPI.h>

SSCMA AI;

void setup()
{
SPI.begin(SCK, MISO, MOSI, -1);
AI.begin(&SPI, D3, -1, -1);
Serial.begin(9600);
}

void loop()
{
if (!AI.invoke())
{
Serial.println("invoke success");
Serial.print("perf: prepocess=");
Serial.print(AI.perf().prepocess);
Serial.print(", inference=");
Serial.print(AI.perf().inference);
Serial.print(", postpocess=");
Serial.println(AI.perf().postprocess);

for (int i = 0; i < AI.boxes().size(); i++)
{
Serial.print("Box[");
Serial.print(i);
Serial.print("] target=");
Serial.print(AI.boxes()[i].target);
Serial.print(", score=");
Serial.print(AI.boxes()[i].score);
Serial.print(", x=");
Serial.print(AI.boxes()[i].x);
Serial.print(", y=");
Serial.print(AI.boxes()[i].y);
Serial.print(", w=");
Serial.print(AI.boxes()[i].w);
Serial.print(", h=");
Serial.println(AI.boxes()[i].h);
}
for (int i = 0; i < AI.classes().size(); i++)
{
Serial.print("Class[");
Serial.print(i);
Serial.print("] target=");
Serial.print(AI.classes()[i].target);
Serial.print(", score=");
Serial.println(AI.classes()[i].score);
}
for (int i = 0; i < AI.points().size(); i++)
{
Serial.print("Point[");
Serial.print(i);
Serial.print("]: target=");
Serial.print(AI.points()[i].target);
Serial.print(", score=");
Serial.print(AI.points()[i].score);
Serial.print(", x=");
Serial.print(AI.points()[i].x);
Serial.print(", y=");
Serial.println(AI.points()[i].y);
}
for (int i = 0; i < AI.keypoints().size(); i++)
{
Serial.print("keypoint[");
Serial.print(i);
Serial.print("] target=");
Serial.print(AI.keypoints()[i].box.target);
Serial.print(", score=");
Serial.print(AI.keypoints()[i].box.score);
Serial.print(", box:[x=");
Serial.print(AI.keypoints()[i].box.x);
Serial.print(", y=");
Serial.print(AI.keypoints()[i].box.y);
Serial.print(", w=");
Serial.print(AI.keypoints()[i].box.w);
Serial.print(", h=");
Serial.print(AI.keypoints()[i].box.h);
Serial.print("], points:[");
for (int j = 0; j < AI.keypoints()[i].points.size(); j++)
{
Serial.print("[");
Serial.print(AI.keypoints()[i].points[j].x);
Serial.print(",");
Serial.print(AI.keypoints()[i].points[j].y);
Serial.print("],");
}
Serial.println("]");
}
}
}

Si todo va bien, verás el mensaje de salida del resultado del modelo como se muestra a continuación.

Paso 4: Cargar el Código y Ejecutar

Abre el código de ejemplo apropiado en el Arduino IDE basado en el protocolo de comunicación que hayas elegido. Verifica y carga el código a la placa XIAO receptora. Abre el monitor serie en el Arduino IDE para ver los datos del modelo recibidos.

Conclusión

Siguiendo esta guía paso a paso, has configurado exitosamente la salida de un modelo en SenseCraft AI y usado el XIAO ESP32S3 Sense como un sensor de IA. Ahora puedes recuperar los datos del modelo usando diferentes protocolos de comunicación como UART, I2C, o SPI, dependiendo de los requisitos de tu proyecto.

Recuerda consultar el código de ejemplo proporcionado y hacer las modificaciones necesarias basadas en tu configuración específica y elección de protocolo de comunicación.

Si encuentras algún problema o tienes más preguntas, por favor consulta la documentación de Seeed Studio o busca asistencia en los foros de la comunidad.

¡Feliz detección con tu XIAO ESP32S3 Sense y SenseCraft AI!

Soporte Técnico y Discusión de Productos

¡Gracias por elegir nuestros productos! Estamos aquí para proporcionarte diferentes tipos de soporte para asegurar que tu experiencia con nuestros productos sea lo más fluida posible. Ofrecemos varios canales de comunicación para atender diferentes preferencias y necesidades.

Loading Comments...