本帖最后由 Fishghost 于 2024-3-29 17:09 编辑
首先,很荣幸能够参加活动并获选赠送一块RD-03E雷达模块。安信可的产品一直有在使用,尤其是ESP8266系列和ESP32系列,几乎所有的项目都是使用这两款产品作为主控实现功能。作为物联网工程专业对嵌入式很感兴趣的我来说,安信可的产品真的很贴合我的兴趣爱好和项目需要,更何况还是国产的!
说回RD-03E这款产品,在此之前我几乎没用过雷达类的产品,对于测距的需求一般都是使用简单的超声波传感器或红外传感器去实现,但是这两者虽然使用简单且结果较为精确,但是也有一定的弊端,就是无法获取被测目标的方位,且对于多个目标不能同时检测,而雷达类的产品则能够弥补这一弊端。RD-03E的参数不再赘述,由于时间的关系,加之最近一段时间事情有点多,所以对于该模块并没有详细的使用,这里主要使用该模块先进行一个简单的灯控实验。
实验开发环境为:ESP32(主控)+VSCode(编辑器)+PlatformIO(插件)+RD-03E模块+LED灯(红、黄、绿)
查询模块手册得知串口参数和数据格式:
使用ESP32的第三个硬串口Serial2与RD-03E进行通信,32号引脚接红灯,33号引脚接黄灯,25号引脚接绿灯。
通过串口工具查询模块输出信息:
这里发现好像是5个字节,应该是因为出厂时是手势识别固件,但是发现第二个字节好像是距离,所以直接读取使用了,代码如下:
- #include <Arduino.h>
-
- #define SERIAL_BAUD_RATE 256000
- #define FRAME_HEADER 0xAA
- #define FRAME_TAILER 0x55
- #define redLED 32
- #define greenLED 33
- #define yellowLED 25
-
- void setup() {
- Serial.begin(115200); // 用于调试输出
-
- // 设置Serial2的接收缓冲区大小
- Serial2.setRxBufferSize(256);
-
- // 初始化Serial2
- Serial2.begin(SERIAL_BAUD_RATE, SERIAL_8N1);
- pinMode(redLED, OUTPUT);
- pinMode(greenLED, OUTPUT);
- pinMode(yellowLED, OUTPUT);
- }
-
- void loop() {
- if (Serial2.available() >= 7) { // 确保至少有6个字节的数据可读
- uint8_t buffer[5] = {0};
- int numRead = Serial2.readBytes(buffer, 5);
- // for(int i = 0; i < numRead; i++) {
- // Serial.print(buffer[i], HEX);
- // Serial.print(" ");
- // }
- // Serial.println();
- if (numRead == 5 && buffer[0] == FRAME_HEADER && buffer[4] == FRAME_TAILER) {
- // uint8_t targetState = buffer[2];
- // uint16_t distance = buffer[1] | (buffer[4] << 8); // 小端格式组合为16位整数
- uint16_t distance = buffer[1];
- // 打印目标状态和距离信息
- // Serial.print("Target State: ");
- // switch (targetState) {
- // case 0x00:
- // Serial.println("No Target");
- // break;
- // case 0x01:
- // Serial.println("Moving Target");
- // break;
- // case 0x02:
- // Serial.println("Micro-moving Target");
- // break;
- // default:
- // Serial.println("Unknown State");
- // }
- digitalWrite(redLED, LOW);
- digitalWrite(greenLED, LOW);
- digitalWrite(yellowLED, LOW);
-
- if(distance < 50){
- digitalWrite(redLED, HIGH);
- }else if(distance < 100){
- digitalWrite(yellowLED, HIGH);
- }else{
-
- digitalWrite(greenLED, HIGH);
- }
-
- Serial.print("Distance: ");
- Serial.println(distance);
- }
- }
- }
复制代码 代码很简单,就是读取第二个字节并进行判断,进而控制LED灯,等后续刷入精准测距固件再进行实验。
实验结果:
实际效果:
|