使用 XIAO ESP32S3 Sense 与 SenseCraft AI 构建 AI 传感器
本 Wiki 提供了一个分步指南,介绍如何在 SenseCraft AI 上配置模型输出,并将 XIAO ESP32S3 Sense 用作 AI 传感器。通过遵循这些说明,你将学会如何将 XIAO ESP32S3 Sense 连接到电脑、选择合适的输出方式,并通过 UART、I2C 和 SPI 等不同通信协议获取模型数据。
前置准备
在继续之前,请确保你已经具备以下条件:
- XIAO ESP32S3 Sense
- 一块额外的 XIAO 开发板(例如 XIAO ESP32C3),用于接收模型数据
- 一根用于将 XIAO ESP32S3 Sense 连接到电脑的 USB-C 数据线
- 已在 Arduino IDE 中安装 Seeed_Arduino_SSCMA 库
| XIAO ESP32S3 Sense |
|---|
![]() |
步骤 1. 进入 XIAO ESP32S3 Sense 工作区并连接设备
通过 SenseCraft AI > Models > Workspace > XIAO ESP32S3 Sense 进入 XIAO ESP32S3 Sense 工作区,或者使用工作区的直接链接。

使用 USB-C 数据线将 XIAO ESP32S3 Sense 开发板连接到电脑。连接完成后,点击工作区页面左上角的 Connect 按钮。

步骤 2. 确保 XIAO ESP32S3 Sense 上已加载模型
在继续之前,请确保你的 XIAO ESP32S3 Sense 开发板上已经加载了训练好的模型。如果你还没有加载模型,请参考 SenseCraft AI 文档,了解如何在设备上训练和部署模型。
如果你想使用自己训练的模型,可以参考以下两个 Wiki。
步骤 3. 准备你想要使用的方式和程序
XIAO 支持通过 UART、IIC 或 SPI 输出模型结果,你可以根据实际情况选择希望使用的输出方式。
选项 1. UART 通信
将两块 XIAO 开发板的 TX 和 RX 引脚连接在一起。对于作为 AI 传感器(已完成建模)的 XIAO ESP32S3 Sense,输出引脚定义如下:
- TX: GPIO43
- RX: GPIO44

从 GitHub 下载 Seeed_Arduino_SSCMA 库,并将其添加到 Arduino 开发环境中。
使用以下示例中的代码:
将波特率设置为 921600,数据位 8 位,无校验位,1 个停止位(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());
}
}
}
如果一切顺利,你将会看到如下所示的模型结果输出信息。

选项 2. I2C 通信
将两块 XIAO 开发板的 SDA 和 SCL 引脚连接在一起。对于作为 AI 传感器(已完成建模)的 XIAO ESP32S3 Sense,输出引脚定义如下:
- SDA: GPIO5(带上拉电阻)
- SCL: GPIO6(带上拉电阻)
- I2C 从机地址为
0x62

从 GitHub 下载 Seeed_Arduino_SSCMA 库,并将其添加到 Arduino 开发环境中。
使用以下示例中的代码:
在 I2C 通信中使用以下协议:
- READ:发送字节 0x10, 0x01, LEN << 8, LEN & 0xff
- WRITE:发送字节 0x10, 0x02, LEN << 8, LEN & 0xff
- AVAIL(用于检查数据是否可用):发送字节 0x10, 0x03
- RESET(用于清空缓冲区):发送字节 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("]");
}
}
}
如果一切顺利,你将会看到如下所示的模型结果输出信息。

选项 3. SPI 通信
- 将两个 XIAO 开发板的以下引脚连接在一起。对于 AI 传感器(已建模)的 XIAO ESP32S3 Sense,输出引脚定义如下:
- MOSI:GPIO9(带上拉电阻)
- MISO:GPIO8
- SCLK:GPIO7(带上拉电阻)
- CS:GPIO4(带上拉电阻)

- 从 GitHub 下载 Seeed_Arduino_SSCMA 库,并将其添加到你的 Arduino 开发环境中。
- 修改提供示例中的代码以使用 SPI 通信。
在 SPI 通信中使用以下协议:
- READ:发送字节 0x10, 0x01, LEN << 8, LEN & 0xff
- WRITE:发送字节 0x10, 0x02, LEN << 8, LEN & 0xff
- AVAIL(用于检查数据是否可用):发送字节 0x10, 0x03
- RESET(用于清空缓冲区):发送字节 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("]");
}
}
}
如果一切顺利,你将会看到如下所示的模型结果输出信息。

步骤 4:上传代码并运行
在 Arduino IDE 中打开与你选择的通信协议相对应的示例代码。验证并将代码上传到接收端的 XIAO 开发板。在 Arduino IDE 中打开串口监视器以查看接收到的模型数据。

总结
通过按照本分步指南操作,你已经成功在 SenseCraft AI 上配置了模型输出,并将 XIAO ESP32S3 Sense 用作 AI 传感器。现在,你可以根据项目需求,使用 UART、I2C 或 SPI 等不同的通信协议来获取模型数据。
请记得参考提供的示例代码,并根据你的具体设置和所选通信协议进行必要的修改。
如果你遇到任何问题或有进一步的问题,请查阅 Seeed Studio 文档或在社区论坛中寻求帮助。
祝你使用 XIAO ESP32S3 Sense 和 SenseCraft AI 玩转感知应用!
技术支持与产品讨论
感谢你选择我们的产品!我们将为你提供多种支持,以确保你在使用我们产品时拥有尽可能顺畅的体验。我们提供多种沟通渠道,以满足不同的偏好和需求。
