发帖
2 0 0

【AI-WB2-32S-kit 任务 6】行人通过检测 - 串口通讯与数据解析

KrOik
注册会员

1

主题

1

回帖

123

积分

注册会员

积分
123
Ai-WB2系列 21 2 昨天 21:33
[i=s] 本帖最后由 KrOik 于 2025-5-6 21:33 编辑 [/i]

【AI-WB2-32S-kit 任务 6】行人通过检测 - 串口通讯与数据解析

-一定,一定,一定要记得时不时保存草稿= =题主这边丢失过一次,好痛苦

一、任务目标

题主在工作室里偶然发现有个激光雷达~故萌生出了做一个简单的行人通过检测项目的想法

这次的项目使用 AI-WB2-32S 开发板,通过 UART 串口接收雷达传感器数据,解析距离信息并实现行人通过检测功能,同时通过 RGB LED 实时指示行人状态(进入 / 离开),完成串口通讯配置、数据解析及状态反馈功能的实现。

涉及的内容是串口通讯,串口打印,数据解析,逻辑判断,以及利用LED实现实时状态反馈。

具体场景为行人通过检测。

二、硬件准备

设备 / 工具 说明
AI-WB2-32S 开发板 核心控制板,支持 UART、GPIO 等外设
雷达传感器(TF02pro-w) 距离检测模块,通过 UART 输出数据
USB 转串口线 连接开发板与电脑,用于程序烧录和日志查看
三色 LED 模块 状态指示(红 / 蓝 / 黄)
面包板及杜邦线 电路连接
你聪明的小脑瓜和灵巧的手 排查问题,克服困难

三、软件环境搭建

  1. 开发环境配置
  • 按照论坛教程搭建 VS Code 开发环境:
  • 安装 VS Code、MSYS2、MinGW64 及 C/C++ 插件。
  • 下载 AI-Thinker-WB2 SDK 并配置环境变量。把仓库和工具链下载下来,配好环境,用vscode打开,就可以愉快的开发啦!
  • 这里题主推荐下载vscode插件makefile tool,提供便捷命令,可直接在 VS Code 中构建、调试和运行 Makefile 目标,无需频繁切换到终端qwq
    image.png
  1. 关键依赖库
  • bl_uart.h:UART 通讯驱动,用于接收雷达数据。
  • bl_gpio.h:GPIO 控制,用于 LED 状态指示。
  • FreeRTOS.h:任务调度,确保 UART 中断与 LED 控制任务并行运行。

四、代码实现与核心逻辑

  1. 项目结构

    image.png

applications/

└─ radar_count/

├─ main.c          # 主函数及初始化
└─ bouffalo.**mk**  # 编译规则,依赖关系文件
  1. 检测原理与代码实现:
    原理解析:

    image.png

    即检测到雷达的距离突变,视为有人进入(图片来源csdn-Zoran.wu主题帖)

    本项目使用到的判断方式为:

(1)UART 初始化与中断回调

// UART参数定义

#define UART_ID 1 // UART1

#define UART_TX_PIN 16 // GPIO16(TX)

#define UART_RX_PIN 7 // GPIO7(RX)

#define UART_BAUDRATE 115200 // 波特率与雷达传感器一致

// 初始化UART并注册接收回调

void uart_init(void) {

bl\_uart\_init(UART\_ID, UART\_TX\_PIN, UART\_RX\_PIN, 0, 0, UART\_BAUDRATE);


bl\_uart\_int\_rx\_notify\_register(UART\_ID, uart\_rx\_callback, NULL);


bl\_uart\_int\_enable(UART\_ID);


printf("[UART] Initialized at %d bps\\r\\n", UART\_BAUDRATE);

}

// 接收回调:解析雷达数据

static void uart_rx_callback(void *arg) {

int ch = bl\_uart\_data\_recv(UART\_ID);


if (ch >= 0 && parse\_tfmini\_data((uint8\_t)ch)) {


    if (radar\_data.strength > 50) {


        update\_people\_count(radar\_data.distance); // 触发人流计数逻辑


    }


}

}

(2)雷达数据解析(状态机算法)

// 数据帧结构(来自雷达数据手册):2字节帧头 + 6字节数据 + 1字节校验和

bool parse_tfmini_data(uint8_t byte) {

static uint8\_t recv\_buf[9] = {0};


static uint8\_t recv\_index = 0;
if (recv\_index == 0 && byte != FRAME\_HEAD) return false; // 等待帧头0x59
recv\_buf[recv\_index++] = byte;


if (recv\_index == 9) { // 接收完整9字节帧


    uint8\_t checksum = 0;


    for (int i = 0; i < 8; i++) checksum += recv\_buf[i];


    if (checksum == recv\_buf[8]) { // 校验和验证


        radar\_data.distance = recv\_buf[2] | (recv\_buf[3] << 8); // 解析距离(cm)


        radar\_data.strength = recv\_buf[4] | (recv\_buf[5] << 8); // 信号强度


        recv\_index = 0;


        return true;


    }


    recv\_index = 0; // 校验失败,重置接收状态


}


return false;

}

(3)人流计数与 LED 状态控制

// 检测逻辑:通过距离变化判断行人通过

void update_people_count(uint16_t distance) {

static bool person\_in\_zone = false;


const uint16\_t BACKGROUND\_DISTANCE = 93; // 背景距离(传感器安装高度)


const uint16\_t HEIGHT\_THRESHOLD = 30;    // 行人高度阈值(cm)这里是题主测试用的!请根据实际调整
uint16\_t current\_height = (distance < BACKGROUND\_DISTANCE) 


                        ? (BACKGROUND\_DISTANCE - distance) : 0;
if (current\_height > HEIGHT\_THRESHOLD) { // 行人进入区域


    if (!person\_in\_zone) {


        person\_in\_zone = true;


        led\_set\_yellow(); // 亮黄灯表示行人通过中


        printf("[DETECT] Person entering! Height: %d cm\\r\\n", current\_height);


    }


} else { // 行人离开区域


    if (person\_in\_zone) {


        person\_in\_zone = false;


        passage\_count++; // 计数加1


        led\_toggle\_color(); // 红蓝交替表示一次通过


        printf("[COUNT] Passage %d! Current count: %d\\r\\n", passage\_count, passage\_count);


    }


}

}

// LED控制:三色状态指示

void led_set_yellow(void) {

bl\_gpio\_output\_set(LED\_RED, 1);


bl\_gpio\_output\_set(LED\_GREEN, 1);


bl\_gpio\_output\_set(LED\_BLUE, 0);

}

void led_toggle_color(void) {

static bool is\_red = true;


bl\_gpio\_output\_set(LED\_RED, is\_red);


bl\_gpio\_output\_set(LED\_BLUE, !is\_red);


is\_red = !is\_red;


printf("[LED] Color toggled to %s\\r\\n", is\_red ? "RED" : "BLUE");

}

五、硬件上手!

  1. 电路连接
开发板 GPIO 雷达传感器 板载RGB
GPIO7(RX) TX -
GPIO16(TX) RX -
GPIO3 - 蓝色 LED
GPIO14 - 红色 LED
GPIO17 - 绿色 LED
  1. 代码修改与编译
  2. 配置 UART 参数:确保UART_TX_PIN、UART_RX_PIN与实际接线一致。雷达的TX要接开发板的RX!!!雷达的RX要接入开发板的TX!不要接错啦!
  3. 校准背景距离:根据传感器安装高度调整BACKGROUND_DISTANCE(这里题主使用的是 93cm测试,需要根据实际调整嗷!)。门上的为雷达,题主这边测试使用就直接平放啦!
    image.png
    -图片来源csdn:Zoran.wu主题帖
  4. 编译项目:

cd applications/radar_count/

make -j8 flash p=COM7 # COM7为开发板串口端口号

  1. 烧录与调试

    这里需要进入到上一级目录进行编译嗷!因为编译过程中需要调用上一级目录中的脚本、工具链或公共库。这里如果在main.c处打开终端,那么还需要输入cd..(进入上一级目录)嗷!
    image.png

  2. 连接开发板到电脑,打开设备管理器确认串口端口(如 COM6)。

    image.png

  3. 使用串口助手(如 ComTool)监控日志,波特率设置为 115200用于接收串口输出。

  4. 烧录命令:

make flash p=COM7 # 自动烧录并复位设备

烧录失败?检查串口是否被占用?是否连接?p=COM6是不是输错成了p=COM=6?

  1. 功能测试

    预计效果:行人进入检测:当行人进入检测区域(高度 > 30cm),LED 亮黄灯,串口输出:

[DETECT] Person entering! Height: 50 cm
行人离开计数:行人离开后,LED 红蓝交替切换,计数增加:

[COUNT] Passage 1! Current count: 1

[LED] Color toggled to BLUE

六、测试效果展示

  1. 实物演示

    b187e9b7c8ae63b8448aeebc4955449.jpg

    77b367162abf330e8d0df29a2bbe941.jpg

  2. 这里题主的视频不知道为什么上传失败了= =,用链接替代吧https://easylink.cc/jp4bsm

  3. LED 状态指示

image.png

-(上图)检测到有行人正在通过

image.png

-行人通过,从红变蓝

状态 LED 颜色 说明
待机 红色 系统初始化完成
检测中 黄色 行人进入检测区域
计数触发 红/蓝切换 行人离开,计数 + 1

七、总结与扩展

  • 精准数据解析:通过状态机算法确保雷达数据帧的完整性和校验准确性。
  • 实时状态反馈:利用三色 LED 直观展示检测过程。
  • 多任务协作:FreeRTOS 任务调度实现 UART 中断与 LED 控制并行运行,资源分配高效。
  1. 扩展方向
  • 增加舵机控制:当计数达到阈值时,通过 SG90 舵机驱动机械结构(如闸门、指示灯转向)。

  • 数据滤波优化:引入中值滤波或卡尔曼滤波,减少环境噪声对距离检测的干扰。

  • 远程上报:通过 Wi-Fi 或蓝牙将计数数据上传至云端,实现远程监控。

    附上ai-wb2-32s引脚图!
    image.png

    image.png
    image.png
    access date:25.5.6 请以最新一版官方上传的数据手册为准!此处仅作参考

这个小项目,成功实现了基于 AI-WB2-32S 开发板的行人通过检测系统,验证了 UART 通讯、数据解析及外设控制的核心功能。

后续可结合实际场景进一步优化检测逻辑,拓展应用场景(如智能门禁、客流统计等)。

──── 0人觉得很赞 ────

使用道具 举报

昨天 21:39
题主这边的代码已打包,可以在https://easylink.cc/1rc2op下载,无解压密码qwq(连接为简单云链提供)
KrOik 发表于 2025-5-6 21:39
题主这边的代码已打包,可以在https://easylink.cc/1rc2op下载,无解压密码qwq(连接为简单云链提供) ...

你把 build_out 文件夹删掉就行,论坛就能穿上了
您需要登录后才可以回帖 立即登录
高级模式
返回
统计信息
  • 会员数: 28655 个
  • 话题数: 40839 篇