Détecter des mouvements avec un détecteur Infrarouge (PIR) sur l’ESP32 en MicroPython
(Mis à jour le 23/06/2023)
Un capteur très utile pour détecter la présence d’une personne ou d’un animal est le capteur infrarouge passif, également connu sous le nom de capteur PIR (Passive InfraRed). Ce capteur est souvent utilisé dans les systèmes d’alarme et les éclairages qui s’allument automatiquement lorsqu’une personne entre dans une pièce.
Comment fonctionne un capteur de mouvement infrarouge (PIR)
Le capteur PIR contient un capteur pyroélectrique sous un dôme en plastique blanc. Ce capteur détecte le rayonnement infrarouge émis par les objets environnants, d’où son nom de « capteur infrarouge passif ». Contrairement aux capteurs actifs qui émettent eux-mêmes un rayonnement infrarouge, le capteur PIR détecte les variations du rayonnement infrarouge causées par un mouvement dans son environnement. Ensuite, le module électronique du capteur envoie une information sous la forme d’une impulsion logique.
Le dôme en plastique agit comme une lentille qui redirige les rayons infrarouges vers le capteur, permettant une détection sur un angle large, suffisamment grand pour détecter une personne dans une pièce.
Prendre en main le module PIR
Il est très facile d’utiliser un capteur infrarouge avec l’ESP32 en MicroPython. Le plus compliqué est de calibrer correctement le capteur PIR pour qu’il détecte les mouvements de manière précise, surtout compte tenu des différentes variantes des modules disponibles.
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 également appelé HC-SR501.
Voici quelques caractéristiques du capteur PIR d’Adafruit (et des versions chinoises similaires) :
Tension d’alimentation : 5-12V (recommandé : 5V)
Portée : Le capteur peut détecter un mouvement jusqu’à 7 mètres
Angle de détection : environ 120 degrés
Branchements du capteur HC-SR04
Le module PIR a 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 compatible avec l’ESP32.
Avertissement
Selon le fabricant du module, les broches 5V
et GND
peuvent être inversées. Veuillez vérifier attentivement les polarités.
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 :
Voici un exemple de montage sur breadboard en utilisant un capteur PIR (avec la polarité d’Adafruit) :
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 mouvement
Il y a trois paramètres que vous pouvez ajuster pour calibrer la détection des mouvements : deux potentiomètres pour la sensibilité et la durée de détection, et un cavalier (jumper) pour activer l’option « Retriger ».
Astuce
Pour une configuration rapide, vous pouvez mettre les potentiomètres dans la même position que sur la photo.
Avertissement
Assurez-vous d’orienter le capteur de la même manière que sur la photo pour que les explications correspondent. Sinon, les indications gauche-droite et sens de rotation seront différents.
Potentiomètre de sensibilité (à droite) : Il règle la sensibilité du capteur en ajustant l’amplitude du mouvement requis pour déclencher la sortie. Pour augmenter la sensibilité, tournez le potentiomètre dans le sens horaire (sens des aiguilles d’une montre). Cela permet de détecter des mouvements plus discrets à une plus grande distance (environ 7 mètres), mais cela augmente également le risque de fausses détections.
Astuce
Les potentiomètres ont une rotation limitée à 180 degrés, veillez donc à ne pas les forcer. Utilisez de préférence un petit tournevis pour les ajuster.
Potentiomètre de durée (à gauche) : Il contrôle la durée pendant laquelle le signal de sortie reste actif après la détection d’un mouvement. Cela correspond à la largeur de l’impulsion générée. Si le capteur est connecté directement à un circuit sans logique (par exemple, un relais avec une lampe), il est préférable d’augmenter la durée pour éviter que la lampe ne s’éteigne immédiatement en cas d’absence de mouvement. Pour augmenter la durée, tournez le potentiomètre dans le sens horaire. À la position maximale, le signal reste actif pendant plusieurs minutes.
À côté des potentiomètres, il y a 3 broches mâles dans un coin, dont deux sont reliées par un cavalier (jumper) de couleur jaune ou noire.
Par défaut, le cavalier est placé dans la position la plus proche du coin, en position “L”. Avec cette configuration si un mouvement est détecté alors que le signal de sortie est déjà actif (génération d’impulsion en cours), il sera ignoré.
Cependant, si vous déplacez le cavalier pour l’éloigner du coin (en position “H”), lorsqu’un mouvement est détecté alors que le signal de sortie est déjà actif, la durée de génération du signal en cours est prolongée pour tenir compte de la nouvelle détection de mouvement (mode de déclenchement multiple).
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’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.
Détecter le mouvement sur l’ESP32 en Micro Python
Une fois que le bon fonctionnement du capteur PIR est validé, nous pouvons intégrer la logique qui permettra à l’ESP32 de détecter un mouvement.
Vérifier 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 :
from machine import Pin
import time
pin_pir = Pin(36, mode=Pin.IN, pull=Pin.PULL_UP)
def my_task():
pass
if __name__ == "__main__":
while True:
if pir_pin.value() == 1:
print("Motion detected")
my_task()
time.sleep_ms(20)
Ce script simple peut fonctionner 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 une même détection. Une solution plus élégante consiste à utiliser une interruption sur l’ESP32.
Avertissement
Si une nouvelle impulsion est émise par le capteur pendant l’exécution de la tâche my_task()
, et qu’elle 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.
from machine import Pin
pin_pir = Pin(36, mode=Pin.IN, pull=Pin.PULL_UP)
def my_task(pin):
print("Motion detected")
pin_button.irq(trigger=Pin.IRQ_RISING,handler=my_task)
while True:
...