STM32驱动安信可Rd-03E点亮LED灯

前言

安信可新款雷达模组Rd-03E已经上市,该雷达采用高性能一发一收微带天线,包含极简化 24 GHz 雷达传感器硬件 Xen102 和智能算法固件 RM01,而智能算法固件 RM01 采用 FMCW 波形和 S3系列芯片专有的先进信号处理技术,可以实现精准的人体测距和运动/微动人体感应。本应用示例使用STM32解析Rd-03E的串口数据,检测人体距离雷达的距离,根据距离不同来点亮不同的灯珠,0~2米内点亮 LED1,2~4米内点亮 LED2,4~6米内点亮 LED3。


一、Rd-03E引脚说明

硬件实物图
J2引脚说明:

J#PIN# 名称 功能 工作范围
J2Pin1 VCC 电源输入 4.5V~5.5V
J2Pin2 GND 接地 -
J2Pin3 OT1 UART_TX 0~3.3V
J2PIN4 RX UART_RX 0~3.3V
J2PIN5 OT2 UART_TX(备用) 0~3.3V

J3引脚说明:

J#PIN# 名称 功能 说明
J3PIN1 GND 接地 -
J3PIN2 DIO 数据口 0~3.3V
J3PIN3 CLK 时钟信号 0~3.3V
J3PIN4 3V3 电源输入 3.3V

二、软件设计框架

在这里插入图片描述


三、STM32F103C8T6使用CubeMX搭配HAL库配置

打开CubeMX,选择STM32F103C8T6。
选择两个串口,分别是串口1和串口2,PA9为USART1_TX,PA10为USART1_RX,PA2为USART2_TX,PA3为USART_RX。
选择异步通讯,勾选中断,注意:串口1的波特率为256000,串口2波特率为115200。
在这里插入图片描述
在这里插入图片描述
设置GPIO口
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


四、STM32与Rd-03E和LED灯的接线

Rd-03E STM32 LED
5V — — 5V — —
GND — — GND — — LED1\2\3 负极
OT1 — — PA10
RX — — PA9
PA11 — — LED1正极
PA12 — — LED2正极
PA15 — — LED2正极

五、串口数据

Rd-03E模组通过串口(TTL电平)与外界通信,雷达串口默认波特率为256000,1停止位,无奇偶校验位。雷达输出检测到的运动/微动/无人状态以及距离信息。

Rd-03E 数据通信使用小端格式,以下表格中所有数据均为十六进制,数据帧格式如下:

帧头 目标状态 距离信息 帧尾部
AA AA 1byte 2byte 55 55
目标状态值 说明
0x00 无目标
0x01 运动目标
0x02 微动目标

数据示例:AA AA 02 3C 00 55 55

扫描二维码关注公众号,回复: 16952361 查看本文章

红色部分表示目标状态,蓝色表示距离。


六、STM32数据处理


#define LED_ON_2 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_SET);
#define LED_OFF_2 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET);
#define LED_ON_4 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_SET);
#define LED_OFF_4 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_RESET);
#define LED_ON_6 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);
#define LED_OFF_6 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);

uint8_t RX_BUF[64]={
    
    0};  //缓存数组
uint8_t RX_count=0;      //计数位
uint8_t RX_temp;         //缓存字符
uint16_t range;          //感应距离

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)//回调函数,检测到雷达发送一帧数据时进行处理
{
    
    
	int i=0;
  if(huart == &huart1){
    
    
    RX_BUF[RX_count++] = RX_temp;//将缓存字符存入缓存数组中
	   if(RX_BUF[RX_count-1] == 0X55 && RX_BUF[RX_count-2] == 0X55){
    
    
		if((RX_BUF[0] == 0XAA)&&(RX_BUF[1] == 0XAA)&&(RX_BUF[5]==0X55)&&(RX_BUF[6]==0X55)){
    
     //判断帧头帧尾
			if(RX_BUF[2] == 0X01||RX_BUF[2] == 0X02)   //有无人检测
			{
    
    
				range=RX_BUF[4];
				range=(range<<8)|RX_BUF[3];//将小端格式下的距离数据如0X90 0X01转换成0X190
				char str[32]={
    
    0};
				sprintf(str,"[%s:%d] range: %d\r\n",__func__,__LINE__,range);
                 HAL_UART_Transmit(&huart2,(uint8_t *)str,strlen(str),0xFFFF);  //输出感应距离,单位:cm
		      
				 if((range>0X0000)&&(range<=0X00C8))    //0-2米
				 {
    
    
					  LED_ON_2;
					  LED_OFF_4;
					  LED_OFF_6;
				 }
				else if((range>0X00C8)&&(range<=0X0190))    //2-4米
				 {
    
    
					  LED_OFF_2;
					  LED_ON_4;
					  LED_OFF_6;
				 }
				 else if((range>0X0190)&&(range<=0X0258))   //4-6米 
				 {
    
    
					  LED_OFF_2;
					  LED_OFF_4;
					  LED_ON_6;
				 }
		
			}
			else if(RX_BUF[2] == 0X00)    //无人
			 {
    
    
				  LED_OFF_2;
          		  LED_OFF_4;
   		          LED_OFF_6;
			 }
			 
		}
		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://axk.coding.net/p/stm32_rd-03/d/Rd-03E_LED_demo/git


联系我们

官方网址: https://www.ai-thinker.com
Docs:https://docs.ai-thinker.com
官方论坛: http://bbs.ai-thinker.com

猜你喜欢

转载自blog.csdn.net/Boantong_/article/details/133387760