跳转到内容

将 XIAO_ESP32S3_Sense 用作 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 工作区并连接设备

Section titled “步骤 1. 进入 XIAO ESP32S3 Sense 工作区并连接设备”

通过 SenseCraft AI > Models > Workspace > XIAO ESP32S3 Sense 进入 XIAO ESP32S3 Sense 工作区,或者使用工作区的直接链接

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

步骤 2. 确保 XIAO ESP32S3 Sense 上已加载模型

Section titled “步骤 2. 确保 XIAO ESP32S3 Sense 上已加载模型”

在继续之前,请确保你的 XIAO ESP32S3 Sense 开发板上已经加载了训练好的模型。如果你还没有加载模型,请参考 SenseCraft AI 文档,了解如何在设备上训练和部署模型。

如果你想使用自己训练的模型,可以参考以下两个 Wiki。

步骤 3. 准备你想要使用的方式和程序

Section titled “步骤 3. 准备你想要使用的方式和程序”

XIAO 支持通过 UART、IIC 或 SPI 输出模型结果,你可以根据实际情况选择希望使用的输出方式。

将两块 XIAO 开发板的 TX 和 RX 引脚连接在一起。对于作为 AI 传感器(已完成建模)的 XIAO ESP32S3 Sense,输出引脚定义如下:

  • TX: GPIO43
  • RX: GPIO44

从 GitHub 下载 Seeed_Arduino_SSCMA 库,并将其添加到 Arduino 开发环境中。


使用以下示例中的代码:

cpp
#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());
}
}
}

如果一切顺利,你将会看到如下所示的模型结果输出信息。

将两块 XIAO 开发板的 SDA 和 SCL 引脚连接在一起。对于作为 AI 传感器(已完成建模)的 XIAO ESP32S3 Sense,输出引脚定义如下:

  • SDA: GPIO5(带上拉电阻)
  • SCL: GPIO6(带上拉电阻)
  • I2C 从机地址为 0x62

从 GitHub 下载 Seeed_Arduino_SSCMA 库,并将其添加到 Arduino 开发环境中。


使用以下示例中的代码:

cpp
#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("]");
}
}
}

如果一切顺利,你将会看到如下所示的模型结果输出信息。

  1. 将两个 XIAO 开发板的以下引脚连接在一起。对于 AI 传感器(已建模)的 XIAO ESP32S3 Sense,输出引脚定义如下:
  • MOSI:GPIO9(带上拉电阻)
  • MISO:GPIO8
  • SCLK:GPIO7(带上拉电阻)
  • CS:GPIO4(带上拉电阻)
  1. 从 GitHub 下载 Seeed_Arduino_SSCMA 库,并将其添加到你的 Arduino 开发环境中。

  1. 修改提供示例中的代码以使用 SPI 通信。
cpp
#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("]");
}
}
}

如果一切顺利,你将会看到如下所示的模型结果输出信息。

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

通过按照本分步指南操作,你已经成功在 SenseCraft AI 上配置了模型输出,并将 XIAO ESP32S3 Sense 用作 AI 传感器。现在,你可以根据项目需求,使用 UART、I2C 或 SPI 等不同的通信协议来获取模型数据。

请记得参考提供的示例代码,并根据你的具体设置和所选通信协议进行必要的修改。

如果你遇到任何问题或有进一步的问题,请查阅 Seeed Studio 文档或在社区论坛中寻求帮助。

祝你使用 XIAO ESP32S3 Sense 和 SenseCraft AI 玩转感知应用!

感谢你选择我们的产品!我们将为你提供多种支持,以确保你在使用我们产品时拥有尽可能顺畅的体验。我们提供多种沟通渠道,以满足不同的偏好和需求。