Uso de XIAO ESP32S3 Sense como sensor de IA con SenseCraft AI
Este 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 ordenador, seleccionar el método de salida adecuado y obtener los datos del modelo utilizando diferentes protocolos de comunicación como UART, I2C y SPI.
Requisitos previos
Antes de continuar, asegúrate de tener lo siguiente:
- XIAO ESP32S3 Sense
- Una placa XIAO adicional (por ejemplo, XIAO ESP32C3) para recibir los datos del modelo
- Cable de datos USB-C para conectar el XIAO ESP32S3 Sense a tu ordenador
- Arduino IDE con la biblioteca Seeed_Arduino_SSCMA instalada
| XIAO ESP32S3 Sense |
|---|
![]() |
Paso 1. Accede al espacio de trabajo de XIAO ESP32S3 Sense y conecta el dispositivo
Accede al espacio de trabajo de XIAO ESP32S3 Sense a través de SenseCraft AI > Models > Workspace > XIAO ESP32S3 Sense, o utiliza el enlace directo al espacio de trabajo.

Usando el cable USB-C, conecta tu placa XIAO ESP32S3 Sense a tu ordenador. Una vez conectada, haz clic en el botón Connect situado en la esquina superior izquierda de la página del espacio de trabajo.

Paso 2. Asegúrate de que haya un modelo cargado en el XIAO ESP32S3 Sense
Antes de continuar, asegúrate de que tu placa XIAO ESP32S3 Sense tenga cargado un modelo entrenado. Si aún no has cargado un modelo, consulta la documentación de SenseCraft AI sobre cómo entrenar y desplegar modelos en tu dispositivo.
Si quieres utilizar tu propio modelo entrenado, puedes consultar los dos wikis siguientes.
Paso 3. Prepara el método y el programa que quieres utilizar
XIAO admite la salida de resultados del modelo mediante UART, IIC o SPI; puedes elegir cómo quieres sacar los resultados según la situación real.
Opción 1. Comunicación UART
Conecta los pines TX y RX de las dos placas XIAO entre sí. Para el XIAO ESP32S3 Sense como sensor de IA (ya modelado), los pines de salida se definen como:
- TX: GPIO43
- RX: GPIO44

Descarga la biblioteca Seeed_Arduino_SSCMA desde GitHub y añádela a tu entorno de Arduino.
Utiliza el código del siguiente ejemplo:
Configura la velocidad en 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 entre sí. Para el XIAO ESP32S3 Sense como sensor de IA (ya modelado), los pines de salida se definen como:
- SDA: GPIO5 (con resistencia de pull-up)
- SCL: GPIO6 (con resistencia de pull-up)
- Dirección esclava I2C a
0x62

Descarga la biblioteca Seeed_Arduino_SSCMA desde GitHub y añádela a tu entorno de Arduino.
Utiliza el código del siguiente ejemplo:
Utiliza el siguiente protocolo para la comunicación I2C:
- READ: Envía los bytes 0x10, 0x01, LEN << 8, LEN & 0xff
- WRITE: Envía los bytes 0x10, 0x02, LEN << 8, LEN & 0xff
- AVAIL (para comprobar la disponibilidad de datos): Envía los bytes 0x10, 0x03
- RESET (para limpiar el búfer): Envía los 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
- Conecta entre sí los siguientes pines de las dos placas XIAO. Para el sensor de IA (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)

- Descarga la biblioteca Seeed_Arduino_SSCMA desde GitHub y añádela a tu entorno de Arduino.
- Modifica el código de los ejemplos proporcionados para utilizar la comunicación SPI.
Utiliza el siguiente protocolo para la comunicación SPI:
- READ: Envía los bytes 0x10, 0x01, LEN << 8, LEN & 0xff
- WRITE: Envía los bytes 0x10, 0x02, LEN << 8, LEN & 0xff
- AVAIL (para comprobar la disponibilidad de datos): Envía los bytes 0x10, 0x03
- RESET (para limpiar el búfer): Envía los 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: Carga el código y ejecútalo
Abre el código de ejemplo apropiado en el IDE de Arduino según el protocolo de comunicación que hayas elegido. Verifica y sube el código a la placa XIAO receptora. Abre el monitor serie en el IDE de Arduino para ver los datos del modelo recibidos.

Conclusión
Siguiendo esta guía paso a paso, has configurado correctamente la salida de un modelo en SenseCraft AI y has utilizado la XIAO ESP32S3 Sense como un sensor de IA. Ahora puedes obtener los datos del modelo utilizando diferentes protocolos de comunicación como UART, I2C o SPI, según los requisitos de tu proyecto.
Recuerda consultar el código de ejemplo proporcionado y realizar las modificaciones necesarias según tu configuración específica y la elección del protocolo de comunicación.
Si encuentras algún problema o tienes más preguntas, consulta la documentación de Seeed Studio o solicita ayuda en los foros de la comunidad.
¡Disfruta de la sensorización con tu XIAO ESP32S3 Sense y SenseCraft AI!
Soporte técnico y debate sobre productos
Gracias por elegir nuestros productos. Estamos aquí para ofrecerte diferentes tipos de soporte y garantizar que tu experiencia con nuestros productos sea lo más fluida posible. Ofrecemos varios canales de comunicación para adaptarnos a diferentes preferencias y necesidades.
