【雷达灯控】安信可 Rd-03E+ 灯+基于arduino自动渐亮开关灯手势控制调光

[复制链接]
查看543 | 回复7 | 2024-3-23 22:02:42 | 显示全部楼层 |阅读模式
一、前言
    第一次参加安信可的活动(https://bbs.ai-thinker.com/forum.php?mod=viewthread&tid=44214),没想到就中了,感谢园长,感谢安信可!!
于是乎利用手头的air001单片机做了一个人在渐亮,人走延时一会渐灭,用手势控制亮度在50%与100%之间切换的demo。本人代码萌新,代码写的能跑就算赢,求轻喷,还请大佬们多多指点。
    Rd-03E是由深圳市安信可科技有限公司开发的雷达模组,搭载矽典微的S3KM111L芯片。S3KM111L 是一种基于 FMCW 雷达收发器技术的集成单片机毫米波传感器 SoC,它工作在 24 GHz 的 K波段,每个单频扫描的调制带宽高达 1 GHz。
   Rd-03E 模组可对运动、微动人体进行探测、识别,并上报实时距离,能够探测指定区域内的目标与手势并实时上报结果,广泛应用于各种 AloT 场景。该模组具有实时性强,测距精度高,测距范围大,算法参数灵活配置等特点。
注意:
该模块采用5v供电,
支持串口通信,波特率256000
模块拿到手上就自带了手势识别固件,特别要注意模块摆放方向位置与角度,倾斜45º安装,如图:
Snipaste_2024-03-23_21-32-40.png

二、代码实现
  串口通讯协议参照手势识别固件手册:
Snipaste_2024-03-23_21-34-20.png
  1. HardwareSerial Serial2(PA1, PA0);  //RX TX

  2. unsigned char serialBuff[5], i, n = 0;  // 建立数组用于缓存
  3. int distance = 1000, lightstate = 0;    //lightstate 0=灭,1=打开,2=延时
  4. int setting1 = 60, setting2 = 110;      //单位 cm , cm
  5. unsigned long previousTime, delayTime = 2000;       //ms
  6. int m;
  7. void setup() {

  8.   pinMode(PB_1, OUTPUT);
  9.   pinMode(PB_0, OUTPUT);
  10.   pinMode(PB_3, OUTPUT);
  11.   digitalWrite(PB_3, HIGH);
  12.   //电源指示灯

  13.   Serial2.begin(256000);  //串口2连接LD-03e模块
  14.   Serial.begin(19200);    //串口1用于与计算机通讯
  15.   Serial.print("ok!");
  16. }

  17. void loop() {
  18.   readserialdata();
  19.   Serial.print("lightstate=");
  20.   Serial.println(lightstate);
  21.   switch (lightstate) {
  22.     case 0:
  23.       if (distance < setting1) {
  24.         lightON();
  25.         lightstate = 1;
  26.       }
  27.       break;
  28.     case 1:
  29.       if (distance > setting2) {  //人离开,延时
  30.         previousTime = millis();  //获取当前系统运行时间
  31.         lightstate = 2;
  32.       }
  33.       if (serialBuff[3] == 1 && n == 0) {
  34.         analogWrite(PB_0, 128);
  35.         digitalWrite(PB_1, 1);
  36.         delay(100);
  37.         n = 1;
  38.       } else if (serialBuff[3] == 1 && n == 1) {
  39.         analogWrite(PB_0, 255);
  40.         digitalWrite(PB_1, 0);
  41.         delay(100);
  42.         n = 0;
  43.       }
  44.       break;
  45.     case 2:
  46.       if (millis() > previousTime + delayTime) {
  47.         if (distance > setting2 || distance == 0) {
  48.           lightOFF();
  49.           digitalWrite(PB_1, 0);
  50.           lightstate = 0;
  51.         } else {
  52.           lightstate = 1;
  53.         }
  54.       } else if (distance < setting1) {
  55.         lightstate = 1;
  56.       }
  57.       break;
  58.     default: break;
  59.   }
  60. }


  61. void lightON() {  //缓亮缓灭
  62.   for (m = 0; m < 256; m++) {
  63.     analogWriteFrequency(10000);  //10kHzPWM
  64.     analogWrite(PB_0, m);
  65.     delay(8);
  66.     readserialdata();  //保持读串口防止串口数据溢出
  67.   }
  68. }

  69. void lightOFF() {
  70.   for (m = 255; m > -1; m--) {
  71.     analogWriteFrequency(10000);  //10kHzPWM
  72.     analogWrite(PB_0, m);
  73.     delay(10);
  74.     readserialdata();  //保持读串口防止串口数据溢出
  75.   }
  76. }

  77. void readserialdata() {
  78.   if (Serial2.available()) {  // 当串口接收到信息后
  79.     //Serial.println("Serial Data Available...");
  80.     Serial2.readBytesUntil(0x55, serialBuff, 5);  //读取串口信息直到遇到55或5个字节
  81.     if (serialBuff[0] == 0xAA) {                  //校验帧头是否为AA
  82.       //Serial.print("Received Serial Data: ");     // 输出serialBuff接收到的内容
  83.       //for (i = 0; i < 5; i++) {
  84.       //Serial.print(serialBuff[i], HEX);
  85.       //}
  86.       //Serial.println("");
  87.       distance = serialBuff[1] + serialBuff[2] * 256;  //计算距离值
  88.       Serial.print("distance=");
  89.       Serial.println(distance);  //输出距离值
  90.     } else {
  91.       Serial.print("Data error");  //若不是AA,则重置数组serialBuffer
  92.       for (i = 0; i < 5; i++) {
  93.         serialBuff[i] = 255;
  94.       }
  95.     }
  96.   }
  97. }
复制代码
三、仍待解决问题
    1、 测试时发现挥手时身体最好不要挡在雷达正前方,最好侧身做手势不然有时会不灵。也可能是我模块摆放位置不太好。
    2、 人离开时模块返回距离值升高,离开检测范围后模块返回距离值又降为0,导致上面这版代码有时会出bug
四、视频

蓝灯当做电源指示灯,绿灯代表照明灯具(后面会加一个nmos带一条大功率灯带),红灯是亮度调节指示灯。视频按手势调节亮度、人来灯亮、人走灯灭顺序展示。
五、参考文档
Rd-03E 手势识别上位机

Rd-03E 快速入门使用文档

Rd-03E 手势识别固件用户手册
附上官方文档下载地址链接:
Rd-03E 系列模组资料


回复

使用道具 举报

干簧管 | 2024-3-23 23:02:35 | 显示全部楼层
👍
回复

使用道具 举报

1055173307 | 2024-3-24 10:33:06 | 显示全部楼层
学习
回复

使用道具 举报

1084504793 | 2024-3-24 14:52:04 | 显示全部楼层
回复

使用道具 举报

lazy | 2024-3-24 16:26:16 | 显示全部楼层
点赞
回复

使用道具 举报

lovzx | 2024-3-24 19:25:10 | 显示全部楼层
学习
回复

使用道具 举报

WT_0213 | 2024-3-24 21:22:54 | 显示全部楼层
学习
回复

使用道具 举报

wukong50 | 2024-3-27 08:52:35 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则