Skip to Content

Comment utiliser le capteur de mouvement PIR HC-SR501 avec Arduino

Comment utiliser le capteur de mouvement PIR HC-SR501 avec Arduino

Dans ce tutoriel, vous apprendrez comment fonctionne le capteur de mouvement PIR HC-SR501 et comment l’utiliser avec Arduino. Vous pouvez trouver des capteurs infrarouges passifs (PIR) tout autour de vous, ils ne sont pas seulement utilisés pour la sécurité, mais aussi dans la plupart des systèmes d’éclairage activés automatiquement.

Dans cet article, j’ai inclus un schéma de câblage et des exemples de code pour que vous puissiez commencer à expérimenter avec votre capteur. Après chaque exemple, j’explique en détail le fonctionnement du code, vous ne devriez donc avoir aucun problème à le modifier selon vos besoins.

Je vais d’abord vous montrer comment utiliser le HC-SR501 en tant qu’unité autonome. Ensuite, nous le connecterons à un Arduino UNO et je vous montrerai comment l’utiliser comme un système d’alarme simple.

Ce tutoriel se concentre sur le capteur HC-SR501, mais vous pouvez aussi utiliser le code fourni pour des capteurs similaires comme le  HC-SR505  ou  AM312. La principale différence est que ces capteurs moins chers ont une portée de détection plus courte et ne disposent pas d’un potentiomètre pour ajuster la sensibilité et le délai.

Matériel nécessaire

Composants matériels

HC-SR501HC-SR501 PIR motion sensor × 1 Amazon
Arduino Uno Rev 3Arduino Uno Rev3 × 1 Amazon
Breadboard × 1 Amazon
Jumper wires × 10 Amazon
resistorResistor assortment × 1 Amazon
red-ledLEDs × 1 Amazon
buzzerPassive buzzer × 1 Amazon
USB cable type A/B × 1 Amazon

Logiciel

Arduino IDEArduino IDE

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.

Comment fonctionne un capteur de mouvement PIR ?

Les capteurs de mouvement PIR se composent de deux parties principales : un  élément pyézoélectrique de détection  et une  lentille de Fresnel . L’élément pyézoélectrique peut détecter le rayonnement infrarouge. Tous les objets dont la température est au-dessus du zéro absolu (0 Kelvin / -273,15 °C) émettent de la chaleur sous forme de rayonnement infrarouge, y compris les corps humains.

HC-SR501-PIR-Motion-Sensor-working-principle
Fonctionnement du capteur de mouvement PIR

Un capteur pyézoélectrique possède deux fentes rectangulaires faites d’un matériau qui laisse passer le rayonnement infrarouge. Derrière celles-ci, il y a deux électrodes infrarouges séparées, l’une produisant une sortie positive et l’autre une sortie négative. Cela permet de détecter un changement dans les niveaux IR et non les niveaux ambiants. Les deux électrodes sont câblées pour s’annuler mutuellement. Si une moitié reçoit plus ou moins de rayonnement IR que l’autre, la sortie bascule vers le haut ou le bas.

Le circuit intégré de traitement du signal embarqué analyse ce signal et met la sortie du capteur à HIGH ou LOW en conséquence.

HC-SR501-PIR-Motion-Sensor-pyroelectric-element
Boîtier du capteur de mouvement PIR

Le dôme blanc devant l’élément de détection est une lentille de Fresnel. Cette lentille concentre le rayonnement infrarouge sur le capteur.

HC-SR501-PIR-Motion-Sensor-fresnel-lens-working-principle
Lentille de Fresnel du capteur de mouvement PIR

Capteur de mouvement PIR HC-SR501

Le capteur de mouvement PIR HC-SR501 est construit autour du circuit intégré BISS0001 Micro Power PIR Motion Detector. Ce CI est spécialement conçu pour traiter le signal des capteurs PIR.

Si vous retirez la lentille de Fresnel, vous verrez l’élément pyézoélectrique RE200B. Sur le PCB, vous trouverez également un régulateur de tension intégré. Cela signifie que vous pouvez alimenter la carte avec une large plage de tension continue, généralement 5 V.

Les spécifications du HC-SR501 sont données dans le tableau ci-dessous, notez qu’il peut y avoir de petites différences selon les fabricants.

Spécifications du HC-SR501

Tension de fonctionnement 4,5 – 20 V
Courant de repos 50 μA
Niveau de sortie HIGH 3,3 V / LOW 0 V
Déclenchement L déclenchement unique / H déclenchement répétitif
Temps de retard 3 – 300 s
Temps de blocage 2,5 s (par défaut)
Déclenchement L déclenchement unique / H déclenchement répétitif
Plage de mesure 3 – 7 m maximum
2 mm
Angle de mesure < 110° angle conique
Dimensions du PCB 32,5 x 24 mm
Trous de fixation 2 mm, espacement 28,5 mm
Dimensions de la lentille de Fresnel 15 mm x 23 mm de diamètre
Température de fonctionnement -15 – 70 °C
Coût Check price

Pour plus d’informations, vous pouvez consulter les fiches techniques ci-dessous :

Réglage du HC-SR501

Au dos de la carte, vous trouverez deux potentiomètres et un cavalier, que vous pouvez utiliser pour ajuster plusieurs paramètres :

HC-SR501-Pinout-Annotation
Brochage de la carte HC-SR501

Réglage de la sensibilité (portée)

Le HC-SR501 a une distance de détection maximale de 7 mètres. Vous pouvez ajuster cette distance en tournant le potentiomètre de sensibilité dans le sens horaire ou antihoraire (voir photo ci-dessus). Tourner le potentiomètre dans le sens horaire augmente la distance jusqu’à 7 mètres. Le tourner dans le sens antihoraire la réduit jusqu’à 3 mètres.

Réglage du délai (Tx)

Ce potentiomètre sert à régler le temps pendant lequel la sortie reste à HIGH après détection de mouvement. Le délai minimum est de 3 secondes et le maximum de 300 secondes (5 minutes). Tournez le potentiomètre dans le sens horaire pour augmenter le délai, et dans le sens antihoraire pour le diminuer.

Cavalier de sélection du mode de déclenchement

Le cavalier (jaune) permet de choisir entre deux modes de déclenchement. Il peut être réglé sur  L  (déclenchement unique) ou  H  (déclenchement répétitif) :

  • Déclenchement unique  – La sortie passe à HIGH dès qu’un mouvement est détecté. Elle reste HIGH pendant le temps défini par le potentiomètre. Tout mouvement pendant cette période n’est pas pris en compte et ne redémarre pas le minuteur.
  • Déclenchement répétitif  – À chaque détection de mouvement, le minuteur de délai est relancé.

La différence entre les modes de déclenchement unique et répétitif est illustrée dans la figure ci-dessous.

Difference-between-single-and-repeating-trigger-HC-SR501
Différence entre les modes de déclenchement unique et répétitif. Les flèches indiquent le temps de délai réglé.

Ajouter une thermistance et/ou une LDR au HC-SR501

Comme on peut le voir sur l’image ci-dessous, le HC-SR501 dispose de pastilles de soudure pour deux composants supplémentaires. Ces pastilles sont généralement étiquetées ‘RL’ et ‘RT’.

HC-SR501-RL-and-RT-solder-pads
Pastilles de soudure du HC-SR501
  • RL  – Ici, vous pouvez ajouter une  light dependent resistor  (LDR) ou photorésistance qui a une faible résistance sous une forte lumière ambiante. Cela permet au détecteur de ne fonctionner que lorsque la zone de détection est suffisamment sombre.
  • RT  – Cette pastille est prévue pour une  thermistor. Son ajout rend la sensibilité du capteur moins dépendante de la température ambiante.

Malheureusement, aucune information supplémentaire n’est fournie dans les fiches techniques, donc je ne suis pas totalement sûr des valeurs des composants à utiliser.

Utiliser le capteur de mouvement PIR HC-SR501 en unité autonome

Pour la plupart des applications, vous pouvez simplement utiliser le HC-SR501 en unité autonome. Vous pouvez utiliser le signal de sortie pour déclencher des relais, des LED, etc.

Le câblage est très simple comme montré sur la photo ci-dessous. Il suffit de connecter VCC et GND à une batterie et une LED rouge entre la broche de sortie et la masse. La tension de sortie est de 3,3 V, j’ai donc ajouté une résistance de limitation de courant de 68 Ω en série avec la LED.

HC-SR501-PIR-motion-sensor-with-LED-wiring-diagram-schematic
Schéma de câblage du capteur de mouvement PIR HC-SR501 avec LED

Notez qu’après avoir alimenté le capteur, vous devez attendre 30 à 60 secondes pour qu’il s’initialise. Pendant cette période, la LED peut clignoter quelques fois. Après une minute, vous pouvez agiter la main devant le capteur et la LED devrait s’allumer.

Avec cette configuration, il est facile de tester le fonctionnement du capteur. C’est aussi un bon moment pour jouer avec les réglages de sensibilité, de délai, ainsi que les deux modes de déclenchement.

Câblage – Connexion du capteur PIR HC-SR501 à Arduino UNO

En connectant le capteur de mouvement à un microcontrôleur comme l’Arduino UNO, vous pouvez contrôler toutes sortes d’éléments : LED, relais, moteurs, buzzers, etc.

Dans le schéma de câblage ci-dessous, vous pouvez voir comment le brancher à l’Arduino. Vous pouvez lire le capteur avec une des broches d’entrée/sortie générales (GPIO) de l’Arduino. Dans cet exemple, je l’ai connecté à la broche numérique 2. Les broches VCC et GND sont connectées respectivement à 5 V et à la masse.

HC-SR501-PIR-motion-sensor-with-Arduino-UNO-wiring-diagram-schematic
Schéma de câblage du capteur PIR HC-SR501 avec Arduino

Les connexions sont aussi indiquées dans le tableau ci-dessous :

Connexions du capteur de mouvement PIR HC-SR501

Capteur PIR HC-SR501 Arduino
VCC 5 V
OUT Broche 2
GND GND

Une fois le capteur câblé, l’étape suivante est de téléverser un exemple de code.

Exemple de code pour le capteur PIR HC-SR501 avec Arduino UNO

Avec le code exemple suivant, vous pouvez lire le capteur et contrôler la LED intégrée de l’Arduino (connectée à la broche 13). Ce code peut aussi être utilisé pour contrôler des relais simples afin d’allumer ou d’éteindre une lumière plus puissante.

Pour que ce code fonctionne correctement, il est préférable de régler le cavalier de mode de déclenchement sur ‘H’ (mode déclenchement répétitif). Réglez aussi le potentiomètre de délai au minimum en le tournant complètement dans le sens antihoraire.

Le code lit l’état du capteur (HIGH ou LOW) et allume ou éteint la LED intégrée en conséquence. Il affiche aussi un message dans le moniteur série, accessible via Tools ou en tapant (Ctrl+Shift+M).

/* Example code for HC-SR501 PIR motion sensor with Arduino. 
   More info: www.www.makerguides.com */

// Define connection pins:
#define pirPin 2
#define ledPin 13

// Create variables:
int val = 0;
bool motionState = false; // We start with no motion detected.

void setup() {
  // Configure the pins as input or output:
  pinMode(ledPin, OUTPUT);
  pinMode(pirPin, INPUT);

  // Begin serial communication at a baud rate of 9600:
  Serial.begin(9600);
}

void loop() {
  // Read out the pirPin and store as val:
  val = digitalRead(pirPin);

  // If motion is detected (pirPin = HIGH), do the following:
  if (val == HIGH) {
    digitalWrite(ledPin, HIGH); // Turn on the on-board LED.

    // Change the motion state to true (motion detected):
    if (motionState == false) {
      Serial.println("Motion detected!");
      motionState = true;
    }
  }

  // If no motion is detected (pirPin = LOW), do the following:
  else {
    digitalWrite(ledPin, LOW); // Turn off the on-board LED.

    // Change the motion state to false (no motion):
    if (motionState == true) {
      Serial.println("Motion ended!");
      motionState = false;
    }
  }
}

Vous devriez voir la sortie suivante dans le moniteur série :

HC-SR501 PIR motion sensor Serial Monitor output
Sortie du capteur PIR dans le moniteur série

Explication du code :

Le code est assez simple et vous n’avez pas besoin de bibliothèques Arduino pour utiliser ce capteur.

Le sketch commence par définir la broche du capteur PIR et celle de la LED. Je les ai connectées aux broches 2 et 13 de l’Arduino (LED intégrée).

L’instruction  #define  est utilisée pour donner un nom à une valeur constante. Le compilateur remplacera toute référence à cette constante par la valeur définie lors de la compilation. Ainsi, partout où vous mentionnez  pirPin, le compilateur la remplacera par la valeur 2 lors de la compilation.

J’ai aussi créé deux variables,  val  et  motionState, qui sont un  integer  et un booléen  boolean (vrai/faux) respectivement. La variable  val  sert à stocker la sortie du capteur PIR (HIGH ou LOW) et  motionState  devient vrai lorsque du mouvement est détecté et faux lorsqu’il n’y en a pas.

// Define connection pins:
#define pirPin 2
#define ledPin 13

// Create variables:
int val = 0;
bool motionState = false; // We start with no motion detected.

Dans la fonction  setup(), nous configurons les broches en entrée ou sortie avec la fonction  pinMode(pin,mode). La broche pirPin est une entrée et la ledPin une sortie. Nous commençons aussi la communication série à 9600 bauds. Assurez-vous que le moniteur série est aussi réglé à 9600.

void setup() {
  // Configure the pins as input or output:
  pinMode(ledPin, OUTPUT);
  pinMode(pirPin, INPUT);

  // Begin serial communication at a baud rate of 9600:
  Serial.begin(9600);
}

Dans la fonction  loop(), je lis d’abord le capteur avec la fonction  digitalRead(pin). Cette fonction retourne HIGH ou LOW.

  // Read out the pirPin and store as val:
  val = digitalRead(pirPin);

Quand la sortie du capteur/val est HIGH, j’allume la LED avec la fonction  digitalWrite(pin,value).

  // If motion is detected (pirPin = HIGH), do the following:
  if (val == HIGH) {
    digitalWrite(ledPin, HIGH); // Turn on the on-board LED.

    // Change the motion state to true (motion detected):
    if (motionState == false) {
      Serial.println("Motion detected!");
      motionState = true;
    }
  }

Ensuite, motionState passe à vrai et le message « Motion detected! » est affiché dans le moniteur série. Je vérifie d’abord l’état actuel de motionState pour que le message ne soit affiché qu’une fois par événement de mouvement.

S’il n’y a plus de mouvement devant le capteur,  val  devient LOW, la LED s’éteint et le message « Motion ended! » est affiché dans le moniteur série.

Créer un système d’alarme avec capteur PIR et buzzer

Avec quelques modifications simples, vous pouvez créer un système d’alarme avec le HC-SR501 et un  piezoelectric buzzer. J’ai connecté le buzzer avec une résistance de 100 Ω entre la broche numérique 5 et la masse. Vous pouvez probablement utiliser le buzzer sans résistance (ce qui le rend plus fort), mais le son sera moins agréable.

HC-SR501-PIR-motion-sensor-with-buzzer-and-Arduino-UNO-wiring-diagram-schematic
Schéma de câblage du capteur PIR HC-SR501 avec Arduino UNO et buzzer.

Le code ci-dessous est presque identique à l’exemple précédent. J’ai juste ajouté une fonction pour créer le son d’alarme. Vous pouvez changer la tonalité du buzzer en modifiant le paramètre d’entrée de la fonction  alarm(duration,frequency)  .

/* Example code to create an alarm system with HC-SR501 PIR motion sensor, buzzer and Arduino. 
   More info: www.www.makerguides.com */

// Define connection pins:
#define buzzerPin 5
#define pirPin 2
#define ledPin 13

// Create variables:
int val = 0;
bool motionState = false; // We start with no motion detected.

void setup() {
  // Configure the pins as input or output:
  pinMode(buzzerPin, OUTPUT);
  pinMode(ledPin, OUTPUT);
  pinMode(pirPin, INPUT);

  // Begin serial communication at a baud rate of 9600:
  Serial.begin(9600);
}

void loop() {
  // Read out the pirPin and store as val:
  val = digitalRead(pirPin);

  // If motion is detected (pirPin = HIGH), do the following:
  if (val == HIGH) {
    digitalWrite(ledPin, HIGH); // Turn on the on-board LED.
    alarm(500, 1000);  // Call the alarm(duration, frequency) function.
    delay(150);

    // Change the motion state to true (motion detected):
    if (motionState == false) {
      Serial.println("Motion detected!");
      motionState = true;
    }
  }

  // If no motion is detected (pirPin = LOW), do the following:
  else {
    digitalWrite(ledPin, LOW); // Turn off the on-board LED.
    noTone(buzzerPin); // Make sure no tone is played when no motion is detected.
    delay(150);

    // Change the motion state to false (no motion):
    if (motionState == true) {
      Serial.println("Motion ended!");
      motionState = false;
    }
  }
}

// Function to create a tone with parameters duration and frequency:
void alarm(long duration, int freq) {
  tone(buzzerPin, freq);
  delay(duration);
  noTone(buzzerPin);
}

Points à considérer lors de la conception d’un système à capteur PIR

Comme pour les autres capteurs PIR, le HC-SR501 a besoin d’un temps d’initialisation et d’adaptation aux niveaux infrarouges de la pièce. Cela prend environ 1 minute au démarrage. Essayez d’éliminer tout mouvement devant le capteur pendant cette période.

Le vent et une source lumineuse proche du capteur peuvent provoquer des interférences, essayez donc d’ajuster votre installation pour éviter cela. Notez aussi que le capteur doit être monté horizontalement car la plupart des mouvements se produisent dans ce plan (ex. marche).

En plus du temps de retard (Tx), le capteur a aussi un « temps de blocage » (Ti). Par défaut, ce temps est de 2,5 secondes et il est difficile à modifier (voir la fiche technique du BISS0001). Chaque fois que la sortie passe de HIGH à LOW, la période de blocage commence. Pendant ce temps, le capteur ne détecte aucun mouvement.

Lors de la conception d’un système basé sur le HC-SR501, vous devrez prendre en compte ces temps de retard.

Conclusion

Dans cet article, je vous ai montré comment fonctionne le capteur de mouvement PIR HC-SR501 et comment l’utiliser avec Arduino. J’espère que vous l’avez trouvé utile et instructif. Si vous avez des questions, des suggestions, ou si vous pensez que des éléments manquent dans ce tutoriel, n’hésitez pas à laisser un commentaire ci-dessous.