Tuto : Capteur de mouvements + photos sur Arduino & Raspberry B+

Introduction

Dans ce tutorial, nous allons voir comment créer un petit système qui détecte les mouvements dans une zone de quelques mètres sur 180°, puis prend une photo de ce qui passe dans le champ de la caméra, et gère l’envoi par email. Le coté applicatif sur le Raspberry est codé avec Node.js.

Cet article est le troisième d’une série consacrée à Arduino et Raspberry, dans le cadre de la découverte de ces outils en interne.

Le montage

Ici le montage est simple : nous utilisons uniquement les deux composants décrits dans le 1er article : le PIR Motion Sensor & la TTL JPEG Serial Camera. Notons qu’ici, le PIR motion sensor n’est pas indispensable, puisque la caméra est capable à elle seule de faire de la détection de mouvement. Pour être franc, nous nous en sommes rendu compte lors de la réception des composants, mais tant pis, ça aura été l’occasion de connecter les deux ensembles 🙂

Sans plus attendre, voici le montage ainsi qu’une photo de système terminé (merci au passage à Fritzing pour l’outil de dessin qui est vraiment bien fait).

capture d cran 2014 10 03 12.28.36

photo scaled

photo 2 scaled

Comme vous pouvez le constater, le détecteur de mouvement envoi ses informations sur l’entrée numérique 2 de l’Arduino, et la caméra dialogue quant à elle sur les entrées/sorties 7 et 8. C’est totalement arbitraire et peut être modifié à votre guise dans le code du sketch.

Le sketch Arduino

Pour le code du sketch, nous n’avons rien inventé, ou tout du moins pas grand chose. L’ensemble de la logique est basée sur les ressources fournies par Adafruit :

Cependant, nous avons tout de même modifié un peu le code pour coller à nos besoins. En effet, par défaut, le PIR détecte continuellement les mouvements et envoi sans arrêt ses infos dans la méthode loop du sketch. Nous avons donc rajouté quelques tests applicatifs, pour empêcher le traitement de se déclencher si un autre traitement est déjà en cours. Concrètement, ça se traduit par l’ajout de booléens au sein du code pour bloquer le déclenchement.

Nous avons également utilisé deux librairies, pour l’émulation d’un port série ainsi que pour la caméra & sa gestion.

  • SoftwareSerial, fourni avec l’IDE Arduino
  • Adafruit_VC0706 qui est la librairie officielle créée par Adafruit pour la gestion de sa caméra

Pour le reste, la logique applicative côté est Arduino est la suivante :

  • Détection d’un mouvement, envoi de l’info sur l’entrée 2
  • Passage en mode « traitement », blocage du système pour la détection
  • Prise de photo par la caméra, puis envoi des informations sur le port série à l’aide d’un buffer
  • Attente d’un signal en réception sur le port série, indiquant que le Raspberry a terminé son traitement
  • Déblocage du système et réouverture de la détection

Le code étant un peu long, pour des soucis de visibilité, je ne le collerai pas ici. Je vous laisse le découvrir sur GitHub.

L’application Node.js sur le Raspberry

Le principe coté Raspberry est simple : récupérer les données transmises sur le port série (le fichier en binaire), reconstruire physiquement l’image sur le système de fichiers, puis envoyer un email avec le fichier en pièce jointe.

Pour écouter le port série, nous utilisons la librairie SerialPort qui propose plusieurs parsers. Nous utilisons deux de ces parseurs pour le traitement :

  • Le parser readline pour afficher les messages de log émis par l’Arduino
  • Le parser raw pour récupérer le contenu du buffer contenant l’image

Pour effectuer automatiquement le changement de parser en fonction du contexte, nous avons défini des marqueurs de début & de fin de fichier (BOF et EOF).

La logique globale s’articule autour de 3 fichiers :

  • server.js qui est le fichier central, responsable de gérer les interactions avec le port série
  • serial_stream.js qui est responsable de récupérer les données transmises lorsque le buffer est envoyé, et de reconstruire une image sur le système de fichier
  • mailer.js qui est responsable de l’envoi des emails une fois le fichier construit sur le système

Je vous laisse découvrir le code sur GitHub :

Si vous vous amusez à mettre en place le système, voici la sortie attendue dans la console, une fois l’application lancée :

node server.js
Connection established
Camera Found:
VC0703 1.00
Ctrl infr exist
User-defined sensor
525
-----------------
Motion detected! - Wait a little
Snap time
Picture taken!
Image frame length 48276 bytes.
BOF
Switch parser
..............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
Writed : 48256 bytes
15 s elapsed
Message sent: 250 2.0.0 OK 1412344536 nf2sm2191779wic.1 - gsmtp
Restart camera
Camera now available

Les . correspondent à la transmission de l’image, avec le parser raw, tous les autres messages sont gérés par readline.
Et voici le résultat finalement obtenu dans la boite mail :

capture d cran 2014 10 06 11.11.49

Conclusion

Je vous laisse découvrir l’ensemble de l’application VlabsMotionDetect sur GitHub si ce n’est pas déjà fait.

De notre coté l’expérience a été plutôt positive. Ça confirme que la séparation Arduino / Raspberry est une bonne chose, cependant il reste encore trop de fils à notre gout.

L’étape d’après pourrait être de remplacer la connexion filaire entre l’Arduino & le Raspberry par un NRF24L01 pour dialoguer sans fil.

Le système peut également encore être amélioré, en ajoutant par exemple un détecteur d’empreintes digitales pour allumer / éteindre.

On peut aussi envisager de remplacer l’Arduino Uno par un Nano, pour miniaturiser tout ça.

Plus généralement, l’idée d’avoir un Raspberry agissant en tant que serveur, autour duquel gravitent plusieurs Arduino avec des capteurs, connectés sans fil ouvre des portes intéressantes dans le domaine de l’Home Automation. Il ne reste plus qu’a mettre en place ces différents composants.

Et vous, qu’avez vous pensé de l’approche ? Quelles seraient vos idées pour développer le système ?