【雷达灯控】安信可 Rd-03E+ 灯 + 自由发挥

[复制链接]
查看438 | 回复3 | 2024-3-15 16:08:02 | 显示全部楼层 |阅读模式
本帖最后由 lovzx 于 2024-3-15 16:13 编辑

简介


感谢安信可的活动,白嫖到了RD-03E雷达模组,RD-03E雷达模组资料连接 Rd-03 系列模组 | 安信可科技 (ai-thinker.com),拿到后就开始找资料开始准备,刚开始是在小安派上写的代码,后来用的时候发现小安派没有多板载LED灯,也没有多余的IO来外接设备,最后想起来了好久没动过的CH32V303开发板,接下来就是准备点亮LED



准备
  • WCH-link
  • 母-母杜邦线若干
  • RD-03E雷达模块
  • CH32V303VCT6-EVT-R0开发板




烧录RD-03E固件



刷机方式:这几天水群学习到了好多,目前最多的就是通过板载的四个下载触电下载,可以选择直接焊接插座的方式,也可以选择用杜邦线公头怼上去按压的方式下载,具体文档可以参考rd-03e使用文档.pdf (ai-thinker.com)
还有一种就是按照GD23的烧录方式,上电的时候把boot0电平拉高就可以通过usb方式下载了,排针旁边就是usb插座的位置
我这里使用的是DAP烧录方式
烧录器准备:



将WCH-Link设置成DAP模式,如下图所示,选择DAP模式后点击右边的Set按钮

wch-link设置教程.png


RD-03E数据格式
rd-03e精准测距用户手册中文版.pdf (ai-thinker.com)手册里面有说明RD-03E是通过串口输出的方式,采用小端序格式,每一帧数据是7个字节,前两位是0xAA 0xAA,第三位是状态码,第4-5位是距离,最后两位是0x55 0x55,所以需要判断前面两字节和后面两字节是否匹配0xAA 0xAA和0x55 0x55就可以了

硬件连接
ch32v303有8个uart接口,RD-03E接入到板载的uart2,uart1用来连接电脑查看日志,板载LED连接到PC6上
代码如下
  1. #include "debug.h"

  2. #include "ring_buffer.h"

  3. static Ring_Buffer_Type rbType;
  4. static u8 rb_buffer[128];

  5. void USART2_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));

  6. void led_init() {

  7.         //设置led引脚为PC6,同时需要用杜邦线把LED1或者LED2连接到PC6引脚,这样就可以通过PC6来控制LED了
  8.         GPIO_InitTypeDef ledGPIO = { 0 };
  9.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
  10.         ledGPIO.GPIO_Pin = GPIO_Pin_6;
  11.         ledGPIO.GPIO_Mode = GPIO_Mode_Out_PP;
  12.         ledGPIO.GPIO_Speed = GPIO_Speed_50MHz;
  13.         GPIO_Init(GPIOC, &ledGPIO);
  14.         GPIO_WriteBit(GPIOC, GPIO_Pin_6, Bit_SET);
  15. }

  16. u8 status = -1;
  17. void led_switch(uint8_t open) {
  18.         if (open != status) {
  19.                 GPIO_WriteBit(GPIOC, GPIO_Pin_6, (open == 0) ? (Bit_SET) : (Bit_RESET));
  20.                 status = open;
  21.         }
  22. }

  23. //初始化uart2
  24. void USART2_Init() {
  25.         GPIO_InitTypeDef gpio = { 0 };
  26.         USART_InitTypeDef uart = { 0 };
  27.         NVIC_InitTypeDef nvic = { 0 };

  28.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
  29.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

  30.         /**
  31.          * A2 TX
  32.          * A3 RX
  33.          */
  34.         gpio.GPIO_Pin = GPIO_Pin_2;
  35.         gpio.GPIO_Speed = GPIO_Speed_50MHz;
  36.         gpio.GPIO_Mode = GPIO_Mode_AF_PP;
  37.         GPIO_Init(GPIOA, &gpio);

  38.         gpio.GPIO_Pin = GPIO_Pin_3;
  39.         gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  40.         GPIO_Init(GPIOA, &gpio);

  41.         uart.USART_BaudRate = 256000;
  42.         uart.USART_WordLength = USART_WordLength_8b;
  43.         uart.USART_StopBits = USART_StopBits_1;
  44.         uart.USART_Parity = USART_Parity_No;
  45.         uart.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  46.         uart.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;

  47.         USART_Init(USART2, &uart);

  48.         //注册uart2中断
  49.         USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);

  50.         nvic.NVIC_IRQChannel = USART2_IRQn;
  51.         nvic.NVIC_IRQChannelPreemptionPriority = 1;
  52.         nvic.NVIC_IRQChannelSubPriority = 1;
  53.         nvic.NVIC_IRQChannelCmd = ENABLE;

  54.         NVIC_Init(&nvic);

  55.         USART_Cmd(USART2, ENABLE);

  56. }

  57. //uart2中断
  58. void USART2_IRQHandler(void) {
  59.         if (USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) {
  60.                 //接收数据
  61.                 u8 read = USART_ReceiveData(USART2);
  62.                 //清除中断
  63.                 USART_ClearITPendingBit(USART2, USART_IT_RXNE);
  64.                 //保存到ring buffer中
  65.                 Ring_Buffer_Write_Byte(&rbType, read);
  66.         }
  67. }

  68. int main(void) {
  69.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  70.         SystemCoreClockUpdate();
  71.         Delay_Init();

  72.         //初始化UART1
  73.         USART_Printf_Init(256000);

  74.         //初始化接收ring buffer
  75.         Ring_Buffer_Init(&rbType, rb_buffer, sizeof(rb_buffer), NULL, NULL);

  76.         //初始化uart2
  77.         USART2_Init();

  78.         printf("SystemClk:%d\r\n", SystemCoreClock);
  79.         printf("ChipID:%08x\r\n", DBGMCU_GetCHIPID());
  80.         printf("This is printf example\r\n");

  81.         //初始化led
  82.         led_init();

  83.         u8 len = 0;
  84.         u8 buf[7] = { 0 };
  85.         u8 count = 0;
  86.         u8 read = 0;
  87.         u16 distance = 0;
  88.         while (1) {
  89.                 //获取接收到的数据长度
  90.                 len = Ring_Buffer_Get_Length(&rbType);
  91.                 for (u8 i = 0; i < len; i++) {
  92.                         //读取接收数据
  93.                         Ring_Buffer_Read_Byte(&rbType, &read);
  94.                         //第一个字节不是0xAA舍弃,从头计数
  95.                         if (count == 0 && read != 0xAA) {
  96.                                 continue;
  97.                         }
  98.                         //第二个字节不是0xAA,从头计数
  99.                         if (count == 1 && read != 0xAA) {
  100.                                 count = 0;
  101.                                 buf[0] = 0x00;
  102.                                 continue;
  103.                         }
  104.                         buf[count] = read & 0xff;
  105.                         count++;
  106.                         //拿到了一帧的数据长度
  107.                         if (count >= 7) {
  108.                                 count = 0;
  109.                                 //检查最后两个字节是不是0x55,防止数据错误
  110.                                 if (0x55 == read && 0x55 == buf[5]) {
  111.                                         //小端序,第5个字节是距离的高8位
  112.                                         distance = buf[3] | buf[4] << 8;
  113.                                         printf("distance:%#x,%#x, %d\n", buf[3], buf[4], distance);
  114.                                         if (distance >= 80) {
  115.                                                 //关灯
  116.                                                 led_switch(0);
  117.                                         } else if (distance < 60 && distance > 20) {
  118.                                                 //开灯
  119.                                                 led_switch(1);
  120.                                         }
  121.                                 }
  122.                         }
  123.                 }
  124.                 Delay_Ms(50);
  125.         }
  126. }

复制代码


效果如下
亮灯.jpg
灭灯.jpg



【安信可RD-03E雷达模块点亮LED灯】 https://www.bilibili.com/video/B ... bcdc04c8f8502594aa2



回复

使用道具 举报

1084504793 | 2024-3-15 16:12:01 | 显示全部楼层
回复

使用道具 举报

物联网 | 2024-3-16 10:14:34 | 显示全部楼层
回复

使用道具 举报

7788 | 2024-3-16 20:33:04 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则