Le mmWave C4001 est un capteur basé sur un radar à 24 GHz pour la détection humaine. Un avantage clé du C4001 par rapport aux capteurs PIR classiques est sa capacité à détecter une présence statique. Les capteurs PIR ne réagissent qu’au mouvement, tandis que le C4001 peut détecter des micro-mouvements tels que la respiration. Il est également plus résistant aux facteurs environnementaux comme la lumière, la température et la poussière.
Le capteur supporte la détection de mouvement jusqu’à 25 mètres et la détection de présence humaine jusqu’à 16 mètres. Il offre des sorties UART et numériques pour une intégration facile avec des microcontrôleurs. Dans ce tutoriel, vous apprendrez comment connecter le capteur mmWave C4001 à un Arduino ou un ESP32. Nous l’utiliserons pour la détection de mouvement ainsi que pour mesurer la distance et la vitesse des objets.
Pièces requises
Vous pouvez vous procurer le capteur mmWave C4001 sur Amazon ou DFRobot. Vous aurez également besoin d’un Arduino ou d’un ESP32. J’utilise un Arduino UNO et un ESP32 Lite dans ce tutoriel, mais tout autre Arduino, ESP32 ou ESP8266 fonctionnera aussi. Enfin, une breadboard et quelques câbles Dupont pour le câblage seront utiles.

Capteur Radar mmWave C4001

ESP32 Lite

Câble USB C

Arduino Uno

Câble USB pour Arduino UNO

Jeu de fils 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.
Matériel du capteur mmWave C4001
Le capteur C4001 est basé sur la technologie radar millimétrique à 24 GHz. Il utilise FMCW la modulation FMCW (Frequency-Modulated Continuous Wave) pour mesurer la distance et le mouvement. Le capteur émet en continu un signal modulé en fréquence et analyse la forme d’onde réfléchie.
La différence de fréquence entre le signal émis et reçu est utilisée pour calculer la distance. Le décalage Doppler sert à détecter le mouvement et la vitesse. Cela permet au capteur de détecter à la fois les grands mouvements et les très petits, comme la respiration.
Contrairement aux capteurs PIR, cette méthode de détection ne dépend pas du rayonnement infrarouge. Elle fonctionne indépendamment des conditions de lumière ambiante et de température. L’image ci-dessous montre l’arrière et l’avant du module capteur mmWave C4001. On peut voir les antennes radar dorées à l’avant de la carte.

Capacités de détection
Le capteur supporte plusieurs modes de mesure en parallèle. Il peut détecter la présence humaine, le mouvement, la distance et la vitesse. La portée maximale de détection de mouvement est de 25 mètres. La détection de présence humaine est fiable jusqu’à environ 16 mètres.
La plage de mesure de distance commence à environ 1,2 mètre et s’étend jusqu’à 25 mètres. La plage de détection de vitesse va de 0,1 m/s à 10 m/s.
Le faisceau radar a un champ de vision d’environ 100° horizontalement et 40° verticalement. Cela permet une couverture étendue avec un seul capteur.

Caractéristiques électriques
Le C4001 fonctionne avec une tension d’alimentation (VIN) de 3,3 V ou 5 V. Cela le rend compatible avec les microcontrôleurs courants comme Arduino et ESP32.
Le débit en bauds par défaut pour la communication série est de 9600. Le capteur fournit à la fois une communication UART et une sortie numérique. L’interface UART permet d’accéder à des données détaillées telles que la distance et la vitesse. La sortie numérique peut être utilisée pour des signaux simples de détection de présence.
Le module comprend des broches pour l’alimentation (VIN), la masse (GND), la transmission série (TX), la réception série (RX) et une sortie numérique (OUT). L’image ci-dessous montre le brochage du module :

Traitement du signal et sortie
Le capteur traite en interne les réflexions radar et fournit des données structurées. Via UART, il transmet en temps réel des informations sur les cibles détectées. Cela inclut l’état de présence, l’état de mouvement, la distance et la vitesse.
La broche de sortie numérique fournit un signal haut ou bas selon l’état de détection. Cela est utile pour des applications simples à déclenchement. Le traitement interne réduit le besoin d’analyse complexe du signal sur le microcontrôleur.
Performance environnementale
Le C4001 est très résistant aux interférences environnementales. Il n’est pas affecté par les conditions d’éclairage, la poussière, l’humidité ou les variations de température.
La plage de température de fonctionnement va de −40 °C à 85 °C. Cela permet une utilisation en intérieur comme en extérieur.
Le capteur maintient une performance stable dans des conditions où les capteurs infrarouges échouent généralement. Cela inclut les environnements chauds ou les scénarios avec peu de mouvement humain.
Spécifications techniques
Le tableau suivant résume les spécifications techniques du capteur mmWave C4001.
| Paramètre | Valeur |
|---|---|
| Tension de fonctionnement | 3,3 V / 5 V |
| Courant de fonctionnement | 10 mA (moyenne), 100 mA (pic) |
| Fréquence de fonctionnement | 24 GHz |
| Type de modulation | FMCW (Frequency-Modulated Continuous Wave) |
| Portée de détection de mouvement | Jusqu’à 25 m |
| Portée de détection de présence humaine | Jusqu’à 16 m |
| Plage de mesure de distance | 1,2 m à 25 m |
| Plage de mesure de vitesse | 0,1 m/s à 10 m/s |
| Angle du faisceau | 100° (horizontal) × 40° (vertical) |
| Interfaces de communication | UART, Entrée/Sortie numérique |
| Débit en bauds par défaut | 9600 |
| Température de fonctionnement | −40 °C à 85 °C |
| Dimensions du module | 26 mm × 30 mm |
Utilisation du capteur mmWave C4001 sans microcontrôleur
Vous devez utiliser un microcontrôleur (ou un ordinateur) pour programmer les réglages spécifiques du capteur mmWave C4001. Par exemple, vous pouvez définir la distance de détection ou la sensibilité. Mais une fois configuré, vous pouvez utiliser le C4001 sans microcontrôleur.
Le schéma de câblage ci-dessous montre comment connecter une LED qui s’allume si le capteur détecte une personne. Il suffit d’alimenter les broches VIN et GND (3,3…5V) puis de connecter une LED avec une résistance à la broche OUT :

Pour la plupart des applications pratiques, vous voudrez probablement connecter un relais au lieu d’une LED pour commuter un appareil à tension ou courant plus élevé. C’est possible, mais vous devrez utiliser un Relay Module avec un circuit amplificateur intégré, car la broche OUT ne peut pas piloter directement la bobine du relais. Voici un exemple de circuit :

Pour plus d’informations sur les modules relais, consultez les How To Use A Relay With Arduino, Interfacing a Relay Module With ESP32 et les Control AC devices with Solid State Relay tutoriels.
Dans les sections suivantes, je vous montrerai comment connecter le capteur mmWave C4001 à un Arduino ou un ESP32. Une fois configuré, vous pouvez décider d’utiliser le capteur avec ou sans microcontrôleur. Pour des tâches de contrôle plus complexes, vous aurez besoin du microcontrôleur.
Connexion du capteur mmWave C4001 à Arduino
Connecter le capteur mmWave C4001 à un Arduino UNO est simple. Commencez par connecter VIN au 5V ou 3,3V de l’Arduino. Ensuite, connectez GND à GND. Enfin, connectez l’interface UART en reliant RX à GPIO 5 et TX à GPIO 4. L’image ci-dessous montre le câblage complet :

Pour plus de commodité, voici un tableau des connexions à réaliser :
| C4001 | Arduino Uno |
|---|---|
| VIN | 5V ou 3,3V |
| GND | GND |
| RX | GPIO 5 |
| TX | GPIO 4 |
Vous n’aurez même pas besoin d’une breadboard pour connecter le capteur à un Arduino UNO. Quatre câbles Dupont suffisent. La photo ci-dessous montre mon câblage :

Connexion du capteur mmWave C4001 à ESP32
L’ESP32 dispose de trois interfaces série et vous pouvez configurer les broches et l’interface que vous souhaitez utiliser. Ici, je connecte TX à GPIO 17 et RX à GPIO 16. Il faudra s’en souvenir lors de l’écriture du code. Enfin, connectez VIN à 3,3V et GND à G. L’image ci-dessous montre le câblage complet :

Pour plus de commodité, voici un tableau des connexions à réaliser :
| C4001 | ESP32 Lite |
|---|---|
| VIN | 3,3V |
| GND | G |
| RX | 17 |
| TX | 16 |
Installation de la bibliothèque DFRobot_C4001
Avant de pouvoir écrire un code pour la détection de mouvement, il faut installer la bibliothèque DFRobot_C4001 DFRobot_C4001. Pour installer cette bibliothèque, allez sur le dépôt DFRobot_C4001, cliquez sur le bouton vert « <> Code » puis sur « Download ZIP » pour télécharger la bibliothèque au format ZIP comme montré ci-dessous :

Ensuite, créez un nouveau sketch Arduino, allez dans Sketch -> Include Library -> Add .ZIP Library … pour installer la bibliothèque ZIP téléchargée (DFRobot_C4001-master.zip) :

Exemple de code : détection de mouvement avec C4001
Le code suivant initialise le capteur radar C4001 via une interface UART et attend que le capteur soit détecté. Il configure ensuite le capteur en mode vitesse et active la détection de micro-mouvements pour une sensibilité accrue. Dans la boucle principale, il vérifie en continu la présence de cibles détectées et lit leur distance et vitesse. Lorsque une cible est présente, les valeurs mesurées sont envoyées au moniteur série.
// 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);
}
Inclusion de la bibliothèque
Le code commence par inclure la bibliothèque DFRobot_C4001.h DFRobot_C4001 pour le capteur. Elle contient les définitions de classes et les fonctions de communication pour le capteur.
#include "DFRobot_C4001.h"
Configuration spécifique à la plateforme
Le code supporte Arduino Uno, ESP8266 et ESP32. Il utilise la compilation conditionnelle pour sélectionner la bonne interface série. Pour Arduino Uno et ESP8266, un port série logiciel est utilisé, car ces cartes ont un nombre limité d’interfaces UART matérielles.
#if defined(ARDUINO_AVR_UNO) || defined(ESP8266) SoftwareSerial mySerial(4, 5); DFRobot_C4001_UART radar(&mySerial, 9600);
La broche 4 est configurée en RX et la broche 5 en TX. Le capteur communique à 9600 bauds.
Pour l’ESP32, une UART matérielle est utilisée à la place, ce qui améliore la fiabilité et les performances.
#elif defined(ESP32) DFRobot_C4001_UART radar(&Serial2, 9600, /*rx*/ 17, /*tx*/ 16); #endif
L’ESP32 est configuré pour utiliser Serial2 avec GPIO17 en RX et GPIO16 en TX. Vous pouvez spécifier d’autres broches ici.
Initialisation de l’objet
L’objet DFRobot_C4001_UART C4001 représente le capteur radar. Il gère toute la communication et la configuration. Le constructeur prend une interface série et un débit en bauds. Sur ESP32, des paramètres supplémentaires définissent les broches RX et TX.
Fonction setup
La fonction setup initialise la communication série et configure le capteur.
void setup() {
Serial.begin(115200);
L’interface série principale est lancée à 115200 bauds. Elle sert à afficher les messages de débogage sur le moniteur série.
while (!radar.begin()) {
Serial.println("Can't find sensor");
delay(1000);
}
La fonction radar.begin() begin initialise la communication avec le capteur. Elle vérifie si le module répond correctement. Si le capteur n’est pas détecté, le code affiche un message d’erreur et réessaie chaque seconde.
Mode capteur
Le mode capteur définit comment les événements de détection sont gérés.
radar.setSensorMode(eExitMode);
Le mode eExitMode est un mode à déclenchement. Le capteur génère une sortie lorsqu’un mouvement est détecté et se réinitialise après une condition définie. Ce mode est optimisé pour des applications simples de détection de mouvement.
D’autres modes peuvent fournir des données continues, mais le mode sortie se concentre sur la détection événementielle.
Réglages de la portée de détection
La portée de détection définit la zone où le capteur détecte activement le mouvement.
radar.setDetectionRange(/*min*/ 30, /*max*/ 1000, /*trig*/ 1000);
La portée minimale est fixée à 30 cm. Les objets plus proches sont ignorés. La portée maximale est fixée à 1000 cm. Les objets au-delà sont ignorés.
La portée de déclenchement définit la distance à laquelle les événements de détection sont générés. Ici, elle est égale à la portée maximale, donc toute la zone de détection est active.
Configuration de la sensibilité
Le capteur offre deux types de réglages de sensibilité.
radar.setTrigSensitivity(1); // 0-9
La sensibilité de déclenchement contrôle la facilité de détection du mouvement. Une valeur basse comme 1 réduit la sensibilité et aide à éviter les faux positifs.
radar.setKeepSensitivity(2); // 0-9
La sensibilité de maintien contrôle comment le capteur conserve la détection après un mouvement détecté. Une valeur légèrement plus élevée assure que les petits mouvements maintiennent la détection active.
Ces deux paramètres permettent un réglage fin entre réactivité et stabilité.
Configuration du timing
Les réglages de timing définissent la rapidité de réaction du capteur et la durée de maintien de l’état.
radar.setDelay(/*trig*/ 0, /*keep*/ 4);
Le délai de déclenchement est fixé à 0, ce qui signifie que le capteur réagit immédiatement à la détection de mouvement.
Le délai de maintien est fixé à 4. Cela définit la durée pendant laquelle l’état de détection est maintenu après l’arrêt du mouvement. Cela évite les basculements rapides entre détecté et non détecté.
Réglages de sortie PWM
Le capteur peut générer des signaux PWM pour un contrôle externe.
radar.setPwm(/*pwm1*/ 50, /*pwm2*/ 0, /*timer*/ 10);
Le premier canal PWM est réglé à une valeur de 50, définissant le rapport cyclique.
Le second canal PWM est désactivé en le réglant à 0.
La valeur du timer définit la période du PWM. Cette fonction peut être utilisée pour contrôler directement des dispositifs externes comme des LED ou des relais.
Polarité de sortie
La polarité de sortie définit le niveau logique du signal de détection. Notez que le nom de la fonction dans la bibliothèque est mal orthographié (« Polaity » au lieu de « Polarity »).
radar.setIoPolaity(1);
Une valeur de 1 configure la sortie en actif haut. Cela signifie que le signal devient HIGH lors de la détection de mouvement. Si réglé à 0, la logique est inversée et le signal devient LOW lors de la détection.
Fonction loop
La fonction loop vérifie en continu la présence de mouvement.
void loop() {
if (radar.motionDetection()) {
Serial.println("Motion detected");
}
delay(100);
}
La fonction radar.motionDetection() retourne true lorsqu’un mouvement est détecté. La logique de détection utilise tous les paramètres configurés, y compris la portée, la sensibilité et le timing.
Lorsqu’un mouvement est détecté, un message est affiché sur le moniteur série.
Le court délai de 100 millisecondes assure des mises à jour rapides tout en limitant l’utilisation du CPU.
Exemple de code : mesures de vitesse et distance avec C4001
Le code suivant initialise le capteur radar mmWave C4001 via UART et le configure pour la détection de mouvement et de vitesse. Dans la boucle principale, le code vérifie en continu si une cible est détectée et, si oui, lit la distance et la vitesse de la cible. Les valeurs mesurées sont ensuite affichées sur le moniteur série, permettant un suivi en temps réel des objets en mouvement.
// 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);
}
Inclusion de la bibliothèque
Comme précédemment, le code commence par inclure la bibliothèque nécessaire pour le capteur radar.
#include "DFRobot_C4001.h"
Configuration spécifique à la plateforme
Ensuite, on retrouve la même compilation conditionnelle pour supporter plusieurs plateformes. Elle sélectionne la bonne interface série selon la carte.
#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
Sur Arduino Uno et ESP8266, la broche 4 est configurée en RX et la broche 5 en TX. Sur ESP32, Serial2 est initialisé avec GPIO17 en RX et GPIO16 en TX.
Fonction setup
La fonction setup initialise la communication série et prépare le capteur.
void setup() {
Serial.begin(115200);
Le moniteur série est lancé à 115200 bauds. Il sert à afficher les résultats de mesure.
while (!radar.begin()) {
Serial.println("Can't find sensor");
delay(1000);
}
Serial.println("Sensor connected");
La fonction radar.begin() begin initialise la communication avec le capteur. La boucle assure que le programme attend la réponse du capteur. Une fois réussi, un message de confirmation est affiché.
Mode capteur
Le capteur est configuré en mode vitesse.
radar.setSensorMode(eSpeedMode);
Le mode eSpeedMode active l’analyse de mouvement avec mesure de vitesse. Dans ce mode, le capteur suit les cibles en mouvement et calcule leur vitesse via le décalage Doppler. Ce mode diffère de la simple détection de présence car il fournit des informations dynamiques sur le mouvement.
Détection de micro-mouvements
Le code active la détection de fretting.
radar.setFrettingDetection(eON);
La détection de fretting permet au capteur de détecter des mouvements très faibles. Cela inclut les micro-mouvements comme la respiration ou de légers mouvements corporels. Lorsqu’elle est activée, la sensibilité aux mouvements subtils augmente, permettant de détecter des personnes immobiles.
Délai de stabilisation
Un court délai est ajouté après la configuration.
delay(500);
Serial.println("Ready");
Ce délai donne au capteur le temps d’appliquer les nouveaux réglages. Ensuite, le système est prêt à démarrer les mesures.
Fonction loop
La boucle lit continuellement les données du capteur.
void loop() {
if (radar.getTargetNumber() > 0) {
La fonction getTargetNumber() retourne le nombre de cibles détectées. Si au moins une cible est présente, le code lit les données de mesure.
Serial.print("Distance: ");
Serial.print(radar.getTargetRange());
La fonction getTargetRange() retourne la distance à la cible détectée. La valeur est donnée en mètres.
Serial.print(" m Speed: ");
Serial.print(radar.getTargetSpeed());
La fonction getTargetSpeed() retourne la vitesse de la cible détectée. Elle est calculée via le décalage Doppler et exprimée en mètres par seconde.
Serial.println(" m/s");
}
delay(10);
}
Les résultats sont affichés sur le moniteur série dans un format lisible. La boucle tourne en continu avec un court délai de 100 millisecondes.
Exemple de sortie
La capture d’écran ci-dessous montre ce que vous devriez voir sur le moniteur série lorsque le capteur détecte un objet.

Bougez votre main plus loin et plus près du capteur à différentes vitesses, et vous verrez que les valeurs de distance et de vitesse mesurées changent.
Conclusions
Dans ce tutoriel, vous avez appris à connecter le capteur mmWave C4001 à un Arduino ou un ESP32 pour la détection de mouvement. Comparé aux capteurs de mouvement infrarouges passifs (PIR), le C4001 basé sur radar est plus fiable et peut détecter des personnes immobiles dans certaines plages de distance.
Si vous avez seulement besoin d’un signal binaire de détection (détecté, non détecté), vous pouvez programmer le capteur une fois (par exemple définir la distance de détection) via un microcontrôleur, puis utiliser la broche OUT. Pour des actions de contrôle plus complexes, vous pouvez programmer le microcontrôleur pour réagir aux mesures du capteur.
Notez qu’il existe aussi le Gravity: C4001 mmWave Human Presence Detection Sensor, très similaire au C4001 mais avec une portée plus courte (12 mètres) et une communication via I2C au lieu d’UART. Jetez aussi un œil aux capteurs mmWave C4002 et mmWave C1001.
Pour plus d’informations sur le capteur mmWave C4001, consultez la page Wiki, le Datasheet et le repo qui contient d’autres exemples de code.
Si vous avez des questions, n’hésitez pas à les poser dans la section commentaires.
Bon bricolage ; )

