01 julio 2013

Utilizando el lector NFC RC522 en la Raspberry Pi

La tecnología de Near Field Communications (NFC) se ha vuelto muy popular desde hace un par de años, al incluirse en teléfonos móviles, tarjetas de crédito e incluso pasaportes.

Hace unos días, adquirí algunos lectores NFC para intentar conectarlos a la Raspberry Pi para un par de proyectos que tengo en mente. Esta será una extremadamente-corta entrada, donde les explicaré los avances en su uso y funcionamiento y les compartiré el código que he utilizado para hacer funcionar el módulo lector.





El módulo RFID


Las tecnologías de identificación por radio-frecuencia (RFID) cubren una amplia gama de estándares. Los dispositivos con NFC son aquellos que funcionan utilizando inducción magnética y trabajan a una frecuencia de 13.56MHz.

Usualmente las etiquetas RFID funcionan como simples códigos de barra, es decir, simplemente reportan un número que es identificado por el lector. El estándar NFC tiene la característica particular que permite el envío y recepción de datos, de manera adicional existen estándares que ofrecen cifrado en la comunicación lo que permite almacenar información "sensible" y protegerla en la transmisión. Piensen en las tarjetas de crédito y los pasaportes.

El módulo que elegí es el MF522-AN, este "kit" me gustó mucho porque incluye un pequeño llavero NFC, una tarjeta "S50",, una tableta de pruebas con antena incluida y los pines necesarios que facilitan la conexión.

Este módulo se comunica por medio de la interfaz I2C o SPI. Esta entrada no vamos a detenernos mucho en explicar como funciona esta interfaz ya que lo que más nos interesa saber, es que es una forma muy fácil de conectar sensores a tabletas controladores, en nuestro caso, a la Raspberry Pi.

Configurando nuestra Raspberry Pi


El puerto GPIO posee soporte tanto para I2C como para SPI. Antes de conectar el módulo debemos habilitar el soporte de la siguiente manera:

Editamos el siguiente archivo:

/etc/modprobe.d/raspi-blacklist.conf

Una vez abierto debemos comentar la línea:

blacklist spi-bcm2708

El archivo nos deberá quedar como se muestra aquí:

# blacklist spi and i2c by default (many users don't need them)

#blacklist spi-bcm2708
blacklist i2c-bcm2708

Reiniciamos nuestra Raspberry Pi y verificamos que existan los dispositivos con el comando "ls":

pi@raspberrypi ~ $ ls /dev/spidev0.*
/dev/spidev0.0  /dev/spidev0.1

Conectando el Módulo


La conexión del módulo es sumamente sencilla como se mostró en la imagen al inicio:


Solo tengan cuidado de no invertir las líneas MOSI y MISO y conectarlas justo como se muestra en el diagráma.

Antes de continuar... Una brevísima explicación de la interfaz SPI


En proyectos anteriores hemos utilizado el puerto serial para Leer/Escribir datos. Dicho puerto tiene la ventaja de que resulta muy fácil de utilizarse y podemos fácilmente procesar los datos que recibimos.

Tanto I2C como SPI son interfaces para comunicación entre circuitos. Este tipo de interfaz utiliza un "bus" para comunicarse es decir un solo cable sirve para enviar o recibir datos desde distintos dispositivos.. Para el caso de SPI tenemos escencialmente 4 líneas:
  • MOSI: Master Out Slave In, por esta línea se envían datos en forma serial desde el dispositivo "maestro" a los dispositivos esclavos.
  • MISO: Master In Slave Out, por esta línea los dispositivos esclavos envían datos al dispositivo maestro.
  • SCK/SCLK: Línea de reloj, aquí se envía un tren de pulsos que se encarga sincronizar las comunicaciones entre los dispositivos.
  • CE: Cada dispositivo tiene una línea de "habilitado", en el dispositivo maestro deberían de haber tantas líneas de habilitado como dispositivos esclavos existan. Los dispositivos esclavo en cambio solo tienen una línea CE que les indica cuando tienen que enviar/recibir datos. En este ejemplo la linea SDA hace las veces de "CE" en nuestro lector NFC.
La interfaz SPI si bien "utiliza" más líneas que I2C tiene la ventaja de que alcanza altas velocidades de transferencia (1Mbps), además su implementación usualmente resulta más sencilla ya que utiliza simples línea serie.



El código fuente...


Primero, necesitamos descargar una pequeña biblioteca que nos permitirá acceder al puerto SPI en la Raspberry Pi en python GitHub con el siguiente comando:

git clone https://github.com/lthiery/SPI-Py

Nos cambiamos a la carpeta SPI-Py y ejecutamos:

sudo python setup.py install


Una ves haya terminado descargamos el código fuente de la clase que controla el lector NFC:

git clone https://github.com/mxgxw/MFRC522-python


Para ejecutarlo, simplemente nos cambiamos a la carpeta MFRC522-python y ejecutamos:

sudo python MFRC522.py


Esta vez no voy a explicar en detalle el funcionamiento ya que es bastante más complicado que una comunicación serial simple.  Pero intentando resumir un poco el código se encarga de inicializar el lector NFC y mantenerse leyendo continuamente para detectar una tarjeta y leer el ID correspondiente.


MIFAREReader = MFRC522()

while continue_reading:
  (status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)
 
  if status == MIFAREReader.MI_OK:
    print "Card detected"

  (status,backData) = MIFAREReader.MFRC522_Anticoll()
  if status == MIFAREReader.MI_OK:
    print "Numero de la tarjeta: "+str(backData[0])+","+str(backData[1])+","+str(backData[2])+","+str(backData[3])+","+str(backData[4])


Importante:  Esta es una re-escritura en Python del código de ejemplo para Arduino, aún no está completo, por el momento solo permite detectar el tipo de tarjeta y leer el número de identificación. Conforme pase el tiempo actualizaré el resto de funciones.

Sin embargo, con esta funcionalidad muy "sencilla" de lectura del ID podrían generar una secilla aplicación de llave electrónica.


Unas cuantas fotos



Por último les comparto unas cuantas fotos del lector conectado funcionando y del programa en ejecución desde la Raspberry Pi.







No habiendo nada más que decir... ¡Hasta la pŕoxima!


Más información y fuentes


5 comentarios:

Marco Santucci dijo...
Este comentario ha sido eliminado por el autor.
Surfparadise dijo...

Hola Mario, acabo de leer tu post y es muy interesante. Justo ahora me comprè uno de esos cacharro. :-D

Pero eventualmente por escribir las informaciones en una tarjeta...como se puede hacer? Tiene ya un codigo preparado? Hay un instruccion especial?

Gracias,

gex dijo...
Este comentario ha sido eliminado por el autor.
gex dijo...

hola estoy tratando de utilizar este código de ejemplo, pero hasta ahora no lo he conseguido por el hecho de que la biblioteca no está instalado o reconocido ltieri, utilizo python3.2 y por casualidad me refiero a ¿cómo podría solucionar este problema?

chemitaxis dijo...

Hola, qué tal= Una pregunta, donde has conseguido los plastiquitos negros que unen los cables con la tarjeta RC522?

Mil millones de gracias por el artículo...

Saludos!!