【雷达灯控】安信可+Rd-03E+激光二极管Arduino ESP8266
Rd-03E基本资料
出厂固件默认烧录为手势识别
Rd-03是由深圳市安信可科技有限公司开发的一款搭载矽典微的S3KM1110芯片的雷达模组,Rd-03基于FMCW雷达收发器技术的集成单片机毫米波传感器SoC。它工作在24GHz的K波段,每个单频扫描的调制带宽高达1GHz。利用FMCW调频连续波,对设定空间内的目标进行探测。结合雷达信号处理,实现高灵敏度的运动检测和微动检测。Rd-03模组可实时 感知区域内是否有运动或者微动的人体 。提供可视化的配置工具,可轻松配置感应距离范围、不同区间的感应灵敏度和无人延时时间等。
元件清单
- ESP8266或者其他Arduino控制板
- 激光二极管
- Rd-03雷达
- 杜邦线
- 一些固定用结构件
上图是官方固定方式,下边这个是我的固定方式,需要用到一些结构件
引脚连接图
我使用的处理器是NodeMcu主控是ESP8266,下面是连接图
下图是连接好的实物图
程序部分
程序部分编写环境为Arduino ESP8266库
利用软串口接收数据防止和硬串产生干扰,注意固件默认波特率256000 下面是完整程序,当接收到手势信号后,灯的状态取反。
#include <SoftwareSerial.h>
// 数据帧状态
enum FrameState {
IDLE, // 等待数据帧开始
RECEIVING, // 接收数据帧中
COMPLETE // 数据帧接收完毕
};
// 创建SoftwareSerial对象,指定TX和RX引脚
SoftwareSerial mySerial(D1, D2); // RX, TX
void setup() {
// 初始化硬件串口,设置波特率为9600
Serial.begin(115200);
// 初始化软串口,设置波特率为9600
mySerial.begin(256000);
// 打印初始化信息
Serial.println("Ready");
pinMode(D3, OUTPUT); // 设置LED引脚为输出模式
digitalWrite(D3, LOW); // 初始时LED关闭
}
void loop() {
// 检查串行端口是否有数据可读
if (mySerial.available() > 0) {
// 读取一个字节
byte incomingByte = mySerial.read();
static FrameState state = IDLE;
static byte frame[5]; // 假设数据帧最大长度为5个字节
static byte frameIndex = 0;
switch (state) {
case IDLE:
// 检查数据帧的开始字节
if (incomingByte == 0xAA) {
state = RECEIVING;
frameIndex = 0;
frame[frameIndex++] = incomingByte; // 存储开始字节
}
break;
case RECEIVING:
// 存储数据帧的字节,直到遇到结束字节或超出数据帧长度
if (frameIndex < 5) {
frame[frameIndex++] = incomingByte;
// 检查是否接收到完整的数据帧
if (frameIndex == 5 && frame[frameIndex - 1] == 0x55) {
state = COMPLETE;
}
} else {
// 数据帧过长,重置状态机
state = IDLE;
}
break;
case COMPLETE:
// 打印数据帧
Serial.print(frame[0], HEX);
Serial.print(frame[1], HEX);
Serial.print(frame[2], HEX);
Serial.print(frame[3], HEX);
Serial.println(frame[4], HEX);
processDataFrame(frame);
// 重置状态机以接收下一个数据帧
state = IDLE;
break;
}
}
}
void processDataFrame(byte* frame) {
// 解析数据帧
// 由于distance是小端字节序,我们直接组合两个字节 55 00 转存为 00 55
int distance = frame[1] | (frame[2] << 8);
byte gesture = frame[3]; // 获取手势信息
if (gesture == 1) {
// 反转LED状态
digitalWrite(D3, !digitalRead(D3));
}
// 输出解析后的数据
Serial.print("Received data frame: Distance = ");
Serial.print(distance);
Serial.print(" cm, Gesture = ");
Serial.println(gesture, HEX);
}
以下是串口输出数据截图
视频展示效果
<iframe src="https://player.bilibili.com/player.html?aid=1151935463&bvid=BV1BZ421b73g&cid=1469900183&p=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"> </iframe> |