Utiliser des capteurs avec le port GPIO - Partie 1

Détection de mouvement

Dans ce tutoriel, nous utiliserons un capteur infrarouge passif (PIR) dont la sortie bascule de l'état bas à l'état haut, à la façon d'un interrupteur, lors de la détection d'un mouvement dans le champ de vision de celui-ci.

L'état du capteur PIR est récupéré dans un programme Python afin d'afficher un message à l'écran lorsqu'une détection de mouvement se produit.

NDLR : cet article fait appel à des bases de programmation en Python, mais aussi à la mise en œuvre du port GPIO du Raspberry Pi. Si nécessaire, nous invitons le lecteur à se familiariser avec ces notions en consultant tout d'abord le tutoriel :

Les commentaires et les suggestions d'amélioration sont les bienvenus, alors, après votre lecture, n'hésitez pas. 7 commentaires Donner une note à l'article (5)

Article lu   fois.

Les deux auteur et traducteur

Traducteur :

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

I. Les capteurs infrarouges PIR

Les capteurs infrarouges PIR (Passive Infrared) fournissent des solutions très simples pour la détection de mouvement.

Tous les éléments sur terre émettent un faible niveau de radiation infrarouge, cependant tout corps exposé à une source de chaleur émet davantage de radiation.

Les capteurs PIR sont capables de détecter tout changement de niveau de radiation à l'intérieur de leur zone de détection. Par exemple, lorsqu'une personne entre dans une pièce, le capteur détecte le changement du niveau de radiation.

Image non disponible
capteur PIR

II. Câblage du circuit

Pour cette expérience, les éléments suivants sont nécessaires :

Tous ces composants peuvent être acquis en commerce spécialisé.

Prenez trois fils de raccordement mâle/femelle et branchez la partie femelle sur les connecteurs du capteur. Les trois connecteurs sont identifiés comme suit :

  • rouge : PIR-VCC (alimentation 3 à 5 VCC) ;
  • brun : PIR-OUT (sortie numérique) ;
  • noir : PIR-GND (masse).

Image non disponible

Branchez la partie mâle du fil de raccordement PIR-VCC à la ligne d'alimentation de la plaquette (la ligne rouge verticale), le fil de raccordement PIR-GND à la ligne de masse (la ligne bleue verticale) et le fil de raccordement PIR-OUT à l'un des jeux de trous libre de la plaquette.

Image non disponible

Utilisez un fil noir pour raccorder la broche n° 6 « GPIO-GND » du Rapsberry à un trou de la ligne de masse de la plaquette sur laquelle le fil PIR-GND est déjà relié.

Image non disponible

Utilisez un fil rouge pour raccorder la broche n° 2 « GPIO 5V » à la ligne d'alimentation de la plaquette sur lequel le fil PIR-VCC est déjà relié.

Image non disponible

Connectez avec un dernier fil, la sortie PIR-OUT à la broche n° 26 « GPIO 7 ».

Image non disponible

Image non disponible
Photo du montage

III. Lire l'état des capteurs en Python

L'état du capteur infrarouge PIR peut être lu de la même façon que l'état d'une entrée raccordée à un bouton poussoir (NDLR : voir Lecture d'un bouton).

Cependant, le capteur PIR ne nécessite pas de résistance de rappel puisque la tension délivrée en sortie est soit 0 V, soit 3,3 V.

La broche n° 26 « GPIO 7 » connectée à la sortie PIR-OUT du capteur doit simplement être configurée comme une entrée (NDLR : voir Configuration des entrées-sorties).

Entrez le code suivant en utilisant un éditeur de texte (nano par exemple) :

 
Sélectionnez
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
PIR = 7
GPIO.setup(PIR, GPIO.IN)

try:
    print("PIR Module Test")
    print(" (CTRL+C to exit)")
    time.sleep(2)
    print "Ready"
    while True:
        if GPIO.input(PIR):
            print("Motion detected! ")
        time.sleep(1)
except KeyboardInterrupt:
    print("Quitting")
    GPIO.cleanup()

Au début du programme, il y a deux déclarations qui initialisent le fonctionnement du GPIO et les fonctions de gestion du temps.

 
Sélectionnez
import RPi.GPIO as GPIO
import time

Ensuite, il y a la configuration de la numérotation du port GPIO dans le mode BCM (NDLR : voir Configuration générale) :

 
Sélectionnez
GPIO.setmode(GPIO.BCM)

Après la configuration du mode de numérotation, une variable spécifique PIR est utilisée pour stocker la connexion du Raspberry Pi associée à la sortie numérique du capteur PIR. Cette variable est utilisée pour configurer la broche comme étant une broche d'entrée avec :

 
Sélectionnez
PIR = 7
GPIO.setup(PIR, GPIO.IN)

Le programme proposé en exemple inclut une instruction try...except. Lors d'un CTRL+C, l'exception KeyboardInterrupt est levée, un message informe que le programme va être quitté, mais juste avant de le faire le port GPIO est réinitialisé.

À l'intérieur du try, il y a des instructions d'affichage à l'écran et une boucle while. Dans cette boucle, on interroge l'entrée GPIO toutes les secondes pour connaître son état. Si elle est à l'état haut, alors le message :

 
Sélectionnez
Motion detected!

s'affiche à l'écran.

IV. Réglages du capteur PIR

Sur le capteur il y a deux potentiomètres. L'un pour régler la durée minimale du maintien du signal de sortie à l'état haut suite à une détection de mouvement, l'autre ajuste la sensibilité du capteur PIR à la détection de mouvement. Suivez les instructions du manuel qui indique les fonctions de chacun des potentiomètres.

Image non disponible
Réglages avec les potentiomètres

Si le programme indique continuellement qu'un mouvement est détecté, essayez de diminuer la sensibilité du capteur. Le curseur du potentiomètre tourné dans le sens contraire des aiguilles d'une montre permettra de la diminuer.

V. Le port GPIO et les fonctions de rappel (ou callbacks)

Dans les exemples précédents, une boucle de scrutation active (polling) a été utilisée pour relever périodiquement l'état de l'entrée du port GPIO.

Cependant, le port GPIO permet également l'utilisation de fonctions de rappel (ou callbacks). Cela signifie qu'une broche d'entrée peut être configurée pour appeler une fonction Python sur un événement particulier provenant d'un changement d'état (NDLR : voir aussi Interruption et détection de front).

Cela est plus avantageux que de scruter activement le port dans une boucle, car l'appel de la fonction est déclenché par interruption sans la nécessité de recourir à une fréquence de scrutation élevée (NDLR : le programme pouvant être occupé à autre chose par ailleurs, il doit revenir interroger l'état de l'entrée à intervalles suffisamment rapprochés pour ne pas manquer le changement d'état qui peut survenir à tout instant).

De cette façon, quand le programme tourne, le CPU du Raspberry attend passivement que le signal du capteur PIR bascule. Une fois le programme réveillé par détection d'un front, la fonction de rappel est activée. Dans notre cas, la fonction de rappel passée à la broche du GPIO est configurée sur un front montant du signal.

Les événements d'interruption possibles du GPIO sont GPIO.RISING (front montant), GPIO.FALLING (front descendant) et GPIO.BOTH (sur changement d'état).

 
Sélectionnez
import RPi.GPIO as GPIO
import time

def callback_up(channel):
    print("Up detected on channel %s" % channel)

PIR = 7
GPIO.setmode(GPIO. BCM)
GPIO.setup(PIR, GPIO.IN)

try:
    GPIO.add_event_detect(PIR, GPIO.RISING, callback=callback_up)
    while 1:
        time.sleep(100)
except KeyboardInterrupt:
    print(" Cleaning up the GPIO")
    GPIO.cleanup()

VI. Conclusion

Nous avons présenté une méthode très simple pour connecter un capteur de mouvement au Raspberry Pi. Nous pourrions compléter en ajoutant un buzzer, des LED et un système de verrouillage magnétique de porte et nous fabriquerions ainsi un système de sécurité complet à bas coût grâce au Raspberry Pi !

VII. Notes de la Rédaction de Developpez.com

Cet article est une traduction adaptée de l'article écrit par Jacob Marsh et paru dans le n°21 du magazine Image non disponibleTheMagPi, sous le titre Image non disponiblePIR motion detection.

Nous remercions les membres de la Rédaction de Developpez.com pour le travail de traduction, de relecture et d'adaptation qu'ils ont effectué, en particulier :

Merci également à Malick pour la relecture orthographique.

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Licence Creative Commons
Le contenu de cet article est rédigé par Jacob Marsh et est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 3.0 non transposé.
Les logos Developpez.com, en-tête, pied de page, css, et look & feel de l'article sont Copyright © 2013 Developpez.com.