Il mmWave C4001 è un sensore basato su radar a 24 GHz per il rilevamento umano. Un vantaggio chiave del C4001 rispetto ai comuni sensori PIR è la capacità di rilevare la presenza statica. I sensori PIR reagiscono solo al movimento, mentre il C4001 può rilevare micro-movimenti come la respirazione. È inoltre più resistente a fattori ambientali come luce, temperatura e polvere.
Il sensore supporta il rilevamento del movimento fino a 25 metri e il rilevamento della presenza umana fino a 16 metri. Fornisce uscite UART e digitali per una facile integrazione con microcontrollori. In questo tutorial imparerai come collegare il sensore mmWave C4001 a un Arduino o a un ESP32. Lo useremo per il rilevamento del movimento e per misurare la distanza e la velocità degli oggetti.
Parti Necessarie
Puoi acquistare il sensore mmWave C4001 su Amazon o DFRobot. Ti servirà anche un Arduino o un ESP32. In questo tutorial uso un Arduino UNO e un ESP32 Lite, ma funzioneranno anche altri modelli di Arduino, ESP32 o ESP8266. Infine, una breadboard e alcuni cavi Dupont per i collegamenti saranno utili.

Sensore Radar mmWave C4001

ESP32 Lite

Cavo USB C

Arduino Uno

Cavo USB per Arduino UNO

Set di Cavi Dupont

Breadboard
Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.
Hardware del Sensore mmWave C4001
Il sensore C4001 si basa sulla tecnologia radar a onde millimetriche a 24 GHz. Utilizza FMCW (Frequency-Modulated Continuous Wave) modulazione per misurare distanza e movimento. Il sensore trasmette continuamente un segnale modulato in frequenza e analizza l’onda riflessa.
La differenza di frequenza tra il segnale trasmesso e quello ricevuto viene usata per calcolare la distanza. Lo spostamento Doppler serve a rilevare movimento e velocità. Questo permette al sensore di rilevare sia movimenti ampi che micro-movimenti come la respirazione.
A differenza dei sensori PIR, questo metodo di rilevamento non si basa sulla radiazione infrarossa. Funziona indipendentemente dalle condizioni di luce e temperatura ambientale. L’immagine sotto mostra il retro e il fronte del modulo sensore mmWave C4001. Si possono vedere le antenne radar dorate sul fronte della scheda.

Capacità di Rilevamento
Il sensore supporta più modalità di misura in parallelo. Può rilevare presenza umana, movimento, distanza e velocità. La portata massima per il rilevamento del movimento è fino a 25 metri. Il rilevamento della presenza umana è affidabile fino a circa 16 metri.
La portata per la misura della distanza parte da circa 1,2 metri e arriva fino a 25 metri. La portata per la misura della velocità va da 0,1 m/s a 10 m/s.
Il fascio radar ha un campo visivo di circa 100° in orizzontale e 40° in verticale. Questo permette una copertura ampia con un solo sensore.

Caratteristiche Elettriche
Il C4001 funziona con una tensione di alimentazione (VIN) di 3,3 V o 5 V. Questo lo rende compatibile con microcontrollori comuni come Arduino e ESP32.
La velocità di comunicazione seriale predefinita è 9600 baud. Il sensore fornisce sia comunicazione UART che un pin di uscita digitale. L’interfaccia UART permette di accedere a dati dettagliati come distanza e velocità. L’uscita digitale può essere usata per segnali semplici di rilevamento presenza.
Il modulo include pin per alimentazione (VIN), massa (GND), trasmissione seriale (TX), ricezione seriale (RX) e un segnale di uscita digitale (OUT). L’immagine sotto mostra il pinout del modulo:

Elaborazione del Segnale e Uscita
Il sensore elabora internamente i riflessi radar e fornisce dati strutturati. Tramite UART, fornisce informazioni in tempo reale sui target rilevati. Questo include stato di presenza, stato di movimento, distanza e velocità.
Il pin di uscita digitale fornisce un segnale alto o basso in base allo stato di rilevamento. Questo è utile per applicazioni semplici basate su trigger. L’elaborazione interna riduce la necessità di analisi complesse sul microcontrollore.
Prestazioni Ambientali
Il C4001 ha una forte resistenza alle interferenze ambientali. Non è influenzato da condizioni di illuminazione, polvere, umidità o variazioni di temperatura.
La temperatura di esercizio va da −40 °C a 85 °C. Questo permette l’uso sia in ambienti interni che esterni.
Il sensore mantiene prestazioni stabili in condizioni in cui i sensori a infrarossi tipicamente falliscono. Questo include ambienti caldi o scenari con movimenti umani minimi.
Specifiche Tecniche
La tabella seguente riassume le specifiche tecniche del sensore mmWave C4001.
| Parametro | Valore |
|---|---|
| Tensione di Alimentazione | 3,3 V / 5 V |
| Corrente di Esercizio | 10 mA (media), 100 mA (picco) |
| Frequenza di Esercizio | 24 GHz |
| Tipo di Modulazione | FMCW (Frequency-Modulated Continuous Wave) |
| Portata Rilevamento Movimento | Fino a 25 m |
| Portata Rilevamento Presenza Umana | Fino a 16 m |
| Portata Misura Distanza | 1,2 m a 25 m |
| Portata Misura Velocità | 0,1 m/s a 10 m/s |
| Angolo del Fascio | 100° (orizzontale) × 40° (verticale) |
| Interfacce di Comunicazione | UART, I/O Digitale |
| Baud Rate Predefinito | 9600 |
| Temperatura di Esercizio | −40 °C a 85 °C |
| Dimensioni del Modulo | 26 mm × 30 mm |
Uso del Sensore mmWave C4001 senza Microcontrollore
È necessario usare un microcontrollore (o un computer) per programmare impostazioni specifiche del sensore mmWave C4001. Ad esempio, puoi impostare la distanza di rilevamento o la sensibilità. Ma una volta configurato, puoi usare il C4001 senza microcontrollore.
Lo schema di collegamento sotto mostra come connettere un LED che si accende se il sensore rileva una persona. Basta fornire alimentazione (3,3…5V) ai pin VIN e GND e poi collegare un LED con una resistenza al pin OUT:

Per la maggior parte delle applicazioni pratiche probabilmente vorrai collegare un relè invece di un LED per commutare dispositivi a tensione o corrente più elevata. Questo è possibile ma dovrai usare un Relay Module con circuito amplificatore integrato, poiché il pin OUT non può pilotare direttamente la bobina del relè. Di seguito un esempio di circuito:

Per maggiori informazioni sui moduli relè vedi i tutorial How To Use A Relay With Arduino, Interfacing a Relay Module With ESP32 e Control AC devices with Solid State Relay.
Nelle sezioni successive ti mostrerò come collegare il sensore mmWave C4001 a un Arduino o a un ESP32. Una volta configurato, puoi decidere se usare il sensore con o senza microcontrollore. Per compiti di controllo più complessi, avrai bisogno del microcontrollore.
Collegamento del Sensore mmWave C4001 ad Arduino
Collegare il sensore mmWave C4001 a un Arduino UNO è semplice. Inizia collegando VIN a 5V o 3,3V dell’Arduino. Poi collega GND a GND. Infine, colleghiamo l’interfaccia UART collegando RX a GPIO 5 e TX a GPIO 4. L’immagine sotto mostra il cablaggio completo:

Per comodità, ecco una tabella con i collegamenti da effettuare:
| C4001 | Arduino Uno |
|---|---|
| VIN | 5V o 3,3V |
| GND | GND |
| RX | GPIO 5 |
| TX | GPIO 4 |
Non ti servirà nemmeno una breadboard per collegare il sensore a un Arduino UNO. Quattro cavi Dupont sono sufficienti. La foto sotto mostra il mio cablaggio:

Collegamento del Sensore mmWave C4001 a ESP32
L’ESP32 ha tre interfacce seriali e puoi configurare i pin e l’interfaccia che vuoi usare. Qui collego TX a GPIO 17 e RX a GPIO 16. Dovremo ricordarlo quando scriviamo il codice. Infine, colleghiamo VIN a 3,3V e GND a G. L’immagine sotto mostra il cablaggio completo:

Per comodità, ecco una tabella con i collegamenti da effettuare:
| C4001 | ESP32 Lite |
|---|---|
| VIN | 3,3V |
| GND | G |
| RX | 17 |
| TX | 16 |
Installazione della libreria DFRobot_C4001
Prima di poter scrivere codice per il rilevamento del movimento, dobbiamo installare la libreria DFRobot_C4001. Per installarla vai al repository DFRobot_C4001, clicca sul pulsante verde “<> Code” e poi su “Download ZIP” per scaricare la libreria in formato ZIP come mostrato sotto:

Poi crea un nuovo sketch Arduino, vai su Sketch -> Include Library -> Add .ZIP Library … per installare la libreria ZIP scaricata (DFRobot_C4001-master.zip):

Esempio di Codice: Rilevamento Movimento con C4001
Il codice seguente inizializza il sensore radar C4001 tramite interfaccia UART e attende che il sensore venga rilevato. Poi configura il sensore per operare in modalità velocità e abilita il rilevamento di micro-movimenti per maggiore sensibilità. Nel loop principale controlla continuamente i target rilevati e legge distanza e velocità. Quando un target è presente, i valori misurati vengono inviati al monitor seriale.
// Libraries:
// - DFRobot_C4001 V 1.0.0
// https://github.com/DFRobot/DFRobot_C4001
// - ESP32 Core V 3.3.8
#include "DFRobot_C4001.h"
#if defined(ARDUINO_AVR_UNO) || defined(ESP8266)
SoftwareSerial mySerial(4, 5);
DFRobot_C4001_UART radar(&mySerial, 9600);
#elif defined(ESP32)
DFRobot_C4001_UART radar(&Serial2, 9600, /*rx*/ 17, /*tx*/ 16);
#endif
void setup() {
Serial.begin(115200);
while (!radar.begin()) {
Serial.println("Can't find sensor");
delay(1000);
}
radar.setSensorMode(eExitMode);
radar.setDetectionRange(/*min*/ 30, /*max*/ 1000, /*trig*/ 1000);
radar.setTrigSensitivity(1); // 0-9
radar.setKeepSensitivity(2); // 0-9
radar.setDelay(/*trig*/ 0, /*keep*/ 4);
radar.setPwm(/*pwm1*/ 50, /*pwm2*/ 0, /*timer*/ 10);
radar.setIoPolaity(1);
}
void loop() {
if (radar.motionDetection()) {
Serial.println("Motion detected");
}
delay(100);
}
Inclusione della Libreria
Il codice inizia includendo la libreria DFRobot_C4001.h per il sensore. Contiene le definizioni delle classi e le funzioni di comunicazione.
#include "DFRobot_C4001.h"
Configurazione Specifica per Piattaforma
Il codice supporta Arduino Uno, ESP8266 e ESP32. Usa la compilazione condizionale per selezionare l’interfaccia seriale corretta. Per Arduino Uno e ESP8266 si usa una porta seriale software, necessaria perché queste schede hanno interfacce UART hardware limitate.
#if defined(ARDUINO_AVR_UNO) || defined(ESP8266) SoftwareSerial mySerial(4, 5); DFRobot_C4001_UART radar(&mySerial, 9600);
Il pin 4 è configurato come RX e il pin 5 come TX. Il sensore comunica a 9600 baud.
Per l’ESP32 si usa invece una UART hardware, migliorando affidabilità e prestazioni.
#elif defined(ESP32) DFRobot_C4001_UART radar(&Serial2, 9600, /*rx*/ 17, /*tx*/ 16); #endif
L’ESP32 è configurato per usare Serial2 con GPIO17 come RX e GPIO16 come TX. Puoi specificare altri pin qui.
Inizializzazione dell’Oggetto
L’oggetto DFRobot_C4001_UART rappresenta il sensore radar. Gestisce tutta la comunicazione e configurazione. Il costruttore prende un’interfaccia seriale e un baud rate. Su ESP32, parametri aggiuntivi definiscono i pin RX e TX.
Funzione setup
La funzione setup inizializza la comunicazione seriale e configura il sensore.
void setup() {
Serial.begin(115200);
L’interfaccia seriale principale parte a 115200 baud. Serve per l’output di debug sul monitor seriale.
while (!radar.begin()) {
Serial.println("Can't find sensor");
delay(1000);
}
La funzione radar.begin() inizializza la comunicazione con il sensore. Controlla se il modulo risponde correttamente. Se il sensore non viene rilevato, il codice stampa un messaggio di errore e riprova ogni secondo.
Modalità Sensore
La modalità sensore definisce come vengono gestiti gli eventi di rilevamento.
radar.setSensorMode(eExitMode);
La modalità eExitMode è basata su trigger. Il sensore genera un’uscita quando viene rilevato un movimento e si resetta dopo una condizione definita. Questa modalità è ottimizzata per applicazioni semplici di rilevamento movimento.
Altre modalità possono fornire dati continui, ma la modalità exit si concentra sul rilevamento basato su eventi.
Impostazioni della Portata di Rilevamento
La portata di rilevamento definisce l’area in cui il sensore rileva attivamente il movimento.
radar.setDetectionRange(/*min*/ 30, /*max*/ 1000, /*trig*/ 1000);
La portata minima è impostata a 30 cm. Oggetti più vicini vengono ignorati. La portata massima è impostata a 1000 cm. Oggetti oltre questa distanza vengono ignorati.
La portata di trigger definisce la distanza alla quale vengono generati eventi di rilevamento. In questo caso è uguale alla portata massima, quindi tutta la zona di rilevamento è attiva.
Configurazione della Sensibilità
Il sensore offre due tipi di impostazioni di sensibilità.
radar.setTrigSensitivity(1); // 0-9
La sensibilità di trigger controlla quanto facilmente viene rilevato il movimento. Un valore basso come 1 riduce la sensibilità e aiuta a evitare falsi positivi.
radar.setKeepSensitivity(2); // 0-9
La sensibilità di mantenimento controlla come il sensore mantiene il rilevamento dopo che il movimento è stato rilevato. Un valore leggermente più alto assicura che piccoli movimenti mantengano attivo il rilevamento.
Questi due parametri permettono di bilanciare reattività e stabilità.
Configurazione dei Tempi
Le impostazioni temporali definiscono quanto rapidamente il sensore reagisce e per quanto tempo rimane attivo.
radar.setDelay(/*trig*/ 0, /*keep*/ 4);
Il ritardo di trigger è impostato a 0. Questo significa che il sensore reagisce immediatamente al movimento.
Il ritardo di mantenimento è impostato a 4. Definisce per quanto tempo lo stato di rilevamento rimane attivo dopo che il movimento si ferma. Questo evita commutazioni rapide tra rilevato e non rilevato.
Impostazioni Uscita PWM
Il sensore può generare segnali PWM per il controllo esterno.
radar.setPwm(/*pwm1*/ 50, /*pwm2*/ 0, /*timer*/ 10);
Il primo canale PWM è impostato a un valore di 50. Questo definisce il duty cycle.
Il secondo canale PWM è disabilitato impostandolo a 0.
Il valore del timer definisce il periodo PWM. Questa funzione può essere usata per controllare dispositivi esterni come LED o relè direttamente dal sensore.
Polarità di Uscita
La polarità di uscita definisce il livello logico del segnale di rilevamento. Nota che il nome della funzione nella libreria è scritto erroneamente (“Polaity” invece di “Polarity”).
radar.setIoPolaity(1);
Un valore di 1 imposta l’uscita attiva alta. Questo significa che il segnale diventa HIGH quando viene rilevato un movimento. Se impostato a 0, la logica è invertita e il segnale diventa LOW quando viene rilevato un movimento.
Funzione loop
La funzione loop controlla continuamente la presenza di movimento.
void loop() {
if (radar.motionDetection()) {
Serial.println("Motion detected");
}
delay(100);
}
La funzione radar.motionDetection() restituisce true quando viene rilevato un movimento. La logica di rilevamento usa tutti i parametri configurati, inclusi portata, sensibilità e tempi.
Quando viene rilevato un movimento, un messaggio viene stampato sul monitor seriale.
Il breve ritardo di 100 millisecondi garantisce aggiornamenti rapidi mantenendo basso l’uso della CPU.
Esempio di Codice: Misure di Velocità e Distanza con C4001
Il codice seguente inizializza il sensore radar mmWave C4001 usando la comunicazione UART e lo configura per il rilevamento di movimento e velocità. Nel loop principale il codice controlla continuamente se un target è rilevato e, in tal caso, legge distanza e velocità del target. I valori misurati vengono poi stampati sul monitor seriale, permettendo il tracciamento in tempo reale degli oggetti in movimento.
// Libraries:
// - DFRobot_C4001 V 1.0.0
// https://github.com/DFRobot/DFRobot_C4001
// - ESP32 Core V 3.3.8
#include "DFRobot_C4001.h"
#if defined(ARDUINO_AVR_UNO) || defined(ESP8266)
SoftwareSerial mySerial(4, 5);
DFRobot_C4001_UART radar(&mySerial, 9600);
#elif defined(ESP32)
DFRobot_C4001_UART radar(&Serial2, 9600, /*rx*/ 17, /*tx*/ 16);
#endif
void setup() {
Serial.begin(115200);
while (!radar.begin()) {
Serial.println("Can't find sensor");
delay(1000);
}
Serial.println("Sensor connected");
radar.setSensorMode(eSpeedMode);
radar.setFrettingDetection(eON);
delay(500);
Serial.println("Ready");
}
void loop() {
if (radar.getTargetNumber() > 0) {
Serial.print("Distance: ");
Serial.print(radar.getTargetRange());
Serial.print(" m Speed: ");
Serial.print(radar.getTargetSpeed());
Serial.println(" m/s");
}
delay(100);
}
Inclusione della Libreria
Come prima, il codice inizia includendo la libreria necessaria per il sensore radar.
#include "DFRobot_C4001.h"
Configurazione Specifica per Piattaforma
Segue la stessa compilazione condizionale per supportare più piattaforme. Seleziona l’interfaccia seriale corretta a seconda della scheda.
#if defined(ARDUINO_AVR_UNO) || defined(ESP8266) SoftwareSerial mySerial(4, 5); DFRobot_C4001_UART radar(&mySerial, 9600); #elif defined(ESP32) DFRobot_C4001_UART radar(&Serial2, 9600, /*rx*/ 17, /*tx*/ 16); #endif
Su Arduino Uno e ESP8266, il pin 4 è configurato come RX e il pin 5 come TX. Su ESP32, Serial2 è inizializzato con GPIO17 come RX e GPIO16 come TX.
Funzione setup
La funzione setup inizializza la comunicazione seriale e prepara il sensore.
void setup() {
Serial.begin(115200);
Il monitor seriale parte a 115200 baud. Serve per stampare i risultati delle misure.
while (!radar.begin()) {
Serial.println("Can't find sensor");
delay(1000);
}
Serial.println("Sensor connected");
La funzione radar.begin() inizializza la comunicazione con il sensore. Il loop assicura che il programma aspetti finché il sensore risponde. Una volta riuscito, viene stampato un messaggio di conferma.
Modalità Sensore
Il sensore è configurato in modalità velocità.
radar.setSensorMode(eSpeedMode);
La modalità eSpeedMode abilita l’analisi del movimento con misura della velocità. In questa modalità il sensore traccia i target in movimento e calcola la loro velocità usando lo spostamento Doppler. Questa modalità è diversa dal semplice rilevamento di presenza perché fornisce informazioni dinamiche sul movimento.
Rilevamento Micro-Movimenti
Il codice abilita il rilevamento di micro-movimenti.
radar.setFrettingDetection(eON);
Il rilevamento di micro-movimenti permette al sensore di rilevare movimenti molto piccoli. Questo include micro-movimenti come la respirazione o piccoli movimenti del corpo. Quando abilitato, il sensore diventa più sensibile ai movimenti sottili e permette di fatto di rilevare persone ferme.
Ritardo di Stabilizzazione
Viene aggiunto un breve ritardo dopo la configurazione.
delay(500);
Serial.println("Ready");
Il ritardo dà al sensore il tempo di applicare le nuove impostazioni. Dopo di che il sistema è pronto per iniziare le misure.
Funzione loop
Il loop legge continuamente i dati dal sensore.
void loop() {
if (radar.getTargetNumber() > 0) {
La funzione getTargetNumber() restituisce il numero di target rilevati. Se è presente almeno un target, il codice procede a leggere i dati di misura.
Serial.print("Distance: ");
Serial.print(radar.getTargetRange());
La funzione getTargetRange() restituisce la distanza dal target rilevato. Il valore è espresso in metri.
Serial.print(" m Speed: ");
Serial.print(radar.getTargetSpeed());
La funzione getTargetSpeed() restituisce la velocità del target rilevato. È calcolata usando lo spostamento Doppler ed è espressa in metri al secondo.
Serial.println(" m/s");
}
delay(10);
}
I risultati vengono stampati sul monitor seriale in formato leggibile. Il loop gira continuamente con un breve ritardo di 100 millisecondi.
Esempio di Output
Lo screenshot sotto mostra cosa dovresti vedere sul monitor seriale quando il sensore rileva un oggetto.

Muovi la mano più lontano e più vicino al sensore a diverse velocità e vedrai che i valori di distanza e velocità misurati cambiano.
Conclusioni
In questo tutorial hai imparato come collegare il sensore mmWave C4001 a un Arduino o a un ESP32 per il rilevamento del movimento. Rispetto ai sensori di movimento a infrarossi passivi (PIR), il C4001 basato su radar è più affidabile e può rilevare persone ferme a determinate distanze.
Se ti serve solo un segnale di rilevamento binario (rilevato, non rilevato), puoi programmare il sensore una volta (ad esempio impostare la distanza di rilevamento) tramite un microcontrollore e poi usare il pin OUT. Per azioni di controllo più complesse puoi programmare il microcontrollore per reagire alle misure del sensore.
Nota che esiste anche il sensore Gravity: C4001 mmWave Human Presence Detection Sensor, molto simile al C4001 ma con portata più corta (12 metri) e comunicazione via I2C invece che UART. Dai anche un’occhiata ai sensori mmWave C4002 e mmWave C1001.
Per ulteriori informazioni sul sensore mmWave C4001 consulta la pagina Wiki, il Datasheet e il repo che contiene altri esempi di codice.
Se hai domande, sentiti libero di lasciarle nella sezione commenti.
Buon divertimento con il tinkering ; )

