Introducción

RFID (siglas de Radio Frequency IDentification, en español identificación por radiofrecuencia) es un sistema de almacenamiento y recuperación de datos que usa dispositivos denominados tags RFID, o etiquetas. El propósito fundamental de la tecnología RFID es transmitir la identidad de un objeto (similar a un número de serie único) mediante ondas de radio.

Las etiquetas RFID (RFID Tag, en inglés) son unos dispositivos pequeños, similares a un adhesivo, que pueden ser adheridas o incorporadas a un producto, un animal o una persona. Contienen antenas para permitirles recibir y responder a peticiones por radiofrecuencia desde un emisor-receptor RFID. Las etiquetas pasivas no necesitan alimentación eléctrica interna, mientras que las activas sí lo requieren.

Las tarjetas cuentan con un número único de identificación, es como su huella digital, con este podemos individualizar cada usuario, producto, objeto o animal que porte el tag.

Tipos de Tags

Tipos de lectores y/o Escritores RFID

En Colombia es común encontrar estas tarjetas y lectores, algunas credenciales de visita, la tarjeta Cívica del Metro de Medellín, el peaje automático sin operador (puede verse el sensor de peaje en la segunda foto arriba a un lado de la flecha verde), entre otros.

Experimento

Lectura de dos tarjetas RFID, identificar sus números únicos UID y a partir de ellos realizar una acción.

Hardware

  • Computador
  • Arduino UNO

  • Cable USB

  • Jumpers (mínimo 7)

  • Módulo RFID

  • Tags

Software

  1. Arduino IDE
  2. Librería RFID, usaremos aquí la librería diseñada por Miguel Balboa (https://github.com/miguelbalboa/rfid)

El Documento de Miguel Balboa hace unas sugerencias de conexiones para algunos Arduinos y otros microcontroladores

Esta recomendación fue seguida y tuvimos éxito inmediato

Para saber el UID de un tag se debe usar el siguiente código:

/*

  ---#Bibliolabs---

  Programa para la lectura de tags RFID
  muestra unicamente el UID de la tarjeta en el
  monitor serial

  Creado por el grupo de Experimentación Tecnológica del
  Sistema de Bibliotecas Públicas de Medellín

  Daniel Cuartas Quiceno  - Tallerista #Bibliolabs

  Pines usados:
   --------------------------
               Arduino
               Uno
   Señal       Pin
   --------------------------
   RST/Reset   9
   SPI SS      10
   SPI MOSI    11 / ICSP-4
   SPI MISO    12 / ICSP-1
   SPI SCK     13 / ICSP-3
*/

//incluimos las dos lbrerías necesarias
#include <SPI.h>
#include <MFRC522.h>

#define RST_PIN         9          // Estos dos pines son configurables
#define SS_PIN          10

// Se crea una instancia MFRC522 con los pines anteriores
MFRC522 mfrc522(SS_PIN, RST_PIN);


void setup() {

  Serial.begin(9600); //Se inicia la comunicación serial
  SPI.begin();			  // Se inicia la comunicación SPI
  mfrc522.PCD_Init(); // Se inicializa MFRC522

}

void loop() {
  //Se verifica que la tarjeta no sea igual a la anterior para evitar errores de lectura y loops infinitos
  if (mfrc522.PICC_IsNewCardPresent()) {
    //Se llama la función getID() encargada de devolver el valor UID de cada tarjeta
    unsigned long uid = getID();

    //Si la tarjeta es válida, continúe
    if (uid != -1) {
      //Muestra el UID
      Serial.println(uid, HEX);
    }
  }
}

//------------------------------------------------------------------
//Función para devolver el UID
//------------------------------------------------------------------

unsigned long getID() {
  if ( ! mfrc522.PICC_ReadCardSerial()) { //Si no es una tarjeta válida regrese con un valor "-1", si es válida, continúe
    return -1;
  }
  byte hex_num[4];
  unsigned long uid;

  hex_num[0] = mfrc522.uid.uidByte[0];
  hex_num[1] = mfrc522.uid.uidByte[1];
  hex_num[2] = mfrc522.uid.uidByte[2];
  hex_num[3] = mfrc522.uid.uidByte[3];
  uid  =  (long)hex_num[0] << 24;
  uid += (long)hex_num[1] << 16;
  uid += (long)hex_num[2] << 8;
  uid += (long)hex_num[3];
  mfrc522.PICC_HaltA(); // Stop reading
  return uid; //Regresa con el valor del UID
}

Comenzamos subiendo el ejemplo DumpInfo y lo subimos para comprobar que las conexiones hechas son las adecuadas. luego de esto comenzó la modificación del código para el fin propuesto en un principio.

/*
 
 ---#Bibliolabs---
 
 Creado por el grupo de Experimentación Tecnológica del 
 Sistema de Bibliotecas Públicas de Medellín

Daniel Cuartas Quiceno  - Tallerista #Bibliolabs
----------------------------------------------------
Daniela Maury Pineda    - B. Fernando Gómez Martínez
----------------------------------------------------
Héctor David López      - PB. San Cristóbal
----------------------------------------------------
Vanessa De Los Rios     - B. La Floresta
----------------------------------------------------
Anderson Silva          - P.B San Antonio de Prado
----------------------------------------------------
Mariluz García          - P.B. España
----------------------------------------------------
Camilo Giraldo          - B. El Limonar
----------------------------------------------------

  Pines usados:
   --------------------------
               Arduino
               Uno
   Señal       Pin
   --------------------------
   RST/Reset   9
   SPI SS      10
   SPI MOSI    11 / ICSP-4
   SPI MISO    12 / ICSP-1
   SPI SCK     13 / ICSP-3
*/

//incluimos las dos lbrerías necesarias
#include <SPI.h>      
#include <MFRC522.h>

#define RST_PIN         9          // Estos dos pines son configurables
#define SS_PIN          10         

MFRC522 mfrc522(SS_PIN, RST_PIN);  // Se crea una instancia MFRC522

//Se declara cada libro con su UID
unsigned long principito = 15061;
unsigned long cienAnos = 4294964596;

void setup() {

  SPI.begin();			// Se inicia la comunicación SPI
  mfrc522.PCD_Init();		// Se inicializa MFRC522
}

void loop() {
  //Se verifica que la tarjeta no sea igual a la anterior para evitar errores de lectura y loops infinitos
  if (mfrc522.PICC_IsNewCardPresent()) {

    //Se llama la función getID() encargada de devolver el valor UID de cada tarjeta
    unsigned long uid = getID();

    //Si la tarjeta es válida, continúe
    if (uid != -1) {

      //Según el UID leido realice una acción, en este caso devolver el nombre del libro en la consola serial
      switch (uid) {
        case 15061:
          Serial.println("PRINCIPITO"); Serial.println(uid);
          break;
        case 4294964596:
          Serial.println("CIEN AÑOS DE SOLEDAD "); Serial.println(uid);
          break;
        //Si no coincide con ningún UID en la base de datos, realice lo siguiente:
        default:
          break;
      }
    }
  }
}

//------------------------------------------------------------------
Función para devolver el UID
//------------------------------------------------------------------

unsigned long getID() {
  if ( ! mfrc522.PICC_ReadCardSerial()) { //Si no es una tarjeta válida regrese con un valor "-1", si es válida, continúe
    return -1;
  }
  //Se lee cada byte del UID y se almacena en la variable temporal hex_num
  unsigned long hex_num;
  hex_num =  mfrc522.uid.uidByte[0] << 24;
  hex_num += mfrc522.uid.uidByte[1] << 16;
  hex_num += mfrc522.uid.uidByte[2] <<  8;
  hex_num += mfrc522.uid.uidByte[3];
  mfrc522.PICC_HaltA(); // Luego de finalizar la lectura del UID detenga la comunicación
  return hex_num; //Regresa con el valor del UID
}

Al detectar la tarjeta Tag Blanca se imprime en la consola “PRINCIPITO”

Al detectar el llavero Tag azul se imprime “CIEN AÑOS DE SOLEDAD”

Programa para lectura de UID

Luego de simplificar el código de ejemplo y buscar lo que es realmente esencial, buscamos entre el datasheet del lector y foros en la comunidad open-source la manera de extraer únicamente el número UID en valor hexadecimal

/*

  ---#Bibliolabs---

  Creado por el grupo de Experimentación Tecnológica del
  Sistema de Bibliotecas Públicas de Medellín

  Daniel Cuartas Quiceno  - Tallerista #Bibliolabs

  Pines usados:
   --------------------------
               Arduino
               Uno
   Señal       Pin
   --------------------------
   RST/Reset   9
   SPI SS      10
   SPI MOSI    11 / ICSP-4
   SPI MISO    12 / ICSP-1
   SPI SCK     13 / ICSP-3
*/

//incluimos las dos lbrerías necesarias
#include <SPI.h>
#include <MFRC522.h>

#define RST_PIN         9          // Estos dos pines son configurables
#define SS_PIN          10

MFRC522 mfrc522(SS_PIN, RST_PIN);  // Se crea una instancia MFRC522


void setup() {
  Serial.begin(9600);
  SPI.begin();			// Se inicia la comunicación SPI
  mfrc522.PCD_Init();		// Se inicializa MFRC522

}

void loop() {
  //Se verifica que la tarjeta no sea igual a la anterior para evitar errores de lectura y loops infinitos
  if (mfrc522.PICC_IsNewCardPresent()) {
    //Se llama la función getID() encargada de devolver el valor UID de cada tarjeta
    unsigned long uid = getID();

    //Si la tarjeta es válida, continúe
    if (uid != -1) {
      //Muestra el UID
      Serial.println(uid,HEX);
    }
  }
}

//------------------------------------------------------------------
//Función para devolver el UID
//------------------------------------------------------------------

unsigned long getID() {
  if ( ! mfrc522.PICC_ReadCardSerial()) { //Si no es una tarjeta válida regrese con un valor "-1", si es válida, continúe
    return -1;
  }
  byte hex_num[4];
  unsigned long uid;

  hex_num[0] = mfrc522.uid.uidByte[0];
  hex_num[1] = mfrc522.uid.uidByte[1];
  hex_num[2] = mfrc522.uid.uidByte[2];
  hex_num[3] = mfrc522.uid.uidByte[3];
  uid  =  (long)hex_num[0] << 24;
  uid += (long)hex_num[1] << 16;
  uid += (long)hex_num[2] << 8;
  uid += (long)hex_num[3];
  mfrc522.PICC_HaltA(); // Stop reading
  return uid; //Regresa con el valor del UID
}