【雷达灯控】安信可+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);
}
以下是串口输出数据截图

视频展示效果