Construisez votre propre système web de verrouillage de porte

Ou comment résoudre vos problèmes concrets d'ingénierie ou d'électronique avec votre Raspberry Pi et l'aide d'un hacker et auteur renommé, Simon Monk

Simon Monk

Traducteur

f-leb

Dans ce tutoriel, nous allons vous montrer comment utiliser un Raspberry Pi pour contrôler une gâche électrique de porte. Le Raspberry Pi exécute un serveur web auquel vous pouvez vous connecter à partir de n'importe quel périphérique équipé d'un navigateur Internet. Par exemple, à partir du moment où vous êtes à portée du réseau sans fil de votre maison, vous pouvez être à l'extérieur de chez vous et vous connecter au serveur web avec un smartphone, entrer un mot de passe et déverrouiller votre porte.

Commentez

- Titre : Construisez votre propre système web de verrouillage de porte

- Auteur : Simon Monk

- Traducteur : f-leb

- Parution : 20 octobre 2015

- Public visé :

- Licence : Le contenu de cet article est rédigé par Simon Monk et est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage dans les Mêmes Conditions 3.0 non transposé. Les logos Developpez.com, en-tête, pied de page, css, et look & feel de l'article sont Copyright ® 2013 Developpez.com.

Voir également :

- Raspberry Pi - Déballage et installation

- Raspberry Pi - Python et le port GPIO

- Construisez votre propre système de détection d'obstacles au stationnement, par Simon Monk

Sommaire

- I. Introduction

- II. Fonctionnement de la partie électronique

- III. Construire son propre système web de déverrouillage de porte

- IV. Comment fonctionne le code

- V. Utilisation de votre système de verrouillage

- VI. Notes de la Rédaction de Developpez.com

I - Introduction

Matériel nécessaire

- Plaquette de câblage (breadbord)

- Deux fils de câblage mâle-femelle

- Deux fils de câblage mâle-mâle

- Quatre résistances électriques 470 Ω

- Transistor Darlington TIP120 (Réf. CPC : SC10999)

- Gâche électrique 12 V CC (Réf. CPC : SR04745)

- Adaptateur Jack avec bornier à vis (Réf. CPC : CN19646)

- Bloc d'alimentation 12 V CC 2A

- Diode 1N4001

- LED rouge

Comme vous pouvez le voir sur la liste des composants requis ci-dessus, ce projet est construit autour d'une plaquette de câblage et utilise un transistor Darlington TIP120 pour commuter la puissance à une gâche électrique.

Dispositif monté autour d'une plaquette de câblage

Nous avons utilisé un transistor de puissance Darlington TIP120, des composants très bon marché et fiables. Vous pourriez aussi utiliser un transistor MOFSET à canal N tel le FQP30N06, où la disposition des pattes est telle que vous n'avez qu'à le disposer sur la plaquette en lieu et place du TIP120. Vous pouvez prendre à peu près n'importe quelle diode que vous trouverez dans un kit de composants électroniques de base. La gâche électrique est conçue pour remplacer la gâche existante (partie femelle qui reçoit le pêne de la serrure), avec un mécanisme articulé qui libère le pêne lorsque l'électroaimant à l'intérieur de la gâche est alimenté.

Tant que la gâche est alimentée, le pêne de la serrure est libéré et la porte peut être ouverte. Avec ce dispositif, vous n'êtes pas piégé à l'extérieur de votre maison en cas de coupure de courant ou de défaillance du Raspberry Pi, car vous pouvez toujours rentrer mécaniquement le pêne de la serrure, de façon classique, avec une clé pour rentrer chez vous.

Déverrouillez votre porte avec un smartphone

L'adaptateur Jack standard avec bornier à vis est un petit dispositif pratique qui vous permet de relier des fils de câblage à un bloc d'alimentation standard à C.C et cela sans se prendre la tête. Cependant, si vous préférez, vous pouvez simplement couper et dénuder les fils provenant du bloc d'alimentation (attention, débranchez d'abord l'alimentation) ; auquel cas, vous n'avez plus besoin des deux fils mâle-mâle comme auparavant pour amener l'alimentation 12 V à la plaquette.

Notez que le bloc d'alimentation de 12 V est seulement utile pour la gâche électrique. Pour alimenter le Raspberry Pi, vous aurez encore besoin d'une alimentation USB 5 V.

Vous trouverez l'ensemble des autres composants en achetant un kit de composants électroniques pour débuter. Le Monk Makes Electronic Starter Kit pour Raspberry Pi inclut une plaquette de câblage, des fils et des LED. La plupart des kits pour Raspberry Pi incluent la plaquette, des fils de câblage et un jeu de résistances électriques.

II - Fonctionnement de la partie électronique

Les broches GPIO du Raspberry Pi sont conçues pour fournir un courant d'environ 3 mA au maximum. Or, la gâche électrique peut absorber jusqu'à 200 mA pour maintenir l'ouverture, avec une pointe de courant lors de la mise en tension. Un transistor est donc utilisé pour permettre malgré tout à la broche GPIO du Raspberry Pi de contrôler le courant absorbé par la gâche.

Le type de transistor utilisé est un Darlington et il est en fait fabriqué à partir de deux transistors, l'un se superposant à l'autre pour apporter une plus grande amplification du courant que ne pourrait apporter un seul transistor. Pour autant, le tout est intégré dans un seul composant et vous pouvez l'utiliser comme s'il s'agissait d'un unique transistor.

Lorsque la broche GPIO 18 est à l'état haut, un faible courant (environ 4,8 mA) traversera la résistance R1 et la « base » du transistor. Cela aura pour effet de commuter l'état du transistor de façon à ce qu'un courant de plus forte intensité puisse traverser l'électroaimant de la gâche (du +12 V vers le 0 V) et ainsi libérer son mécanisme de verrouillage. Le rôle de la diode D1 est de protéger le transistor contre les pics de tension qui se produisent lors de la mise en tension de la gâche.

La LED et la résistance R2 sont aussi traversées par un courant quand le transistor commute. Dès lors, lorsque le mécanisme de la gâche est libéré, la LED s'allume pour vous prévenir que la porte est déverrouillée.

III - Construire son propre système web de déverrouillage de porte

Préparation du montage

Suivez les indications des photos de la plaquette ci-dessous et vérifiez bien que les composants et fils de câblage sont connectés dans les bonnes rangées de trous de la plaquette. Vous devez également vous assurer que le transistor, la LED et la diode sont tous montés dans le bon sens, et spécialement la diode qui peut griller et entraîner le transistor avec elle si elle est montée dans le mauvais sens.

- Étape 1 - Préparez la plaquette

Connectez les composants sur la plaquette comme montré sur la photo. La patte la plus longue de la LED est la borne positive et elle doit être située à droite sur la plaquette. Un petit trait est dessiné à une extrémité de la diode et il doit aussi être dirigé vers la droite de la plaquette. Le transistor est surmonté d'une partie métallique sur le côté qui doit être situé à droite. Si vous voulez disposer vos composants de façon un peu plus propre, raccourcissez les pattes des résistances afin qu'elles n'enjambent pas trop haut au-dessus de la plaquette.

- Étape 2 - Ajoutez les connexions de l'alimentation

Fixez les fils de câblage mâle-mâle au bornier à vis de l'adaptateur Jack. Utilisez des fils rouge et noir et assurez-vous de fixer la patte du fil rouge à la borne repérée avec un signe « + ». Ensuite, connectez les autres extrémités des fils sur la plaquette. La patte du fil rouge doit être connectée sur la rangée de trous de la plaquette servant à apporter l'alimentation, la ligne rouge à droite sur la photo, repérée également avec un signe « + ». La patte du fil noir est reliée à la dernière des trois pattes du transistor, celle tout en bas sur la photo.

- Étape 3 - Connectez la gâche électrique

Les fils de la gâche peuvent être branchés directement sur la plaquette, spécialement durant les tests. Cependant, quand viendra le temps de déployer le projet en situation réelle, vous voudrez probablement ajouter des câbles plus longs pour connecter la plaquette à la gâche. Des câbles téléphoniques ou même des câbles de haut-parleur fonctionneront très bien pour cela. Vous pouvez relier ces longs câbles à la gâche avec un bloc de raccordement.

- Étape 4

Il y a juste deux liaisons à faire entre le Raspberry Pi et la plaquette. Pour ces connexions, vous aurez besoin des fils de câblage mâle-femelle. Un fil ira de la broche GND du Raspberry Pi vers la rangée de trous en face de la dernière des trois pattes du transistor tout en bas sur la photo. L'autre ira de la broche GPIO 18 vers l'extrémité gauche de la résistance R1. Alimentez votre Raspberry Pi, connectez l'alimentation 12 V à la plaquette et allumez le bloc d'alimentation.

Comme tout projet, il est bien de tester et de vérifier que tout fonctionne normalement pendant que vous avez tout sous la main. Une fois que tout est vérifié, vous pouvez mettre le matériel dans un boîtier et déployer le système en condition réelle de fonctionnement.

Maintenant que la partie matérielle du projet est complète, nous devons nous préoccuper du fonctionnement logiciel. Le programme est écrit en Python et utilise la bibliothèque nommée Bottle pour apporter les fonctionnalités d'un serveur web à ce projet.

Pour installer Bottle, vérifiez que votre Raspberry Pi est connecté à Internet et saisissez les commandes suivantes :

sudo apt-get update
sudo apt-get install python-bottle

Vous pouvez télécharger le programme à partir du Raspberry Pi, en saisissant en ligne de commande :

git clone https://github.com/simonmonk/pi_magazine.git

Avant d'exécuter le programme, ouvrez le fichier door_lock_server.py avec un éditeur (nano par exemple) et changez la valeur de la variable IP_ADDRESS avec l'adresse IP de votre Raspberry Pi (tapez la commande ipconfig en ligne de commande). Vous voudrez aussi probablement changer la valeur 'letmein' de la variable PASSWORD avec quelque chose d'un peu plus sécurisé.

Pour exécuter le programme, changez de répertoire en allant dans celui où est situé le code pour ce projet et ensuite, lancez son exécution en saisissant les commandes ci-dessous :

cd /home/pi/pi_magazine/02_door_lock
sudo python door_lock_server.py

Cela va démarrer un serveur web sur votre Raspberry Pi. Vous pouvez vérifier son fonctionnement en ouvrant une fenêtre de navigateur sur un autre ordinateur ou un smartphone, puis en entrant l'adresse IP de votre Pi. Pour le nôtre, il s'agissait de l'adresse 192.168.1.14. Si tout se passe bien, une page web s'affiche, vous invitant à saisir un mot de passe pour déverrouiller la porte. Entrez votre mot de passe et la LED devrait s'allumer, et la gâche s'activer à déverrouiller la porte.

IV - Comment fonctionne le code

Le code Python de ce programme situé en fin d'article est largement commenté. Vous trouverez probablement plus pratique d'avoir le code ouvert dans un éditeur pendant que nous le passons en revue. Le programme commence par importer les bibliothèques nécessaires, soit Bottle, RPi.GPIO et time. Suivent des déclarations de constantes que vous aurez sans doute besoin de modifier. PASSWORD est (bien évidemment) le mot de passe qui doit être saisi pour que la porte s'ouvre, donc faites en sorte qu'il reste assez obscur.

La constante MAX_ATTEMPS est fixée par défaut à la valeur 5. Elle définit le nombre maximum de tentatives de saisie incorrecte de mot de passe avant que le programme ne vous ferme l'accès à toute nouvelle tentative d'ouverture de porte. La constante OPEN_TIME spécifie la durée en secondes où la gâche reste déverrouillée avant qu'elle ne se reverrouille automatiquement. La gâche doit être déverrouillée suffisamment longtemps, le temps d'ouvrir la porte et de la refermer derrière soi.

Ensuite, la sortie du port GPIO qui contrôle le verrouillage est configurée et le compteur de tentatives attempts est initialisé à 0 afin d'indiquer qu'il n'y a encore eu aucune tentative échouée de connexion.

La fonction unlock_door met la broche LOCK_PIN à l'état HIGH pour libérer le mécanisme de la gâche, attend le nombre de secondes spécifié dans OPEN_TIME, puis remet la broche LOCK_PIN à l'état LOW pour verrouiller à nouveau.

Le reste du code met en place l'interface web. Bottle utilise le décorateur @route pour indiquer que les fonctions qui suivent immédiatement sont des gestionnaires pour les requêtes web. Donc, la page par défaut, de route ( / ), est pilotée par la fonction nommée index. La fonction index utilise un mécanisme de template propre à Bottle pour retourner le HTML contenu dans le fichier template nommé home.tpl. Vous trouverez tous les templates HTML utilisés dans cet article dans le dossier du projet. La page d'accueil contient un formulaire avec un champ de saisie du mot de passe et un bouton de soumission.

Le second gestionnaire concerne la page /unlock, et c'est cette page qui traite la requête POST envoyée depuis le formulaire de la page index. Cette fonction est l'endroit où la plupart des actions ont lieu. Avant tout, le mot de passe qui a été soumis depuis le formulaire est récupéré depuis le paramètre de la requête web et assigné à la variable pwd. Ensuite, le nombre de tentatives de connexion est comparé avec le nombre maximal de tentatives autorisées et, s'il lui est supérieur, la page lockout est retournée pour empêcher toute nouvelle tentative de connexion.

Après cela, le mot de passe du formulaire est comparé avec la constante PASSWORD et, s'il y a correspondance, la fonction unlock_door est appelée et le compteur de tentatives de connexion est remis à zéro. Si, par contre, le mot de passe saisi est incorrect, le compteur attempts est incrémenté et la page web du template failed.tpl est affichée. Les dernières lignes du programme démarrent le serveur web sur le port 80. La clause try/finally est utilisée pour réinitialiser les broches du port GPIO lorsque le programme est interrompu avec CTRL+C.

V - Utilisation de votre système de verrouillage

La première chose à dire c'est que n'importe qui d'un peu compétent en matière de sécurité et lisant cet article se mettra probablement à pleurer de rire en voyant les gros problèmes de sécurité de votre système, et les nombreuses vulnérabilités qui pourraient permettre à quelqu'un de s'introduire chez vous. Cependant, garder le Pi derrière un pare-feu signifie que l'interface web susceptible de se faire pirater est accessible seulement si quelqu'un a accès à votre LAN. Seulement vous, pouvez juger si c'est assez sécurisé pour votre maison, mais ne nous blâmez pas si quelqu'un s'en va avec toutes vos affaires !

Finalement, si vous appréciez la conception des pages web, alors la première chose que vous aurez envie de faire est d'apporter un peu de style à vos pages. L'emplacement pour faire cela se situe dans les fichiers templates suivants :

- home.tpl : la page d'accueil contenant le formulaire de saisie du mot de passe ;

- failed.tpl : la page affichée après qu'un mot de passe incorrect ait été saisi ;

- lockout.tpl : la page affichée après avoir dépassé le nombre maximum de tentatives de connexion ;

- opened.tpl : la page affichée après que la porte ait été déverrouillée pendant le temps spécifié.

door_lock_server.py

from bottle import route, run, template, request
import RPi.GPIO as GPIO
import time

# Change these for your setup.
PASSWORD = 'letmein'
MAX_ATTEMPTS = 5  # before you are locked out
OPEN_TIME = 5     # number of seconds for lck to stay open
IP_ADDRESS = '192.168.1.14' # of your Pi

# Configure the GPIO pin
GPIO.setmode(GPIO.BCM)
LOCK_PIN = 18
GPIO.setup(LOCK_PIN, GPIO.OUT)

# Initialize the number of failed login attempts to 0
attempts = 0;

# Unlock the door by setting LOCK_PIN high for
# OPEN_TIME seconds
def unlock_door():
GPIO.output(LOCK_PIN, True)
time.sleep(OPEN_TIME)
GPIO.output(LOCK_PIN, False)

# Handler for the home page
@route('/')
def index(name='time'):
return template('home.tpl')

# Handler for the 'unlock' page
@route('/unlock', method='POST')
def new_item():
global attempts
# Get the password entered in the password field of the form
pwd = request.POST.get('password', '').strip()
# check to see if tehre have been too many failed attemts
if attempts >= MAX_ATTEMPTS:
return template('lockout.tpl')
# unlock the door if the password is correct
if pwd == PASSWORD:
attempts = 0
unlock_door()
return template('opened.tpl')
else:
attempts += 1
return template('failed.tpl')

# Start the webserver running on port 80
try:
run(host=IP_ADDRESS, port=80)
finally:
print('Cleaning up GPIO')
GPIO.cleanup()

home.tpl

<html>
<body>

<h1>Door Lock</h1>

<form method="POST" action="unlock">
<p>Enter Password</p>
<input type="password" name="password" length="20"/>
<input id ="sub" type="submit" value="OK"/>
</form>

</body>
</html>

lockout.tpl

<html>
<body>

<h1>Door Lock</h1>

<p>Too many incorrect password attempts. You are locked out!</p>

</body>
</html>

opened.tpl

<html>
<body>

<h1>Door Lock</h1>

<p>The Door is now Locked Again</p>

<a href="/">Back</a>

</body>
</html>

failed.tpl

<html>
<body>

<h1>Door Lock</h1>

<p>Incorrect Password</p>

<a href="/">Back</a>

</body>
</html>

VI - Notes de la Rédaction de Developpez.com

Cet article est une traduction de l'article écrit par Simon Monk et paru dans le n° 32 du magazine TheMagPi, sous le titre Build your own web door lock.

Retrouvez les projets de l'auteur publiés dans le magazine TheMagPi sur la plateforme GitHub.

Nous remercions les membres de la Rédaction de Developpez.com pour le travail de traduction et de relecture qu'ils ont effectué, en particulier :

- f-leb

- deusyss

Merci également à milkoseck pour sa relecture orthographique.