La RFID est une technologie permettant de transmettre des données sans contact, qui est utilisée dans les cartes à puce. Les cartes d’accès peuvent être lues à l’aide d’un module RFID Raspberry Pi (RC522), ce qui permet, par exemple, de donner accès à des portes ou à des serrures. Les smartphones actuels en ont de semblables.
Dans ce tutoriel, je montrerai comment lire des étiquettes RFID avec le RC522 et le Raspberry Pi et aussi écrire des cartes à puce. Le code présenté peut également être utilisé pour d’autres projets (ouvreur de porte, contrôle d’accès).
La NFC est une technologie connexe, dont les différences sont présentées ici. La RFID et la NFC transmettent toutes deux sur une fréquence de 13,56 MHz, c’est pourquoi les modules sont compatibles entre eux.
Pièces d’équipement utilisées
J’ai utilisé les pièces suivantes (de construction) pour ce tutoriel :
- Raspberry Pi 4 (fonctionne également avec toutes les versions précédentes)
- Mifare RC522 RFID Module (incl. KeyCard)
-
- kit de soudure
Il existe également des lecteurs USB RFID, mais je ne les ai pas essayés.
Si vous voulez utiliser le lecteur de cartes comme contrôle d’entrée, etc., il est logique de donner une carte à chaque utilisateur. Vous pouvez également acheter ces cartes à puce en plus ou moins grande quantité pour une somme modique, puis écrire individuellement RC522 sur chaque carte (instructions ci-dessous).
Installation
La bande de broches de mon module n’était pas encore soudée, j’ai donc dû la souder d’abord avant de pouvoir connecter les broches.
Le câblage est le suivant:
RF522 Module | Raspberry Pi |
---|---|
SDA | Pin 24 / GPIO8 (CE0) |
SCK | Pin 23 / GPIO11 (SCKL) |
MOSI | Pin 19 / GPIO10 (MOSI) |
MISO | Pin 21 / GPIO9 (MISO) |
IRQ | — |
GND | Pin6 (GND) |
RST | Pin22 / GPIO25 |
3.3V | Pin 1 (3V3) |
L’ensemble ressemble schématiquement à ceci:
Activation du SPI et installation du logiciel
Afin d’utiliser le Shield RFID RC522, nous avons besoin du bus SPI. Pour que le Kernel soit chargé au démarrage, nous éditons le fichier de configuration :
sudo nano /boot/config.txt
Le contenu suivant est ajouté à la fin du fichier :
device_tree_param=spi=on dtoverlay=spi-bcm2708
Vous enregistrez et quittez avec CTRL + O, CTRL + X. Ensuite, nous activons le SPI :
sudo raspi-config
Activez sous « Options avancées »> « SPI » et confirmez le redémarrage (vous pouvez également utilisersudo reboot now
).
Vous pouvez ensuite utiliser dmesg | grep spi
pour vérifier si le module a été chargé. La sortie devrait ressembler à ceci :
pi@raspberrypi:~ $ dmesg | grep spi [ 10.784368] bcm2708_spi 20204000.spi: master is unqueued, this is deprecated [ 10.813403] bcm2708_spi 20204000.spi: SPI Controller at 0x20204000 (irq 80)
Maintenant les paquets doivent être installés pour que nous puissions accéder au bus SPI et charger une bibliothèque correspondante à partir de GitHub.
sudo apt-get install git python-dev --yes
Tout d’abord nous installons le module Python SPI
git clone https://github.com/lthiery/SPI-Py.git cd SPI-Py sudo python setup.py install cd ..
et ensuite la bibliothèque Raspberry Pi RFID RC522:
git clone https://github.com/mxgxw/MFRC522-python.git && cd MFRC522-python
Test du lecteur/écriture RFID Raspberry Pi
En plus du module RC522, une carte blanche et un porte-clés compatible NFC sont généralement fournis. Ces pièces peuvent être utilisées pour l’authentification car elles sont inscriptibles et lisibles. Un smartphone compatible NFC (Android/iOS) peut également être utilisé (ce qui est le cas de la plupart des téléphones portables récents).
Pour effectuer le premier test de la carte/porte-clés, nous exécutons le script:
sudo python Read.py
Dès que la carte à puce est présentée et reconnue, vous verrez une sortie comme celle-ci:
pi@raspberrypi:~/MFRC522-python $ sudo python Read.py Welcome to the MFRC522 data read example Press Ctrl-C to stop. Card detected Card read UID: 69,245,238,117 Size: 8 Sector 8 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Afin de modifier les données stockées (numéros) sur la puce, nous éditons le fichier « Write.py ». (sudo nano Write.py
). Pour ce faire, modifiez le code à partir de la ligne 55 comme suit (vous pouvez choisir librement les 16 nombres de data
entre 0 et 255. J’ai représenté un mot avec ASCII characters)
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
# Variable for the data to write data = [114, 97, 115, 112, 98, 101, 114, 114, 121, 45, 116, 117, 116, 111, 114, 0] # Fill the data with 0xFF #for x in range(0,16): # data.append(0xFF) print "Sector 8 looked like this:" # Read block 8 MIFAREReader.MFRC522_Read(8) print "\n" #print "Sector 8 will now be filled with 0xFF:" # Write the data MIFAREReader.MFRC522_Write(8, data) #print "\n" print "It now looks like this:" # Check to see if it was written MIFAREReader.MFRC522_Read(8) print "\n" """ data = [] # Fill the data with 0x00 for x in range(0,16): data.append(0x00) print "Now we fill it with 0x00:" MIFAREReader.MFRC522_Write(8, data) print "\n" print "It is now empty:" # Check to see if it was written MIFAREReader.MFRC522_Read(8) print "\n" """ |
Utilisation du lecteur NFC/RFID dans les projets Raspberry Pi (serrure de porte, etc.)
Les deux fichiers Python « Read.py » et « Write.py » contiennent des exemples de code pour la lecture et l’écriture d’une puce qui peuvent être utilisés dans d’autres projets. Le fichier le plus important est « MFRC522.py », qui peut être copié dans un autre projet.
L’extrait suivant peut être utilisé dans d’autres projets, par exemple pour vérifier une serrure à code ou une serrure de porte. J’utilise un seul niveau d’authentification (vous pourriez aussi en définir plusieurs) avec un certain code initial. Les derniers chiffres fournissent des informations sur le détenteur de la carte (si ces données sont stockées quelque part). Vous ne pourriez identifier l’utilisateur que par son UID, mais je suppose que plusieurs cartes peuvent appartenir à un même utilisateur. Si cette solution ne vous plaît pas, vous pouvez bien sûr la modifier.
J’ai effectué une petite modification dans le fichier « MFRC522.py » de sorte que la fonction MIFAREReader.MFRC522_Read
a une valeur de retour :
331 332 333 334 335 336 337 338 339 340 341 342 343 344 |
def MFRC522_Read(self, blockAddr): recvData = [] recvData.append(self.PICC_READ) recvData.append(blockAddr) pOut = self.CalulateCRC(recvData) recvData.append(pOut[0]) recvData.append(pOut[1]) (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, recvData) if not(status == self.MI_OK): print "Error while reading!" i = 0 #if len(backData) == 16: # print "Sector "+str(blockAddr)+" "+str(backData) return backData |
L’exemple de code ressemblait alors à ceci (les modifications précédentes sont importantes, sinon aucune comparaison ne peut avoir lieu) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
#!/usr/bin/env python # -*- coding: utf8 -*- import RPi.GPIO as GPIO import MFRC522 def sample_func(sample_var): # Beispiel Funktion # Skript starten, Daten loggen, etc. print("Test Funktion wurde aufgerufen") # ... MIFAREReader = MFRC522.MFRC522() authcode = [114, 97, 115, 112, 98, 101, 114, 114, 121] # die ersten 9 Ziffern sind der Authentifizierungscode try: while True: # Scan for cards (status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL) # If a card is found if status == MIFAREReader.MI_OK: # Get the UID of the card (status,uid) = MIFAREReader.MFRC522_Anticoll() # This is the default key for authentication key = [0xFF,0xFF,0xFF,0xFF,0xFF,0xFF] # Select the scanned tag MIFAREReader.MFRC522_SelectTag(uid) # Authenticate status = MIFAREReader.MFRC522_Auth(MIFAREReader.PICC_AUTHENT1A, 8, key, uid) # Check if authenticated if status == MIFAREReader.MI_OK: # Read block 8 data = MIFAREReader.MFRC522_Read(8) if data[:9] == authcode: sample_func(data) #elif ... except KeyboardInterrupt: print("Abbruch") GPIO.cleanup() |
Comme vous pouvez le constater, le code est très simple et, comme je l’ai dit, ne devrait servir que d’impulsion pour lancer vos propres applications, plus sophistiquées. Le code en ligne doit, bien sûr, être adapté.
Quels sont les projets que vous envisagez de réaliser avec cet appareil ? J’envisage de construire une serrure de porte ou une serrure de tiroir/petit coffre-fort avec le lecteur RFID du Raspberry Pi.