STM32驱动Rd-03D搭配VC-02制作人数检测播报器

[复制链接]
查看936 | 回复7 | 2024-1-5 15:27:48 | 显示全部楼层 |阅读模式
前言
安信可新款雷达模组Rd-03D已经上市,该雷达采用一发两收的天线,可以实现目标跟踪,实现对区域内目标测距、测角和测速。本应用示例使用STM32解析Rd-03D的串口数据,将结果通过另一个串口发送给VC-02开发板,实现对当前人数的实时播报。
一:Rd-03D引脚说明

1.png
J1引脚说明:

2-.png
J2引脚说明:
3.png
二:软件设计框架
4.png
三:STM32F103C8T6使用CubeMX搭配HAL库配置
打开CubeMX,选择STM32F103C8T6。
选择两个串口,分别是串口1和串口2,PA9为USART1_TX,PA10为USART1_RX,PA2为USART2_TX,PA3为USART_RX。
选择异步通讯,勾选中断,注意:串口1的波特率为256000,串口2波特率为115200。
5.png
6.png
7.png
下面附上时钟配置图
8.png

四:STM32与Rd-03D和VC-02的接线

9.png
五:串口数据处理
Rd-03D的串口数据
Rd-03D模组通过串口(TTL电平)与外界通信,雷达串口默认波特率为256000,1停止位,无奇偶校验位。雷达输出检测到的目标信息,包括在区域中的x坐标,y坐标,以及目标的速度值。
雷达默认是处于单目标检测模式,需要切换至多目标检测模式。

10.png
上报是数据帧格式:
11.png
数据示例:AA FF 03 00 0E 03 B1 86 10 00 68 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 CC
红色部分表示目标1的信息,蓝色表示目标2的信息,绿色表示目标3的信息。

本示例只展示有无人,所以只需要判断在对应的数据帧中有没有相应的目标信息即可。

六:VC-02的串口数据

VC-02的串口数据格式是由用户自定义的,开发的平台和资料可以在VC系列模组官网查看,链接:https://docs.ai-thinker.com/voice_module

这里附上我自己定义的串口协议和语音指令表格,串口输出均为16进制数,文章结尾附上VC-02固件。
12.png
七:STM32数据处理
这里我是采取设置标志位的方式处理数据。为了防止在雷达数据下发过快时,语音一直重复播报的情况。
  1. uint8_t RX_BUF[64]={0};          //缓存数组
  2. uint8_t RX_count=0;              //计数位
  3. uint8_t RX_temp;        //缓存字符

  4. uint8_t Radar_1=0;                        //目标1标志位
  5. uint8_t Radar_2=0;                        //目标2标志位
  6. uint8_t Radar_3=0;                        //目标3标志位

  7. uint8_t Speaker_1=0;                //语音播报目标1标志
  8. uint8_t Speaker_2=0;                //语音播报目标2标志
  9. uint8_t Speaker_3=0;                //语音播报目标3标志

  10. uint8_t Single_Target_Detection_CMD[]={0xFD,0xFC,0xFB,0xFA,0x02,0x00,0x80,0x00,0x04,0x03,0x02,0x01}; //单目标检测模式指令,该模式下只会检测一个目标
  11. uint8_t Multi_Target_Detection_CMD[]={0xFD,0xFC,0xFB,0xFA,0x02,0x00,0x90,0x00,0x04,0x03,0x02,0x01};         //多目标检测模式指令,该模式下只会检测多个目标

  12. uint8_t SpeakerCMD_0[5]={0x5A,0x00,0x00,0x00,0x00}; //无目标播报串口指令
  13. uint8_t SpeakerCMD_1[5]={0x5A,0x00,0x00,0x00,0x01}; //目标1播报串口指令
  14. uint8_t SpeakerCMD_2[5]={0x5A,0x00,0x00,0x00,0x02}; //目标2播报串口指令
  15. uint8_t SpeakerCMD_3[5]={0x5A,0x00,0x00,0x00,0x03}; //目标3播报串口指令

  16. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)//回调函数,检测到雷达发送一帧数据时进行处理
  17. {
  18.                 if(huart == &huart2){   //串口2触发中断
  19.                         RX_BUF[RX_count++] = RX_temp;//将缓存字符存入缓存数组中
  20.                         if((RX_BUF[RX_count-1] == 0x00)&&(RX_BUF[RX_count-2] == 0xFF)){                        //接收VC串口指令查询当前人数
  21.                                 if((0==Radar_3)&&(0==Radar_2)&&(0==Radar_1)){
  22.                                         HAL_UART_Transmit(&huart2,(uint8_t *)&SpeakerCMD_0,sizeof(SpeakerCMD_0),0xFFFF);   //触发无目标语音播报
  23.                                 }
  24.                                 else if(1==Radar_3){
  25.                                         HAL_UART_Transmit(&huart2,(uint8_t *)&SpeakerCMD_3,sizeof(SpeakerCMD_3),0xFFFF);   //触发目标3语音播报
  26.                                 }
  27.                                 else if(1==Radar_2){
  28.                                         HAL_UART_Transmit(&huart2,(uint8_t *)&SpeakerCMD_2,sizeof(SpeakerCMD_2),0xFFFF);                //触发目标2语音播报
  29.                                 }
  30.                                 else if(1==Radar_1){
  31.                                         HAL_UART_Transmit(&huart2,(uint8_t *)&SpeakerCMD_1,sizeof(SpeakerCMD_1),0xFFFF);                //触发目标1语音播报
  32.                                 }
  33.                                
  34.                                 while(HAL_UART_GetState(&huart2)==HAL_UART_STATE_BUSY_TX); //判缓存数组是否发送完毕
  35.                                
  36.                                 memset(RX_BUF,0x00,sizeof(RX_temp));//清空缓存数组
  37.                                 RX_count = 0;//计数位置零
  38.                         }
  39.                         HAL_UART_Receive_IT(&huart2,&RX_temp,1);//串口2继续接收数据
  40.         }
  41.                
  42.                 if(huart == &huart1){                        //串口1触发中断
  43.                         RX_BUF[RX_count++] = RX_temp;//将缓存字符存入缓存数组中
  44.                         if((RX_BUF[RX_count-1] == 0xCC)&&(RX_BUF[RX_count-2] == 0x55)){
  45.                                 if((1==Radar_1)&&(0==Speaker_1)){                                                                                                                                                //逻辑判断,触发目标1语音播报
  46.                                         HAL_UART_Transmit(&huart2,(uint8_t *)&SpeakerCMD_1,sizeof(SpeakerCMD_1),0xFFFF);
  47.                                         Speaker_1=1;
  48.                                 }
  49.                                 else if((1==Radar_2)&&(0==Speaker_2)){                                                                                                                                                //逻辑判断,触发目标2语音播报
  50.                                         HAL_UART_Transmit(&huart2,(uint8_t *)&SpeakerCMD_2,sizeof(SpeakerCMD_2),0xFFFF);
  51.                                         Speaker_2=1;
  52.                                 }
  53.                                 else if((1==Radar_3)&&(0==Speaker_3)){                                                                                                                                                //逻辑判断,触发目标3语音播报
  54.                                         HAL_UART_Transmit(&huart2,(uint8_t *)&SpeakerCMD_3,sizeof(SpeakerCMD_3),0xFFFF);
  55.                                         Speaker_3=1;
  56.                                 }
  57.                                 else if((0x00==RX_BUF[5])&&(0x00==RX_BUF[14])&&(0x00==RX_BUF[22]))                         //数据比较,雷达检测到无目标
  58.                                 {
  59.                                  Radar_1=0;
  60.                                  Radar_2=0;
  61.                                  Radar_3=0;
  62.                                  Speaker_1=0;
  63.                                  Speaker_2=0;
  64.                                  Speaker_3=0;
  65.                                 }
  66.                                 else if((0x00!=RX_BUF[5])&&(0x00==RX_BUF[14])&&(0x00==RX_BUF[22]))        //数据比较,雷达检测到一个目标
  67.                                 {
  68.                                  Radar_1=1;
  69.                                  Radar_2=0;
  70.                                  Radar_3=0;
  71.                                  Speaker_2=0;
  72.                                  Speaker_3=0;
  73.                                 }
  74.                                 else if((0x00!=RX_BUF[5])&&(0x00!=RX_BUF[14])&&(0x00==RX_BUF[22]))        //数据比较,雷达检测到两个目标
  75.                                 {
  76.                                  Radar_1=0;
  77.                                  Radar_2=1;
  78.                                  Radar_3=0;
  79.                                  Speaker_1=0;
  80.                                  Speaker_3=0;
  81.                                 }
  82.                                 else if((0x00!=RX_BUF[5])&&(0x00!=RX_BUF[14])&&(0x00!=RX_BUF[22]))        //数据比较,雷达检测到三个目标
  83.                                 {
  84.                                  Radar_1=0;
  85.                                  Radar_2=0;
  86.                                  Radar_3=1;
  87.                                  Speaker_1=0;
  88.                                  Speaker_2=0;
  89.                                 }       
  90. //      HAL_UART_Transmit(&huart1,(uint8_t *)&RX_BUF,RX_count,0xFFFF);//将缓存数组中的数据从串口发送出去
  91.                                 while(HAL_UART_GetState(&huart2)==HAL_UART_STATE_BUSY_TX);//判缓存数组是否发送完毕
  92.                                 memset(RX_BUF,0x00,sizeof(RX_temp));//清空缓存数组
  93.                                 RX_count = 0;//计数位置零
  94.                         }  
  95.                         HAL_UART_Receive_IT(&huart1,&RX_temp,1);//串口1继续接收数据
  96.   }
  97. }
复制代码
八:源码地址和固件
源码地址:https://e.coding.net/axk/stm32_rd-03/STM32_Rd-03D_VC-02.git

用心做好保姆工作
回复

使用道具 举报

1084504793 | 2024-1-5 16:41:29 | 显示全部楼层
回复

使用道具 举报

WangChong | 2024-1-5 17:35:53 | 显示全部楼层
vc01可以吗 ,我只有01
回复 支持 反对

使用道具 举报

爱笑 | 2024-1-5 17:41:11 | 显示全部楼层
WangChong 发表于 2024-1-5 17:35
vc01可以吗 ,我只有01

这个需要问问泽哥
用心做好保姆工作
回复 支持 反对

使用道具 举报

san | 2024-1-5 20:17:18 | 显示全部楼层
回复

使用道具 举报

干簧管 | 2024-1-5 22:44:22 | 显示全部楼层
回复

使用道具 举报

lazy | 2024-1-6 12:08:39 | 显示全部楼层
给园长点赞
回复 支持 反对

使用道具 举报

Ai-Thinker小泽 | 2024-1-9 11:29:35 | 显示全部楼层
WangChong 发表于 2024-1-5 17:35
vc01可以吗 ,我只有01

一样的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则