STM32驱动安信可RD-03D实现不同角度点亮不同LED灯

[复制链接]
查看798 | 回复3 | 2024-1-5 14:02:39 | 显示全部楼层 |阅读模式
前言
安信可新款雷达模组Rd-03D已经上市,该雷达采用一发两收的天线,可以实现目标跟踪,实现对区域内目标测距、测角和测速。
本应用示例使用STM32解析Rd-03D的串口数据,检测人体距离雷达的角度,根据角度不同点亮不同的灯珠。-60度到-20度点亮 LED1,-20度到20度点亮LED2,20度到60度点亮LED3
一: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
设置GPIO口
7.png
8.png
9.png

四:STM32与Rd-03D和LED灯的接线
10.png
五:串口数据处理
Rd-03D的串口数据
Rd-03D模组通过串口(TTL电平)与外界通信,雷达串口默认波特率为256000,1停止位,无奇偶校验位。雷达输出检测到的目标信息,包括在区域中的x坐标,y坐标,以及目标的速度值(小端模式)。
上报是数据帧格式:

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的信息。

本示例展示解析单目标模式下对角度信息进行解析,所以需对单个目标内的数据进行解析(即目标1),其中单个目标具体包含内容如下:

12.png
根据目标X,Y坐标数据帧说明可知,若像上述数据示例,模组将目标1的角度数据转换为相关坐标信息的过程展示如下:
目标1x坐标:OxOE+Ox03*256= 782
0-782= -782 mm;
目标1y坐标:OxB1+Ox86*256 = 34481
34481-2^15= 1713 mm;
六:STM32数据处理
角度计算过程运用到了三角函数知识,求对边比邻边(即x/y)tan(θ)角度,如图:
13.png
具体实现代码:
  1. #define LED_ON_2 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_SET);
  2. #define LED_OFF_2 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET);
  3. #define LED_ON_4 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_SET);
  4. #define LED_OFF_4 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_RESET);
  5. #define LED_ON_6 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);
  6. #define LED_OFF_6 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);

  7. #define PI 3.14159265
  8. uint8_t RX_BUF[64]={0};  //缓存数组
  9. uint8_t RX_count=0;      //计数位
  10. uint8_t RX_temp;         //缓存字符
  11. uint16_t range;          //感应距离
  12. int16_t x_pos;           //x轴坐标
  13. int16_t y_pos;          //y轴坐标
  14. double angle;          //角度

  15. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)//回调函数,检测到雷达发送一帧数据时进行处理
  16. {
  17.          
  18.         if(huart == &huart1){                        //串口1触发中断
  19.                         RX_BUF[RX_count++] = RX_temp;//将缓存字符存入缓存数组中
  20.                         if((RX_BUF[RX_count-1] == 0xCC)&&(RX_BUF[RX_count-2] == 0x55)){//判断帧尾

  21.                                 //sprintf(str,"4: %02x,5: %02x,6: %02x,7: %02x\r\n",RX_BUF[4],RX_BUF[5],RX_BUF[6],RX_BUF[7]);
  22.                  //HAL_UART_Transmit(&huart2,(uint8_t *)str,strlen(str),0xFFFF);
  23.                                 if((0x00==RX_BUF[5])&&(0x00==RX_BUF[14])&&(0x00==RX_BUF[22]))//数据比较,雷达检测到无目标
  24.                          {
  25.                                   LED_OFF_2;
  26.                             LED_OFF_4;
  27.                              LED_OFF_6;

  28.                          }

  29.                                 else {
  30.                                         x_pos=(RX_BUF[5]<<8)+RX_BUF[4];//获取X坐标
  31.                                         y_pos=(RX_BUF[7]<<8)+RX_BUF[6];//获取Y坐标
  32.                                         int16_t tempx,tempy;
  33.                                         tempx = 0x8000&x_pos;//保留最高位
  34.                                         x_pos = x_pos&0x7fff;//清除最高位
  35.                                         if(!tempx){//判断最高位是否为0
  36.                                                 x_pos = -x_pos;//为0则取反(即坐标变负值)
  37.                                         }
  38.                                         //跟X坐标同理
  39.                                         tempy = 0x8000&y_pos;
  40.                                         y_pos = y_pos&0x7fff;
  41.                                         if(!tempy){
  42.                                                 y_pos = -y_pos;
  43.                                         }
  44.                                        
  45.                                 
  46.                 char x_y_pos[32]={0};
  47.                                 sprintf(x_y_pos,"x_pos: %d,y_pos: %d\r\n",x_pos,y_pos);
  48.                 HAL_UART_Transmit(&huart2,(uint8_t *)x_y_pos,strlen(x_y_pos),0xFFFF);  //输出X,Y轴坐标
  49.                                  
  50.                                 angle = atan2 (x_pos,y_pos) * 180.0 / PI;//使用三角函数公式反正切函数atan2得角度
  51.                                 char angle_str[32]={0};
  52.                                 sprintf(angle_str,"angle: %lf,\r\n",angle);
  53.                  HAL_UART_Transmit(&huart2,(uint8_t *)angle_str,strlen(angle_str),0xFFFF);  //输出角度
  54.                                  
  55.                                    if((angle>=(-60)&&(angle<(-20))))   //-60度到-20度
  56.                                  {
  57.                                           LED_ON_2;
  58.                                           LED_OFF_4;
  59.                                           LED_OFF_6;
  60.                                  }
  61.                                 else  if((angle>=(-20)&&(angle<=20)))       //-20度到20度
  62.                                  {
  63.                                           LED_OFF_2;
  64.                                           LED_ON_4;
  65.                                           LED_OFF_6;
  66.                                  }
  67.                                  else if((angle>20&&(angle<=60)))       //20度到60度
  68.                                  {
  69.                                           LED_OFF_2;
  70.                                           LED_OFF_4;
  71.                                           LED_ON_6;
  72.                                  }
  73.                
  74.                         }
  75.                                 while(HAL_UART_GetState(&huart2)==HAL_UART_STATE_BUSY_TX);//判缓存数组是否发送完毕
  76.                                 memset(RX_BUF,0x00,sizeof(RX_temp));//清空缓存数组
  77.                                 RX_count = 0;//计数位置零
  78.                         }  
  79.                         HAL_UART_Receive_IT(&huart1,&RX_temp,1);//串口1继续接收数据
  80.   }
  81. }
复制代码
七:效果演示
https://www.bilibili.com/video/BV1uN41147Qm?p=4&vd_source=a701bf07bcd16747985957dcae125a44
八:源码地址
https://e.coding.net/axk/stm32_rd-03/STM32_Rd03D_LED.git

用心做好保姆工作
回复

使用道具 举报

lvxinjia123 | 2024-1-5 14:36:24 | 显示全部楼层
赞一个
回复

使用道具 举报

1084504793 | 2024-1-5 14:51:47 | 显示全部楼层
回复

使用道具 举报

李白百 | 2024-2-29 10:19:10 | 显示全部楼层
学习学习
回复

使用道具 举报

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

本版积分规则