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 3.984 vecess, 2 visitas hoy)

13 comentarios sobre “Lee tarjetas RFID en tu Raspberry Pi de forma muy sencilla

  • el 26/08/2018 a las 6:26 pm
    Permalink

    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

    Respuesta
  • el 13/04/2018 a las 7:38 am
    Permalink

    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…

    Respuesta
    • el 14/04/2018 a las 7:56 pm
      Permalink

      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.

      Respuesta
  • el 16/03/2018 a las 6:59 pm
    Permalink

    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.

    Respuesta
    • el 21/03/2018 a las 12:08 am
      Permalink

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

      Respuesta
      • el 21/03/2018 a las 11:23 pm
        Permalink

        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

        Respuesta
        • el 22/03/2018 a las 10:54 pm
          Permalink

          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.

          Respuesta
  • el 26/10/2017 a las 1:21 pm
    Permalink

    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.

    Respuesta
    • el 18/11/2017 a las 6:35 pm
      Permalink

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

      Respuesta
  • el 16/10/2017 a las 4:33 pm
    Permalink

    a mi no me lee la tarjeta por favor ajuda

    Respuesta
    • el 18/11/2017 a las 6:31 pm
      Permalink

      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.

      Respuesta
  • el 12/10/2017 a las 8:26 pm
    Permalink

    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

    Respuesta

Deja un comentario

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