Réalisation d’un système de contrôle d’accès à l’aide de Arduinos et d’un Raspberry
Voici comment réaliser un système d’ouverture de portes par lecteur de badges à base de Arduino et de Raspberry
Matériel :
- Par porte à sécuriser :
- Un Arduino
- Un lecteur de badge MRF522
- Un relais
- 1 Led verte (pour signaler l’autorisation)
- 1 Led rouge (pour signaler la non autorisation ou la non reconnaissance d’un badge)
- 2 résistances de 220 Ohms (une par Led)
- 1 Emetteur / Récepteur NRF24L01
- Optionnel pour la mise au point (3 simulations de badges : 1 autorisé, 1 non autorisé, 1 inconnu)
- 3 boutons poussoirs (1 type depar simulation)
- 3 Résistances de 10 000 Ohms (une par bouton)
- Pour la centrale :
- Un Raspberry Pi
- 1 Emetteur / Récepteur NRF24L01
- Optionnel : 1 écran Oled I2c
Concept :
Chaque porte à sécuriser comporte un lecteur de badge MRF522 relié à un Arduino.
Chaque Arduino a un identifiant unique dans son code, cela identifie la porte à sécuriser.
Lorsqu’un utilisateur passe son badge devant le lecteur, le Arduino lit l’identifiant du badge qui est une suite de 4 nombres entiers entre 0 et 255.
Il transmet le numéro de badge au Raspberry par une liaison sans fils privative (qui n’est pas du Wifi)
Le Raspberry récupère le numéro du badge, l’heure du passage et l’identifiant de la porte (identifiant du Aruino ayant émis le message)
Le Raspberry interroge la base de données pour savoir si ce badge a le droit d’ouvrir la porte ou non.
Il affiche sur on écran Oled la réponse et la transmet en liaison sans fil par son NRF24L01 au Arduino
Le Arduino reçoit la réponse et l’analyse, allumant la led Verte ou Rouge
La sortie de la Led verte peut être reliée à un relais pour déverrouiller une porte.
Connexions aux Arduino
MRF522 | Arduino |
---|---|
VCC | +3,3V |
GND | GND |
MOSI | D11 |
MISO | D12 |
SCK | D13 |
SS | D2 |
RST | D3 |
NRF24L01 | Arduino |
---|---|
VCC | +3,3V |
GND | GND |
MOSI | D11 |
MISO | D12 |
SCK | D13 |
CE | D9 |
CSN | D10 |
Rappels sur les montages d’une Led et d’un bouton Poussoir
Arduino | |
---|---|
+ Led Verte (ou relais) | D4 |
+Led Rouge | D5 |
Bouton de simulation Badge inconnu | D6 |
Bouton de simulation Badge KO | D7 |
Bouton de simulation Badge KO | D8 |
Code source Arduino :
Le code exploite les bibliothèques RF24 et MRF522 à installer sur le logiciel Arduino
Chaque Arduino devra avoir un Id (RADIO_ID) différent , valeurs possibles de 1 à 255, le code comporte la valeur 1.
Les valeurs de badges correspondant aux boutons de simulations sont à personnaliser pour réaliser sereinement des tests: (recherchez dans le code » if (digitalRead(PIN_SIMU_OK) == HIGH) » )
Au départ, j’utilisais la puissance d’émission la plus basse pour le NRF24. Je me suis aperçu que dans un bâtiment, comportant des murs, la portée n’était que de quelques mètres. Finalement, j’ai utilisé la valeur maxi (HIGH) et la portée recouvre l’ensemble d’un bâtiment de 2 étages. Vous pouvez l’adapter à vos besoins. Le seul impact concerne la consommation électrique si vous souhaitez alimenter vos Arduinos sur batterie, cela jouera sur leur autonomie.
Connexion au Raspberry
Ecran Oled | Raspberry |
---|---|
VCC | +3,3V |
GND | GND |
SDA | SDA |
SDC | SDC |
NRF24L01 | Raspberry |
---|---|
VCC | +3,3V |
GND | GND |
MISO | SP MISO |
MOSI | SP MOSI |
SCK | SP SCLK |
CSN | GPIO22 |
CE | SPCE0 |
Base de données des badges et autorisations dans le Raspberry :
Mon projet complet exploite une vrai base de données SQL et un site sécurisé pour le mettre à jour.
Pour vous permettre une adaptation plus aisée à votre propre système le code de l’exemple exploite un fichier json (fichier que je produis par lecteur de la base de données régulièrement).
La structure du fichier json est ainsi faite : c’est un tableau de données json.
[{« NUM_BADGE »: »00093228″, »ID_BADGE »: »000.009.050.040″, »LPRENOM »: »Pierre », »LNOM »: »Martin », »AUTH1″: »Y », »AUTH2″: »Y », »AUTH3″: »Y », »AUTH4″: »N », »AUTH5″: »N », »AUTH6″: »N », »AUTH7″: »N », »AUTH8″: »N »},{« NUM_BADGE »: »001E00CE », »ID_BADGE »: »000.030.000.206″, »LPRENOM »: »Thomas », »LNOM »: »Dupond », »AUTH1″: »N », »AUTH2″: »N », »AUTH3″: »N », »AUTH4″: »N », »AUTH5″: »Y », »AUTH6″: »N », »AUTH7″: »N », »AUTH8″: »N »}, ]
chaque ligne de données json contient le numéro de badge dans deux formats (mais le format nombre entiers suffiraient) :
- NUM_BADGE = numéro du badge au format hexadécimal (parce que les badges sont imprimés avec ce numéro)
- ID_BADGE est sa conversion en nombres entier (tel que le Arduino va le fournir)
- LPRENOM et LNOM sont les prénoms et nom des possesseurs de badges
- AUTHx est la zone qui indique si le badge a l’autorisation Y (Yes) ou N (No) d’ouvre la porte x
Code source Raspberry :
Le code, écrit en Python exploite une extraction de la base de données au format Json qui se fait régulièrement (toutes les 15 minutes de 8h du matin à 22h le soir)
Il vous faudra l’adapter à votre situation.
Techniquement, le Raspberry écoute avec son NRF24L01 les messages. S’il en reçoit 1 et qu’il est correctement formaté il l’analyse. Le message contient à qui il est destiné , si c’est 0 (Radio_Id=0) ce message est destiné au Raspberry. Il va alors récupérer de qui provient le message (identifiant du Arduino), le numéro de badge et le rechercher dans ses données Json.
2 cas sont possibles :
- Pas trouvé (badge inconnu)
- Trouvé
Si le badge est trouvé le code va récupérer le nom du propriétaire, le numéro identifiant le Arduino et s’il est autorisé ou non, il va afficher cela sur l’écran Oled.
Enfin, il renvoie la réponse qui est identique au message initial excepté que :
- les données identifiants To et From sont croisées (le récepteur devient l’émetteur et l’émetteur initial le récepteur)
- la valeur Auth est enreignée (0 pour autorisé, 1 pour non autorisé, 2 pour inconnu)
Ex : dans mon cas, chaque personne peut-être autorisée à 8 lecteurs de badge.
Si le message vient du Arduino numéro 4 (From=4), alors on cherche dans les données Json la valeur de AUTH4 pour ce badge.
Le code utilise pas mal de bibliothèques python à installer préalablement.
Voici les commandes d’installation de ses bibliothèques (prévoyez 20 bonnes minutes)
cd /home/pi sudo apt install i2c-tools python3-dev python3-pip sudo apt install libfreetype6-dev libjpeg-dev build-essential sudo apt install libopenjp2-7 libtiff5 git libboost-python-dev sudo apt install python3-setuptools python3-rpi.gpio pigpio sudo pip3 install ConfigParser netifaces Unidecode sudo -H pip3 install luma.oled mkdir RF24Installer cd RF24Installer wget http://tmrh20.github.io/RF24Installer/RPi/install.sh chmod +x install.sh ./install.sh #Aux questions qui seront posées ne demandez que l'installation du module RF24 #Pour correction d'un bug dans l'installateur , il faut créer un lien symbolique : cd /usr/lib/arm-linux-gnueabihf sudo ln -s /usr/lib/arm-linux-gnueabihf/libboost_python39.so libboost_python3.so cd /home/pi/RF24Installer/rf24libs/RF24/pyRF24 sudo chmod +x setup.py sudo python3 setup.py build sudo python3 setup.py install