【雷达灯控】安信可 Rd-03E+ 台灯基于MM32G0001

[复制链接]
查看1517 | 回复16 | 2024-2-29 20:02:43 | 显示全部楼层 |阅读模式
本帖最后由 WangChong 于 2024-2-29 20:30 编辑

简介
大家好,安信可大大又有活动了,这次安信可赠送的是雷达模块RD-03E。由于之前参加活动获取了一块,所以现在可以提前发帖进行DIY。这次给大家带来教程的是如何使用RD-03E模块来使家里不智能的台灯变得稍微聪明点。并且给参加这次雷达活动的朋友们先探探路。


模块介绍及资料获取
好了,废话不多说。 我们来先看一下RD-03E模块
360截图18141220403883.png
我们这次采用的是官方的出厂固件,也就是精准测距模块,当然这块雷达也支持手势识别,但是本篇教程并未涉及,所以不做深究。
首先我们来获取一下官方提供的文档资料以及上位机软件。
360截图18180713103111130.png

在上述链接页面找到这个文档并且点击下载。 并且下载下图所示的上位机软件。此时,所需的文档和软件资料准备完毕。
360截图16720404335147.png



串口工具连接并且使用上位机访问RD-03E


360截图17001018447926.png

使用串口工具,将雷达模块的OT1连接至串口工具的RX, 雷达的RX连接串口工具的TX(如果仅仅接收数据的话RX可以不接)

打开上位机软件并且按照下面步骤进行连接
360截图17071209534543.png

实际上,这个上位机工具对我们来说没有什么用处。我们需要的是通过MCU解析雷达模块发送的数据并且来控制台灯的点亮或者熄灭。我们可以打开串口助手来实际的查看串口发送的数据

打开安信可串口助手,并且设置波特率为256000
360截图17110705786665.png
我们可以观察到雷达一直在输出数据。

数据解析及程序撰写
根据上述接收到的数据以及上面下载文档的通信协议章节的解读我们得知,雷达数据的数据帧格式为7个字节。
高两个字节为数据帧的起始,第三个字节为雷达检测到目标的当前状态,第四个和第五个字节则为雷达于目标的距离数据,最后两个字节为帧结尾。
那么我们只需要写一个程序来解析这个串口的数据帧即可完成对雷达状态的解析。
360截图17670909454282.png

我们不需要距离信息,因此我们在数据帧起始之后只需要判断数据帧开头后的第一个字节也就是7个字节中的第三位则可以判断是否有物体运动

代码如下:
  1. #define _MAIN_C_        
  2. /* Files include */
  3. #include "platform.h"
  4. #include "gpio_led_toggle.h"
  5. #include "main.h"
  6. #include <string.h>

  7. void clearArray(uint8_t* array, size_t size) {
  8.     memset(array, 0, size);
  9. }
  10. int main(void)
  11. {               
  12.     uint8_t received[7];
  13.     uint8_t temp;
  14.     uint8_t status = 0;
  15.     uint8_t index = 0;
  16.     PLATFORM_Init();
  17.     while (1)
  18.     {
  19.         if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE))
  20.         {
  21.             temp = USART_ReceiveData(USART1);
  22.             //接收第一位, 数据开始
  23.             if(status == 0 && temp == 0xAA)
  24.             {
  25.                 received[index] = temp;
  26.                 status = 1;
  27.                 index ++;
  28.             } else if(status == 1 && temp ==0xAA)
  29.             {
  30.                 //接收第二位
  31.                 received[index] = temp;
  32.                 index ++;
  33.                 status = 2;
  34.             } else if(status == 1 && temp !=0xAA)
  35.             {
  36.                 //清空非法起始位
  37.                 clearArray(received, 7);
  38.                 status=0;
  39.                 index =0;
  40.             } else if(status ==2)
  41.             {
  42.                 //连续接收五次
  43.                 received[index]= temp;
  44.                 index ++;
  45.             } else {
  46.                 continue;
  47.             }
  48.             //重置,等待开始
  49.             if(index == 7)
  50.             {
  51.                 if(received[2]==0x01 || received[2]==0x02) {
  52.                     //点亮
  53.                     GPIO_WriteBit(GPIOA,GPIO_PIN_11,BIT_RESET);
  54. //                                                                                PLATFORM_DelayMS(1000 * 60);
  55.                 } else {
  56.                     //熄灭
  57.                     GPIO_WriteBit(GPIOA,GPIO_PIN_11,BIT_SET);
  58.                 }
  59.                 clearArray(received, 7);
  60.                 index =0;
  61.                 status =0;
  62.             }
  63.         }

  64.     }
  65. }

复制代码

这里的代码主要是使用了一个状态机制,当程序检测到数据起始帧的AA AA的话,那么再接收数据体,或者帧尾,当接收到非法帧的话则清空之前接收到的数据。
在完成一个完整的数据帧接收之后,根据接收到的7个字节中的第三个字节来判断当前雷达检测物体的状态。从而决定是否点亮台灯。之后再清除标注位,让程序进入下一轮的循环。 如果觉得点亮或者熄灭太快的话可以在点亮之后增加适当的延时。

视频效果演示
【智能台灯】



Project.zip

602.66 KB, 下载次数: 30

回复

使用道具 举报

lovzx | 2024-2-29 20:29:56 | 显示全部楼层
王哥v5
回复

使用道具 举报

楚华 | 2024-2-29 20:58:29 | 显示全部楼层
回复

使用道具 举报

知行合一 | 2024-2-29 22:13:09 | 显示全部楼层
赞一下
回复

使用道具 举报

bzhou830 | 2024-3-1 08:41:45 | 显示全部楼层
王哥v5
选择去发光,而不是被照亮
回复

使用道具 举报

爱笑 | 2024-3-1 08:43:18 | 显示全部楼层
不错不错
用心做好保姆工作
回复

使用道具 举报

noonezero | 2024-3-1 08:54:50 | 显示全部楼层
赞,赞,赞
回复

使用道具 举报

干簧管 | 2024-3-1 09:10:06 | 显示全部楼层
王哥👍
回复

使用道具 举报

lvxinjia123 | 2024-3-1 09:10:43 | 显示全部楼层
赞一个
回复

使用道具 举报

WT_0213 | 2024-3-1 09:41:10 | 显示全部楼层
这就完成了?
回复 支持 反对

使用道具 举报

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

本版积分规则