PIR: un détecteur de mouvement USB

PIR: un détecteur de mouvement USB

On nous demande de temps en temps si Yoctopuce n'aurait pas envie de fabriquer un détecteur de mouvement USB basé sur un capteur PIR. Autant tuer le suspense tout de suite, la réponse est: non, pas pour l'instant. En revanche on peut vous expliquer comment en construire un pour à peine plus cher qu'un Yocto-Serial.



On a récemment découvert le ZEPIR0BAS02MODG fabriqué par ZiLOG. Derrière ce nom un peu barbare se cache un module aux caractéristiques assez remarquables:

  • Il est minuscule : ~25x16mm
  • Il peut être piloté depuis un port série TTL
  • Il ne coûte que quelques euros

Le module ZEPIR0BAS02MODG de ZiLOG
Le module ZEPIR0BAS02MODG de ZiLOG


Évidement, on s'est dépêché d'en connecter un à un Yocto-Serial.

Connexions

Le module ZEPIR0BAS02MODG peut être directement connecté à un Yocto-Serial, et peut même être alimenté par le Yocto-Serial. Il y a juste une petite subtilité: pour activer le port série du ZEPIR0BAS02MODG il faut placer une résistance de 100KΩ entre les pins VDD et TX du ZEPIR0BAS02MODG.

5 fils et une résistance suffisent à raccorder le module à un Yocto-Serial
5 fils et une résistance suffisent à raccorder le module à un Yocto-Serial


Avec un peu d'adresse, on arrive même à faire entrer tout le système dans le boîtier du Yocto-Serial et obtenir ainsi un détecteur de présence USB particulièrement compact.


Le système complet  On peut même tout faire entrer dans un boîtier Yoctopuce
Un Yocto-Serial suffit pour interfacer le ZEPIR0BAS02MODG.



Configuration

Pour fonctionner avec le capteur PIR, le Yocto-Serial doit être configuré convenablement. Le plus facile consiste à utiliser le VirtualHub. La première chose à faire consiste à configurer la vitesse du port à savoir en 9600bauds, 8N1. Il faut ensuite activer l'alimentation du module en 3.3V.

Configuration du port série du Yocto-Serial
Configuration du port série du Yocto-Serial


Le ZEPIR0BAS02MODG peut être entièrement configuré et piloté par le port série, il dispose pour cela d'une bonne trentaine de fonctions. Pour la démo, on a choisi d'utiliser la plus triviale: si on envoie le caractère ASCII "a", le capteur répond alors:

  • soit "Y", s'il a détecté un mouvement depuis le dernier appel,
  • soit "N", s'il n'a rien détecté depuis le dernier appel,
  • soit "U", s'il n'est pas prêt.

On a donc configuré le Yocto-Serial pour qu'il fonctionne en mode binaire (generic byte stream) et on a créé une tâche qui, toutes les 500ms, envoie le byte 0x61 (a) au détecteur, puis lit un byte en retour qu'elle mappe sur le genericSensor1. Ainsi en fonction de la réponse du ZEPIR0BAS02MODG, les valeurs 78 (N), 85 (U), 89 (Y) seront mappées sur le genericSensor1.

Configuration de la tâche qui pilote le senseur
Configuration de la tâche qui pilote le senseur


Finalement, on a modifié le mapping du senseur pour que 78 corresponde à -7, 85 à 0 et 89 à 4. Ainsi il suffit de tester si la valeur courante du genrericSensor1 est strictement positive pour savoir si quelque chose à bougé devant le capteur. On en a aussi profité pour donner le nom logique "PIR" au genericSensor1.

Configuration de genericSensor1 du YoctoSerial
Configuration de genericSensor1 du YoctoSerial



Une fois que tout est configuré, il ne reste plus qu'à tester.

Exemple d'application

On a écrit un petit programme de test en python qui met en place un callback qui déclenche un relais pendant 5 secondes à chaque fois que le ZEPIR0BAS02MODG détecte quelque chose.

from yocto_api import *
from yocto_relay import *

relay = None
errmsg = YRefParam()

def PIRvalueChanged(sesnor,value):
    if int(value)>0 : relay.pulse(5000)

if YAPI.RegisterHub("usb", errmsg) != YAPI.SUCCESS:
    sys.exit("init error" + str(errmsg))

sensor = YSensor.FindSensor("PIR")
relay  = YRelay.FirstRelay()

if not(sensor.isOnline()):sys.exit("No PIR sensor available")
if relay==None: sys.exit("No relay available")
sensor.registerValueCallback(PIRvalueChanged)
while True:
    YAPI.Sleep(100,errmsg)



Et voici une petite vidéo qui montre le système en action.

  


Ça a l'air un peu magique comme ça, mais sachez que pour que cela fonctionne correctement le détecteur ne peut pas être installé n'importe où: il faut éviter de le placer face à une fenêtre, dans un courant d'air etc... Vous trouverez plus de détails dans le mode d'emploi du ZEPIR0BAS02MODG.


Conclusion

La versatilité du Yocto-Serial nous a permis de construire un détecteur de présence en deux temps trois mouvements. Evidement, l'exemple d'application présenté ici est des plus trivial: c'est l'équivalent de ces lampes automatiques qu'on trouve dans tous les magasins de bricolage, mais les possibilités sont beaucoup plus larges. Si vous branchez le Yocto-Serial qui pilote le détecteur à un YoctoHub-Ethernet ou un YoctoHub-Wireless-g, vous pouvez vous fabriquer un système de détection capable d'interagir avec Internet...

Commenter 2 commentaires Retour au blog



1 - demarec5160 Mardi 28 janvier 2020 13H47

Bonjour j'aimerais intégrer un capteur de mouvement a ma telecommande de retroprojecteur afin que l'image s'allume quand il y a une présence. Es ce que cela est faisable?
Merci de vos réponses

2 - martinm (Yocto-Team)Mardi 28 janvier 2020 14H34

@demarec5160: ça dépend jusqu'à quel point vous êtes prêt à modifier votre télécommande et si vous comptez pouvoir aussi l'utiliser normalement après.

Yoctopuce, get your stuff connected.