Raspberry TP n°3 : utiliser un capteur infra-rouge

Les capteur infra-rouges ou PIR se trouvent un peu n’importe où sur Internet pour quelques euros.

Ici un exemple (un peu cher tout de même sur ce site) : http://thepihut.com/products/pir-motion-sensor-module

DSC_0116[1]

Kikou ! J’ai deux yeux et un joli chapeau de chez Augustin Fresnel

Avant d’utiliser un capteur, il est nécessaire de lire sa documentation (rtfm godammit) afin de déterminer ses principales capacités et aussi comment l’utiliser correctement. Le produit est rarement (jamais?) livré avec sa documentation et il faut la retrouver sur Internet. De plus, les descriptions sur les sites de vente ne comportent pas toutes les informations importantes.

Ici, les spec complètes de notre petit capteur : HC-SR501

Pour le modèle ci-dessus on a donc :

– détection dans un rayon de 110°

– détection jusqu’à 7 mètres de distance maximum

– input voltage (besoin en alimentation) : 4,5 V à 20V

– lorsqu’il y a détection de mouvement, le capteur envoie un niveau haut (3,3V et non 0,3V comme l’indique le site ThePiHut.com). Quand il n’y a pas de mouvement, le capteur prend un niveau bas (0V). Ca tombe bien car les broches du Raspberry fonctionnent de la même façon.

En regardant sous la jupe de la bête, on se rend compte qu’il y a deux mini-potentiomètres et un jumper.

pir-sensor

Bizarrement, je n’ai pas de jumper sur le mien mais il y a quand même des espèces de connecteurs. Du coup, je pense que je suis en « repeat trigger » (confirmé par la doc, c’est le mode par défaut). Je n’ai pas trop compris la différence entre les deux états (repeat trigger et single trigger). Si quelqu’un veut expliquer, merci d’avance.

Le premier potar « sensitivity adjust » permet de régler la distance de détection de 3 mètres à 7 mètres.

Le deuxième potar « time delay adjust » permet de régler le délai avant lequel le capteur revient au niveau bas après une détection de mouvement. Il peut varier de 5 secondes à 5 minutes. Par défaut, il est réglé sur 5 secondes.

Il y a aussi un « block time », par défaut à 2,5 secondes, et réglé d’usine. Il s’agit d’un délai pendant lequel, après un retour à l’état bas, le capteur n’accepte aucune mesure. Je n’ai pourtant pas constaté ce fonctionnement…

La doc indique que le capteur a besoin d’une minute pour s’initialiser et qu’il a pourra émettre un signal haut de 0 à 3 fois pendant cette minute. Je confirme que c’est vrai.

On voit donc qu’il y a pas mal de paramètres à prendre en compte. Avant de récupérer les valeurs dans un programme, on peut tester le capteur en live, simplement en l’alimentant et en utilisant une diode comme indicateur de détection. Ca permet de voir si on a bien réglé les paramètres comme on le souhaite :

DSC_0113[1]

C’est relativement simple. On alimente le capteur (GND sur GND, VCC sur 5V) et on dirige la sortie (OUT) sur un circuit avec en premier une résistance, puis une LED (la patte longue vers la résistance) puis vers GND pour fermer le circuit.

Ma première erreur a été d’alimenter le capteur avec du 3,3V alors qu’il demande du 4,5V minimum. Ce qui fait que ça fonctionne un peu n’importe comment. J’ai ensuite corrigé en connectant sur la 2ème broche du Raspberry, la broche 5V. Ca marche mieux.

J’ai bougé ma main devant le capteur. Tant qu’on bouge devant, le capteur reste en état « haut ». Si on passe une seconde devant, il reste en état « haut » pendant 5 secondes, mais parfois moins.

J’ai changé ensuite la molette du « delay time ». En passant rapidement la main, le capteur reste en état « haut » beaucoup plus longtemps. J’ai remarqué qu’avec un delay time au minimum, déjà on arrivait parfois à moins de 4 secondes, au lieu des 5 secondes annoncées par la doc et qu’en plus, le capteur avait tendance à « ramer ».

And now for something completely different. Voici du code à donner au serpent dans votre Raspberry Pi qui, je l’espère, est équipé d’une belle Rapsbian.

Le but était d’avoir un programme aussi proche du comportement de la diode. Au niveau du montage, on alimentera le capteur (GND sur GND, VCC sur 5V) et on dirigera la sortie vers la broche #17 du Raspberry. Pour vérifier la cohérence du programme, j’ai connecté mon circuit avec diode sur la broche #17 également. Ainsi l’affichage du programme doit être synchro avec la diode.

Bonus exclusif : j’ai ajouté un calcul du temps de « mouvement ». Celui-ci étant bien entendu prolongé du « delay time » que vous aurez fixé avec la molette. Ca permet d’ailleurs de voir en secondes sur « combien » vous avez réglé la molette, car sinon, c’est du pif ma bonne dame.

# importation des bibliotheques necessaires
import RPi.GPIO as GPIO
import time
# numerotation des broches en modem BCM ie l'etiquette et pas l'ordre des broches
GPIO.setmode(GPIO.BCM)

# veuillez brancher la sortie OUT de votre capteur sur la broche 17 svp
PIR_PIN = 17

# nous allons interroger cette broche, donc le signal est en entree (IN)
GPIO.setup(PIR_PIN, GPIO.IN)

# partons du principe que le capteur n'est pas actif mais on va vite checker
etat_actuel = False
etat_precedent = False

while 1:
        try:
                time.sleep(0.1)
                etat_actuel = GPIO.input(PIR_PIN)
                if etat_actuel and not etat_precedent:
                        print "Alerte au mouvement!"
                        time_depart = time.time()
                if etat_precedent and not etat_actuel:
                        print "Capteur au repos. Plus de mouvement."
                        time_arrivee = time.time()
                        duree = time_arrivee - time_depart
                        print "duree du mouvement : " + str(duree)
                etat_precedent = etat_actuel

        except KeyboardInterrupt:
                print "Au revoir, a bientot."
                GPIO.cleanup()
                break

Une réflexion sur “Raspberry TP n°3 : utiliser un capteur infra-rouge

Laisser un commentaire