本帖最后由 iiv 于 2024-3-10 19:04 编辑
大家好,昨天收到了rd03e雷达模块,经过一翻摸索,最后使用“M61”读取雷达出厂自带的手势识别固件串口信息实现了人体检测和手势检测点灯,这个固件楼楼觉得手势效果很不错,但是测距有一丢丢拉跨,不过也能用。
接线啥的非常简单,也没什么好说的,这里楼楼主要想说一下楼楼遇到最大的问题,那就是误触,大家一定要把雷达固定好,按照手册的指示那样子,一点要把它摆好,需要注意的是,它是使用5V供电的哦。
话不多说,先点个灯!
这个是手势识别的,感觉除了有点费胳膊以外别的都挺好的,也非常灵敏。
这个是通过串口输出的距离来判断是否有人存在,要是有人就开灯,反之就关闭灯,效果也还算可以吧。
下面说一下雷达的串口数据格式,楼楼使用的是出厂自带的手势识别的
这些文档中都给我们描述的很清楚,只要细心找都会找到,其余的也好像没啥要注意的,知道了格式之后我们直接读串口就可以了,一定要注意,雷达要固定好,固定好,固定好....
下面楼楼分享一下楼楼使用M61开发板读取雷达数据控制灯的代码,供大家参考,如果大家刚接触M61这块板子,可以参考一下楼楼的代码,如果是大佬,请划走/手动滑稽
楼楼把代码分成了2个文件
RD_03E_gesture.h ,新建一个复制粘贴进去 - #ifndef _RD_03E_GESTURE
- #define _RD_03E_GESTURE
- #include "bflb_uart.h"
- #include <bflb_gpio.h>
- struct bflb_device_s *uartx;
- struct bflb_device_s *gpio;
- #define FRAME_START 0xAA //帧头
- #define FRAME_END 0x55 //帧尾
- #define FRAME_LENGTH 5 //长度
- #define BAUDRATE 256000 //波特率
- #define RD03_UART "uart1" //串口
- /**
- * @brief 保存雷达数据的结构体
- * @param frame_buffer 【数组】完整的一帧数据
- * @param dist 距离
- * @param gest 手势
- */
- struct RD03_ES{
- uint8_t frame_buffer[FRAME_LENGTH]; //一帧数据
- uint32_t dist; /*距离*/
- uint32_t gest; /*手势*/
- };
- // 功能:初始化串口
- // 参数一:rx_pin
- // 参数一:tx_pin
- void RD_03E_init(uint8_t RD_rx_pin, uint8_t RD_tx_pin){
- gpio = bflb_device_get_by_name("gpio");
- bflb_gpio_uart_init(gpio, RD_tx_pin, GPIO_UART_FUNC_UART1_TX);
- bflb_gpio_uart_init(gpio, RD_rx_pin, GPIO_UART_FUNC_UART1_RX);
- uartx = bflb_device_get_by_name(RD03_UART);
- struct bflb_uart_config_s cfg = {
- .baudrate = BAUDRATE,
- .data_bits = UART_DATA_BITS_8,
- .stop_bits = UART_STOP_BITS_1,
- .parity = UART_PARITY_NONE,
- .flow_ctrl = 0,
- .tx_fifo_threshold = 4,
- .rx_fifo_threshold = 4,
- };
- bflb_uart_init(uartx, &cfg);
- bflb_uart_enable(uartx);
- }
- //读取一帧数据
- //参数一:保存数据的结构体
- void RD03E_read(struct RD03_ES *rd_data){
- int _data, buffer_index = 0;
- while (1) {
- if(bflb_uart_rxavailable(uartx)){
- _data = bflb_uart_getchar(uartx);
- // 接收到帧头时,开始接收新帧
- if (_data == FRAME_START) {
- buffer_index = 0;
- rd_data->frame_buffer[buffer_index++] = _data;
- }
- // 当接收到有效数据且未满一帧时,继续存储数据
- else if (buffer_index < FRAME_LENGTH && _data != FRAME_END) {
- rd_data->frame_buffer[buffer_index++] = _data;
- }
- // 当接收到帧尾并且数据长度正好为5时,打印并重新开始接收下一帧
- else if (buffer_index == FRAME_LENGTH - 1 && _data == FRAME_END) {
- rd_data->frame_buffer[buffer_index++] = _data;
- rd_data->gest = rd_data->frame_buffer[3]; // 手势
- rd_data->dist = (rd_data->frame_buffer[2] << 8) | rd_data->frame_buffer[1]; //距离
- buffer_index = 0;
- return;
- }
- }
- }
- }
- #endif
复制代码
main.c - #include "RD_03E_gesture.h"
- #include "board.h"
- #define LED_PIN 34
- #define RD03_RX_PIN 26
- #define RD03_TX_PIN 27
- int main(void)
- {
- board_init();
- uint8_t flg = 0;
- RD_03E_init(RD03_RX_PIN,RD03_TX_PIN);
- struct RD03_ES rd_data;
- bflb_gpio_init(gpio, LED_PIN, GPIO_OUTPUT);
- while (1) {
- // 读一帧数据
- RD03E_read(&rd_data);
- // -----------------------打印全部信息------------------------------------------
- printf("雷达数据:");
- for (int i = 0; i < FRAME_LENGTH; ++i) {
- printf("%02X ", rd_data.frame_buffer[i]);
- }
- printf("\r\n");
- printf("距离:%d CM\r\n",rd_data.dist);
- printf("手势:%d\r\n",rd_data.gest);
- // -----------------------------------------------------------------
- // // 读取手势
- // if(rd_data.gest == 1){
- // printf("检测到手势!");
- // if (flg) {
- // bflb_gpio_reset(gpio, LED_PIN); flg = 0;
- // } else {
- // bflb_gpio_set(gpio, LED_PIN); flg = 1;
- // }
-
- // }
- // 读距离
- // if(rd_data.dist != 0){
- // printf("检测到有人存在!");
- // bflb_gpio_reset(gpio, LED_PIN);
- // }else{
- // printf("人已离开!");
- // bflb_gpio_set(gpio, LED_PIN);
- // }
- bflb_mtimer_delay_ms(2);
-
- }
- }
复制代码
楼楼把雷达数据分成了3部分,大家可以直接按照楼楼写的这样把注释打开直接获取某个需要的状态,别的楼楼没什么要说的,就先这样。
重要的事说三遍: 雷达一定要按照要求固定好! 雷达一定要按照要求固定好! 雷达一定要按照要求固定好!
|