LD2410 Rust Driver
A no_std compatible Rust driver for the HLK-LD2410 human presence radar sensor. This library provides a robust interface for communicating with the LD2410 over UART using the vendor's binary framed protocol.
Features
- No-std compatible – works in embedded environments without the standard library
- Robust frame parsing – handles continuous sensor streams with proper header/footer validation
- Normal and engineering modes – read presence data or switch to engineering mode for detailed diagnostics
- Configuration support – enter/exit config mode, read firmware, restart, and more
- Flexible distance parsing – handles firmware variations in distance field encoding
Protocol Overview
The LD2410 communicates via UART at 256000 baud (8N1) using a binary framed protocol:
Sensor Reports (radar → host)
[Header: F4 F3 F2 F1][Length: u16 LE][Frame Data][Footer: F8 F7 F6 F5]
Frame data contains:
- Type byte (0x02 for normal mode, 0x01 for engineering)
- Inner marker (0xAA)
- Payload
- Inner tail (0x55) and check (0x00)
Command/ACK Frames (host ↔ radar)
[Header: FD FC FB FA][Length: u16 LE][Command Word: u16 LE][Payload][Footer: 04 03 02 01]
Usage
Basic Presence Detection
use LD2410;
// Create sensor with UART peripheral
let mut sensor = LD2410new;
// Read presence data continuously
loop
Configuration
// Enter configuration mode
sensor.enter_config_mode?;
// Read firmware version
let fw = sensor.read_firmware_raw?;
// Exit configuration mode
sensor.exit_config_mode?;
Engineering Mode
// Enable engineering mode for detailed diagnostics
sensor.enable_engineering_mode?;
// Read engineering reports (type 0x01)
// ... handle engineering data ...
// Return to normal mode
sensor.disable_engineering_mode?;
Data Structures
PresenceData
Contains the parsed presence detection report:
target_state– NoTarget, Moving, Stationary, or Bothmoving_distance_cm– distance to moving targetmoving_energy– energy level of moving target (0-255)still_distance_cm– distance to stationary targetstill_energy– energy level of stationary target (0-255)detection_distance_cm– overall detection distance
Error Types
Read(E)– UART read errorWrite(E)– UART write errorInvalidFrame– malformed frame structureUnknownReportType– unsupported report typeInvalidReport– report content too short or inconsistentBufferOverflow– received frame exceeds buffer size
Requirements
- UART peripheral implementing
embedded-iotraits (Read+Write) - 256000 baud, 8N1 configuration
- Sufficient buffer space (256 bytes internal)
Example
See ../hello-world-ld2410/ for a complete ESP32 example using esp-hal and embassy.
License
MIT