【雷达灯控】安信可 Rd-03E出厂固件点灯

[复制链接]
查看518 | 回复10 | 2024-3-9 21:06:35 | 显示全部楼层 |阅读模式
本帖最后由 iiv 于 2024-3-10 19:04 编辑

大家好,昨天收到了rd03e雷达模块,经过一翻摸索,最后使用“M61”读取雷达出厂自带的手势识别固件串口信息实现了人体检测和手势检测点灯,这个固件楼楼觉得手势效果很不错,但是测距有一丢丢拉跨,不过也能用。


接线啥的非常简单,也没什么好说的,这里楼楼主要想说一下楼楼遇到最大的问题,那就是误触,大家一定要把雷达固定好,按照手册的指示那样子,一点要把它摆好,需要注意的是,它是使用5V供电的哦。

话不多说,先点个灯!


手势.gif


这个是手势识别的,感觉除了有点费胳膊以外别的都挺好的,也非常灵敏。


距离.gif


这个是通过串口输出的距离来判断是否有人存在,要是有人就开灯,反之就关闭灯,效果也还算可以吧。



                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图



下面说一下雷达的串口数据格式,楼楼使用的是出厂自带的手势识别的



1.png


这些文档中都给我们描述的很清楚,只要细心找都会找到,其余的也好像没啥要注意的,知道了格式之后我们直接读串口就可以了,一定要注意,雷达要固定好,固定好,固定好....

下面楼楼分享一下楼楼使用M61开发板读取雷达数据控制灯的代码,供大家参考,如果大家刚接触M61这块板子,可以参考一下楼楼的代码,如果是大佬,请划走/手动滑稽

楼楼把代码分成了2个文件

RD_03E_gesture.h ,新建一个复制粘贴进去
  1. #ifndef _RD_03E_GESTURE
  2. #define _RD_03E_GESTURE

  3. #include "bflb_uart.h"
  4. #include <bflb_gpio.h>
  5. struct bflb_device_s *uartx;
  6. struct bflb_device_s *gpio;

  7. #define FRAME_START 0xAA //帧头
  8. #define FRAME_END   0x55 //帧尾
  9. #define FRAME_LENGTH 5   //长度
  10. #define BAUDRATE 256000  //波特率
  11. #define RD03_UART "uart1" //串口


  12. /**
  13. * @brief 保存雷达数据的结构体
  14. * @param frame_buffer   【数组】完整的一帧数据
  15. * @param dist    距离
  16. * @param gest    手势
  17. */
  18. struct RD03_ES{
  19.     uint8_t frame_buffer[FRAME_LENGTH]; //一帧数据
  20.     uint32_t dist;  /*距离*/
  21.     uint32_t gest; /*手势*/
  22. };

  23. // 功能:初始化串口
  24. // 参数一:rx_pin
  25. // 参数一:tx_pin
  26. void RD_03E_init(uint8_t RD_rx_pin, uint8_t RD_tx_pin){
  27.     gpio = bflb_device_get_by_name("gpio");
  28.     bflb_gpio_uart_init(gpio, RD_tx_pin, GPIO_UART_FUNC_UART1_TX);
  29.     bflb_gpio_uart_init(gpio, RD_rx_pin, GPIO_UART_FUNC_UART1_RX);
  30.     uartx = bflb_device_get_by_name(RD03_UART);
  31.     struct bflb_uart_config_s cfg = {
  32.         .baudrate = BAUDRATE,
  33.         .data_bits = UART_DATA_BITS_8,
  34.         .stop_bits = UART_STOP_BITS_1,
  35.         .parity = UART_PARITY_NONE,
  36.         .flow_ctrl = 0,
  37.         .tx_fifo_threshold = 4,
  38.         .rx_fifo_threshold = 4,
  39.     };
  40.     bflb_uart_init(uartx, &cfg);
  41.     bflb_uart_enable(uartx);
  42. }

  43. //读取一帧数据
  44. //参数一:保存数据的结构体
  45. void RD03E_read(struct RD03_ES *rd_data){
  46.     int _data, buffer_index = 0;
  47.     while (1) {
  48.         if(bflb_uart_rxavailable(uartx)){
  49.             _data = bflb_uart_getchar(uartx);

  50.             // 接收到帧头时,开始接收新帧
  51.             if (_data == FRAME_START) {
  52.                 buffer_index = 0;
  53.                 rd_data->frame_buffer[buffer_index++] = _data;
  54.             }
  55.             // 当接收到有效数据且未满一帧时,继续存储数据
  56.             else if (buffer_index < FRAME_LENGTH && _data != FRAME_END) {
  57.                 rd_data->frame_buffer[buffer_index++] = _data;
  58.             }
  59.             // 当接收到帧尾并且数据长度正好为5时,打印并重新开始接收下一帧
  60.             else if (buffer_index == FRAME_LENGTH - 1 && _data == FRAME_END) {
  61.                 rd_data->frame_buffer[buffer_index++] = _data;
  62.                 rd_data->gest = rd_data->frame_buffer[3]; // 手势
  63.                 rd_data->dist = (rd_data->frame_buffer[2] << 8) | rd_data->frame_buffer[1]; //距离
  64.                 buffer_index = 0;
  65.                 return;
  66.             }
  67.         }
  68.     }
  69. }

  70. #endif
复制代码

main.c
  1. #include "RD_03E_gesture.h"
  2. #include "board.h"

  3. #define LED_PIN 34
  4. #define RD03_RX_PIN 26
  5. #define RD03_TX_PIN 27

  6. int main(void)
  7. {

  8.     board_init();
  9.     uint8_t flg = 0;
  10.     RD_03E_init(RD03_RX_PIN,RD03_TX_PIN);
  11.     struct RD03_ES rd_data;
  12.     bflb_gpio_init(gpio, LED_PIN, GPIO_OUTPUT);
  13.     while (1) {
  14.         // 读一帧数据
  15.         RD03E_read(&rd_data);

  16.         // -----------------------打印全部信息------------------------------------------
  17.         printf("雷达数据:");
  18.         for (int i = 0; i < FRAME_LENGTH; ++i) {
  19.             printf("%02X ", rd_data.frame_buffer[i]);
  20.         }
  21.         printf("\r\n");

  22.         printf("距离:%d CM\r\n",rd_data.dist);
  23.         printf("手势:%d\r\n",rd_data.gest);
  24.         // -----------------------------------------------------------------

  25.         // // 读取手势
  26.         // if(rd_data.gest == 1){
  27.         //     printf("检测到手势!");
  28.         //     if (flg) {
  29.         //         bflb_gpio_reset(gpio, LED_PIN); flg = 0;
  30.         //     } else {
  31.         //         bflb_gpio_set(gpio, LED_PIN); flg = 1;
  32.         //     }
  33.             
  34.         // }

  35.         // 读距离
  36.         // if(rd_data.dist != 0){
  37.         //     printf("检测到有人存在!");
  38.         //     bflb_gpio_reset(gpio, LED_PIN);
  39.         // }else{
  40.         //     printf("人已离开!");
  41.         //     bflb_gpio_set(gpio, LED_PIN);
  42.         // }
  43.         bflb_mtimer_delay_ms(2);
  44.         
  45.     }
  46. }
复制代码

楼楼把雷达数据分成了3部分,大家可以直接按照楼楼写的这样把注释打开直接获取某个需要的状态,别的楼楼没什么要说的,就先这样。

重要的事说三遍:
雷达一定要按照要求固定好!
雷达一要按照要求固定好!
雷达一要按照要求固定好!





回复

使用道具 举报

WT_0213 | 2024-3-9 23:58:21 | 显示全部楼层
回复

使用道具 举报

hdydy | 2024-3-10 09:51:48 | 显示全部楼层
向大佬学习
回复 支持 反对

使用道具 举报

1055173307 | 2024-3-10 11:43:10 | 显示全部楼层
回复

使用道具 举报

干簧管 | 2024-3-10 13:42:12 | 显示全部楼层
狗哥牛
回复

使用道具 举报

业余菜狗 | 2024-3-11 10:43:38 来自手机 | 显示全部楼层
干簧管 发表于 2024-3-10 13:42
狗哥牛

串台了
回复 支持 反对

使用道具 举报

干簧管 | 2024-3-11 15:23:13 | 显示全部楼层

呃,尴尬了,把七哥认成你了
回复 支持 反对

使用道具 举报

lazy | 2024-3-11 15:28:40 | 显示全部楼层
闪光灯的感脚
回复 支持 反对

使用道具 举报

sansui | 2024-3-12 13:51:18 | 显示全部楼层
回复

使用道具 举报

7788 | 2024-3-12 19:05:38 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则