aAlarm V2 : Une alarme de détection d'intrusion avec Arduino

 

Mise à jour 17/11/14 : Caméra WiFi, Motion et RaspberryPi

J'ai passé du temps sur d'autres sujets, mais je reviens finalement à ce projet pour l'améliorer quelques peu.

Il se trouve que j'ai fait l'acquisition d'une véritable caméra de surveillance de marque Axis.

Equipé d'une caméra plus performante, je compte améliorer la partie vidéo en intégrant Motion dont j'avais parlé l'année dernière.

J'en profite aussi pour remplacer le pc portable par un Raspberry Pi.

Axis 207MW

Acheté d'occasion, voilà de quoi remplacer avantageusement la webcam utilisée jusqu'ici.

  • Meilleure prise de vue, notamment en conditions de basse luminosité (j'utilise aussi un projecteur IR à led)
  • Protocole WiFi : Permet de placer la caméra plus loin et sans le cordon USB...
  • Protocole Ethernet : Pratique pour la configuration
  • Excellent support avec Motion

Motion

Comme son nom l'indique, ce logiciel permet de détecter les mouvements sur une image recue par une caméra.

L'analyse en temps réel est bien plus rapide que celle de ZoneMinder.

La configuration, bien qu'elle se fasse par un long fichier de configuration, est bien plus aisée et efficace.

J'utilise l'option "netcam_url" qui permet d'indiquer à Motion où récuperer l'image courante ("IP:8081/jpg/image.jpg" pour la 207MV)

De plus, les évenements peuvent être directement enregistrés dans une base de donnée ; cela permet d'exploiter plus facilement les images pour les réutiliser dans l'interface de aAlarm.

RaspberryPi

J'ai remplacé l'emcombrant PC portable par le fameux nano-ordinateur.

J'utilise la distribution Raspbian (installé via Noobs pour faire rapide...)

Le résultat est assez positif, cependant, la puissance disponible étant bien moindre malgré tout, il convient de régler correctement Motion pour que la détection du mouvement ne soit pas trop décalée.

(J'ai réduit la capture de la caméra à une résolution VGA, alors que la caméra est capable de diffuser un flux en 1280x1024)

La suite ?

Je détaillerais l'installation de l'ensemble prochainement, je dois d'abord améliorer quelques points du programme Perl et de l'interface Web Django.

J'aimerais aussi mettre en place une interface Android, mais cela demandera plus de temps.

Mise à jour 04/11/13

Je teste actuellement motion, un détecteur de mouvement pour camera.

Récemment, j'ai réinstallé aAlarm sur une installation fraîche d'Ubuntu Server. Impossible de faire reconnaitre la C270 à ZoneMinder.

Tout marche correctement avec Motion. De plus, le service démarre bien plus rapidement que ZoneMinder.

Motion ne propose pas d'interface aussi complète que ZoneMinder, mais est largement plus simple à mettre en oeuvre. 

On y trouve aussi un support pour db, qui permet l'insertion de chaque image.

Je vais intégrer le service Motion afin de proposer une alternative à ZoneMinder.

Bientôt plus d'info à ce sujet.

1/ Présentation

AAlarm est un système d'alarme basé sur Arduino.
 
N'hésitez pas à laisser vos commentaires en bas de page.
 

1.1/ Fonctionnalités proposées

  • Jusqu’à 13 détecteurs numériques
  • Panneau de contrôle : Clavier matriciel, diodes d'états, Buzzer
  • Sirène piezzo-électrique
  • Interface Web
  • Envoi d'emails d'alertes
  • Simulateur de présence sonore (Lecture de fichiers audio)
  • Vidéo surveillance (Interaction avec ZoneMinder)
  • Paramétrage depuis l'interface Web

1.2/ Présentation vidéo

  • Présentation générale de l'interface Web
  • Cas d'utilisation 1 : Activation et désactivation du système sans intrusion
  • Cas d'utilisation 2 : Activation du système avec intrusion
 

1.3/ Améliorations futures

  • Evolution vers une solution domotique plus complète (Contrôle à distance d'appareils électriques, fonctionnalités sans fil)
  • Détecteurs complexes utilisant les entrées analogiques d'Arduino
  • Multi-utilisateurs : Codes d'accès personnels, autorisations par zone
  • Journalisation des événements par utilisateur
  • Planification d’événements (coupure de l'alarme sur une plage d'horaire spécifique, pour un utilisateur particulier..)

2/ Matériel

aAlarm est composé de trois modules électroniques connectés en USB à un PC.

2.1/ Module principal

Le module principale est basé sur une carte Arduino Uno ; la carte du microcontrôleur est connectée à la facon d'un "shield".
 
Le module principal concentre les connexions :
  • Du module de contrôle (clavier matriciel), relié en I2C
  • Du module sirène
  • Des détecteurs
  • Du PC (Serial over USB)
 
Module principal et Arduino Uno
 
Module principal avec Arduino connecté, connectique RJ11 (vers module de contrôle) et module d'alimentation de la sirène (sans sirène!)
 
Shéma éléctrique

2.2/ Module de contrôle

Relié en I2C, il peut être placé relativement loin de la carte principale (plus de 5m dans mon cas).
J'ai utilisé un câble de type téléphonique, avec des connecteurs RJ11 de part et d'autre permettant une finition correcte ainsi qu'un branchement facile.
 
Le câble de connexion transporte également le courant nécessaire au fonctionnement du module (5v).
 
Fonctions :
  • Activation ou désactivation de la surveillance
  • Signalisation visuelle (leds d'états de l'alarme)
  • Signalisation sonore (buzzer)
 
Boitier ouvert
 
Boitier fermé et son connecteur RJ11
 
Boitier en position
 
Shéma éléctrique

2.3/ Module sirène (optionnel)

La sirène est alimentée en courant par un circuit élévateur de tension.
(Ce type de sirène nécessite peu de courant pour fonctionner)
 
Ainsi, le module convertit les 5v de la sortie d'Arduino en 12v, avec un niveau de décibel suffisant pour réveiller tout l'immeuble..
 
Module sirène : Carte d'alimentation
 

Shéma éléctrique

2.4/ Détecteurs

Arduino comporte 14 E/S numériques.
Une sortie étant utilisée par le module sirène, il est donc possible de connecter 13 détecteurs sur le module principal.
 
A l'heure actuelle, j'utilise un seul détecteur de porte. Il s'agit d'un simple contacteur de récupération.
Placé contre la porte d'entrée de mon appartement, il permet donc de connaitre l'état de l'ouverture : Ouvert ou Fermé.
 
J'ai déjà testé avec de multiples détecteurs (de simples interrupteurs) cependant, je tenterais de connecter un détecteur de gaz ou de fumée sur une des entrées libres.
 
Détecteur de porte (ouvert)
 
Détecteur de porte (fermé)
 

2.5/ Caméra

ZoneMinder permet d'utiliser une (ou plusieurs) caméras USB de type webcam.
Celle que j'utilise permet de surveiller la porte d'entrée.
 
Webcam en position

2.6/ PC

J'utilise un PC portable de récupération. Plusieurs raisons à cela :
  • Encombrement réduit
  • Fonctionnement sur batterie : Permet d'alimenter tout le circuit d'alarme en cas de coupure de courant (de plus, mon modem est ondulé, les alertes continuent à être envoyées)
  • Puissance disponible : ZoneMinder est un service très consommateur de CPU. Je doute qu'un RaspberryPI dispose de ressources suffisantes pour le faire fonctionner.
aAlarm au complet : Acer 6100 (AMD Turion) et modules éléctroniques

2.6/ Simulateur de présence audio

J'utilise une enceinte amplifié de récupération, placé près de la porte, pour sonoriser l'entrée pendant mon absence.

3/ Logiciel

aAlarm GitHub

aAlarm s'articule autour de trois composants logiciels :
  • aAlarm Controller, écrit en Perl, qui assure l'interface avec Arduino
  • Le programme chargé par Arduino
  • Un client Web développé en Django
 
Le Controller et le client Web communique par un modèle de donnée (MySQL) construit avec l'ORM de Django.
 
Shéma de principe général

3.1/ Controller Perl

Le Controller est une évolution de la première version de ce projet.
C'est le composant logiciel principal.
 
En communiquant avec Arduino, il connait les états des détecteurs et en détermine l'état global.
D'autre part, il intercepte les ordres issus du client Web pour les exécuter.
  • Communication série (Serial over USB) avec la carte Arduino (Device::SerialPort)
  • Envoi des emails (MIME::Lite)
  • Communication avec la base de données (DBI)
Le script contrôle également le service ZoneMinder et la diffusion sonore (simulateur de présence)
 
Le paramétrage par défaut du Controller est assuré par un fichier de configuration.
La configuration est par la suite maintenue par la base de données qui devient la référence, sauf pour certaines variables techniques.

3.2/ Programme Arduino

Egalement une évolution de la première version, le programme de la carte est toutefois plus simple et efficace.
 
Il interroge l'état des détecteurs, pour, en cas de changement, le signaler au Controller.
En outre, il contrôle les éléments électroniques (Diodes, Buzzer, Sirène) en fonction des ordres passés par le Controller

3.3/ Client Web

Dans la première version d'aAlarm, le client Web était écrit en PHP.
L'utilisation de Django permet, en plus d'une souplesse de développement décuplée, de profiter de l'ORM intégré.
 
Le client Web fournit une vue en temps réel (Ajax) de l'état de l'alarme et des différents détecteurs, et de contrôler aAlarm à distance.
 
Fonctionnalités :
  • Etat en temps réel de l'alarme et des détecteurs 
  • Etat en temps réel de ZoneMinder et du simulateur de présence sonore
  • Contrôle à distance (Activation / Désactivation de l'alarme et des services)
  • Historique des événements
  • Authentification utilisateur (Django)
  • Contrôle vidéo des intrusions (Utilisation des images issues de ZoneMinder)
  • Paramétrage à la volée (certaines configurations nécessitent cependant un redémarrage du Controller)
 
Homepage : Etat global (Online), détecteurs (Porte fermée, présence sonore, ZoneMinder) - Tout roule...
 
Homepage : Etat global (Alert), détecteurs (Porte fermée, présence sonore stoppée, ZoneMinder) - Intrusion confirmée !

3.4/ Modèle de données

Le modèle de données est maintenu par l'ORM intégré à Django.

  • Event : Evénements survenant sur l'état global et sur les détécteurs
  • Execute : Ordres passés par l'interface Web
  • Parameter : Paramètres de l'application. Initialement inscrits dans un fichier, ils sont inscrits et maintenus en base par la suite
Modèle de données de aAlarm

3.5/ ZoneMinder

ZoneMinder utilise des caméras USB (ou IP) avec détection des mouvements.

Ce service optionnel est lancé par aAlarm, et permet d'accéder aux images enregistrées pendant l'intrusion pour confirmer visuellement une intrusion.

4/ Fonctionnement

4.1/ Etat global

AAlarm est basé sur 6 états globaux chaînés. 
 
Chaque état représente une situation différente et entraîne certaines actions
  • OFFLINE : Alarme inactive
  • TIMED : Etat transitoire pour laisser à l'utilisateur le temps de sortir de la zone protégée
  • ONLINE : Alarme active
  • INTRUSION : Un détecteur a été sollicité, le code de désactivation doit être entré
  • WARNING : Le code de désactivation n'a pas été entré correctement, avertissement sonore de l'intrus et email d'avertissement envoyé
  • ALERT : La sirène est déclenchée, un email d'alerte est envoyé
Le passage d'un état à l'autre est déterminé soit par une action utilisateur, soit par le changement d'état d'un détecteur.
Cycle de l'état global d'aAlarm

4.2/ Etat des détecteurs

Le détecteur de porte comporte les états OUVERT ou FERME
Il est possible de créer d'autre type de détecteurs : Les états de ceux-ci sont paramétrables.

4.3/ Détecteurs spéciaux

La surveillance des services optionnels (ZoneMinder et diffusion sonore) sont implémentés sous forme de détecteurs.
Ainsi, ils apparaissent dans l'interface comme les détecteurs classiques et permettent de garder un oeil sur l'exécution desservices optionnels.

5/ Historique

5.1/ Arduino et alarme d'intrusion

J'ai commencé par tester un système très basique, commandé par un clavier matriciel
 
Je l'ai ensuite perfectionné pour qu'il communique via le port USB avec un programme en Perl, afin d'envoyer un email d'alerte
 
De ces quelques expériementations, j'ai créé le hardware actuel d'aAlarm...
 
...la partie logicielle ayant evoluée par la suite

5.2/  Version précédente

La première version complète d'AAlarm était fonctionelle, mais basique :
  • Peu de paramétrages possibles
  • Modèle de données simpliste
  • Client Web écrit en PHP/MySQL

http://dev.kprod.net/?q=instrusion-detection-using-arduino-alarm

5.3/ Améliorations et nouveautés

  • Refonte du controleur Perl
  • Nombreux paramétrages (fichier et base de données)
  • Nouveaux modèle de donnée basé sur l'ORM de Django
  • Client Web réécrit avec Django
  • Intégration avec ZoneMinder (outil de video surveillance)
  • Diffusion sonore pour simuler une présence