Alarme de maison avec un raspberry pi

raspberry-ban

J’ai un ami qui souhaite vérifier que personne n’entre chez lui quand il n’est pas là. Ceci peut être intéressant pour Dexter mais aussi en cas de propriétaire invasif. Afin de contrôler les allers et venues dans son appartement, nous avons eu l’idée de prendre en photo avec une webcam toutes les personnes qui passent la porte. Les photos pourront ensuite être envoyées par mail ou bien sur une interface web.

Mise en place d’un système de sécurité

Un système de sécurité est composé de capteurs. L’ensemble des capteurs permet de détecter une présence. On va retrouver des capteurs sur les portes et fenêtres qui permettent de savoir si celles ci sont ouvertes. On peut aussi trouver des capteurs de mouvement. Dans notre cas, nous souhaitons utiliser un capteur permettant de détecter l’ouverture d’une porte. Celui ci a été récupéré dans le vieux carton d’un projet de technologie réalisé en 4ième.

capteur

Ce capteur va alors être relié à un GPIO du raspberry pi. Il faudra ensuite prendre une photographie en direction de la porte d’entrée sur laquelle le capteur sera placé. On aurait tout aussi bien pu activer un buzzer.

Partie hardware

le capteur fonctionne avec un commun et une sortie normalement ouvert et normalement fermé. L’idée est de relier ce capteur à un GPIO du raspberry pi afin que l’on détecte sur le GPIO :

  • Un état haut (3.3V) si la porte est fermé
  • Un état bas (0V) si la porte est ouverte

Nous obtenons le câblage suivant :

cablage

Afin de s’assurer que la sortie est à l’état bas lorsque la porte est ouverte nous utiliserons une résistance de pulldown.
pour réaliser ce montage nous utilisons un connecteur au pas de 2.54 ainsi qu’un petit domino et nous obtenons le montage suivant, qui se fixe simplement sur le raspberry pi :

pontRasp

Il faut maintenant détecter le niveau de la pin GPIO22. Pour cela nous allons utiliser, une librairie C conçue pour piloter nos GPIO.

Librairie C pour le BCM 2835

La librairie que nous utilisons est disponible ici : librairie

Sur le raspberry pi, ouvrez un shell :

$ wget http://www.open.com.au/mikem/bcm2835/bcm2835-1.17.tar.gz
$ tar zxvf bcm2835-1.17.tar.gz
$ cd bcm2835-1.17
$ ./configure
$ make
$ sudo make check
$ sudo make install

La librairie est maintenant installée.
Les noms des GPIO sont ceux décrit en orange dans l’image ci dessus. Il sont nommés de RPI_GPIO_P1_01 à RPI_GPIO_P1_26. Et ils correspondent aux 26 broches de sorties. Cependant, ils ne correspondent pas aux sorties que vous pouvez utiliser via le système de fichier. Le GPIO22 que nous allons utiliser est ainsi appelé RPI_GPIO_P1_15.

Sur le site de la librairie nous trouvons directement un exemple que nous allons réutiliser dans notre projet. Si vous souhaitez repartir de la source originale, elle se trouve ici : source
Pour détecter le niveau de sortie du GPIO22, nous utilisons le code C suivant:

//input.c
#include <bcm2835.h>
#include <stdio.h>
// Input sur le GPIO22 qui est nommé 15 dans le système de la librairie
#define PIN RPI_GPIO_P1_15
 
int main(int argc, char ** argv) {
    if (!bcm2835_init()) {
        return 1;
   }
    // Fixe le GPIO en entrée
    bcm2835_gpio_fsel(PIN, BCM2835_GPIO_FSEL_INPT);
    //  avec une résistance de pull down
    bcm2835_gpio_set_pud(PIN, BCM2835_GPIO_PUD_DOWN);
 
    while (1) {
        // lecture du niveau d'entrée
        uint8_t value = bcm2835_gpio_lev(PIN);
        printf("lecture GPIO22: %d\n", value);
 
        // attendre 2s
        delay(2000);
    }
    //Un brin de toilette
    bcm2835_close();
    return 0;
}

Compilons et lançons le programme et amusons nous à déplacer le capteur (équivalent à ouvrir et fermer la porte) :

$ gcc input.c -l rt -l bcm2835 -o input
$ sudo ./input
lecture GPIO22: 1
lecture GPIO22: 1
lecture GPIO22: 0
lecture GPIO22: 0
lecture GPIO22: 1

Photographie avec la webcam

Afin de photographier l’entrée, nous allons réutiliser la librairie openCV. Celle ci avez déjà été utilisé à Halloween pour réaliser un capteur de mouvement avec une webcam. Je vous invite à lire l’article suivant pour l’installation et la programmation : Halloween project

Pour ce qui est de l’installation, elle est faite directement depuis les dépôts.

$ sudo apt-get install libcv-dev libcvaux-dev libhighgui-dev

Le code complet est disponible en annexe.

Envoi par mail et interface graphique

L’envoi par mail et l’interface graphique sont codés en php. Les appels entre les deux langages se font soit via la commande system, soit via des pipes nommées.

Et l’interface web donne:

screenShot

Conclusion

Vous pouvez remplacer le capteur par un détecteur de mouvement. N’hésitez pas à nous contacter si vous souhaitez en savoir d’avantage ou avez d’autres idées saugrenues.

It’s oversimple isn’t it?

26 réflexions au sujet de « Alarme de maison avec un raspberry pi »

  1. Bonjour,bonsoir,
    Je suis super intéressé par votre projet.
    Mais j’ai quand même trois petites questions
    1.je comprend pas trop le but de résistance de pulldown.
    2.j’ai un soucis quand je compil mon programme sous geany il me dit « compilé avec succès » alors que je ne sais pas l’ouvrir.
    et comme jamais deux sans trois, quel programme utilisez vous pour programmer en c?
    merci d’avance
    Tom

    1. Bonsoir,

      1. La resistance de pulldown sert à rerouter le signal vers la masse. En clair, si elle n’était pas présente et qu’on applique un niveau logique 1 (3V) alors au moment ou l’on débrancherai le circuit le niveau resterai à l’état logique 1 (3V). Avec une resistance de pulldown, le niveau logique déscend à 0 puisque le courant peut partir à la masse.

      2. Pour compilé sur un raspberry PI le plus simple et d’envoyer le code source dessus et de le compiler en utilisant gcc directement sur le raspberry pi en utilisant une session distante. Une fois cela effectué, il ne reste plus qu’à le lancer avec ./nom_du_programme

      3. Personellement j’utilise VIM, il est posssible de l’installer directement sur le raspberry pi avec un :

      $ sudo apt-get install vim

      Pour raspian et pour arch linux il y a l’équivalent avec yaourt.

  2. hello 🙂
    j’ai un détecteur de mouvement (pir) qui provient d’une alarme je ne l’ai jamais utilisé. pensé vous que c’est possible de le raccorder ? si oui savez vous comment dois je le connecter ?
    merci

    1. Bonsoir,
      Il est en effet possible de le connecter. Si celui provient d’une alarme, peut être que le niveau de tension est différent de 3V. Si il supporte le 3V, il est alors possible de l’utiliser directement en le raccordant aux GPIO du raspberry pi.

      Généralement ce genre de capteur à :
      – Une entrée d’alimentation à relier au 3V du raspberry
      – Une masse à relier à la masse du raspberry
      – Une sortie, à relier à un GPIO, cette sortie est à l’état bas (0V) s’il n’y a pas de mouvement, et à l’état haut s’il y a mouvement (3V)

      1. donc si je vous comprend bien le raccordement est le même excepté le raccordement a la masse en supplément. et du coup question programmation ca reste identique 🙂
        merci de me confirmer cela 🙂
        merci d’avance

        1. Bonjour,
          Si on regarde celui ci :
          Capteur PIR

          On voit qu’il y a une masse un V+ (l’alimentation) et une sortie O/P, qui est la sortie indiquant le déclanchement du capteur.
          Du point de vue de la programmation, le code est équivalent à celui proposé dans cette article.
          Cependant, dans le modèle proposé ici, c’est une alimentation 5V, il faut donc pour celui ci raccorder l’alimentation à une sortie 5V du raspberry et prévoir de baisser la tension. Pour cela, un simple diviseur de tension suffit : Pont diviseur de tension

  3. Bonjour,

    Je cherches a mettre en place un système de surveillance mais pour une maison entière, je voulais savoir si vous aviez étudier le nombre limite de capteur par rapspberry.

    Merci d’avance

    1. Le nombre limite est une question très vaste.
      De manière simpliste, on peut répondre qu’il est égal au nombre de GPIO disponnibles en entrée (15).
      Cependant, avec des montages hardwares il est possible d’augmenter ce nombre à l’infini.

      On pourrait faire un montage qui couperai le courant, dès qu’une porte s’ouvre, ou qu’un capteur PIR détecte un mouvement.
      Il n’y aurait alors besoins que d’un seul GPIO pour autant de capteur que l’on souhaite. Avec un montage comme celui l’information sur la provenance de l’intrusion serait perdu.

  4. Bonjour,

    Niveau hardware tu as pris quoi comme capteur, depuis un moment je cherche à faire la même chose que toi mais je bloque au niveau du hardware du capteur.

    1. Il est difficile de répondre à la question sans avoir d’avantage de détails. Ce genre d’erreurs provient généralement d’un capteur défectueux ou d’un fil mal branché.

  5. Bonjour
    étant nul en électronique,pouvez vous me dire ou brancher la résistance et quel doit étre sa valeur?Aije bien compris?
    N’ayant jamais programmer en c,j’édite un fichier que je nomme input.c,je colle le texte ,j’enregistre je quitte et je compile en lançant la commande:
    gcc input.c -l rt -l bcm2835 -o input
    C’est bien ça?
    Faut il rendre le fichier exécutable comme on le ferais avec un script en basch avec par exemple un chmod?
    Ensuite si je veux lancer une action en fonction de l’etat du capteur,je dois recréer un script en bash ou continuer en c?
    je sais c’est des questions un peu bébéte,mais je voudrais etre sur avant de me lancer
    D’avance merci.

    1. Bonjour,
      c’est la ligne suivante qui branche la résistance :

      // avec une résistance de pull down
      bcm2835_gpio_set_pud(PIN, BCM2835_GPIO_PUD_DOWN);

      Celle ci est intégrée dans les Rpi, il n’y a donc rien de particlier à faire.
      Pour lancer une action en C, regarde du côté de la fonction system().

  6. Excellent tuto tout est claire sauf la partie de L’envoi par mail et l’interface graphique je souhaite plus de détaille la dessous
    merci d’avance

    1. Bonjour,

      En effet, la résistance est déjà présente dans le raspberry. Il faut cependant lui indiqué de la branché. C’est ce qui est fait avec la ligne de code suivante :
      // avec une résistance de pull down
      bcm2835_gpio_set_pud(PIN, BCM2835_GPIO_PUD_DOWN);

  7. Salut je voudrais commencer le projet mais j’ai quelque questions.

    Sur les photo je vois un petit truc mais c’est quoi ? Il le faut obligatoirement ? Ou il suffit de relier directement les 2 fils du contacteur magnétique ?

    Merci

Répondre à MonKey Annuler la réponse

Votre adresse e-mail ne sera pas publiée.