Lee tarjetas RFID en tu Raspberry Pi de forma muy sencilla
En este artículo te mostramos cómo trabajar con el módulo RFID en Raspberry Pi. RFID es una tecnología de tarjetas inalámbricas de uso muy común, es posible que tengas alguna ya en casa por el trabajo, el gimnasio, etc. Es un proyecto sencillo que puedes combinar con otros para realizar cosas muy interesantes.
Contenidos
Listado de componentes
Necesitarás los siguientes componentes básicos para realizar este proyecto.
- Raspberry Pi con el sistema operativo Raspbian: hemos utilizado la versión 3, pero las librerías no son específicas de este modelo. También funcionará en otras versiones, aunque es posible que necesites instalar más librerías para trabajar con los módulos RFID.
- Módulo RFID RC522, que utiliza la interfaz SPI.
- Placa de prototipado rápido.
- Cables de prototipado. Necesitaremos cables macho-hembra para realizar las conexiones. También puedes realizar las conexiones directamente sin usar la placa de prototipado, directamente de la Rpi al módulo.
Cableado del módulo RFID RC522
La siguiente tabla muestra una lista de las conexiones necesarias. Tenemos una imagen que te enseñará dónde están los pines de tu raspberry pi. En general, los módulos RC522 vienen serigrafiados con la descripción de los distintos pines.
RC522 label | RC522 Pin | Rpi pin | GPIO label |
SDA | 1 | 24 | GPIO 8 |
SCK | 2 | 23 | GPIO 11 |
MOSI | 3 | 19 | GPIO 10 |
MISO | 4 | 21 | GPIO 9 |
GND | 6 | 25 | GND |
RST | 7 | 22 | GPIO 25 |
3.3V | 8 | 1 | 3.3V |
Realiza el cableado con tu Raspberry Pi apagada. ¿Tienes el cableado listo? ¡Revísalo! Un cableado erróneo podría dañar el módulo o tu Raspberry Pi. Revísalo varias veces antes de conectar la corriente de nuevo.
Realiza el cableado con tu Raspberry Pi apagada
Configuración de la Raspberry Pi
Necesitarás Habilitar la interfaz SPI que emplea el módulo. Para ello, puedes hacerlo desde la terminal o desde el menú gráfico, como te resulte más cómodo.
Habilitar SPI desde la terminal
Antes de empezar, realizaremos una actualización para tener todo a punto:
$sudo apt-get update $sudo apt-get upgrade
Ahora ya podemos realizar la configuración. Llamamos a la utilidad de configuración y navegamos por los menús para activar el módulo.
$sudo raspi-config
Habilitar SPI desde raspbian
Si estamos utilizando la interfaz gráfica, bien sea directamente conectados a un monitor o a través de VNC, podemos navegar por los menús para activar la configuración:
Instalación de librerías
Para utilizar el módulo RFID RC522 necesitaremos instalar unas cuantas librerías que trabajan con SPI. Crearemos una carpeta para nuestro proyecto, utilizaremos git para descargar el código y python para instalar las librerías.
Las librerías que utilizaremos son:
https://github.com/lthiery/SPI-Py.git – Para poder utilizar hardware SPI como una extensión C para Python
https://github.com/mxgxw/MFRC522-python.git – Pequeños ejemplos para poder interactuar con el ódulo RFID-RC522
Abre una terminal y sigue los pasos para realizar la instalación:
pi@raspberrypi:~ $sudo apt-get install python2.7-dev pi@raspberrypi:~ $ mkdir rfid pi@raspberrypi:~ $ cd rfid pi@raspberrypi:~ $ git clone https://github.com/lthiery/SPI-Py.git pi@raspberrypi:~ $ cd SPI-Py/ pi@raspberrypi:~ $ sudo python setup.py install pi@raspberrypi:~ $ cd .. pi@raspberrypi:~ $ git clone https://github.com/mxgxw/MFRC522-python.git pi@raspberrypi:~ $ cd MFRC522-python
Ejecución del ejemplo
Sitúate en el directorio donde hemos descargado MFRC52-python y ejecuta el siguiente comando:
pi@raspberrypi:~ $ python Read.py
La última línea ejecuta un programa para leer las tarjetas. Si tienes todo conectado, acerca una tarjeta RFID al lector y podrás ver su identificador en cuanto la acerques. Puedes ver una imagen de ejemplo a continuación.
Sugerencias de proyectos
La tecnología RFID se puede usar en infinidad de proyectos, tan sólo necesitas un poco de imaginación para combinar el código de lectura que aqui mostramos con cualquier proyecto que se te ocurra. Algunos ejemplos serían:
- Control de acceso, gestión de entradas/salidas.
- Una cerradura controlada por tarjetas.
- Una librería de música que tiene una tarjeta para cada disco.
- Control de inventario
- ¿Se te ocurre algo más? ¡Te esperamos en los comentarios?
steve disculpa, estoy intentando utilizar una rfid con una frecuencia de 902-928 Mhz, la cual utiliza Wiegand estándar a 26 / 34 Bits. El hecho es que no se si pueda utilizar como tal el poducto
Hola , muyt interesante la publicacion. Ayuda por favor tengo ocupados fisicamente los pin en el raspberry desde el 1 hasta el 26 con una pantalla touch. PUEDO UTILIZAR OTROS PINESy que puedo hacer en este caso?
Felecitaciones. Le agradeceria si me puede asesorar, pretendo colocar un RC522 pero tengo ocupado fisicamente desde el PIN 1 hasta el PIN 26 con una pantalla de 5″, existen otros pines que pueda ocupar ?
hola, gran información me podrían aconsejar como hacer que un programa que tengo en la raspberry pi pudiera hacerla funcionar con la RFID
hola disculpa a mi me sale este error. Pudieras ayudarme de favor, saludos.
pi@raspberrypi:~/rfid/MFRC522-python $ python Read.py
/home/pi/rfid/MFRC522-python/MFRC522.py:133: RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warnings.
GPIO.setup(self.NRSTPD, GPIO.OUT)
Traceback (most recent call last):
File «Read.py», line 41, in
MIFAREReader = MFRC522.MFRC522()
File «/home/pi/rfid/MFRC522-python/MFRC522.py», line 135, in __init__
self.MFRC522_Init()
File «/home/pi/rfid/MFRC522-python/MFRC522.py», line 406, in MFRC522_Init
self.MFRC522_Reset();
File «/home/pi/rfid/MFRC522-python/MFRC522.py», line 138, in MFRC522_Reset
self.Write_MFRC522(self.CommandReg, self.PCD_RESETPHASE)
File «/home/pi/rfid/MFRC522-python/MFRC522.py», line 141, in Write_MFRC522
spi.transfer(((addr<<1)&0x7E,val))
TypeError: function takes exactly 2 arguments (1 given)
En el último paso, clona este fork en lugar del que pone, está arreglado:
git clone https://github.com/naleefer/MFRC522-python.git
hola buenas, cuando ejecuto el Read.py me da este error de a continuación:
~/rfid/MFRC522-python $ python Read.py
/home/pi/rfid/MFRC522-python/MFRC522.py:133: RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warnings.
GPIO.setup(self.NRSTPD, GPIO.OUT)
Traceback (most recent call last):
File «Read.py», line 41, in
MIFAREReader = MFRC522.MFRC522()
File «/home/pi/rfid/MFRC522-python/MFRC522.py», line 135, in __init__
self.MFRC522_Init()
File «/home/pi/rfid/MFRC522-python/MFRC522.py», line 406, in MFRC522_Init
self.MFRC522_Reset();
File «/home/pi/rfid/MFRC522-python/MFRC522.py», line 138, in MFRC522_Reset
self.Write_MFRC522(self.CommandReg, self.PCD_RESETPHASE)
File «/home/pi/rfid/MFRC522-python/MFRC522.py», line 141, in Write_MFRC522
spi.transfer(((addr<<1)&0x7E,val))
TypeError: function takes exactly 2 arguments (1 given)
alguna idea de como solucionarlo? un saludo
Tenéis un error de bulto en la documentación: El IRQ de la placa RC522 tiene que ir conectado al pin 18 de la raspberry pi (GPIO 24).
Si no, os dará el error que se reporta aquí:
https://stackoverflow.com/questions/54847012/raspberry-pi-3b-and-rfid-rc522-python-typeerror
Un saludo y enhorabuena por el artículo.
buen dia, consulta tengo un lector de tarjeta por usb rfid reader que necesito que cuando alguien este habilitado active un rele asi desde ahi para acceso de puerta etc
saludos y gracias
Ariel
Hola Ariel,
en principio, lo que comentas es sencillo, pero necesitarás estar un poco familiarizado con programación para ello. El código para el rfid reader depende del fabricante, así que sin conocer el modelo no podemos saber si es compatible con la librería que aquí usamos. Respecto a activar un relé, es muy sencillo dado que las GPIO de la Raspberry pi pueden hacerlo sin problemas (necesitas un módulo externo de relé). Por último, para saber si alguien está o no habilitado tienes que tener una base de datos con los códigos de las tarjetas para saber quien tiene acceso.
Como ves, son tres proyectos en uno (relé, tarjeta y base de datos). Nos parece un proyecto muy interesante el combinar las tres cosas, de hecho tenemos en el tintero artículos similares ¡anímate a hacerlo y plantéanos cualquier duda que te pueda surgir!
Un saludo,
Admin.
No se si alguien te la ha preguntado pero se puede hacer interface graficas en Python de forma que al dar acceso salga una foto o parecido?
Hola Jose,
si, en Python se pueden hacer interfaces gráficas para casi cualquier plataforma. Si tienes interés, para trabajar en escritorio te recomendamos QT Creator y Kivy. Este último es un proyecto bastante completo, que te permite hacer aplicaciones multiplataforma. Si tienes algo de familiaridad con la web, hoy en día la tendencia es a hacer aplicaciones en el navegador. Tenemos un artículo donde mostramos los controles de una cámara web en html, con un servidor flask (python), que quizás te ayude para empezar tu proyecto.
El control de acceso con una imagen, del tipo que tienen en los gimnasios con tarjetas RFID, es un proyecto muy interesante y se puede hacer completamente con python y raspberry pi.
Un saludo,
Admin.
Hola, para hacer el proyecto usando Python 3, que se requiere hacer?
Hola Jose,
perdona, se nos había escurrido tu comentario y no lo habíamos visto hasta ahora. Pues tendría que probarlo. Danos un par de días que tenemos que desempolvar el lector de pruebas. Si lo pruebas antes y tienes algún error, déjanos un comentario a ver si es algo sencillo de solucionar.
Un saludo,
Admin.
Muy buen aporte , tengo una pregunta : que lector RFID es compatible con rasberry que característica debo tener en cuenta. Gracias
Hola Stiven,
disculpa por el retraso, se nos han quedado algunos comentarios sin responder. El módulo RFID RC522 que mencionamos en el artículo es compatible con la Raspberry Pi, pero en general cualquier módulo que tenga interfaz SPI (Serial Peripheral Interface) debería funcionar. Lo que solemos hacer nosotros es buscar las palabras RFID junto con la raspberry pi, o arduino. Si dudas sobre un módulo concreto puedes enviarnos un enlace o el datasheet y trataremos de ayudarte.
Un saludo,
Admin.
steve disculpa, estoy intentando utilizar una rfid con una frecuencia de 902-928 Mhz, la cual utiliza Wiegand estándar a 26 / 34 Bits. El hecho es que no se si pueda utilizar como tal el poducto
Hola, estoy haciendo la prueba pero con una NFC Tag Sticker NTAG216 (888bytes). Cuando hace la lectura, da un error de authenticación.
Sólo muestra: Card detected, el Card read UID, en size indica que es 4, pero en sector indica el error.
Qué cambios se le pueden hacer al código?
Gracias
Hola, tengo este proyecto entre manos pero utilizando un LAMP Stack y haciendo alguna cosita más. He probado tu guía y todo va bien hasta que ejecuto el Read.py que ejecuta el programa y se queda esperando a que le acerque la tarjeta o la llave. En cuanto lo hago, no muestra nada. He probado también el write.py por si necesitara escribirla primero por si de fábrica viniese vacía (No se exactamente como funcionan las tarjetas) pero me pasa lo mismo. No me sale ningún error, todo parece ir bien pero no muestra nada.
El sistema que tengo montado es sobre una Raspberry Pi 3 Model b con Raspbian stretch lite, no se si será por esto. Para asegurarme que tenía bien las conexiones me he instalado el pinout y en teoría son así tal como describes y se supone que las tengo bien. No se muy bien como mirar donde está el problema. Surfeando un poco vi que comentaban que esto era conocido y que se solucionaba con un rpi-update, el cual ejecuté sin cambio alguno, vamos sigue igual…
Hola Carlos,
efectivamente, hubo un pequeño lío en una versión de Raspbian Jessie cuando cambiaron unos drivers, pero debería de estar solucionado (https://github.com/raspberrypi/linux/issues/1547).
por favor, comprueba los siguientes puntos de nuevo:
-Reinicia tu raspberry.
-Que SPI esté habilitado (lee /boot/config.txt y comprueba que tienes dtparam=spi=on)
-Que tengas las librerías instaladas (la versión de python dev para 2.7 también)
-Que python 2.7 sea tu versión de pyton por defecto.
-Que uses exactamente el mismo hardware para leer las tarjetas.
-Revisa el cableado. Escríbelo. Revísalo de nuevo. Es la principal fuente de problemas, pues hay confusión entre GPIO y los pines.
Lo cierto es que el tutorial está hecho con raspbian jessie, no lo hemos probado con stretch. Estamos en medio de otro proyecto, en cuanto lo terminemos actualizaremos y comprobaremos, salvo que nos digas que ya te funciona ;-). ¿Podrías coger otra sd e instalar Jessie a ver si te funciona? De este modo no cambias tu sistema y saldríamos de dudas.
Un saludo,
admin.
Me parece una excelente aportación este tutorial, justo estaba buscando como comenzar un proyecto que me asignaron, ahora solo debo investigar como hacer la interfaz gráfica (alguna sugerencia) había trabajado anteriormente con raspberry pi pero en otra clase de proyecto donde no requería una interfaz gráfica o programa ejecutable como tal, me considero un novato en ese sentido.
Gracias por tu comentario, nos alegramos de que te haya sido útil el tutorial. Te recomendaría que, si estás empezando y quieres algo sencillo, utilizases la librería Tkinter, pues es la estándar para crear interfaces gráficas en proyectos sencillos. No me atrevo a recomendar una guía en español pues parece que hay muchas incompletas. Si te interesa más hacer una página web, el framework Django sería la solución si querés hacerla en python, aunque quizás sea excesivo para un proyecto pequeño. En cualquier caso, déjanos un comentario con lo que decidiste hacer, ¡igual con tu experiencia nos animamos y hacemos un tutorial sobre interfaces gráficas en el futuro! .
Muchas gracias, a ciencia cierta ya estoy comenzando con este proyecto, esta interesante, tomare la lectura del tag id, este consultara a una base de datos en mySQL, si encuentra el registro activará una señal digital para abrir una cerradura, al mismo tiempo debo desplegar la información en pantalla del nombre del usuario de ser posible una foto he estado buscando por la web y aun no se si me convendría realizar la interfaz en java y mandar a llamar el modulo python, o hacer todo en python, me gustaría mas adelante aportarlo dado que es un tema que se frecuenta mucho hoy en día, agradezco la atención
El proyecto suena muy interesante. La elección de la interfaz a este nivel ya es muy particular, dependiendo del software con el que uno esté familiarizado. Particularmente, opinamos que la tendencia hoy en día es crear una API con los servicios que queramos ofrecer, y luego realizar el front-end en cualquier lenguaje llamando a la API. De este modo, el proyecto quedaría modular y flexible, permitiendo en un futuro integrar la aplicación con otras aplicaciones o dispositivos móviles, por ejemplo. Java es un lenguaje muy popular para la creación de APIs, si bien ofrecer servicios en python también puede hacerse de manera muy sencilla con frameworks como Flask o Django. Para la parte de visualización del usuario, Java puede usarse perfectamente para desarrollar una aplicación tradicional de escritorio, si bien la tendencia hoy en día es desarrollar aplicaciones web, donde otros lenguajes como Javascript y sus múltiples Frameworks (Angular, React, etc) son más comunes. Como decimos, una elección particular, y nos alegraremos de seguir escuchando sobre este interesante proyecto.
Hola @admin. Estoy haciendo un proyecto con Django como servidor el cual está orientado a usuarios de edad avanzada o con cierta incapacidad para manejar cualquier interfaz con un ratón y un teclado. Es por ello que hago uso de comandos de voz para mostrar una seria de fotos y videos en una galería multimedia. Para el inicio de sesión, estoy usando un RPi como cliente, en el cual uso el lector RFID RC522 con las librerías que citas anteriormente para leer un código RFID previamente asociado a cada usuario, y de esta forma loguear al usuario. Es una manera más accesible de iniciar sesión sin tener que escribir con un teclado las credenciales. Es mi primer proyecto con Django y dado a que tengo una estructura cliente-servidor, mi problema es que no sé como comunicar el script python de lectura del RFID con el servidor de Django. Pues el lector está conectado sólo en el cliente. ¿Qué enfoque tengo que seguir, que herramientas puedo usar?. Llevo aquí atascado varios días buscando una solución.
Manual de 10, se entiende y se puede llevar a cabo facilmente, yo en concreto e utilizado una Raspberry Zero y funciona a las mil maravillas. Muchas gracias por ello, ya que estaba completamente desanimado viendo que mucha gente lo había intentado y no había podido.
La única pregunta que tengo, para imprimir estos caracteres en HEX ?? Tengo ya un sistema montado y lo hago todo a traves de HEX, y cambiar ahora todo a esto, me es dificil.
Gracias por tu comentario. Si te desenvuelves con python, puedes hacer una función que convierta cada dígito en hexadecimal de forma muy sencilla:
def twoDigitHex( number ):
… return ‘%02x’ % number
El 02 le dice que te lo escriba en dos dígitos y la x indica que lo escriba en hexadecimal con minúsculas. Puedes hacer un bucle que lea uno a uno los caracteres llamando a la función e imprima el resultado. ¡Un saludo!.
a mi no me lee la tarjeta por favor ajuda
Realmente, con esa información es imposible ayudarte. Te diría que comprobaras las conexiones con un tester, que te aseguraras de que las librerías están bien instaladas, y claro, que des un poco más de información acerca del error. Puedes preguntarme por aquí, pero si te desenvuelves con el inglés te sugeriría poner la pregunta en https://www.stackoverflow.com es el mejor sitio para preguntar cuando algo no va bien, pues está lleno de profesionales que pueden responderte si les proporcionas la información adecuada.
que buena información , tengo una duda , si yo quisiera conectar mas de un lector de tarjetas como podría hacerlo ., hay algún limite por la cantidad de puertos gpio . saludos
En principio no, pero es seguro que necesitarás alguna modificación en el código para que funcione. He encontrado este proyecto en github que hace justo eso, así que quizás pueda ayudarte: https://github.com/erivandoramos/TwoRC522RPi