Arduino – Contrôle d’accès

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

Lecteur de badge MRF522

MRF522Arduino
VCC+3,3V
GNDGND
MOSID11
MISOD12
SCKD13
SSD2
RSTD3

NRF24L01

NRF24L01Arduino
VCC+3,3V
GNDGND
MOSID11
MISOD12
SCKD13
CED9
CSND10

Rappels sur les montages d’une Led et d’un bouton Poussoir

montage LEDmontage bouton poussoir
Arduino
+ Led Verte (ou relais)D4
+Led RougeD5
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.

download

Connexion au Raspberry

oled-i2c

Ecran OledRaspberry
VCC+3,3V
GNDGND
SDASDA
SDCSDC

nrf24l01

NRF24L01Raspberry
VCC+3,3V
GNDGND
MISOSP MISO
MOSISP MOSI
SCKSP SCLK
CSNGPIO22
CESPCE0

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

download