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.

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:

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.

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:

Ejecución del ejemplo

Sitúate en el directorio donde hemos descargado MFRC52-python y ejecuta el siguiente comando:

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?
(Visto 7.881 vecess, 1 visitas hoy)
¡Comparte este articulo!

25 pensamientos en “Lee tarjetas RFID en tu Raspberry Pi de forma muy sencilla

  1. 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)

  2. 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

  3. 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

    1. 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.

  4. 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?

    1. 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.

    1. 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.

  5. Muy buen aporte , tengo una pregunta : que lector RFID es compatible con rasberry que característica debo tener en cuenta. Gracias

    1. 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.

  6. 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

  7. 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…

    1. 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.

  8. 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.

    1. 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! .

      1. 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

        1. 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.

          1. 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.

  9. 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.

    1. 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!.

    1. 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.

  10. 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

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Publicaciones relacionadas

Comienza escribiendo tu búsqueda y pulsa enter para buscar. Presiona ESC para cancelar.

Volver arriba