La tecnología de Identificación por Radiofrecuencia (RFID) ha revolucionado la forma en que interactuamos con la información y los objetos en nuestro entorno. Desde sistemas de alarma en tiendas hasta la gestión de inventarios en grandes almacenes como Decathlon, las etiquetas y lectores RFID se han convertido en herramientas omnipresentes. Este artículo se adentra en cómo puedes construir tu propio sistema de "backup" o respaldo de información utilizando un microcontrolador Arduino y un módulo lector RFID RC522, permitiéndote almacenar y recuperar datos de manera sencilla y segura.
Comprendiendo los Fundamentos de la Tecnología RFID
Las siglas RFID significan "Radio Frequency Identification", o Identificación por Radiofrecuencia en español. En su núcleo, un sistema RFID consta de dos componentes principales: las etiquetas (o "tags") y los lectores (o "transceptores").
Las etiquetas RFID son pequeños dispositivos que contienen un circuito que actúa como antena, conectado a un chip miniaturizado que almacena la información. Estas etiquetas no se limitan a las típicas tarjetas; también se encuentran en pulseras, etiquetas de ropa, llaveros "tag", e incluso pueden ser incrustadas bajo la piel de animales o humanos. La información almacenada en estas etiquetas puede variar desde identificadores únicos hasta datos más complejos.
Por otro lado, el lector RFID, también conocido como transceptor, es el dispositivo encargado de comunicarse con las etiquetas. Este emisor-receptor emite una señal de radiofrecuencia que energiza las etiquetas dentro de su alcance, permitiéndoles responder transmitiendo la información almacenada. Esta información es luego captada y decodificada por el lector.

Tipos de Etiquetas RFID y su Alimentación
Las etiquetas RFID se clasifican principalmente por su capacidad de lectura/escritura y su método de alimentación.
Existen etiquetas RFID de "solo lectura", cuya información es grabada de forma permanente durante el proceso de fabricación y no puede ser modificada. En contraposición, las etiquetas de "lectura y escritura" permiten la modificación de los datos almacenados, lo que las hace ideales para aplicaciones donde la información necesita ser actualizada.
Respecto a la alimentación, distinguimos entre etiquetas activas y pasivas. Las etiquetas RFID activas poseen su propia fuente de energía, como una batería, lo que les permite tener un rango de lectura considerable, que puede variar entre 10 y 100 metros. Sin embargo, las etiquetas RFID pasivas, que son las más comunes en proyectos de electrónica doméstica y de bajo costo, obtienen su energía por inducción de la onda electromagnética emitida por el lector. Esta dependencia de la energía del lector limita su alcance de lectura a unos pocos centímetros, típicamente entre 2 y 5 cm para módulos como el RC522.
El Módulo Lector RFID RC522: Características y Conexión
El módulo lector RFID RC522 es una opción popular y asequible para integrar la tecnología RFID en proyectos con Arduino. Este módulo se basa en el circuito integrado MFRC522 de NXP Semiconductors y opera en la banda de alta frecuencia (HF) de 13.56 MHz, un estándar común para muchas aplicaciones RFID.
El módulo RC522 presenta varias características clave:
- Antena Integrada: La espiral rectangular plana visible en el módulo es su antena, encargada de emitir las ondas de radiofrecuencia.
- Rango de Lectura: Su alcance máximo de lectura es de aproximadamente 5 cm, lo que lo hace ideal para aplicaciones de proximidad.
- Voltaje de Operación: Opera con un voltaje de 2.5V a 3.3V. Es crucial no conectar el pin VCC a una fuente de 5V de Arduino, ya que esto podría dañar permanentemente el módulo. Se debe conectar a un pin de 3.3V.
- Interfaz de Comunicación: Soporta interfaces SPI, I2C y UART, facilitando su conexión a microcontroladores como Arduino. La comunicación SPI es la más utilizada para este módulo.
- Pin de Interrupción (IRQ): Un pin muy útil que alerta al microcontrolador cuando una etiqueta RFID se acerca al lector, optimizando el consumo de energía.
- Pin de Reset (RST): Permite encender y apagar el módulo. Mantenerlo en estado LOW lo apaga con un consumo mínimo, mientras que un cambio a HIGH lo reinicia.
Conexión del Módulo RC522 a Arduino:
La conexión física del módulo RC522 a una placa Arduino (como Uno, Nano o Mini Pro) se realiza a través de los pines de alimentación y comunicación.
- VCC: Conectar al pin de 3.3V de Arduino.
- GND: Conectar al pin GND de Arduino.
- RST: Se puede conectar a cualquier pin digital de Arduino (por ejemplo, el pin 9).
- Pines SPI:
- SDA/MOSI: Conectar al pin MOSI de Arduino.
- SCK: Conectar al pin SCK de Arduino.
- MISO: Conectar al pin MISO de Arduino.
- SS/SDA: Este pin tiene múltiples funciones dependiendo de la interfaz configurada. Para SPI, generalmente se utiliza como Slave Select (SS) y se conecta al pin digital designado como SS en Arduino (normalmente el pin 10 en Arduino Uno).
Es importante verificar la tolerancia de voltaje de la placa Arduino a la que se conectará. Si la placa no es tolerante a 5V, podría ser necesario utilizar un adaptador de nivel lógico entre el módulo y Arduino.

Programando el Lector RFID con Arduino
La comunicación entre Arduino y el módulo RC522, aunque compleja a nivel de programación, se simplifica enormemente gracias a librerías dedicadas. Una de las más populares y robustas es la desarrollada por Miguel Balboa. Esta librería abstrae gran parte de la complejidad del protocolo de comunicación, permitiendo a los desarrolladores centrarse en la lógica de la aplicación.
Para comenzar, deberás instalar la librería MFRC522 en tu Entorno de Desarrollo Integrado (IDE) de Arduino. Una vez instalada, puedes cargar uno de los ejemplos de código proporcionados por la librería para familiarizarte con su funcionamiento.
Un ejemplo básico para leer la información de una tarjeta RFID implica los siguientes pasos:
- Incluir la Librería:
#include <MFRC522.h> - Definir Pines: Especificar los pines de Arduino a los que se han conectado el RST y el SS del módulo RC522.
- Inicializar el Módulo: Crear una instancia de la clase MFRC522 y su objeto
mfrc522. - Iniciar Comunicación: En la función
setup(), inicializar la comunicación serial y el módulo RFID. - Buscar Tarjetas: En la función
loop(), verificar continuamente si hay una nueva tarjeta presente en el lector. - Leer UID: Si se detecta una tarjeta, leer su Identificador Único (UID) y mostrarlo por el monitor serial. El UID es un número único asignado por el fabricante a cada etiqueta RFID.
El siguiente fragmento de código ilustra cómo se podría obtener y mostrar el UID de una tarjeta:
#include <SPI.h>#include <MFRC522.h>#define RST_PIN 9 // Pin RST del RC522#define SS_PIN 10 // Pin SS (SDA) del RC522MFRC522 mfrc522(SS_PIN, RST_PIN); // Crea un objeto mfrc522void setup() { Serial.begin(9600); // Inicia comunicación serial SPI.begin(); // Inicia SPI mfrc522.PCD_Init(); // Inicia el módulo MFRC522 Serial.println(F("Escaneando tarjetas RFID...")); Serial.println(F("Presiona reset para recargar la lista"));}void loop() { // Espera a que se acerque una tarjeta if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // Selecciona una tarjeta if ( ! mfrc522.PICC_ReadCardSerial()) { return; } // Muestra el UID de la tarjeta Serial.print(F("Tarjeta detectada - UID: ")); 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(); // Opcional: Mostrar el tipo de tarjeta Serial.print(F("Tipo de tarjeta: ")); MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak); Serial.println(mfrc522.PICC_GetTypeName(piccType)); delay(4000); // Pequeña pausa antes de volver a escanear}Para ver la salida, debes cargar este código en tu placa Arduino, abrir el "Monitor Serie" en el IDE de Arduino (Ctrl+Shift+M) y acercar la tarjeta que viene con el lector RC522. Es importante mantener la tarjeta cerca del lector hasta que se muestre toda la información.
How to download the RFID library on Arduino IDE
Estructura de Memoria de las Tarjetas MIFARE Classic
Las tarjetas RFID que se utilizan comúnmente con el módulo RC522 son las del tipo MIFARE Classic, específicamente las versiones con 1K de memoria. Estas tarjetas tienen una estructura de memoria organizada en sectores y bloques, lo que permite una gestión detallada de la información.
Una tarjeta MIFARE Classic 1K está dividida en:
- 16 Sectores: Numerados del 0 al 15.
- 4 Bloques por Sector: Cada sector contiene 4 bloques, numerados del 0 al 3.
De estos 4 bloques, solo 3 bloques (bloques 0, 1 y 2) se pueden utilizar para almacenar datos del usuario. El cuarto bloque (bloque 3) se reserva para almacenar las claves de cifrado y los permisos de acceso (Access Conditions) para ese sector. Este bloque se conoce como "bloque Trailer".
Dentro del bloque Trailer, los 16 bytes se distribuyen de la siguiente manera:
- 6 bytes para Clave A: Una de las claves de autenticación del sector.
- 3 bytes para Condiciones de Acceso: Definen los permisos de lectura y escritura para los bloques del sector.
- 6 bytes para Clave B: La otra clave de autenticación del sector.
- 1 byte restante: Generalmente no utilizado o con fines específicos.
Para acceder a cualquier bloque de un sector, es necesario autenticarse primero utilizando la Clave A o la Clave B correspondiente a ese sector, junto con los permisos de acceso definidos.
Seguridad en las Tarjetas MIFARE Classic: Vulnerabilidades y Mejora
Las tarjetas MIFARE Classic, aunque ampliamente utilizadas, presentan deficiencias significativas en su sistema de cifrado. El algoritmo de seguridad propietario de NXP, si bien era innovador en su momento, ha sido objeto de análisis y se ha demostrado que es vulnerable. No se requiere una gran inversión tecnológica para "hackear" estas tarjetas, lo que las hace poco recomendables para aplicaciones de seguridad crítica.
El principal problema radica en que las claves de autenticación (Key A y Key B) y los permisos de acceso se almacenan en el mismo sector que los datos. Si se puede leer el contenido del bloque Trailer, se puede intentar descifrar las claves. Aunque se pueden utilizar claves personalizadas, la seguridad inherente del algoritmo es limitada.
Para mejorar la seguridad, es fundamental:
- Utilizar Claves Propias: No emplear las claves por defecto que vienen con las tarjetas. Generar y utilizar tus propias claves de cifrado únicas.
- No Compartir Claves: Mantener la confidencialidad de las claves A y B para cada sector.
- Cambiar Claves Regularmente: Si la aplicación lo permite, implementar un mecanismo para cambiar las claves periódicamente.
La librería MFRC522 permite modificar estas claves. El proceso general implica autenticarse con las claves actuales, calcular el bloque Trailer y escribir las nuevas claves.
El siguiente código muestra cómo se podría cambiar las claves de un sector específico:
// ... (código de inicialización y lectura de tarjeta)// Función para cambiar las claves de un sectorvoid cambiarKeys(byte sector, byte nuevaKeyA[6], byte nuevaKeyB[6]) { // Calcular el bloque Trailer del sector byte trailerBlock = sector * 4 + 3; // Autenticarse con las claves actuales (asumiendo que se conocen) // Si no se conocen, este proceso fallará. // Aquí se usaría PCD_Authenticate() con las claves antiguas. // Por simplicidad, omitimos la autenticación con claves antiguas para este ejemplo. Serial.print(F("Intentando escribir nuevas claves en el Sector ")); Serial.println(sector); // Escribir las nuevas claves Key A y Key B en el bloque Trailer // (Este es un ejemplo simplificado, la escritura real es más compleja) // mfrc522.MIFARE_Write(trailerBlock, ..., ...); Serial.println(F("Proceso de actualización de claves (simulado).")); Serial.println(F("Ojo: una vez actualices las claves, debes usar las nuevas para acceder."));}// Ejemplo de uso:// byte sectorAEscribir = 15;// byte keyA_nueva[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; // Ejemplo de nueva Key A// byte keyB_nueva[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; // Ejemplo de nueva Key B// cambiarKeys(sectorAEscribir, keyA_nueva, keyB_nueva);Es crucial entender que una vez que se cambian las claves de autenticación de un sector, los datos almacenados en él solo serán accesibles utilizando las nuevas claves. Si se pierden las claves, la información en ese sector se vuelve inaccesible.
Aplicaciones Prácticas: Creando un Sistema de "Backup" Personalizado
La capacidad de leer y escribir datos en tarjetas RFID abre un abanico de posibilidades para crear sistemas de respaldo personalizados. Un ejemplo práctico es simular tarjetas de transporte público recargables, como las utilizadas en sistemas de autobuses o tranvías.
Imaginemos una tarjeta que almacena el número de "viajes" disponibles. Podemos programar el sistema para:
- Recargar la Tarjeta: Aumentar el número de viajes disponibles.
- Consumir Viajes: Disminuir el número de viajes cada vez que se utiliza la tarjeta.
Para esto, necesitamos definir:
- Sector y Bloque de Almacenamiento: Elegir un sector específico (por ejemplo, el sector 15) y un bloque dentro de ese sector (por ejemplo, el primer byte del bloque 0) para almacenar el número de viajes.
- Número de Viajes: Determinar la cantidad máxima de viajes que puede contener la tarjeta y el valor a añadir o restar.
Aquí se presentan fragmentos de código que ilustran estos procesos:
Código para Recargar Viajes:
// ... (código de inicialización y lectura de tarjeta)void recargarViajes(int viajesAAgregar) { byte sector = 15; // Sector donde se almacenan los datos byte bloque = 0; // Bloque dentro del sector byte buffer[18]; // Buffer para leer/escribir datos (16 bytes + padding) // Autenticarse en el sector if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) { if (!mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, sector, &key, &mfrc522.uid)) { Serial.println(F("Error de autenticación para leer datos.")); return; } // Leer el bloque actual if (mfrc522.MIFARE_Read(sector * 4 + bloque, buffer, &size) != MFRC522::STATUS_OK) { Serial.println(F("Error al leer el bloque de viajes.")); return; } int viajesActuales = buffer[0]; // El primer byte almacena el número de viajes int nuevosViajes = viajesActuales + viajesAAgregar; // Asegurarse de no exceder un límite si es necesario // if (nuevosViajes > MAX_VIAJES) nuevosViajes = MAX_VIAJES; buffer[0] = (byte)nuevosViajes; // Actualizar el número de viajes // Volver a autenticarse para escribir if (!mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, sector, &key, &mfrc522.uid)) { Serial.println(F("Error de autenticación para escribir datos.")); return; } // Escribir el bloque actualizado if (mfrc522.MIFARE_Write(sector * 4 + bloque, buffer, 16) != MFRC522::STATUS_OK) { Serial.println(F("Error al escribir el bloque de viajes.")); return; } Serial.print(F("Se agregaron ")); Serial.print(viajesAAgregar); Serial.print(F(" viajes. Total: ")); Serial.println(nuevosViajes); Serial.println(F("Proceso de recarga finalizado.")); }}// Ejemplo de uso:// recargarViajes(10); // Añade 10 viajes a la tarjetaCódigo para Consumir Viajes:
El código para consumir viajes es muy similar al de recarga, pero en lugar de sumar, se resta.
// ... (código de inicialización y lectura de tarjeta)void consumirViaje() { byte sector = 15; byte bloque = 0; byte buffer[18]; byte size; // Definir la clave A (o B) que se usará para la autenticación. // Debe ser la clave correcta para el sector 15. byte key[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; // Clave por defecto (¡cambiarla!) if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) { if (!mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, sector, &key, &mfrc522.uid)) { Serial.println(F("Error de autenticación para leer datos.")); return; } if (mfrc522.MIFARE_Read(sector * 4 + bloque, buffer, &size) != MFRC522::STATUS_OK) { Serial.println(F("Error al leer el bloque de viajes.")); return; } int viajesActuales = buffer[0]; if (viajesActuales > 0) { int nuevosViajes = viajesActuales - 1; buffer[0] = (byte)nuevosViajes; // Volver a autenticarse para escribir if (!mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, sector, &key, &mfrc522.uid)) { Serial.println(F("Error de autenticación para escribir datos.")); return; } if (mfrc522.MIFARE_Write(sector * 4 + bloque, buffer, 16) != MFRC522::STATUS_OK) { Serial.println(F("Error al escribir el bloque de viajes.")); return; } Serial.print(F("Viaje consumido. Viajes restantes: ")); Serial.println(nuevosViajes); } else { Serial.println(F("No hay viajes disponibles.")); } Serial.println(F("Proceso de consumo finalizado.")); }}// Ejemplo de uso:// consumirViaje(); // Consume un viaje de la tarjetaAl cargar el código de recarga y luego el código de consumo, se puede simular perfectamente el ciclo de vida de una tarjeta de transporte recargable. La tarjeta se acerca al lector, se le añaden viajes, y luego se le restan cada vez que se "utiliza".

Consideraciones Finales y Potencial del RFID con Arduino
La integración de la tecnología RFID con plataformas como Arduino abre un universo de posibilidades, desde sistemas de control de acceso hasta la automatización de tareas en el hogar o en entornos educativos. La relativa simplicidad del hardware, combinado con la potencia de las librerías de software, hace que sea una tecnología accesible para aficionados y profesionales por igual.
El lector RC522, a pesar de su corto alcance, es una herramienta excelente para proyectos que requieren identificación de objetos o personas a corta distancia. Su bajo costo, como se mencionó, hace que kits que incluyen el módulo, una tarjeta y un llavero MIFARE Classic S50 se puedan adquirir por precios muy bajos (alrededor de 1.45€ en distribuidores internacionales). Tarjetas adicionales se pueden conseguir por 0.25€ o etiquetas adhesivas por unos 0.15€.
Es fundamental recordar las limitaciones de seguridad inherentes a las tarjetas MIFARE Classic. Para aplicaciones que requieran un alto nivel de seguridad, se deben explorar tecnologías RFID más avanzadas o implementar capas adicionales de encriptación y autenticación a nivel de software. Sin embargo, para proyectos caseros, educativos o aplicaciones donde la seguridad crítica no es la principal preocupación, el RC522 y las tarjetas MIFARE Classic ofrecen una plataforma robusta y versátil para experimentar y construir.
La tecnología RFID, y en particular el estándar NFC (Near-Field Communication), que es un subconjunto de RFID de alta frecuencia, sigue evolucionando. La creciente adopción de NFC en smartphones abre nuevas vías para la interacción sin contacto. Aunque no todos los sistemas RFID y NFC son compatibles, la tendencia es hacia una mayor interoperabilidad.
En resumen, construir un sistema de "backup" con Arduino y tarjetas RFID es un proyecto gratificante que no solo enseña sobre el funcionamiento de estas tecnologías, sino que también permite crear soluciones prácticas y personalizadas. Ya sea para gestionar inventarios, crear sistemas de control de acceso sencillos o simular sistemas de pago y transporte, el mundo del RFID con Arduino está al alcance de tu mano.