embassy-ld2410 0.1.1

Async driver for LD2410C Human Presence Radar using Embassy and UART
docs.rs failed to build embassy-ld2410-0.1.1
Please check the build logs for more information.
See Builds for ideas on how to fix a failed build, or Metadata for how to configure docs.rs builds.
If you believe this is docs.rs' fault, open an issue.

🛰️ embassy-ld2410

Crates.io Docs.rs License: GPL-2.0-or-later Platform: RP2040/RP2350 Embedded: Rust

Driver no_std asynchrone pour le radar de présence humaine LD2410C (24GHz FMCW), conçu pour l'écosystème Embassy sur RP2040 et RP2350.


đź“– Description

Le LD2410C est un module radar haute sensibilité qui surpasse les capteurs PIR traditionnels. Il détecte les mouvements actifs ainsi que les micro-mouvements (respiration) d'une personne totalement immobile, jusqu'à 6 mètres de distance.

Ce driver parse le protocole série binaire du LD2410C avec synchronisation automatique sur le header de trame, rendant l'intégration robuste même en cas de démarrage au milieu d'une trame.


✨ Caractéristiques

  • âś… Entièrement asynchrone (async/await, Embassy)
  • âś… ZĂ©ro allocation (no_std, no_alloc)
  • âś… Synchronisation automatique sur header de trame
  • âś… RĂ©silience aux trames corrompues (rĂ©essai silencieux)
  • âś… Support optionnel de defmt
  • âś… Compatible RP2040, RP2350-A, RP2350-B

🛠️ Spécifications Matérielles

Paramètre Valeur
Interface UART
Baudrate 256 000 bps (fixe)
Tension 5V (VCC)
Niveau logique 3.3V (compatible Pico)
Fréquence radar 24 GHz FMCW
Portée max ~6 mètres
Fréquence trame ~10 Hz

Câblage (UART0)

LD2410C TX  →  Pico GP1 (RX)
LD2410C RX  →  Pico GP0 (TX)
LD2410C VCC →  Pico VBUS (pin 40, 5V)
LD2410C GND →  Pico GND

📦 Installation

[dependencies]
embassy-ld2410 = "0.1.1"

[features]
rp235xa = ["embassy-ld2410/rp235xa"]  # Pico 2
rp2040  = ["embassy-ld2410/rp2040"]   # Pico 1
rp235xb = ["embassy-rp/rp235xb"]

🚀 Exemple Complet

#![no_std]
#![no_main]

use embassy_executor::Spawner;
use embassy_rp::bind_interrupts;
use embassy_rp::uart::{
    BufferedUart, BufferedInterruptHandler,
    Config as UartConfig,
};
use embassy_rp::peripherals::UART0;
use embassy_ld2410::{Ld2410, TargetState};
use static_cell::StaticCell;

bind_interrupts!(struct Irqs {
    UART0_IRQ => BufferedInterruptHandler<UART0>;
});

static TX_BUF: StaticCell<[u8; 16]>  = StaticCell::new();
static RX_BUF: StaticCell<[u8; 256]> = StaticCell::new();

#[embassy_executor::main]
async fn main(_spawner: Spawner) {
    let p = embassy_rp::init(Default::default());

    let mut uart_config = UartConfig::default();
    uart_config.baudrate = 256_000;

    let uart = BufferedUart::new(
        p.UART0,
        p.PIN_0,  // TX → LD2410C RX
        p.PIN_1,  // RX → LD2410C TX
        Irqs,
        TX_BUF.init([0u8; 16]),
        RX_BUF.init([0u8; 256]),
        uart_config,
    );
    let (_tx, rx) = uart.split();
    let mut radar = Ld2410::new(rx);

    loop {
        match radar.read_presence().await {
            Ok(data) => {
                match data.target_state {
                    Some(TargetState::Moving)   => { /* mouvement détecté */ }
                    Some(TargetState::Static)   => { /* présence immobile */ }
                    Some(TargetState::Combined) => { /* mouvement + statique */ }
                    _                           => { /* aucune présence */ }
                }
                // data.detection_distance en cm
                // data.moving_energy / data.static_energy : 0-100
            }
            Err(_) => { /* réessaie automatiquement */ }
        }
    }
}

⚖️ Licence

Copyright (C) 2026 Jorge Andre Castro
Distribué sous licence GPL-2.0-or-later.