ESP32 LD2410B模组实验:24GHz雷达人体感应检测与串口输出数据分析
目录
实验效果
使用LD2410B人体存在感应模组检测人的存在,并在串口中输出数据。
元件介绍
LD2410B 是一款高灵敏度的 24GHZ 人体存在感应模组。工作原理是利用 FMCW 调频连续波,对设定空间内的人体目标进行探测,结合雷达信号处理精确人体感应算法.实现高灵敏度的人体存在状态感应,可识别运动和静止状态下的人体,并可计算出目标的距离等辅助信息。
产品主要应用在室内场景,感知区域内是否有运动或者微动人体,实时输出结果。最远感应距离可达 6米,分辨率 0.75m。提供配置工具,可配置感应距离范围、不同区间的感应灵敏度和无人延时时间等。支持 GPIO 和 UART 输出,即插即用,可灵活应用于不同的智能场景和终端产品。
产品特征:
- 频率: 24G-24.25GHz
- 调制方式: FMCW
- 检测距离: 0.75~6m
- 可调探测角度: 土60
- 供电: 5V
- 电流: ~79mA
- 输出串口电平: 3.3V
- 扫频带宽:250MHz(符合CE/FCC认证标准
- 环境温度:-40°C~+85°C
- 数据格式:串口ASCII输出/高低电平3.3V&OV
- 封装形式:默认带插针,可定制座子或不带插针
这个模块调试非常简单,只要模块通电,即可使用手机通过蓝牙连接模块,查看里面的数据和配置灵敏度。
引脚说明
- OUT:目标状态输出
检测到有人体存在:输出高电平,无人体存在:输出低电平 - UART_Tx:串口Tx
串口Tx引脚 - UART_Rx:串口Rx
串口Rx引脚 - GND:电源地
电源地 - VCC:电源输入
供电输入 5V
BOM
ESP32 x1
LD2401B 人体存在检测模块 x1
接线图
LD2410B 引脚 | <-> | ESP32 引脚 |
---|---|---|
5V | <-> | 5V |
GND | <-> | GND |
UART Rx | <-> | IO 33 |
UART Tx | <-> | IO 32 |
安装库
LD2410
用于 Hi-Link LD2410 24Ghz FMCW 雷达传感器的 Arduino 库,也适用于ESP系列开发板。该传感器是一种频率调制连续波雷达,可用于存在检测,并可配置其在不同范围内对静态和移动目标的灵敏度。
https://github.com/ncmreynolds/ld2410
可在Arduino IDE的「库管理」中搜索「LD2410」并安装,也可以在Github上下载手动安装。
程序提点
1,关于接线
- 如果未定义
ESP_IDF_VERSION_MAJOR
或者是在IDF版本4+以下,那么使用默认的GPIO引脚32和33。 - 如果是ESP32芯片,使用GPIO引脚32和33。
- 如果是ESP32S2芯片,使用GPIO引脚9和8。
- 如果是ESP32C3芯片,使用GPIO引脚4和5。
- 如果当前编译目标不是支持的芯片,则引发编译错误。
2,setup()
函数用于初始化:
- 使用115200波特率初始化
MONITOR_SERIAL
,在串行监视器上提供反馈。 - 根据不同的微控制器板,初始化
RADAR_SERIAL
,并使用不同的引脚(如果是ESP32)和波特率(256000)。 - 输出初始化信息,并尝试使用
radar.begin()
来初始化雷达模块。
3,loop()
函数是程序的主循环,其中包括雷达数据的读取和处理:
- 调用
radar.read()
读取雷达数据。 - 如果雷达已连接且自上次读取数据以来已过了1000毫秒,则更新
lastReading
。 - 检测是否有静止或移动的目标。如果有,通过
MONITOR_SERIAL
输出目标的信息,包括目标的距离和能量。 - 如果没有探测到目标,则输出“没有目标”。
完整程序
// welcome to www.lingshuunlab.com
/*
* Example sketch for reporting on readings from the LD2410 using whatever settings are currently configured.
*
* This has been tested on the following platforms...
*
* On ESP32, connect the LD2410 to GPIO pins 32&33
* On ESP32S2, connect the LD2410 to GPIO pins 8&9
* On ESP32C3, connect the LD2410 to GPIO pins 4&5
* On Arduino Leonardo or other ATmega32u4 board connect the LD2410 to GPIO pins TX & RX hardware serial
*
* The serial configuration for other boards will vary and you'll need to assign them yourself
*
* There is no example for ESP8266 as it only has one usable UART and will not boot if the alternate UART pins are used for the radar.
*
* For this sketch and other examples to be useful the board needs to have two usable UARTs.
*
*/
#if defined(ESP32)
#ifdef ESP_IDF_VERSION_MAJOR // IDF 4+
#if CONFIG_IDF_TARGET_ESP32 // ESP32/PICO-D4
#define MONITOR_SERIAL Serial
#define RADAR_SERIAL Serial1
#define RADAR_RX_PIN 32
#define RADAR_TX_PIN 33
#elif CONFIG_IDF_TARGET_ESP32S2
#define MONITOR_SERIAL Serial
#define RADAR_SERIAL Serial1
#define RADAR_RX_PIN 9
#define RADAR_TX_PIN 8
#elif CONFIG_IDF_TARGET_ESP32C3
#define MONITOR_SERIAL Serial
#define RADAR_SERIAL Serial1
#define RADAR_RX_PIN 4
#define RADAR_TX_PIN 5
#else
#error Target CONFIG_IDF_TARGET is not supported
#endif
#else // ESP32 Before IDF 4.0
#define MONITOR_SERIAL Serial
#define RADAR_SERIAL Serial1
#define RADAR_RX_PIN 32
#define RADAR_TX_PIN 33
#endif
#elif defined(__AVR_ATmega32U4__)
#define MONITOR_SERIAL Serial
#define RADAR_SERIAL Serial1
#define RADAR_RX_PIN 0
#define RADAR_TX_PIN 1
#endif
#include <ld2410.h>
ld2410 radar;
uint32_t lastReading = 0;
bool radarConnected = false;
void setup(void)
{
MONITOR_SERIAL.begin(115200); //Feedback over Serial Monitor
//radar.debug(MONITOR_SERIAL); //Uncomment to show debug information from the library on the Serial Monitor. By default this does not show sensor reads as they are very frequent.
#if defined(ESP32)
RADAR_SERIAL.begin(256000, SERIAL_8N1, RADAR_RX_PIN, RADAR_TX_PIN); //UART for monitoring the radar
#elif defined(__AVR_ATmega32U4__)
RADAR_SERIAL.begin(256000); //UART for monitoring the radar
#endif
delay(500);
MONITOR_SERIAL.print(F("\nConnect LD2410 radar TX to GPIO:"));
MONITOR_SERIAL.println(RADAR_RX_PIN);
MONITOR_SERIAL.print(F("Connect LD2410 radar RX to GPIO:"));
MONITOR_SERIAL.println(RADAR_TX_PIN);
MONITOR_SERIAL.print(F("LD2410 radar sensor initialising: "));
if(radar.begin(RADAR_SERIAL))
{
MONITOR_SERIAL.println(F("OK"));
MONITOR_SERIAL.print(F("LD2410 firmware version: "));
MONITOR_SERIAL.print(radar.firmware_major_version);
MONITOR_SERIAL.print('.');
MONITOR_SERIAL.print(radar.firmware_minor_version);
MONITOR_SERIAL.print('.');
MONITOR_SERIAL.println(radar.firmware_bugfix_version, HEX);
}
else
{
MONITOR_SERIAL.println(F("not connected"));
}
}
void loop()
{
radar.read();
if(radar.isConnected() && millis() - lastReading > 1000) //Report every 1000ms
{
lastReading = millis();
if(radar.presenceDetected())
{
if(radar.stationaryTargetDetected())
{
Serial.print(F("Stationary target: "));
Serial.print(radar.stationaryTargetDistance());
Serial.print(F("cm energy:"));
Serial.print(radar.stationaryTargetEnergy());
Serial.print(' ');
}
if(radar.movingTargetDetected())
{
Serial.print(F("Moving target: "));
Serial.print(radar.movingTargetDistance());
Serial.print(F("cm energy:"));
Serial.print(radar.movingTargetEnergy());
}
Serial.println();
}
else
{
Serial.println(F("No target"));
}
}
}
把程序上传,打开串口就可以开始测试,并观察数据。
参考资料
HLK LD2410B生命存在感应模组说明书 V1.07.pdf:
LD2410B 串口通信协议 V1.06 230221.pdf:
毫米波传感器天线罩设计指南: