Lectura de etiquetas RFID RC522 con Raspberry Pi
Publicado por Loli Diéguez en
RFID es una tecnología mediante la cual los datos se transmiten sin existir contacto entre dispositivos, sino que se realiza por medio de tarjetas que tienen un chip en su interior que se activa al acercar la tarjeta a la fuente lectora
Las tarjetas de acceso se pueden leer con un módulo RFID Raspberry Pi (RC522) y, por ejemplo, se pueden emplear para dar acceso a puertas o controlar cerraduras.
En este tutorial, verás cómo leer tarjetas RFID con el lector RC522 y Raspberry Pi. El código presentado también se puede utilizar para otros proyectos como apertura de puertas, control de acceso,...
NFC es una tecnología similar, y tanto RFID como NFC transmiten en una frecuencia de 13,56 MHz, por lo que los módulos son compatibles entre sí.
Material necesario
Para realizar este tutorial, necesitarás:
- Raspberry Pi 4 (también funciona con todas las versiones anteriores)
- Módulo RFID Mifare RC522 (incluye KeyCard)
-
- Utensilios para soldar
Si deseas utilizar el lector de tarjetas como control de entrada, etc., tiene sentido entregar una tarjeta a cada usuario y las puedes comprar con chip en cantidades cada vez mayores por poco dinero y luego configurarlas individualmente.
Configurar tarjetas
Si tienes la tira de pines del módulo RC522 estan sin soldar, lo primero que tienes que hacer es soldarlos antes de poder conectar los pines.
El cableado es el siguiente:
Módulo RF522 | 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,3 V | Pin 1 (3V3) |
El resultado final debería ser algo así:
Activación de la instalación de software y SPI
Para utilizar el módulo RFID RC522, necesitas el bus SPI, para lo cual tenemos que activar esta interfaz en primer lugar, para ellos edita el archivo config o ve al menú correspondiente, si lo haces por el archivo config, sigue estos pasos:
sudo nano /boot/config.txt
Agrega esas líneas al final del archivo:
device_tree_param = spi = on dtoverlay = spi-bcm2708
Guarda y sal con CTRL + O, CTRL + X.
Luego activamos SPI:
sudo raspi-config
Activa en "Opciones avanzadas"> "SPI" y confirma el reinicio (alternativamente utiliza sudo reboot now
).
Luego puedes usar dmesg | grep spi
para verificar si el módulo se ha cargado.
La salida del comando debe darte algo asi:
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)
Ahora debes cargar los paquetes adecuados para poder usar el bus SPI y cargaremos bibliotecas relacionadas, para ellos escribe esto
sudo apt-get install git python-dev - yes
Primero instalamos el módulo Python SPI
clone de git https://github.com/lthiery/SPI-Py.git cd SPI-Py sudo python setup.py install CD ..
clone de git https://github.com/mxgxw/MFRC522-python.git && cd MFRC522-python
Prueba del lector / grabador RFID Raspberry Pi
Además del módulo RC522, normalmente se suministra una tarjeta blanca y un llavero compatible con NFC. Estas partes se pueden utilizar como autenticación porque se pueden escribir y leer. También se podría usar un teléfono inteligente con NFC (Android / iOS).
Para ejecutar la primera prueba de la tarjeta / llavero, ejecutamos el script:
sudo python Read.py
Tan pronto como la tarjeta con chip se aproxime al lector y se reconozca, verás una salida como esta:
pi @ raspberrypi: ~ / MFRC522-python $ sudo python Read.py Bienvenido al ejemplo de lectura de datos MFRC522 Presione Ctrl-C para detener. Tarjeta detectada Tarjeta de lectura UID: 69,245,238,117 Tamaño: 8 Sector 8 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Para cambiar los datos almacenados (números) en el chip de la tarjeta, editamos el archivo “Write.py” ( sudo nano Write.py
). Para hacer esto, edita el código de la línea 55 de la siguiente manera (puedes elegir libremente los 16 números data
entre 0 y 255.
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"
"""
|
Uso del lector NFC / RFID en proyectos de Raspberry Pi (cerradura de puerta, etc.)
Los dos archivos de Python "Read.py" y "Write.py" contienen un código de muestra para leer y escribir un chip que se puede utilizar en otros proyectos. El archivo más importante es “MFRC522.py”, que se puede copiar en otro proyecto.
El siguiente extracto se puede utilizar en otros proyectos, por ejemplo, como verificación de una cerradura con código o una cerradura de puerta. Utiliza un nivel de autenticación (también puedes establecer varios) con un cierto código inicial. Los últimos dígitos proporcionan información sobre el titular de la tarjeta (si esos datos están almacenados en algún lugar). Solo podría identificar al usuario por el UID, pero supongo que varias tarjetas pueden pertenecer a un usuario. Si no te gusta esta solución, puedes, por supuesto, cambiarla.
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
|
El código de muestra se ve así (los cambios anteriores son importantes, de lo contrario no se puede realizar ninguna comparación):
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]
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()
|
Como puedes ver, el código es muy simple y, como dije, solo debería servir como un inicio para empezar tus propias aplicaciones más sofisticadas. El código que he puesto lo deberás ajustar si lo quieres emplear en otro tipo de proyectos.
Compartir esta publicación
- Etiquetas: tutorial