drapeau uk

chatiere Les propriétaires de chat peuvent-être curieux de connaître les habitudes de sorties de leur chat. Je suis dans ce cas et j'ai voulu enregistrer les allées et venues du quadripède en ajoutant un capteur sur la chatière.



Pour la réalisation, de ce système, j'ai utilisé

Le schéma synoptic est le suivant :
synoptic

Les différentes éléments

Le capteur

chatiere Pour le capteur de position de la trappe, les choix offerts sont multiples, et celui que j'ai pris n'est pas forcément le meilleur. J'ai fait avec ce que j'avais sous la main d'une part, et je souhaitais éviter les éléments mécaniques d'autre part.

Le capteur de flux s'alimente en 5V, et sa sortie est centrée en 2.5V. Le signal augmente à la présence d'un pôle nord et diminue à la présence d'un pôle sud. Le problème avec cette solution, c'est que lorsque que la trappe s'ouvre complètement, il n'y a plus de champ magnétique.

La positon de l'aimant sur la chatière fait que nous avons une fonction de transfert de ce type
fonction de transfert

Comme nous le voyons ci-dessus, la fonction n'est pas bijective, ce qui veut dire en français que pour une tension donnée, il peut y avoir plusieurs positions de la chatière. A 2.5V, la trappe est soit ouverte à fond, soit fermée. J'ai eu quelques soucis à cause de ça car je n'avais pas prévu que le chat restait 2 minutes dans la chatière avant de sortir vraiment dehors.


La carte micro

J'ai pris une plaque à trou que j'avais dans mon garage là aussi.
carte microcontroleur schéma carte uc
En entrée : signal analogique 0-5V centré à 2.5V

En sortie : deux signaux numériques 3.3V S1 et S2. : S1 est un signal pour signaler une sortie du chat, et S2 pour une entrée du chat.

Le tableau ci-dessouss représente l'état de la sortie en fonction de la tension d'entrée. Pour les valeurs extrêmes, les deux sorties en même temps signalent une erreur : capteur débranché.
U S1
Sortie
 S2
Entrée
>4.5V 1 1
entre 3V et 4.5V0 1
entre 2V et 3V 0 0
entre 0.5V et 2V 1 0
< 0.5 V 1 1

Quand une détection survient, le signal est maintenu 1 seconde. Ca permet de pouvoir filtrer les parasites sur la carte raspberry.

Le raspberry

Pour cette partie, je me suis énormément aidé de ce blog : Blog d'Idleman.

La carte microcontrôleur est reliée au port d'extension du raspberry par 3 fils :
S1 sur la GPIO24
S2 sur la GPIO25
et les masses sont reliées entre elles également.

Ensuite j'ai écrit le code suivant en python. Ma source est RasPi.Tv
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# script based on by Alex Eames http://RasPi.tv
# http://RasPi.tv/how-to-use-interrupts-with-python-on-the-raspberry-pi-and-rpi-                                                                         gpio-part-3
import RPi.GPIO as GPIO
import time
from subprocess import Popen

PinIn = 25
PinOut = 24

GPIO.setmode(GPIO.BCM)

# GPIO 24 & 25 set up as inputs, pulled up to avoid false detection. 
# In case of no signal input # We'll be setting up rising edge detection for both
GPIO.setup(PinIn , GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(PinOut , GPIO.IN, pull_up_down=GPIO.PUD_UP)


# now we'll define two threaded callback functions
# these will run in another thread when our events are detected
def my_callback(channel):
    print "Sortie %d" % PinIn
    my_upload(0)

def my_callback2(channel):
    print "Entree %d" % PinOut
    my_upload(1)


## envoie les donnees le serveur free
def my_upload(value):
   cmd = "wget -q -O - http://lyonl.free.fr/pi/chatiere.php?type=%d" %value
   p   = Popen(cmd , shell=True )

# when a rising edge is detected on Pin_In, regardless of whatever
# else is happening in the program, the function my_callback will be run
# we add a bouncetime but it should be useless as we have no press button  
GPIO.add_event_detect(PinIn , GPIO.RISING, callback=my_callback, bouncetime=300)
GPIO.add_event_detect(PinOut , GPIO.RISING, callback=my_callback2, bouncetime=300)


try:
      while True:
         time.sleep(1)


except KeyboardInterrupt:
    GPIO.cleanup()       # clean up GPIO on CTRL+C exit
    print "fin de programme"
GPIO.cleanup()           # clean up GPIO on normal exit


Le script fonctionne sur interruption : il ne consomme quasiment aucune ressource processeur.Ce script appelle une page php sur un serveur free. Cette page enregistre l'évènement dans une base de donnnée. J'aurais très bien pu enregistrer l'évènement directement dans le raspberry, mais par stratégie de sécurité, je ne souhaite pas avoir un serveur web dessus. J'ai donc déporté toute la partie web et base de données sur une page perso chez free.


Le serveur free

 J'ai créé deux pages chez free :

Conclusion

L'enchaînement est assez simple mais long. J'ai dû utiliser plusieurs langages de programmation : du C pour le microcontrôleur, du python pour le raspberry et du PHP pour le serveur free. Si vous avez des idées pour plus de simplicité j'en prendrai de la graine pour la prochaine fois

J'ai eu une difficulté aussi concernant le comportement du chat. Il lui arrive en sortant de la maison de rester une ou plusieurs minutes dans la chatière. Le capteur lui voyait deux sorties. J'ai dû modifier le soft en php pour filtrer les rebonds : si deux sorties proche de moins de deux minutes, la deuxième sortie est masquée.