Cómo leer tags RFID con el MFRC522 y un Arduino UNO

RFID es una tecnología para identificar objetos mediante etiquetas RFID con un código único. Para conocer ese código, llamado UID, se necesita de un lector.

Antes de continuar te invitamos a leer esta guía que elaboramos sobre el RFID para conocer los conceptos que usaremos aquí. ¿Qué es el RIF y en dónde se usa?

Con este tutorial aprenderás a leer el UID de una etiqueta pasiva usando un Arduino UNO y el módulo MFRC522.

Este módulo trabaja con la frecuencia de 13.56 MHz. Es común en el desarrollo de proyectos RFID con Arduino y otras tarjetas de desarrollo por lo que es normal encontrarlo soldado en una PCB y con su antena incorporada. Utiliza el protocolo SPI para comunicarse con los microcontroladores, en este caso el Atmega328P.

Gráfico de pinout del lector RFID MFRC522.
Gráfico de pinout del lector RFID MFRC522.
Voltaje de operación2.5 – 3.6
Frecuencia 13.56 MHz
ProtocolosSPI, I²C y UART.
Detalles técnicos del MFRC522

Aquí puedes ver el datasheet del MFRC522: M112132_NXP_FSpec_RC522_20070515

¿Qué necesitamos?

  • Arduino UNO o cualquier otro modelo.
  • Cable USB correspondiente al Arduino.
  • Lector MFRC522.
  • Etiquetas RFID: se pueden adquirir junto al MFRC522.
  • Cables dupont hembra-macho.
  • Editor de código Arduino. Descarga aquí.
  • Librería MFRC522.

Conectando el MFRC522

En esta tabla puede ver los pines que se usarían para conectar el MFRC522 con distintas placas de desarrollo.

MFRC522Arduino UNOArduino MEGAArduino NanoESP32
SDA1053105
SCK13521318
MOSI11511123
MISO12501219
RQNo conectado No conectado No conectado No conectado
GNDGND GND GND GND
RST95922
3.3V3.3V 3.3V 3.3V 3.3V

Nota

Para usar el ESP32 con el editor de Arduino te invitamos a seguir esta guía: Conociendo al ESP32.

Dejamos a tu disposición el diagrama de conexión para el Arduino UNO. Recuerda alimentar el MFRC522 con 3.3 Voltios, de lo contrario podría dañarse. 

Gráfico de conexión entre un MFRC522 y un Arduino UNO.
Conexión entre un Arduino UNO y un MFRC522.
Arduino UNO conectado a un MFRC522 junto a dos etiquetas RFID pasivas.
Arduino UNO conectado a un MFRC522 junto a dos etiquetas RFID pasivas.

Programando nuestro lector

Librerías

Necesitamos dos librerías para utilizar el MFRC522. 

La primera librería será para usar el protocolo SPI y viene al instalar el editor de Arduino.

La segunda librería se llama MFRC522. Esta librería nos dará las funciones para controlar el módulo y leer los tags.

Descargar librería MFRC522: GitHub – miguelbalboa/rfid: Arduino RFID Library for MFRC522

Instalando librería

Sigue los pasos para añadir la librería del MFRC522. Ve al menú Herramientas y después da clic en Administrar Bibliotecas o presiona la combinación de teclas Ctrl+Mayús(Shift)+I.

Captura del menú de Herramientas del editor de Arduino.

Busca mfrc522 e instala la opción desarrollada por GithubCommunity.

Captura del gestor de librerías de Arduino.

Presiona en el botón Descargar correspondiente a la librería.

Listo, ahora podemos continuar.

Subiendo y probando el código

Este código sirve para leer una tag RFID e imprimir su UID en el monitor serial.

/* 
 *  Lectura de tag RFID con el MFRC522 y Arduino
 *  Henry Mera
 *  https://todoMaker.com 
*/

//Añadir librerías
#include <SPI.h>
#include <MFRC522.h>

//Declaración de los pines que se usarán en la comunicación SPI.
const int RST_pin = 9; //Pin para resetear el módulo
const int SS_pin = 10; //Pin de selección del módulo/esclavo. También llamado SDA.
//Creación del objeto mfrc522
MFRC522 mfrc522(SS_pin, RST_pin);

void setup() {
  Serial.begin(115200); //Inicia puerto serial
  SPI.begin(); //Inicia comunicación por SPI
  mfrc522.PCD_Init(); //Inicia el módulo MFRC522 con el nombre de objeto declarado anteriormente
}

void loop() {
  /*
   * PICC_IsNewCardPresent(): Indica si se ha detectado un tag cerca al lector.
   * PICC_ReadCardSerial(): Lee la información dentro del tag.
  */
  if (mfrc522.PICC_IsNewCardPresent()) {
    if (mfrc522.PICC_ReadCardSerial()) {
      Serial.print("UID: ");
      /*
       * mfrc522.uid.size: Almacena el tamaño del UID.
       * mfrc522.uid.uidByte: almacena cada byte del UID.
       * 
       * Los byte se concatenarán en un array. Se usa mfrc522.uid.size como 
       * referencia de cuántas veces repetir el proceso.
       * 
       * El UID será mostrado en formato hexadecimal en el monitor serie.
      */
      for (byte i = 0; i < mfrc522.uid.size; i++) {
        Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
        Serial.print(mfrc522.uid.uidByte[i], HEX);
      }
      Serial.println(); //Imprime un salto de línea.
      mfrc522.PICC_HaltA(); //Resetea el módulo para estar disponible a nuevas lecturas.
    }
  }
  delay(250);
}

Ahora veremos una explicación detallada del código.

Agregamos las librerías para la comunicación SPI entre el Arduino y el MFRC522.

También se añade la librería que nos ayudará a controlar las funciones del lector RFID.

#include <SPI.h>
#include <MFRC522.h>

Con esta parte declaramos el pin de Arduino que se usará para resetear el lector. Con SS_pin seleccionamos el módulo MFRC522 como un esclavo

const int RST_pin = 9; //Pin para resetear el módulo
const int SS_pin = 10; //Pin de selección del módulo/esclavo. También llamado SDA.

Con esto creamos un objeto llamado mfrc522 y añadimos los pines que declaramos antes para que se pueda realizar la comunicación.


MFRC522 mfrc522(SS_pin, RST_pin);

Dentro de setup daremos inicio al monitor serial. Esto nos servirá para imprimir datos en la pantalla.

Se inicia la comunicación mediante SPI.

PCD_Init() es la instrucción de la librería para activar el lector. Al llamar una función de la librería se pone el nombre del objeto que creamos, un punto y la instrucción.

Serial.begin(115200);
SPI.begin();
mfrc522.PCD_Init();

mfrc522.PICC_IsNewCardPresent() y mfrc522.PICC_ReadCardSerial() entregan valore booleanos. Osea que pueden ser verdaderos o falsos.

En palabras sencillas, al poner la primera función en una condicional if es como si le preguntáramos al lector ¿Detectaste una etiqueta RFID? Si la respuesta es sí quiere decir que un tag está dentro del área de lectura.

Después de eso seguimos con otra condición. En este caso el programa continuará su ejecución si es que se ha realizado la lectura del tag que detectamos anteriormente.

if (mfrc522.PICC_IsNewCardPresent()) {
    if (mfrc522.PICC_ReadCardSerial()) {

Esta repetición nos mostrará el UID en formato hexadecimal.

Hay que tener en cuenta que mfrc522.uid.size es la longitud en bytes del UID. Con esto se establece un límite de veces que se repetirá el ciclo.

La variable también “i” nos servirá con mfrc522.uid.uidByte[i] para indicar que posición del UID que imprimiremos en la pantalla.

La primera posición es el espacio 0. Cuando se complete esa parte “i++” sumará una unidad a “i” y eso hará que se imprima la posición siguiente. Este ciclo se reptirá mientras “i” sea menor a mfrc522.uid.size.

Es como si unieras pequeños cuadros de papel y el resultado fuese una tira larga.

for (byte i = 0; i < mfrc522.uid.size; i++) {
        Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
        Serial.print(mfrc522.uid.uidByte[i], HEX);
}

Finalmente imprimiremos un salto de línea para no mezclar el contenido que llegue después. Y reiniciaremos el lector para que esté listo cuando se detecte otro tag.

Serial.println(); //Imprime un salto de línea.
mfrc522.PICC_HaltA();

Después de copiar el código conecta tu tarjeta Arduino a la PC, selecciona el puerto correcto y presiona el botón para subir el código.

Botón para subir código del MFRC522 a Arduino UNO.

Abre el monitor serial y acerca una tag RFID al lector. Verás como aparece la UID.

Menú para abrir monitor serial en Arduino.

Cada vez que acerquemos un tag se mostrará su UID en el monitor serial. En esta caso estamos usando la tarjeta y llavero mostrados anteriormente.

Monitor serial de Arduino mostrando los UID de tags RFID.
Monitor serial mostrando las UID de dos tags RFID.

Conclusiones

Aprendiste a conectar el módulo MFRC522 a una tarjeta de desarrollo y programarla para leer el UID de los tags que estén cerca al lector. Además, entendiste lo que realiza cada parte del código.

Síguenos para aprender a utilizar más módulos y realizar proyectos.

Te invitamos a tomar el curso de Introducción al ESP32: Introducción al ESP32 | TodoMaker’s School

Previous Post
Next Post