Identificar tarjetas RFID con Arduino

Una vez que hicimos andar nuestro módulo RC522 con Arduino, lo siguiente es intentar hacer algo nosotros como Identificar tarjetas RFID y hacer algo interactivo, pero obviamente los ejemplos a veces no son suficientes. En esta presentación les dejo los principios del uso de la librería que presenté en la página básica de RFID para identificar tarjetas RFID y hacer algo asociado a la identificación.

Las funciones que necesitamos conocer

Para identificar tarjetas RFID es necesario conocer algunas funciones basicas de la librería que nos permitirán leer una tarjeta y acceder a su número único de identificación, que es el dato básico con el que trabajaremos hoy. Quiero aclarar antes de comenzar, que luego veremos técnicas para ampliar esta identificación y evitar la clonación de tarjetas, algo muy común y simple de hacer y encontrar, pero por ahora veamos como leer y procesar tarjetas.

mfrc522.PICC_IsNewCardPresent()

Esta función/método nos dice si hay una tarjeta presente frente a nuestro módulo. No implica lectura o escritura alguna, y es el primer paso para leer una tarjeta, es decir, antes de leer una tarjeta debemos verificar que haya una presente.

mfrc522.PICC_ReadCardSerial()

Esta función/método es la que finalmente le pide al módulo que lea la tarjeta presente. La lectura es simplemente de su identificador único o ID, y no de sus registros internos. Recuerde que muchas tarjetas tienen la capacidad de almacenar datos y los mismos pueden ser leídos por el módulo.

mfrc522.uid

Este es el registro que representa el ID de la tarjeta. Su estructura es como sigue:

typedef struct {
    byte		size;			// Numero de bytes en el UID. 4, 7 o 10
    byte		uidByte[10];
    byte		sak;
} Uid;

Y básicamente lo más impotante es mfrc522.uid.size que nos dice el tamaño del ID de la tarjeta, que según el tipo puede ser de 4, 7 o 10 bytes, y mfrc522.uid.uidByte[] que es un array de 10 bytes. Obviamente en las tarjetas con ID de 4 bytes solo se usan los primeros 4 bytes del array.

Sketch para identificar tarjetas RFID

// Importamos la libreria general para comunicaciones por SPI
#include <SPI.h>
// Importamos la libreria para el modulo
#include <MFRC522.h>

// Los pines que usamos para conectarnos
#define RST_PIN 9          
#define SDA_PIN 10 // Tambien conocido como SS

MFRC522 mfrc522(SDA_PIN, RST_PIN);  

void setup() {
  // Iniciamos el Monitor serial
  Serial.begin(9600);
  
  // Iniciamos el SPI
  SPI.begin();
  
  // Iniciamos el modulo
  mfrc522.PCD_Init();
  
  Serial.println("Pase una tarjeta por el modulo para ver su ID...");
}

void loop() {
  // Si hay tarjeta nueva presente la leemos
  if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) {
    
    // Mostramos el ID de la tarjeta leída
    Serial.print("ID tarjeta: ");
    for (byte i = 0; i < mfrc522.uid.size; i++) {
      if(mfrc522.uid.uidByte[i] < 0x10) {
        Serial.print(" 0");
      }
      else {
        Serial.print(" ");
      }
      
      Serial.print(mfrc522.uid.uidByte[i], HEX);
    }
    
    Serial.println();
    
    // Despues de leer una tarjeta esperamos 1 segundo antes de seguir (para evitar multiples lecturas)
    delay(1000);
  }
}

Para probar el Sketch debe conectar su módulo usando las instrucciones en la página básica del RC522 que puede consultar aqui.

Identificar tarjetas RFID con Arduino

10 comentarios en “Identificar tarjetas RFID con Arduino”

  1. Hola, quería consultar, si yo cargo el programa, incluyo las librerías y todo pero al momento de pasar alguna tarjeta no lee nada… ¿que podría estar pasando?
    aclaro también que la luz roja del modulo RFID está prendida en todo momento…
    gracias de antemano.

    • Hola Gerardo, pueden estar pasando muchas cosas. La comunicación puede que no esté bien establecida. Una opcion es comprobar los cables y conectores. El I2C solo funciona conectado de la manera correcta. Otra opcion es que el modulo esté fallado, tenés opcion de probar con otro módulo?

  2. Buenas tardes.
    Muy interesante todo.
    Estoy interesado en evitar la clonación de tarjetas RFID, y dices que es algo muy facil.
    Podrías explicarnos como hacerlo?

    Gracias.

    • Quiero aclarar que no siempre es facil, y facil no significa al alcance de todos. Preferiría no explicar como clonar tarjetas (no queremos promover delitos sin querer). En lugar de eso, explicaré métodos de como reconocer tarjetas clonadas que me parece mucho más util. Igualmente, el problema de las tarjetas clonadas es característico de las tarjetas simples, como las del ejemplo. Hay tarjetas mucho más complejas y avanzadas que no pueden clonarse facilmente, pero requieren otro tipo de hardware (electrónica) para leerlas. En estas tarjetas, el truco para capturar una tarjeta clonada es grabar algo en ella cada vez que la leemos. Es cierto que le disminuimos la vida util, pero muchas veces el precio es más que justificado. Si por ejemplo grabas la hora en que la tarjeta es leida por ultima vez, en la siguiente lectura alguna de las 2 tarjetas fallará (porque no tendrá la hora adecuada grabada). Espero eso te ayude sino en breve lo explicaré con un ejemplo paso a paso con código. Gracias por escribirnos!

  3. Hola , estoy tratando de que el lector me tire un 1 cuando no hay tarjeta presente , y el numero de la tarjeta si esta esta , esto es para decidir en el software si se saco la tarjeta del lector , tengo problemas con isnewcardpresent . es como que devuelve tru y falso en todo momento , no se si me explico , intento que si hay tarjeta me devuelva el numero de la misma y si no hay un 1 o 0 …me das una mano por favor ?? gracias

    • Para hacer lo que quieres deberías hacer una función que resuelva lo que queres. Un ejemplo de ello sería:


      double function verificarTarjeta() {
      if (mfrc522.PICC_IsNewCardPresent()) {
      if (mfrc522.PICC_ReadCardSerial()) {
      // Acá construyes o conviertes el numero de la tarjeta como quieres
      // y lo pones en una variable double de nombre cardNumber

      // Y luego solo la retornas
      return cardNumber;
      }
      }
      return 0;
      }

  4. Hola, tengo un problema con mi módulo RC522, ocurre que lee las dos tarjetas que vienen con el, sin embargo, al momento de leer una tarjeta foranea esta no la reconoce ni la lee, ¿Sabes qué pueda ser?

    • Hola Natalia. En general los problemas para leer tarjetas tienen que ver con el tipo de tarjeta. Sucede que no todos los tipos de tarjeta son iguales y el RC522 solo lee algunos tipos de tarjeta. En específico, lee los siguientes tipos de tarjetas: Mifare1 S50, Mifare1 S70, MIFARE Ultralight, Mifare Pro, and MIFARE DESFire. Espero te sirva el dato. Saludos!

    • Hola Melissa, eso dependerá del modoen que trabajes. El Sketch que compartí es básico y usa la muy conveniente función PICC_IsNewCardPresent(). La ventaja de dicha función es que solo devuelve true cuando hay una tarjeta NUEVA, osea que evita las lecturas duplicadas que suelen ser un dolor de cabeza en programación. Prueba con 2 tarjetas y lee una y luego la otra intercaladas y no tendrás problemas. No he probado como leer la misma tarjeta más de una vez seguida, pero un truco que se me ocurre y que yo probaría es inicializar el módulo luego de una lectura, con una llamada a mfrc522.PCD_Init();

Deja un comentario