前言
安信可新款雷达模组Rd-03D已经上市,该雷达采用一发两收的天线,可以实现目标跟踪,实现对区域内目标测距、测角和测速。本应用示例使用STM32解析Rd-03D的串口数据,将结果通过另一个串口发送给VC-02开发板,实现对当前人数的实时播报。
一:Rd-03D引脚说明
J1引脚说明:
J2引脚说明:
二:软件设计框架
三:STM32F103C8T6使用CubeMX搭配HAL库配置
打开CubeMX,选择STM32F103C8T6。
选择两个串口,分别是串口1和串口2,PA9为USART1_TX,PA10为USART1_RX,PA2为USART2_TX,PA3为USART_RX。
选择异步通讯,勾选中断,注意:串口1的波特率为256000,串口2波特率为115200。
下面附上时钟配置图
四:STM32与Rd-03D和VC-02的接线
五:串口数据处理
Rd-03D的串口数据
Rd-03D模组通过串口(TTL电平)与外界通信,雷达串口默认波特率为256000,1停止位,无奇偶校验位。雷达输出检测到的目标信息,包括在区域中的x坐标,y坐标,以及目标的速度值。
雷达默认是处于单目标检测模式,需要切换至多目标检测模式。
上报是数据帧格式:
数据示例: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固件。
七:STM32数据处理
这里我是采取设置标志位的方式处理数据。为了防止在雷达数据下发过快时,语音一直重复播报的情况。
- uint8_t RX_BUF[64]={0}; //缓存数组
- uint8_t RX_count=0; //计数位
- uint8_t RX_temp; //缓存字符
- uint8_t Radar_1=0; //目标1标志位
- uint8_t Radar_2=0; //目标2标志位
- uint8_t Radar_3=0; //目标3标志位
- uint8_t Speaker_1=0; //语音播报目标1标志
- uint8_t Speaker_2=0; //语音播报目标2标志
- uint8_t Speaker_3=0; //语音播报目标3标志
- uint8_t Single_Target_Detection_CMD[]={0xFD,0xFC,0xFB,0xFA,0x02,0x00,0x80,0x00,0x04,0x03,0x02,0x01}; //单目标检测模式指令,该模式下只会检测一个目标
- uint8_t Multi_Target_Detection_CMD[]={0xFD,0xFC,0xFB,0xFA,0x02,0x00,0x90,0x00,0x04,0x03,0x02,0x01}; //多目标检测模式指令,该模式下只会检测多个目标
- uint8_t SpeakerCMD_0[5]={0x5A,0x00,0x00,0x00,0x00}; //无目标播报串口指令
- uint8_t SpeakerCMD_1[5]={0x5A,0x00,0x00,0x00,0x01}; //目标1播报串口指令
- uint8_t SpeakerCMD_2[5]={0x5A,0x00,0x00,0x00,0x02}; //目标2播报串口指令
- uint8_t SpeakerCMD_3[5]={0x5A,0x00,0x00,0x00,0x03}; //目标3播报串口指令
- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)//回调函数,检测到雷达发送一帧数据时进行处理
- {
- if(huart == &huart2){ //串口2触发中断
- RX_BUF[RX_count++] = RX_temp;//将缓存字符存入缓存数组中
- if((RX_BUF[RX_count-1] == 0x00)&&(RX_BUF[RX_count-2] == 0xFF)){ //接收VC串口指令查询当前人数
- if((0==Radar_3)&&(0==Radar_2)&&(0==Radar_1)){
- HAL_UART_Transmit(&huart2,(uint8_t *)&SpeakerCMD_0,sizeof(SpeakerCMD_0),0xFFFF); //触发无目标语音播报
- }
- else if(1==Radar_3){
- HAL_UART_Transmit(&huart2,(uint8_t *)&SpeakerCMD_3,sizeof(SpeakerCMD_3),0xFFFF); //触发目标3语音播报
- }
- else if(1==Radar_2){
- HAL_UART_Transmit(&huart2,(uint8_t *)&SpeakerCMD_2,sizeof(SpeakerCMD_2),0xFFFF); //触发目标2语音播报
- }
- else if(1==Radar_1){
- HAL_UART_Transmit(&huart2,(uint8_t *)&SpeakerCMD_1,sizeof(SpeakerCMD_1),0xFFFF); //触发目标1语音播报
- }
-
- while(HAL_UART_GetState(&huart2)==HAL_UART_STATE_BUSY_TX); //判缓存数组是否发送完毕
-
- memset(RX_BUF,0x00,sizeof(RX_temp));//清空缓存数组
- RX_count = 0;//计数位置零
- }
- HAL_UART_Receive_IT(&huart2,&RX_temp,1);//串口2继续接收数据
- }
-
- if(huart == &huart1){ //串口1触发中断
- RX_BUF[RX_count++] = RX_temp;//将缓存字符存入缓存数组中
- if((RX_BUF[RX_count-1] == 0xCC)&&(RX_BUF[RX_count-2] == 0x55)){
- if((1==Radar_1)&&(0==Speaker_1)){ //逻辑判断,触发目标1语音播报
- HAL_UART_Transmit(&huart2,(uint8_t *)&SpeakerCMD_1,sizeof(SpeakerCMD_1),0xFFFF);
- Speaker_1=1;
- }
- else if((1==Radar_2)&&(0==Speaker_2)){ //逻辑判断,触发目标2语音播报
- HAL_UART_Transmit(&huart2,(uint8_t *)&SpeakerCMD_2,sizeof(SpeakerCMD_2),0xFFFF);
- Speaker_2=1;
- }
- else if((1==Radar_3)&&(0==Speaker_3)){ //逻辑判断,触发目标3语音播报
- HAL_UART_Transmit(&huart2,(uint8_t *)&SpeakerCMD_3,sizeof(SpeakerCMD_3),0xFFFF);
- Speaker_3=1;
- }
- else if((0x00==RX_BUF[5])&&(0x00==RX_BUF[14])&&(0x00==RX_BUF[22])) //数据比较,雷达检测到无目标
- {
- Radar_1=0;
- Radar_2=0;
- Radar_3=0;
- Speaker_1=0;
- Speaker_2=0;
- Speaker_3=0;
- }
- else if((0x00!=RX_BUF[5])&&(0x00==RX_BUF[14])&&(0x00==RX_BUF[22])) //数据比较,雷达检测到一个目标
- {
- Radar_1=1;
- Radar_2=0;
- Radar_3=0;
- Speaker_2=0;
- Speaker_3=0;
- }
- else if((0x00!=RX_BUF[5])&&(0x00!=RX_BUF[14])&&(0x00==RX_BUF[22])) //数据比较,雷达检测到两个目标
- {
- Radar_1=0;
- Radar_2=1;
- Radar_3=0;
- Speaker_1=0;
- Speaker_3=0;
- }
- else if((0x00!=RX_BUF[5])&&(0x00!=RX_BUF[14])&&(0x00!=RX_BUF[22])) //数据比较,雷达检测到三个目标
- {
- Radar_1=0;
- Radar_2=0;
- Radar_3=1;
- Speaker_1=0;
- Speaker_2=0;
- }
- // HAL_UART_Transmit(&huart1,(uint8_t *)&RX_BUF,RX_count,0xFFFF);//将缓存数组中的数据从串口发送出去
- while(HAL_UART_GetState(&huart2)==HAL_UART_STATE_BUSY_TX);//判缓存数组是否发送完毕
- memset(RX_BUF,0x00,sizeof(RX_temp));//清空缓存数组
- RX_count = 0;//计数位置零
- }
- HAL_UART_Receive_IT(&huart1,&RX_temp,1);//串口1继续接收数据
- }
- }
复制代码 八:源码地址和固件
源码地址:https://e.coding.net/axk/stm32_rd-03/STM32_Rd-03D_VC-02.git
|