MIFARE RC522 + Arduino

19
242
Siguiendo con los tutoriales de Arduino, les presento ahora cómo puedes trabajar con un módulo de radio frecuencia para leer tarjetas. Voy a trabajar con el módulo RFID RC522 y exploraremos muchas inquietudes que se tienen con este módulo principalmente porque no hay mucha documentación en español para la interacción con Arduino. Podemos obtenerla en Ebay o en Amazon, con la misma compañía que adquirí el LCD HD44780 a poco más de 8.66 USD.

MIFARE es un conjunto de chips ampliamente utilizados en aplicaciones que implican tarjetas inteligentes sin contacto, es decir tarjetas de proximidad y es propiedad de la reconocida NXP Semiconductores. El módulo de RFID que estaré utilizando posee el chip MIFARE RC522, un circuito integrado de lectura/escritura utilizado para la comunicación sin contacto operado bajo una frecuencia de 13.56 MHz a 3.3 V. También posee un cristal de cuarzo de 27.12 MHz.

Las tarjetas que trae este módulo son la estándar S50 de color blanco que puede ser personalizada a través de una impresora de sublimación y la S50 en formato llavero. Ambas tarjetas proveen un número único de identificación de 32 bits y funcionan en base a tecnología NFC (Neard Field Communication) o bien en español, comunicación de campo cercano que permite la comunicación entre dispositivos que estén próximos uno del otro utilizando inducción magnética.

A pesar que este módulo opera a 3.3 V, el chip RC522 también puede operar a 2.5 V. Puede trabajar con distintos protocolos de bajo nivel seriales tipo SPI, UART, o I2C. Sin embargo, este módulo está diseñado para trabajar únicamente con SPI. Si aún no sabes cómo funciona este protocolo te invito a que visites el artículo ¿Cómo funciona el protocolo SPI? en donde comento los conceptos básicos del funcionamiento de este protocolo.

Materiales:

Paso 1: Creando el circuito

Conocer el mapeado de este módulo con la placa Arduino UNO fue difícil de conseguir ya que hay pocos lugares en internet que suministran la información correcta. Con un poco de investigación se puede llegar hasta el mapeado correcto.

MFRC522 ARDUINO
SDA 10
SCK 13
MOSI 11
MISO 12
GND GND
RST 9
3.3 V 3.3 V

Este mapeado se utiliza con la librería RFID MFRC522 que ofrece Miguel Balboa, que bien es una de las mejores librerías que encontré, sin embargo no hace mucho énfasis en la conexión de hardware. Es importante notar que la corriente de operación esperada para operar el módulo está entre el rango de 13-25 mA, la salida de 3.3 V del Arduino UNO drena una corriente máxima de 50 mA, pero en condiciones de operación la corriente no supera más de los 8 mA, siendo estos datos obtenidos a través de un multímetro mientras me encontraba haciendo las pruebas.

Paso 2: Creando el programa

Para utilizar el siguiente código, asumiendo que estas trabajando en un sistema Linux/GNU primero debes tener a disposición la librería de Miguel, esto lo puedes hacer clonando el repositorio:

Y luego mover la librería hacia la carpeta libraries dentro de la carpeta Arduino ubicada en tu directorio de usuario

Una vez que tengas la librería a disposición copia el siguiente código:

Las tarjetas utilizadas en este módulo poseen un pequeño circuito integrado que funciona en base a inducción electromagnética, cuando ésta está lo suficientemente cercana a la antena (casi unos 10 mm) el campo electromagnético que produce la antena genera un voltaje inducido que le permite al circuito integrado energizarse y así en un corto tiempo leer su correspondiente número de identificación.

El código consiste en almacenar esa lectura en las variables serNumX y compararlas cada vez que se hace la lectura de tarjeta y define si el número de identificación es distinto o no.

Los pines de RST (reset) y SDA son configurables, así que no es necesario que los tengas en los pines 10 y 9. Al usar SPI con respecto a I2C, se tiene la ventaja que las velocidades de transmisión son mucho más altas que las de I2C. Para el RC522 utilizando SPI se puede tener velocidades de hasta 10 Mbit/s, aunque se utiliza más líneas que el I2C.

Para observar la lectura serial, podemos abrir la consola serial que posee arduino y listo =)

Paso 3: Presentación del proyecto

mifare-rc522-arduino-3 mifare-rc522-arduino-2mifare-rc522-arduino-3mifare-rc522-arduino

  • Mauricio Peña

    Disculpa y si no tengo un sistema Linux, será que pueden proporcionarme la libreria para un sistema windows?

    • Antony García González

      Que librería?

  • Antony García González

    Necesitas crearle una interfaz de software, ya sea en Python o quizás Java

  • Meixter

    oye tengo una inquietud, es que no he podido identificar donde está instalado mi Arduino IDE para poder usar completo el comando ‘mv rfid ~/Arduino/libraries’, sin embargo me aparece instalado en el buscador de ubuntu, podrías darme un indicio de donde podría haber quedado instalado Arduino?

  • Carto

    Hola
    he copiado el codigo para ver como funciona el modulo RC522 y al compilarlo arduino me da el siguiente error:

    modulo_rfid522:59: error: invalid conversion from ‘byte {aka unsigned char}’ to ‘MFRC522::PICC_Type’ [-fpermissive]

    Serial.println(rfid.PICC_GetTypeName(piccType));
    I:documentosArduinolibrariesrfid-master/MFRC522.h:388:36: error: initializing argument 1 of ‘static const __FlashStringHelper* MFRC522::PICC_GetTypeName(MFRC522::PICC_Type)’ [-fpermissive]

    static const __FlashStringHelper *PICC_GetTypeName(PICC_Type type);

    ^

    exit status 1
    invalid conversion from ‘byte {aka unsigned char}’ to ‘MFRC522::PICC_Type’ [-fpermissive]

    gracias de antemano

  • ojcorona

    Necesito ayuda, tengo 2 meses que compre un arduino y entre mi kit habia un RFID-RC522 hoy intente hacerlo funcionar y me marca errores, algo de lo que me di cuenta es que aqui en la publicacion manejan el #include y en la libreria de miguel balboa utiliza el MFRC522.h intente cambiando la instancia rfid por MFRC522 y resulta que no reconoce las clases, alguien puede ayudarme, gracias de antemano.

    • ¿Podrías colocar el código que estas ejecutando en un fpaste o algo similar?

      Saludos.

      • He actualizado el código para que funcione correctamente.
        Gracias por la observación.

  • Juan Lopez

    Y para I2C como seria un ejemplo?, la conexion supongo seria con los pines SDA y MISO, ademas de 3.3v y GND

    • PanamaHitek

      El chip acepta ya sea SPI, I2C y UART como métodos de comunicación serial, sin embargo lo librería actualmente no implementa ha implementado para I2C, únicamente está disponible mediante SPI. Saludos,

  • antonio cruz

    hola muy excelente información agradeceria si me informara de como puede escribir en la tarjeta S50 con arduino uno RFID-RC522 este es mi correo tonycruz2050@gmail.com.

    • PanamaHitek

      Antonio, sería bueno crear un artículo de cómo hacerlo. Voy a ver si para esta semana lo puedo hacer. Un saludo.

      • antonio cruz

        Me parece perfecto, esperare el articulo muchas gracias. Saludos.

        El jue, 28 de mayo de 2015 19:26, Disqus escribió:

        • PanamaHitek

          Antonio, aún queda pendiente el artículo. He estado bastante saturada estos últimos meses. Pronto tendremos el artículo.

    • PanamaHitek

      Como aún no hemos subido un artículo, si te urge puedes usar el método MIFARE_Write.

  • Francisco Jose del Campo

    Hola Kiara, buen post, pero creo que los && (and) del if que comprueba si los valores leídos en una tarjeta (rfid.serNum[0], rfid.serNum[1], etc.) son diferentees de las variables definidas (serNum0, serNum1, etc) deben ser || (or), ya que en caso contrario dos tarjetas con valores 45,190,115,8,232 y 189,56,121,8,244 serían tomadass por la misma, precisamente por el valor 8 en ambas tarjetas en la cuarta posición.
    Según el if todos los valores deberían ser diferetnes por culpa de los &&.

    Un saludo.

    • PanamaHitek

      Buenas Francisco. Estuve viendo el código y realmente tienes razón.
      Muchísimas gracias por pasarte, leer el artículo y darnos ese feedback.
      Arreglado.

  • Gastón Charkiewicz

    Hola Kiara, muy buen post, explicado de una forma muy clara.

    Puede ser que las siguientes dos líneas de imports:
    //Agregamos las librerias necesarias
    #include
    #include

    …tengan que ser sustituídas por:
    #include
    #include

    • PanamaHitek

      Gastón, muchísimas gracias por comentar.
      Tienes toda la razón. Se me olvidó copiar las librerías.
      Arreglado. 😀