Skip to Content

Détection de présence humaine avec mmWave C4001

Détection de présence humaine avec mmWave C4001

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 Lolin32

ESP32 Lite

Câble USB C

Arduino

Arduino Uno

USB Data Sync cable Arduino

Câble USB pour Arduino UNO

Dupont wire set

Jeu de fils Dupont

Half_breadboard56a

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.

Arrière et avant du capteur mmWave C4001 (source)

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.

Portée de détection du capteur mmWave C4001 (source)

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 :

 Pinout of the mmWave C4001 Sensor
Brochage du capteur mmWave C4001 (source)

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 :

Connecting the mmWave C4001 Sensor to LED
Connexion du capteur mmWave C4001 à une LED

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 :

Connecting the mmWave C4001 Sensor to Relay Module
Connexion du capteur mmWave C4001 à un module relais

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 :

Connecting the mmWave C4001 Sensor to an Arduino UNO
Connexion du capteur mmWave C4001 à un Arduino UNO

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 :

mmWave C4001 Sensor connected to an Arduino UNO
Capteur mmWave C4001 connecté à un Arduino UNO

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 :

Connecting the mmWave C4001 Sensor to an ESP32
Connexion du capteur mmWave C4001 à un ESP32

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 ; )