Vision AI V2 数据的RS485传输

硬件准备
Seeed Studio XIAO ESP32S3 | Grove Vision AI V2 | OV5647-62 FOV 摄像头模块 适用于 Raspberry Pi 3B+4B | Seeed Studio XIAO RS485 扩展板 |
---|---|---|---|
![]() | ![]() | ![]() | ![]() |
连接方法
首先,准备两个扩展板、两个 XIAO 系列开发板和一个 Vision AI V2,并根据图示连接对应的引脚。本示例使用 XIAO ESP32C3 作为演示。
步骤 1. 准备两个 RS485 扩展板和两个 XIAO 系列开发板,并按照下图连接引脚

步骤 2. 准备 Vision AI V2,将其安装在两个 RS485 扩展板之一的背面,作为发送端

如果您是第一次使用 RS485 扩展板并且不确定如何连接,请点击此链接(https://wiki.seeedstudio.com/cn/XIAO-RS485-Expansion-Board/)
如果您不知道如何烧录模型并添加模型输出代码,请点击此链接(https://wiki.seeedstudio.com/cn/grove_vision_ai_v2_software_support/),该链接将详细告诉您每一步操作。
为了更好地后续使用,请不要跳过这两个步骤!
软件准备
发送端代码
#include <Seeed_Arduino_SSCMA.h>
#ifdef ESP32
#include <HardwareSerial.h>
HardwareSerial Serial3(1);
// 定义两个映射到内部 UART 的 Serial 设备
HardwareSerial atSerial(0);
#else
#define atSerial Serial1
#endif
#define enable_pin D2 // 定义使能引脚为 D2
SSCMA AI;
void setup()
{
Serial3.begin(115200, SERIAL_8N1, 7, 6); // 使用 115200 波特率、8 数据位、无校验位、1 停止位初始化 Serial3
Serial.begin(9600); // 初始化 Serial 用于调试输出
AI.begin(&atSerial); // 使用 AT 串口初始化 AI 模块
pinMode(enable_pin, OUTPUT); // 将使能引脚设置为输出
digitalWrite(enable_pin, HIGH); // 将使能引脚设置为高电平以启用 AI 模块
}
void loop()
{
if (!AI.invoke(1, false, true)) { // 调用 AI 开始处理
Serial.println("调用成功"); // 打印成功消息
// 打印性能指标
Serial.print("性能: 预处理=");
Serial.print(AI.perf().prepocess);
Serial.print(", 推理=");
Serial.print(AI.perf().inference);
Serial.print(", 后处理=");
Serial.println(AI.perf().postprocess);
// 遍历检测到的框
for (int i = 0; i < AI.boxes().size(); i++) {
Serial.print("框[");
Serial.print(i);
Serial.print("] 目标=");
Serial.print(AI.boxes()[i].target);
Serial.print(", 分数=");
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(", 宽度=");
Serial.print(AI.boxes()[i].w);
Serial.print(", 高度=");
Serial.println(AI.boxes()[i].h);
}
// 遍历检测到的类别
for (int i = 0; i < AI.classes().size(); i++) {
Serial.print("类别[");
Serial.print(i);
Serial.print("] 目标=");
Serial.println(AI.classes()[i].target);
// 检查目标类别并发送对应状态
if (AI.classes()[i].target == 0) {
String status_a = "未检测到人"; // 定义未检测到人的状态
Serial3.println(status_a); // 将状态发送到 Serial3
Serial.println(status_a); // 将状态打印到 Serial 监视器
} else if (AI.classes()[i].target == 1) {
String status_b = "检测到人"; // 定义检测到人的状态
Serial3.println(status_b); // 将状态发送到 Serial3
Serial.println(status_b); // 将状态打印到 Serial 监视器
}
}
delay(1000); // 在下一次循环迭代前等待 1 秒
}
}
代码详细功能
-
库包含
- 包含
HardwareSerial
库以使用硬件串口功能。 - 包含
Seeed_Arduino_SSCMA
库以控制 AI 模块。
- 包含
-
串口对象创建
HardwareSerial Serial3(1);
HardwareSerial atSerial(0);创建 Serial3 和 atSerial 对象用于串口通信。
-
AI 对象创建
SSCMA AI;
创建 SSCMA 类的实例用于 AI 处理。
-
性能指标
Serial.print("性能: 预处理=");
Serial.print(AI.perf().prepocess);
Serial.print(", 推理=");
Serial.print(AI.perf().inference);
Serial.print(", 后处理=");
Serial.println(AI.perf().postprocess);打印 AI 处理阶段的性能指标:预处理、推理和后处理。
-
检测框循环
for (int i = 0; i < AI.boxes().size(); i++) {
Serial.print("框[");
Serial.print(i);
Serial.print("] 目标=");
Serial.print(AI.boxes()[i].target);
Serial.print(", 分数=");
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(", 宽度=");
Serial.print(AI.boxes()[i].w);
Serial.print(", 高度=");
Serial.println(AI.boxes()[i].h);
}遍历检测到的框并打印其详细信息,包括目标、分数和边界框坐标。
-
检测类别循环
for (int i = 0; i < AI.classes().size(); i++) {
Serial.print("类别[");
Serial.print(i);
Serial.print("] 目标=");
Serial.println(AI.classes()[i].target);遍历检测到的类别并打印其目标。
-
宏定义
pinMode(enable_pin, OUTPUT); // 将使能引脚设置为输出
digitalWrite(enable_pin, LOW);定义使能引脚为 D2。
-
发送消息
// 检查目标类别并发送对应状态
if (AI.classes()[i].target == 0) {
String status_a = "未检测到人"; // 定义未检测到人的状态
Serial3.println(status_a); // 将状态发送到 Serial3
Serial.println(status_a); // 将状态打印到 Serial 监视器
} else if (AI.classes()[i].target == 1) {
String status_b = "检测到人"; // 定义检测到人的状态
Serial3.println(status_b); // 将状态发送到 Serial3
Serial.println(status_b); // 将状态打印到 Serial 监视器
}判断是否检测到人,如果检测到人则发送 "检测到人" 到接收端;如果未检测到人则发送 "未检测到人" 到接收端。
接收端代码
#include <HardwareSerial.h>
HardwareSerial Serial3(1); // 使用 UART2
#define enable_pin D2 // 定义使能引脚为 D2
void setup() {
Serial.begin(115200); // 使用 115200 波特率初始化硬件串口
Serial3.begin(115200, SERIAL_8N1, 7, 6); // 使用 115200 波特率、8 数据位、无校验位、1 停止位初始化 Serial3 (RX=D4(GPIO4), TX=D5(GPIO5))
// 等待硬件串口准备好
while(!Serial3);
while(!Serial); // 此行通常不必要,因为 Serial.begin() 会立即准备好
pinMode(enable_pin, OUTPUT); // 将使能引脚设置为输出
digitalWrite(enable_pin, LOW); // 将使能引脚设置为低电平以启用设备
}
void loop() {
delay(100); // 延迟 100 毫秒
// 检查硬件串口是否有可用数据
if (Serial3.available()) {
String receivedData = Serial3.readStringUntil('\n'); // 读取直到换行符的字符串
Serial.print("接收到的数据: "); // 打印接收到数据的标签
Serial.println(receivedData); // 直接打印接收到的数据
}
}
代码详细功能
-
库的引入
- 引入
HardwareSerial
库以使用硬件串口功能。
- 引入
-
串口对象创建
- 使用 UART2 创建一个
Serial3
对象。
- 使用 UART2 创建一个
-
宏定义
pinMode(enable_pin, OUTPUT); // 将使能引脚设置为输出
digitalWrite(enable_pin, LOW);将使能引脚定义为 D2。
-
Setup 函数
Serial3.begin(115200, SERIAL_8N1, 7, 6);
初始化主串口和 Serial3,设置波特率、数据位等。这是与 Vision AI V2 通信以传输数据的串口。
while(!Serial3);
while(!Serial);等待所有串口准备就绪,将使能引脚设置为输出,并将其拉低以启用设备。
-
Loop 函数
if (Serial3.available());
:每 100 毫秒检查 Serial3 上是否有可用数据。String receivedData = Serial3.readStringUntil('\n');
:如果有数据可用,读取直到换行符,并将接收到的数据打印到主串口。
-
打印结果
Serial.print("Received data: ");
Serial.println(receivedData);打印发送方的消息。
结果图表
当摄像头识别到一个人时,它会发送 “people detected”,而当它未识别到人时,它会发送 “no people detected”。接收方将在串口上显示发送方的识别结果。

技术支持与产品讨论
感谢您选择我们的产品!我们为您提供多种支持渠道,以确保您使用我们的产品时体验顺畅。我们提供多种沟通方式,以满足不同的偏好和需求。