Arduino - Capteur de mouvement

Lorsque vous approchez de certains endroits où les portes s'ouvrent/se ferment automatiquement, où les ampoules s'allument/s'éteignent automatiquement ou où l'escalator est activé automatiquement, vous êtes-vous déjà posé la question : « Comment cela peut-il se faire ? » ? Si oui, ce tutoriel répond non seulement à cette question, mais vous explique également comment y parvenir. Commençons !

Dans ce tutoriel, nous allons apprendre :

Préparation du matériel

1×Arduino Uno
1×USB 2.0 cable type A/B
1×HC-SR501 Motion Sensor
1×Jumper Wires
1×(Optional) 9V Power Adapter for Arduino
1×(Recommended) Screw Terminal Block Shield for Arduino Uno
1×(Optional) Transparent Acrylic Enclosure For Arduino Uno

Or you can buy the following sensor kits:

1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)
Divulgation : Certains des liens fournis dans cette section sont des liens affiliés Amazon. Nous pouvons recevoir une commission pour tout achat effectué via ces liens, sans coût supplémentaire pour vous. Nous vous remercions de votre soutien.

À propos du capteur de mouvement HC-SR501

Capteur de mouvement HC-SR501

Le capteur HC-SR501 PIR est un capteur pouvant détecter le mouvement des humains (ou des animaux). Il est largement utilisé pour détecter la présence humaine dans de nombreuses applications (allumage/extinction automatique d'une ampoule, ouverture/fermeture de porte, activation/désactivation d'escalator, détection d'un intrus...)

Schéma des broches

Le capteur de mouvement HC-SR501 possède 3 broches :

  • Broche GND : doit être connectée au GND (0V)
  • Broche VCC : doit être connectée au VCC (5V)
  • Broche OUTPUT : est une broche de sortie : BASSE lorsque aucun mouvement n'est détecté, HAUTE lorsque un mouvement est détecté. Cette broche doit être connectée à la broche d'entrée de l'Arduino.

Le HC-SR501 dispose également d'un cavalier et de deux potentiomètres, qui servent à ajuster les paramètres du capteur. Commencez par conserver le réglage par défaut. Les détails sont décrits dans la section Utilisations Avancées.

Détail des broches du capteur de mouvement HC-SR501

Comment ça marche

Le capteur HC-SR501 détecte le mouvement en se basant sur le changement du rayonnement infrarouge provenant de l'objet en mouvement. Pour être détecté par le capteur HC-SR501, l'objet doit remplir deux conditions :

  • Bouge ou secoue
  • émet de l'infrarouge.

Alors :

  • Si un objet est en mouvement mais n'émet pas de rayon infrarouge (par exemple, un robot ou un jouet véhicule), il n'est pas détecté par le capteur.
  • Si un objet émet un rayon infrarouge mais ne se déplace pas (par exemple, une personne reste immobile sans bouger), il n'est pas détecté par le capteur.

Les humains et les animaux émettent naturellement des infrarouges. Ainsi, le capteur peut détecter les mouvements des humains et des animaux.

État de la broche de SORTIE :

  • Lorsqu'il n'y a aucun humain (ou animal) en mouvement dans la portée détectée du capteur, la broche de SORTIE du capteur est BASSE.
  • Lorsqu'un humain (ou un animal) entre dans la portée détectée du capteur, la broche de SORTIE du capteur passe de BASSE à HAUTE (⇒ détection de mouvement).
  • Lorsqu'un humain (ou un animal) s'éloigne de la portée détectée du capteur, la broche de SORTIE du capteur passe de HAUTE à BASSE (⇒ fin du mouvement).

La vidéo ci-dessus illustre le principe de fonctionnement du capteur de mouvement. En pratique, le fonctionnement du capteur de mouvement diffère légèrement selon le réglage du capteur (décrit dans la section Usages Avancés).

Détecter la présence humaine

Le capteur lui-même ne détecte PAS la présence humaine, il détecte uniquement le mouvement. Nous utilisons Arduino (ou un MCU) pour déduire la présence humaine en nous basant sur la détection de mouvement du capteur, selon la règle suivante :

  • Si un mouvement est détecté, les humains sont présents
  • Si aucun mouvement n'est détecté, les humains ne sont pas présents

Cette règle est incorrecte dans un cas pratique : les humains sont présents dans la portée du capteur mais ne bougent PAS. Le mouvement n'est PAS détecté. L'Arduino (ou MCU) déduit que l'humain n'est PAS présent.

Par exemple, votre salle de réunion utilise un capteur de mouvement pour allumer/éteindre automatiquement la lumière, celle-ci s'allume automatiquement lorsque des personnes entrent dans la pièce. Pendant la réunion, si tout le monde reste immobile sans bouger, aucun mouvement n'est détecté ⇒ aucune présence humaine n'est détectée ⇒ la lumière s'éteint automatiquement. Pour allumer la lumière, il faut que quelqu'un bouge.

Cependant, ce problème n'est PAS grave et le capteur est bon marché. Par conséquent, le capteur est largement utilisé pour détecter les humains dans de nombreuses applications.

Arduino - Capteur de mouvement HC-SR501

Lorsqu'une broche d'Arduino est configurée en entrée numérique, elle peut lire l'état (BAS ou HAUT) de tout ce à quoi elle est connectée.

En connectant la broche de l'Arduino à la broche de SORTIE du capteur HC-SR501, nous pouvons utiliser le code Arduino pour vérifier la valeur de la broche de SORTIE afin de détecter le mouvement.

Diagramme de câblage

Schéma de câblage du capteur de mouvement Arduino

This image is created using Fritzing. Click to enlarge image

Configuration initiale

Time Delay AdjusterScrew it in anti-clockwise direction fully.
Detection Range AdjusterScrew it in clockwise direction fully.
Repeat Trigger SelectorPut jumper as shown on the image.
réglage initial du capteur de mouvement Arduino

Comment programmer pour un capteur de mouvement

  • Configurez une broche d'Arduino en mode entrée numérique en utilisant la fonction pinMode()
pinMode(PIN_TO_SENSOR, INPUT);
  • Lire l'état de la broche de SORTIE du capteur en utilisant la fonction digitalRead().
pinStateCurrent = digitalRead(PIN_TO_SENSOR);
  • Détecter le début du mouvement (changement d'état de la broche de LOW à HIGH)
pinStatePrevious = pinStateCurrent; // stocker l'ancien état pinStateCurrent = digitalRead(PIN_TO_SENSOR); // lire le nouvel état if (pinStatePrevious == LOW && pinStateCurrent == HIGH) { // changement d'état du pin : LOW -> HIGH Serial.println("Motion detected!"); }
  • Détecter l'arrêt de mouvement (changement d'état du pin de HAUT à BAS)
c pinStatePrevious = pinStateCurrent; // stocker l'ancien état pinStateCurrent = digitalRead(PIN_TO_SENSOR); // lire le nouvel état if (pinStatePrevious == HIGH && pinStateCurrent == LOW) { // changement d'état du pin : HIGH -> LOW Serial.println("Motion stopped!"); }

Code Arduino

/* * Ce code Arduino a été développé par newbiely.fr * Ce code Arduino est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/tutorials/arduino/arduino-motion-sensor */ const int PIN_TO_SENSOR = 2; // la broche à laquelle le pin OUTPUT du capteur est connecté int pinStateCurrent = LOW; // état actuel de la broche int pinStatePrevious = LOW; // état précédent de la broche void setup() { Serial.begin(9600); // initialiser la série pinMode(PIN_TO_SENSOR, INPUT); // configurer la broche Arduino en mode entrée pour lire la valeur à partir de la broche OUTPUT du capteur } void loop() { pinStatePrevious = pinStateCurrent; // stocker l'ancien état pinStateCurrent = digitalRead(PIN_TO_SENSOR); // lire le nouvel état if (pinStatePrevious == LOW && pinStateCurrent == HIGH) { // changement d'état de la broche: LOW -> HIGH Serial.println("Motion detected!"); // TODO: activer une alarme, une lumière ou activer un dispositif ... ici } else if (pinStatePrevious == HIGH && pinStateCurrent == LOW) { // changement d'état de la broche: HIGH -> LOW Serial.println("Motion stopped!"); // TODO: désactiver une alarme, une lumière ou désactiver un dispositif ... ici } }

Étapes rapides

  • Copiez le code ci-dessus et ouvrez-le avec l'IDE Arduino
  • Cliquez sur le bouton Upload de l'IDE Arduino pour téléverser le code vers Arduino
  • Ouvrez le moniteur série
  • Déplacez votre main devant la portée du capteur
  • Observez la sortie dans le moniteur série
COM6
Send
Motion detected! Motion stopped!
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Vidéo

Utilisations Avancées

Cette section est consacrée à des connaissances approfondies. NE vous inquiétez pas si vous ne comprenez pas. Ignorez cette section si elle vous surcharge, et revenez un autre jour. Continuez à lire les sections suivantes.

Comme mentionné ci-dessus, nous pouvons ajuster les réglages du capteur via un cavalier et deux potentiomètres.

Ajusteur de portée de détection

Ce potentiomètre est utilisé pour ajuster la portée de détection (environ 3 mètres à 7 mètres).

  • S'il est vissé entièrement dans le sens des aiguilles d'une montre, la portée de détection est d'environ 3 mètres.
  • S'il est vissé entièrement dans le sens inverse des aiguilles d'une montre, la portée de détection est d'environ 7 mètres.
Plage de détection du capteur de mouvement

Nous pouvons ajuster le potentiomètre pour atteindre la plage souhaitée (une valeur comprise entre 3m et 7m)

Ajusteur de délai времени

Ce potentiomètre est utilisé pour régler le délai.

  • S'il est vissé complètement dans le sens des aiguilles d'une montre, le délai est d'environ 5 minutes.
  • S'il est vissé complètement dans le sens contraire des aiguilles d'une montre, le délai est d'environ 3 secondes.

La signification du retard temporel est expliquée en combinaison avec le Déclencheur Répété dans la partie suivante.

capteur de mouvement ajuster le délai de temporisation

Sélecteur de déclenchement répété

Il y a un cavalier, qui est utilisé pour sélectionner les modes de déclenchement : déclenchement unique ou déclenchement répétable.

sélection du déclencheur du capteur de mouvement

Nommons le réglage du retardateur (réglé via le Ajusteur de Délai) time_delay. Supposons que vous continuiez à vous déplacer dans la portée du capteur pendant longtemps (appelé motion_time) (plusieurs fois plus long que time_delay)

  • Mode à déclenchement unique : l'état de la broche OUTPUT bascule plusieurs fois entre BAS et HAUT. La durée en HAUT est égale à time_delay. La durée en BAS est fixée à 3 secondes.
capteur de mouvement en mode déclenchement unique
  • Mode de déclenchement répétable : l'état de la broche OUTPUT reste HAUT pendant (temps_de_mouvement + délai_temporel).
mode de déclenchement répétable du capteur de mouvement

Test

Pour voir comment fonctionnent les modes de déclenchement, faisons un test. Réglez le retardateur complètement dans le sens antihoraire pour obtenir un délai de 3 secondes.

  • Mode de déclenchement unique :
    • Placez le cavalier pour sélectionner le mode de déclenchement unique.
    • Continuez à bouger votre main devant le capteur pendant environ 10 secondes.
    • Retirez votre main de la portée du capteur.
    • Attendez 3 secondes, vous verrez la sortie sur le moniteur série comme suit :
    COM6
    Send
    Motion detected! Motion stopped! Motion detected! Motion stopped! Motion detected! Motion stopped!
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  
    • Mode de déclenchement répétable :
      • Placez le cavalier pour sélectionner le mode de déclenchement répétable
      • Continuez à bouger votre main devant le capteur pendant environ 10 secondes.
      • Éloignez votre main de la portée du capteur
      • Attendez 3 secondes, vous verrez la sortie sur le moniteur série comme suit :
      COM6
      Send
      Motion detected! Motion stopped!
      Autoscroll Show timestamp
      Clear output
      9600 baud  
      Newline  

      Comme nous pouvons le voir, en mode déclenchement unique, le capteur se déclenche deux ou trois fois. En mode déclenchement répétitif, le capteur ne se déclenche qu'une seule fois.

      ※ NOTE THAT:

      Dans les deux cas, pendant le temps BAS (3 secondes) (la valeur fixe et non ajustable), le capteur n'est PAS capable de détecter aucun mouvement. En d'autres termes, le capteur est bloqué durant cette période. En pratique, cela ne pose aucun problème.

      Il est recommandé d'utiliser le mode de déclenchement répétitif.

      Dans de nombreuses applications réelles :

      • Nous activons ou mettons en marche des appareils/machines dès la présence humaine
      • Nous n'éteignons ni ne désactivons pas immédiatement les appareils/machines dès que l'humain n'est plus présent. Nous éteignons ou désactivons les appareils/machines après un délai.

      Comment utiliser le délai

      Lorsque la présence humaine n'est pas détectée, le système d'automatisation prendra des mesures après un délai.

      Le délai peut être réglé sur le capteur de mouvement et le code Arduino :

      • Sur le capteur de mouvement : min est de 3 secondes et max de 5 minutes, réglé via l'ajusteur de délai.
      • Sur le code Arduino : n'importe quelle valeur, réalisée par programmation.

      Si nous ne définissons PAS de délai d'expiration dans le code Arduino, le délai d'expiration est égal au délai d'attente dans les paramètres du capteur.

      Si nous définissons un délai d'attente dans le code Arduino, le délai d'attente est la somme du retard de temps dans le paramétrage du capteur et du retard de temps dans le code Arduino.

      Définir un délai dans le code Arduino

      /* * Ce code Arduino a été développé par newbiely.fr * Ce code Arduino est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/tutorials/arduino/arduino-motion-sensor */ const int PIN_TO_SENSOR = 2; // le pin auquel le pin OUTPUT du capteur est connecté int pinStateCurrent = LOW; // état actuel du pin int pinStatePrevious = LOW; // état précédent du pin const unsigned long DELAY_TIME_MS = 30000; // 30000 millisecondes ~ 30 secondes bool delayEnabled = false; unsigned long delayStartTime; void setup() { Serial.begin(9600); // initialiser le port série pinMode(PIN_TO_SENSOR, INPUT); // configurer le pin Arduino en mode entrée pour lire la valeur du pin OUTPUT du capteur } void loop() { pinStatePrevious = pinStateCurrent; // stocker l'état pinStateCurrent = digitalRead(PIN_TO_SENSOR); // lire le nouvel état if (pinStatePrevious == LOW && pinStateCurrent == HIGH) { // changement d'état du pin : LOW -> HIGH Serial.println("Motion detected!"); Serial.println("Turning on / activating"); delayEnabled = false; // désactiver le délai // TODO: activer l'alarme, la lumière ou activer un dispositif ... ici } else if (pinStatePrevious == HIGH && pinStateCurrent == LOW) { // changement d'état du pin : HIGH -> LOW Serial.println("Motion stopped!"); delayEnabled = true; // activer le délai delayStartTime = millis(); // définir l'heure de début } if (delayEnabled == true && (millis() - delayStartTime) >= DELAY_TIME_MS) { Serial.println("Turning off / deactivating"); delayEnabled = false; // désactiver le délai // TODO: désactiver l'alarme, éteindre la lumière ou désactiver un dispositif ... ici } }

      Supposons que le mode de déclenchement répétable soit réglé. Le délai dans ce code est fixé à 30 secondes. Cela signifie que le temps de retard est égal à 30 secondes plus time_delay, qui est réglé sur le paramètre du capteur (via le réglage du retard de temps).

Mettez-vous au défi

Utilisez le capteur de mouvement pour réaliser l'un des projets suivants :

  • Allumez automatiquement la lumière lorsque vous entrez dans votre chambre et éteignez la lumière 30 secondes après votre départ. Conseil : Consultez Arduino - Relais.
  • Déclenchez automatiquement une alarme lorsque quelqu'un s'approche de vos objets de valeur. Conseil : Consultez Arduino - Buzzer Piézoélectrique.

Références de fonction

※ OUR MESSAGES

  • Please feel free to share the link of this tutorial. However, Please do not use our content on any other websites. We invested a lot of effort and time to create the content, please respect our work!