Ignorer et passer au contenu

Livraison offerte à partir de 50€ d'achats, livrée sous 48h !

Livraison à partir de seulement 2.50€ !

Contents Menu Expand Light mode Dark mode Auto light/dark mode

Détecter des mouvements avec un détecteur Infrarouge (PIR) sur l’ESP32 avec du code Arduino

(Mis à jour le 23/06/2023)

Voici un capteur très intéressant pour détecter la présence d’une personne ou d’un animal : le capteur infrarouge passif, souvent appelé capteur PIR pour « Passive InfraRed ». Ce genre de capteur est fréquemment utilisé dans les systèmes d’alarme ou dans les éclairages qui s’allument automatiquement lorsqu’une personne entre dans une pièce.

Le fonctionnement d’un détecteur de mouvement par infrarouge (PIR)

Sous le dôme blanc en plastique, se trouve un capteur pyroélectrique qui détecte le rayonnement infrarouge émis par les objets environnants, c’est pourquoi il est appelé « capteur infrarouge passif ».

Il diffère des capteurs actifs qui émettent eux-mêmes un rayonnement (via une LED infrarouge) pour ensuite capter la partie transmise ou réfléchie (via une photorésistante par exemple).

Si un mouvement est détecté dans l’environnement du capteur, cela entraîne des variations du rayonnement infrarouge détecté. Le circuit électronique du module nous envoie ensuite l’information.

En fait la boule plastique agit comme une lentille qui aide à rediriger les rayons infrarouges vers le capteur : cela permet d’avoir un angle de détection important, suffisant pour détecter une personne dans une pièce.

Astuce

C’est pour cela que les détecteurs de mouvements sont placés en général dans les coins des pièces.

Prendre en main le module PIR

Utiliser un détecteur infrarouge avec un ESP32 se fait très facilement d’un point de vue électronique. Il n’y a pas besoin de code complexe ni d’utiliser des librairies tierces. Par contre, ce qui est compliqué, c’est de calibrer correctement le capteur PIR pour qu’il détecte correctement un mouvement. C’est d’autant plus fastidieux, qu’il existe plusieurs variations du module selon les fabricants.

Caractéristiques techniques du module PIR (HC-SR501)

Les capteurs PIR disponibles dans les kits DIY sont généralement basés sur le modèle proposé par Adafruit .

Note

Parfois ce module PIR est appelé avec la référence HC-SR501.

Circuit module HC-SR501 Adafruit PIR

Apercu du module PIR d’Adafruit

Voici quelques caractéristiques du capteur PIR d’Adafruit (et de ses clones chinois) :

  • Tension d’alimentation : 5-12V en fonction des modules (5V recommandé)

  • Portée : Le module peut détecter un mouvement jusqu’à 7m

  • Angle de mesure : ~120°

Note

Le module en lui-même fonctionne en 3.3V : il y a un régulateur linéaire qui convertit la tension d’entrée en 3.3V.

Branchements du capteur HC-SR04

Le module PIR comporte 3 connecteurs : GND pour la masse, OUT pour la sortie du capteur et +5V pour l’alimentation. Le signal de sortie de 3.3V est adapté pour l’ESP32.

Correspondance des broches

Module PIR

ESP32

OUT

GPIO36

5V

5V

GND

GND

Avertissement

Malheureusement, pour complexifier les choses inutilement, en fonction du fabricant du module, les broches 5V et GND peuvent être inversées. Par exemple, celui dans les photos à une alimentation inversée par rapport à celui d’Adafruit…

Pour être sûr d’alimenter le capteur dans le bon sens, je vous propose l’astuce suivante :

Note

La broche 5V est du même côté que la diode orange du module :

Brochage polarité capteur HC-SR501 PIR

Voici un exemple de montage sur breadboard en utilisant un capteur PIR (avec la polarité d’Adafruit) :

Câblage du PIR avec carte ESP

Câblage d’un capteur PIR (Adafruit) avec une carte uPesy ESP32 Wroom DevKit

Note

La broche GPIO36 a été choisie arbitrairement : vous pouvez prendre n’importe quelles broches d’entrées logiques de l’ESP32 pour OUT .

Configurer la détection de mouvements

Il y a trois paramètres sur lequel on peut jouer pour calibrer la détection des mouvements : 2 potentiomètres pour la sensibilité et la durée détection, et 1 cavalier (jumper) pour activer l’option “Retriger”.

Astuce

Pour une configuration toute prête, vous pouvez mettre les potentiomètres dans la même position que sur la photo.

Calibration potentiomètre capteur HC-SR501 PIR

Avertissement

Je vous conseille de mettre le module dans la même orientation que sur la photo pour que les explications coïncident. Sinon avec une orientation différente, la gauche droite et le sens de rotation seront différents.

À droite , le potentiomètre de sensibilité permet de régler la sensibilité du capteur en modifiant l’ampleur du mouvement requise pour déclencher la sortie. Pour**augmenter la sensibilité** , il faut tourner le potentiomètre dans le sens horaire ( sens des aiguilles d’une montre).

Cela permettra de détecter des mouvements plus discrets à une distance plus éloignée (jusqu’à 7 mètres environ) mais augmentera également le risque de faux positifs.

Astuce

Les 2 potentiomètres sont limités à course d’un demi-tour (rotation de 180°) : il faut éviter de forcer dessus. C’est mieux d’utiliser un petit tournevis, même si on peut se débrouiller avec les doigts (et les ongles), pour tourner ces petits potentiomètres.

À gauche , le potentiomètre de durée permet de contrôler la durée pendant laquelle le signal de sortie restera actif après la détection d’un mouvement. C’est-à-dire jouer sur la largeur d’impulsion générée. Puisque l’impulsion sera détectée par l’ESP32, une durée courte est suffisante. Cela permettra au capteur de détecter un nouveau mouvement et d’envoyer une nouvelle impulsion.

Cependant, si le capteur commande directement un circuit sans logique (par exemple un relais avec une lampe), c’est mieux d’augmenter la durée pour éviter que la lampe s’éteigne immédiatement quand il n’y a plus de mouvement.

Vous pouvez augmenter la durée en tournant le potentiomètre dans le sens horaire (à la position maximale, le signal restera actif pendant plusieurs minutes).

Astuce

Sur la photo, les potentiomètres sont réglés tel que la sensibilité de détection soit maximale avec une durée d’impulsion minimale.

A côté des potentiomètres, il y a 3 pins mâles dans un coin, dont deux sont reliés par un cavalier (jumper en anglais) de couleur jaune ou noire.

Par défaut, le jumper se trouve dans la position la plus proche du coin dans la position L . En utilisant cette configuration (Single Trigger ) , si un mouvement est détecté alors que le signal de sortie est déjà à l’état haut (génération d’impulsion en cours), il sera ignoré.

Par contre, si vous déplacez le jumper pour l’éloigner du coin (dans la position H ), si un mouvement est détecté alors que le signal de sortie est déjà à l’état haut, la génération du signal en cours est allongée pour prendre en compte la nouvelle détection de mouvement (Multiple Trigger Mode)

Explication mode Simple trigger PIR
Explication mode Simple trigger PIR

Astuce

Au final, le mode Multiple Trigger peut être utile si le signal doit rester à l’état haut tant qu’il y a une personne dans une pièce. Ceci étant, ce mode n’est pas très fiable, car même si l’impulsion est plus longue, elle finit par redescendre même s’il y a toujours du mouvement… Je vous conseille de rester dans la position d’origine en mode Single Trigger.

Vérifier que le capteur détecte bien les mouvements

Pour voir si le capteur est bien ajusté pour détecter les mouvements, on peut utiliser différentes méthodes de debug. Je vous recommande de faire cette étape pour être sûr que le module réagit correctement aux mouvements qu’il doit détecter. La méthode la plus simple consiste à utiliser le traceur série inclus dans l’Arduino IDE.

Méthode qui utilise le traceur série pour afficher les impulsions du PIR

On peut utiliser le traceur série du logiciel Arduino IDE pour afficher le signal généré par le capteur PIR au cours du temps. C’est en quelque sorte un oscilloscope très basique 🙂.

Astuce traceur série Arduino IDE oscilloscope

On utilise un code Arduino, qui renvoie la valeur analogique du signal renvoyé par le capteur PIR.

void setup() {
  pinMode(36, INPUT);
  Serial.begin(115200);
}

void loop() {
  Serial.println(analogRead(36));
  delay(20);
}

Astuce

C’est pour cela qu’on utilise la broche GPIO36 dans cet exemple car elle est reliée à l’ADC de l’ESP32.

Si les potentiomètres sont bien ajustés, vous devriez observer des impulsions dans le traceur série, quand il y a du mouvement aux alentours du capteur.

Exemple traceur série Arduino IDE oscilloscope

Astuce

Si vous avez un oscilloscope sous la main, vous pouvez très bien vous en servir à la place😎.

Méthode pour vérifier la détection de mouvement avec une simple LED

Ce n’est pas la méthode que je recommanderais, mais si vous n’avez pas d’ordinateur ni d’oscilloscope sous la main, cela peut être pratique. La méthode consiste juste à brancher une LED en sortie de la broche OUT du capteur qui génère l’impulsion. Quand un mouvement est détecté, la LED devrait s’allumer.

Astuce

Si l’impulsion est très rapide, il se peut que ce ne soit pas réellement visible à l’œil.

Câblage du PIR avec carte ESP

Astuce

L’ESP32 est utilisée ici uniquement pour l’alimentation 5V.

Détecter le mouvement sur l’ESP32 avec du code Arduino

Une fois que le bon fonctionnement du capteur PIR est validé, on peut intégrer la logique qui permettra à l’ESP32 de savoir qu’un mouvement a été détecté.

Sonder en boucle l’état de la broche

La méthode la plus évidente pour détecter l’impulsion logique est de tout simplement scruter l’état de la broche qui est relié au capteur PIR dans la fonction loop() :

#define PIN_PIR 36

void my_task(){
  }

void setup() {
  pinMode(PIN_PIR, INPUT);
  Serial.begin(115200);
}

void loop() {
  if (digitalRead(PIN_PIR) == 1){
      Serial.println("Motion detected");
      my_task(); // task when motion detected
  }
  delay(20);
}

Ce code simpliste peut faire l’affaire si le programme n’a rien d’autre à faire. Tant que l’impulsion est à l’état haut, la fonction my_task() sera exécutée : elle peut être appelée plusieurs fois pour la même détection. Une solution plus élégante est d’utiliser une interruption de l’ESP32.

Avertissement

Si pendant que la tâche my_task() une impulsion est envoyée par le capteur et se termine avant la fin de l’exécution de my_task() , elle ne sera pas prise en compte par l’ESP32.

Utiliser une interruption en arrière-plan

En utilisant une interruption , la fonction my_task() sera exécuté à chaque fois qu’une nouvelle impulsion sera envoyée par le capteur infrarouge. La fonction loop() peut être utilisée pour autre chose.

Astuce

C’est l’approche à privilégier si vous voulez implémenter une logique plus complexe pour traiter les signaux de détection du capteur.

#define PIN_PIR 36

void IRAM_ATTR my_task() {
  ets_printf("Motion detected\n");
}

void setup() {
  Serial.begin(115200);
  pinMode(PIN_PIR, INPUT);
  attachInterrupt(PIN_PIR, my_task, RISING);
}

void loop() {
}

Si les tâches à effectuer dans l’interruption sont conséquentes, c’est mieux de les effectuer dans la boucle principale. L’interruption sera utilisée juste pour signaler à coup sûr une impulsion du capteur PIR.

Astuce

On peut jouer sur le mode de détection de l’interruption pour avoir un comportement différent , par exemple qu’elle se déclenche sur un front montant et descendant, pour calculer la durée de l’impulsion.

Utilisations avancées

Interruption pour signaler la détection avec exécution de la tâche dans la boucle principale

On évite de faire des actions trop longues dans les routines d’interruptions. Une pratique courante est de changer l’état d’une variable dans la routine et d’exécuter la tâche dans la boucle principale.

#define PIN_PIR 36

volatile boolean motion_detected = false;

void IRAM_ATTR my_task() {
  motion_detected = true;
}

void setup() {
  Serial.begin(115200);
  pinMode(PIN_PIR, INPUT);
  attachInterrupt(PIN_PIR, my_task, RISING);
}

void

Cette section est réservée aux abonnés. Il vous reste 68% à découvrir.

Devenir membre premium

Déjà abonné ? Connectez-vous

Quelques ressources et idées de projets intéressantes