一、前言 于是乎利用手头的air001单片机做了一个人在渐亮,人走延时一会渐灭,用手势控制亮度在50%与100%之间切换的demo。本人代码萌新,代码写的能跑就算赢,求轻喷,还请大佬们多多指点。 Rd-03E是由深圳市安信可科技有限公司开发的雷达模组,搭载矽典微的S3KM111L芯片。S3KM111L 是一种基于 FMCW 雷达收发器技术的集成单片机毫米波传感器 SoC,它工作在 24 GHz 的 K波段,每个单频扫描的调制带宽高达 1 GHz。 Rd-03E 模组可对运动、微动人体进行探测、识别,并上报实时距离,能够探测指定区域内的目标与手势并实时上报结果,广泛应用于各种 AloT 场景。该模组具有实时性强,测距精度高,测距范围大,算法参数灵活配置等特点。 注意: 该模块采用5v供电, 支持串口通信,波特率256000 模块拿到手上就自带了手势识别固件,特别要注意模块摆放方向位置与角度,倾斜45º安装,如图:
二、代码实现 串口通讯协议参照手势识别固件手册:
- HardwareSerial Serial2(PA1, PA0); //RX TX
- unsigned char serialBuff[5], i, n = 0; // 建立数组用于缓存
- int distance = 1000, lightstate = 0; //lightstate 0=灭,1=打开,2=延时
- int setting1 = 60, setting2 = 110; //单位 cm , cm
- unsigned long previousTime, delayTime = 2000; //ms
- int m;
- void setup() {
- pinMode(PB_1, OUTPUT);
- pinMode(PB_0, OUTPUT);
- pinMode(PB_3, OUTPUT);
- digitalWrite(PB_3, HIGH);
- //电源指示灯
- Serial2.begin(256000); //串口2连接LD-03e模块
- Serial.begin(19200); //串口1用于与计算机通讯
- Serial.print("ok!");
- }
- void loop() {
- readserialdata();
- Serial.print("lightstate=");
- Serial.println(lightstate);
- switch (lightstate) {
- case 0:
- if (distance < setting1) {
- lightON();
- lightstate = 1;
- }
- break;
- case 1:
- if (distance > setting2) { //人离开,延时
- previousTime = millis(); //获取当前系统运行时间
- lightstate = 2;
- }
- if (serialBuff[3] == 1 && n == 0) {
- analogWrite(PB_0, 128);
- digitalWrite(PB_1, 1);
- delay(100);
- n = 1;
- } else if (serialBuff[3] == 1 && n == 1) {
- analogWrite(PB_0, 255);
- digitalWrite(PB_1, 0);
- delay(100);
- n = 0;
- }
- break;
- case 2:
- if (millis() > previousTime + delayTime) {
- if (distance > setting2 || distance == 0) {
- lightOFF();
- digitalWrite(PB_1, 0);
- lightstate = 0;
- } else {
- lightstate = 1;
- }
- } else if (distance < setting1) {
- lightstate = 1;
- }
- break;
- default: break;
- }
- }
- void lightON() { //缓亮缓灭
- for (m = 0; m < 256; m++) {
- analogWriteFrequency(10000); //10kHzPWM
- analogWrite(PB_0, m);
- delay(8);
- readserialdata(); //保持读串口防止串口数据溢出
- }
- }
- void lightOFF() {
- for (m = 255; m > -1; m--) {
- analogWriteFrequency(10000); //10kHzPWM
- analogWrite(PB_0, m);
- delay(10);
- readserialdata(); //保持读串口防止串口数据溢出
- }
- }
- void readserialdata() {
- if (Serial2.available()) { // 当串口接收到信息后
- //Serial.println("Serial Data Available...");
- Serial2.readBytesUntil(0x55, serialBuff, 5); //读取串口信息直到遇到55或5个字节
- if (serialBuff[0] == 0xAA) { //校验帧头是否为AA
- //Serial.print("Received Serial Data: "); // 输出serialBuff接收到的内容
- //for (i = 0; i < 5; i++) {
- //Serial.print(serialBuff[i], HEX);
- //}
- //Serial.println("");
- distance = serialBuff[1] + serialBuff[2] * 256; //计算距离值
- Serial.print("distance=");
- Serial.println(distance); //输出距离值
- } else {
- Serial.print("Data error"); //若不是AA,则重置数组serialBuffer
- for (i = 0; i < 5; i++) {
- serialBuff[i] = 255;
- }
- }
- }
- }
复制代码三、仍待解决问题 1、 测试时发现挥手时身体最好不要挡在雷达正前方,最好侧身做手势不然有时会不灵。也可能是我模块摆放位置不太好。 2、 人离开时模块返回距离值升高,离开检测范围后模块返回距离值又降为0,导致上面这版代码有时会出bug 四、视频
蓝灯当做电源指示灯,绿灯代表照明灯具(后面会加一个nmos带一条大功率灯带),红灯是亮度调节指示灯。视频按手势调节亮度、人来灯亮、人走灯灭顺序展示。 五、参考文档 Rd-03E 手势识别上位机
Rd-03E 快速入门使用文档
Rd-03E 手势识别固件用户手册 附上官方文档下载地址链接: Rd-03E 系列模组资料
|