Skip to main content

使用 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)用于接收模型数据
  • USB-C 数据线,用于将 XIAO ESP32S3 Sense 连接到计算机
  • 安装了 Seeed_Arduino_SSCMA 库的 Arduino IDE
XIAO ESP32S3 Sense

步骤 1. 访问 SenseCraft AI Vision 工作区并连接 XIAO ESP32S3 Sense

打开您的网页浏览器,导航到 SenseCraft AI Vision 工作区页面。


从可用设备中选择 XIAO ESP32S3 Sense 开发板。

使用 USB-C 数据线将您的 XIAO ESP32S3 Sense 开发板连接到计算机。连接后,点击位于 SenseCraft AI Vision 工作区页面左上角的连接按钮。

步骤 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 环境中。


使用以下示例中的代码:

note

将波特率设置为 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 环境中。


使用以下示例中的代码:

note

使用以下协议进行 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 通信

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

  1. 修改提供的示例代码以使用 SPI 通信。
note

使用以下协议进行 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 传感愉快!

技术支持与产品讨论

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

Loading Comments...