1. Introduction

Mon chat a une vie de roi dans la maison. Il a pour habitude d'aller et venir comme bon lui semble, ce qui me force à me lever plusieurs fois par jour afin de lui ouvrir la fenêtre pour qu'il puisse rentrer. J'ai donc pensé créer un système permettant d'ouvrir et de refermer la fenêtre dès que la présence de mon chat est détectée. Ce projet relève plusieurs défis. Premièrement, il faut pouvoir détecter un mouvement à l'aide d'une camera afin d'ouvrir la fenêtre mais aussi être sur que la fenêtre ne se referme pas trop rapidement. N'ayant pas de moteur à ma disposition, j'ai décider d'allumer deux LEDs différentes aux moments ou respectivement il doit tourner dans un sens ou dans l'autre.

2. Matériel et méthodes

2.1 Matériel

Voici la liste du matériel:

- Raspberry Pi

- Raspberry Pi Camera Module V2

- 2 LEDs de couleurs différentes (pour remplacer le moteur)

- 4 fils électriques

- 1 breadboard

- 2 résistances de 3.3 Ohms

2.2 Méthode

2.2.1 Réglages de la caméra

1. Il faut d'abord connecter la caméra:

Localisez le port de la caméra et connectez la caméra. Tirez doucement sur les bords du clip en plastique. Insérez le ruban de la caméra. Assurez-vous que c'est dans le bon sens. Poussez le clip en plastique en place

2. Il faut maintenant activer le port de la caméra:

allez dans les réglages en tapant

   sudo raspi-config

sélectionnez "interfacing options" puis "Camera" et enfin "Enable Camera".

La caméra devrait maintenant être détectée. Pour vérifier, tapez :

  vcgencmd get_camera

si la caméra est connectée correctement, vous devriez voir apparaître :

   supported=1 detected=1

Si ce n'est pas le cas, redémarrez votre machine et vérifiez bien que votre caméra soit connectée dans le bon sens.

3. Quelques téléchargements

Tapez le code suivant afin de télécharger picamera:

   sudo apt-get install python-picamera python3-picamera

pour installer python3:

   sudo apt-get install python3-pi

pour installer le module RPi.GPIO :

   sudo apt-get install python-RPi.GPIO

enfin, pour installer numpy:

   sudo apt-get install python-numpy

Nous devrions maintenant avoir tout les programmes nécessaires. Il faut maintenant les importer dans notre programme:

   import numpy
   import picamera
   import picamera.array
   import RPi.GPIO as GPIO
   import time

Nous voilà prêts à coder.

4. Setup de la caméra

Il faut maintenant définir la résolution de l'image ainsi que l'angle de prise de vue. Les lignes de code suivantes servent à mettre tout ceci en place.

   camera = picamera.PiCamera()
   CAMERA_WIDTH = 64
   CAMERA_HIGHT = 48
   
   camera.resolution = (CAMERA_WIDTH, CAMERA_HIGHT)
   camera.exposure_mode = 'auto'
   camera.awb_mode = 'auto'
   
   SENSIBILITY = 100
   THRESHOLD = 10
   CAMERA_HIGHT = 48

5. Détecter du mouvement

Pour la bonne réalisation du projet, il est crucial de pourvoir détecter du mouvement. Pour ceci, nous allons définir la fonction Take_Motion_Image():

   def Take_Motion_Image():
           capture = picamera.array.PiRGBArray(camera)
           camera.capture(capture, format='rgb')
           return capture.array

puis vérifier si quelque chose a bougé:

   def Scan_Motion():
           global motion_capture1, motion_capture2, CAMERA_WIDTH, CANERA_HIGHT, SENSIBILITY, THRESHOLD
   
           motionFound = False
           motion_capture2 = Take_Motion_Image()
           diffCount = 0;
   
           center_x = 0
           center_y = 0
   
           for w in range(0, CAMERA_WIDTH):
                   for h in range(0, CAMERA_HIGHT):
                           diff = abs(int(motion_capture1hw1) - int(motion_capture2hw1))
                           diffCount += (diff > THRESHOLD)
                           center_x += w*(diff > THRESHOLD)
                           center_y += h*(diff > THRESHOLD)
   
           motionFound, motion_capture1 = (diffCount > SENSIBILITY), motion_capture2
   
           return (motionFound)
           center_y = 0

2.2.2 Mise en place du circuit électrique

1. Mise en place physique

Comme dit précédemment, n'ayant pas de moteur à disposition, j'ai fais le choix d'utiliser deux LEDs de couleurs différentes afin de montrer à quel moment le moteur aurait été censé ouvrir la fenêtre et la fermer. J'ai choisi deux bornes, la borne 27 (OUVERTURE, circuit avec la LED rouge sur l'image) ainsi que la 23 (FERMETURE, circuit avec la öED bleue sur l'image). Surtout n'oubliez pas de placer une résistance dans le circuit de chaque LED. Voici une image du circuit: IMG_0954.jpeg

2.Réglages initiaux

Les commandes suivantes permettent d'établir les réglages tel que les bornes utilisées:

   def init():
           GPIO.setmode(GPIO.BCM)
           GPIO.setwarnings(False)
           GPIO.setup(OUVERTURE, GPIO.OUT)
           GPIO.setup(FERMETURE, GPIO.OUT)
           print 'initialisation etablie'

3. Partie finale

Il ne rest plus qu'à établir ce que l'ordinateur doit faire lorsque du mouvement est détecté. Au départ, j'ai utilisé le code suivant mais sans la partie "time.sleep(5)" ce qui faisait que la LED s'allumait puis s'éteignait si rapidement qu'on pouvait à peine apercevoir la lumière. EN ajoutant la ligne de code citée précédemment, ce problème a été résolu.

   while True:
           if Scan_Motion():
                   GPIO.output(OUVERTURE, GPIO.HIGH)
                   print 'ouverture fenetre'
                   time.sleep(5)
                   GPIO.output(OUVERTURE, GPIO.LOW)
                   GPIO.output(FERMETURE, GPIO.HIGH)
                   print 'fermeture fenetre'
                   time.sleep(5)
                   GPIO.output(FERMETURE, GPIO.LOW)

3. Résultats

Lorsque du mouvement est détecté, la première LED s'allume bien pendant 5 secondes, le temps durant lequel le moteur ouvrirait la fenêtre, puis la deuxième s'allume sur la même durée, le temps qui serait utilisé pour fermer la fenêtre. Le système est donc fonctionnel.

4. Discussion

Le système fonctionne plutôt bien dans son ensemble. Il pourrait éventuellement fonctionner dans des "conditions réelles" malgré quelques dysfonctionnements:

Premièrement, la caméra est trop sensible. Le moindre mouvement ouvrirait la fenêtre et ce n'est pas le résultat voulu. Ensuite, pour améliorer le système, il faudrait vérifier que le chat n'est plus dans le champ de la caméra avant de refermer la fenêtre afin de ne pas risquer de créer une guillotine pour chat. Aussi, la caméra devant être placée en extérieur, il faudrait l'imperméabiliser. Enfin, ce serait un atout si seul mon chat pouvait activer l'ouverture de la fenêtre, à l'aide d'une puce ou d'un GPS par exemple.

Pour l'utilisation dans des conditions réelles, il faut remplacer la partie du code qui allume puis éteints les LEDs par un code contrôlant un moteur capable d'ouvrir et de fermer la fenêtre.

5. Conclusion

La réalisation de ce projet n'a pas été de tout repos mais m'a apportée grande satisfaction. C'est la première fois que je réalisais quelque chose "de mes propres mains" et je dois avouer que cela rapporte une grande satisfaction de voir le projet aboutir. J'ai conscience que le projet n'est pas parfait mais il me satisfait et est digne de mes attentes.

Références

https://raspberrypi.stackexchange.com/questions/71127/how-can-i-install-numpy-and-pandapower "How can I install numpy and pandapower?"

https://projects.raspberrypi.org/en/projects/getting-started-with-picamera "Getting started with picamera"

https://www.pyimagesearch.com/2015/06/01/home-surveillance-and-motion-detection-with-the-raspberry-pi-python-and-opencv/ "Home surveillance and motion detection with the Raspberry Pi, Python, OpenCV, and Dropbox"

https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/robot/downloads/ "Physical computing with Raspberry Pi"

https://www.raspberrypi.org/documentation/usage/camera/ "Camera Module"