【AI-WB2-32S-kit 任务 6】行人通过检测 - 串口通讯与数据解析
-一定,一定,一定要记得时不时保存草稿= =题主这边丢失过一次,好痛苦
一、任务目标
题主在工作室里偶然发现有个激光雷达~故萌生出了做一个简单的行人通过检测项目的想法
这次的项目使用 AI-WB2-32S 开发板,通过 UART 串口接收雷达传感器数据,解析距离信息并实现行人通过检测功能,同时通过 RGB LED 实时指示行人状态(进入 / 离开),完成串口通讯配置、数据解析及状态反馈功能的实现。
涉及的内容是串口通讯,串口打印,数据解析,逻辑判断,以及利用LED实现实时状态反馈。
具体场景为行人通过检测。
二、硬件准备
| 设备 / 工具 | 说明 | 
| AI-WB2-32S 开发板 | 核心控制板,支持 UART、GPIO 等外设 | 
| 雷达传感器(TF02pro-w) | 距离检测模块,通过 UART 输出数据 | 
| USB 转串口线 | 连接开发板与电脑,用于程序烧录和日志查看 | 
| 三色 LED 模块 | 状态指示(红 / 蓝 / 黄) | 
| 面包板及杜邦线 | 电路连接 | 
| 你聪明的小脑瓜和灵巧的手 | 排查问题,克服困难 | 
三、软件环境搭建
- 开发环境配置
- 按照论坛教程搭建 VS Code 开发环境:
- 安装 VS Code、MSYS2、MinGW64 及 C/C++ 插件。
- 下载 AI-Thinker-WB2 SDK 并配置环境变量。把仓库和工具链下载下来,配好环境,用vscode打开,就可以愉快的开发啦!
- 这里题主推荐下载vscode插件makefile tool,提供便捷命令,可直接在 VS Code 中构建、调试和运行 Makefile 目标,无需频繁切换到终端qwq
  
- 关键依赖库
- bl_uart.h:UART 通讯驱动,用于接收雷达数据。
- bl_gpio.h:GPIO 控制,用于 LED 状态指示。
- FreeRTOS.h:任务调度,确保 UART 中断与 LED 控制任务并行运行。
四、代码实现与核心逻辑
- 
项目结构  
 
applications/
└─ radar_count/
├─ main.c          # 主函数及初始化
└─ bouffalo.**mk**  # 编译规则,依赖关系文件
- 
检测原理与代码实现:
 原理解析:
  
 即检测到雷达的距离突变,视为有人进入(图片来源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");
}
五、硬件上手!
- 电路连接
| 开发板 GPIO | 雷达传感器 | 板载RGB | 
| GPIO7(RX) | TX | - | 
| GPIO16(TX) | RX | - | 
| GPIO3 | - | 蓝色 LED | 
| GPIO14 | - | 红色 LED | 
| GPIO17 | - | 绿色 LED | 
- 代码修改与编译
- 配置 UART 参数:确保UART_TX_PIN、UART_RX_PIN与实际接线一致。雷达的TX要接开发板的RX!!!雷达的RX要接入开发板的TX!不要接错啦!
- 校准背景距离:根据传感器安装高度调整BACKGROUND_DISTANCE(这里题主使用的是 93cm测试,需要根据实际调整嗷!)。门上的为雷达,题主这边测试使用就直接平放啦!
  
 -图片来源csdn:Zoran.wu主题帖
- 编译项目:
cd applications/radar_count/
make -j8 flash p=COM7  # COM7为开发板串口端口号
- 
烧录与调试 这里需要进入到上一级目录进行编译嗷!因为编译过程中需要调用上一级目录中的脚本、工具链或公共库。这里如果在main.c处打开终端,那么还需要输入cd..(进入上一级目录)嗷!
  
 
- 
连接开发板到电脑,打开设备管理器确认串口端口(如 COM6)。  
 
- 
使用串口助手(如 ComTool)监控日志,波特率设置为 115200用于接收串口输出。 
- 
烧录命令: 
make flash p=COM7  # 自动烧录并复位设备
烧录失败?检查串口是否被占用?是否连接?p=COM6是不是输错成了p=COM=6?
- 
功能测试 预计效果:行人进入检测:当行人进入检测区域(高度 > 30cm),LED 亮黄灯,串口输出: 
[DETECT] Person entering! Height: 50 cm
行人离开计数:行人离开后,LED 红蓝交替切换,计数增加:
[COUNT] Passage 1! Current count: 1
[LED] Color toggled to BLUE
六、测试效果展示
- 
实物演示  
  
 
- 
这里题主的视频不知道为什么上传失败了= =,用链接替代吧https://easylink.cc/jp4bsm 
- 
LED 状态指示 

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

-行人通过,从红变蓝
| 状态 | LED 颜色 | 说明 | 
| 待机 | 红色 | 系统初始化完成 | 
| 检测中 | 黄色 | 行人进入检测区域 | 
| 计数触发 | 红/蓝切换 | 行人离开,计数 + 1 | 
七、总结与扩展
- 精准数据解析:通过状态机算法确保雷达数据帧的完整性和校验准确性。
- 实时状态反馈:利用三色 LED 直观展示检测过程。
- 多任务协作:FreeRTOS 任务调度实现 UART 中断与 LED 控制并行运行,资源分配高效。
- 扩展方向
- 
增加舵机控制:当计数达到阈值时,通过 SG90 舵机驱动机械结构(如闸门、指示灯转向)。 
- 
数据滤波优化:引入中值滤波或卡尔曼滤波,减少环境噪声对距离检测的干扰。 
- 
远程上报:通过 Wi-Fi 或蓝牙将计数数据上传至云端,实现远程监控。 附上ai-wb2-32s引脚图!
  
  
  
 access date:25.5.6 请以最新一版官方上传的数据手册为准!此处仅作参考
 
这个小项目,成功实现了基于 AI-WB2-32S 开发板的行人通过检测系统,验证了 UART 通讯、数据解析及外设控制的核心功能。
后续可结合实际场景进一步优化检测逻辑,拓展应用场景(如智能门禁、客流统计等)。