
Si alguna vez has pasado por una caja rápida de una gran superficie y has visto cómo, al dejar todos los productos en una bandeja, aparecen automáticamente en la pantalla, ya has visto RFID en acción. No es magia ni telepatía tecnológica: es un sistema basado en radiofrecuencia que permite identificar objetos sin contacto directo, y que puedes replicar en casa con un simple Arduino y un lector económico como el RC522.
En esta guía vas a aprender, paso a paso, cómo utilizar Arduino y un lector RFID RC522 para leer y escribir etiquetas, entender qué es exactamente RFID, qué tipos de sistemas existen, cómo se alimentan las tarjetas pasivas, cómo se organiza la memoria de una tarjeta MIFARE Classic 1K y cómo montar proyectos reales como un control de acceso o una tarjeta de transporte recargable. Ponte cómodo, porque vamos a destripar el tema a fondo pero con un lenguaje claro y cercano.
Qué es la tecnología RFID y cómo funciona
La identificación por radiofrecuencia, o RFID (Radio Frequency Identification), es un sistema que permite reconocer objetos mediante un identificador único transmitido por radio. Ese identificador suele llamarse UID (Unique ID) y podríamos verlo como el DNI de la etiqueta. El sistema completo se compone de dos elementos principales: la etiqueta RFID (tag o transpondedor) y el lector RFID (transceptor).
Las etiquetas RFID pueden presentarse en muchos formatos distintos: tarjetas de plástico tipo tarjeta de crédito, llaveros, pegatinas adhesivas que se pegan en productos para evitar robos, e incluso chips implantados bajo la piel de animales para su identificación. Internamente, todas comparten lo mismo: una antena y un pequeño chip que almacena información y se comunica con el lector.
Existen etiquetas de solo lectura, cuyo UID viene programado de fábrica y no se puede modificar, y etiquetas de lectura/escritura, en las que un lector adecuado, como el módulo RC522, puede leer y también grabar datos en la memoria. Esto hace posible aplicaciones como tarjetas de transporte recargables, sistemas de acceso con saldo, control de presencia, etc.
Por otro lado tenemos el lector RFID o transceptor. Este dispositivo no solo se dedica a recibir datos, sino que además emite un campo electromagnético de radiofrecuencia. Ese campo es clave para entender cómo se alimentan las etiquetas pasivas y cómo tiene lugar el intercambio de información entre tarjeta y lector.
Alimentación y principio de funcionamiento de las etiquetas RFID
Una pregunta muy habitual es: si las pegatinas RFID de los productos del súper o las tarjetas de acceso no llevan pila, ¿de dónde obtienen la energía para funcionar? La clave está en que muchas de estas etiquetas son pasivas y se alimentan por inducción electromagnética a partir del campo generado por el lector.
Cuando acercas una etiqueta pasiva a un lector, su antena entra en el campo electromagnético que genera el módulo (por ejemplo, a 13,56 MHz en el caso del RC522). Ese campo induce una corriente en la antena de la etiqueta, que se utiliza para alimentar el chip interno de forma momentánea. Una vez “despierto”, el chip modula la señal que devuelve al lector (a esto se le llama retrodispersión o backscatter), codificando en ella el UID y, si procede, otros datos almacenados en la memoria.
A diferencia de tecnologías como el infrarrojo, no es necesario que haya línea de visión directa entre etiqueta y lector: la radiofrecuencia puede atravesar ciertos materiales, aunque su comportamiento depende de la frecuencia, de la presencia de metal, agua, etc. El lector capta la señal retrodispersada, la interpreta y, a continuación, envía los datos a un microcontrolador (como Arduino, ESP8266 o ESP32) o a un ordenador.
Tipos de sistemas RFID según la frecuencia
El espectro de radiofrecuencia es muy amplio, y las ondas de radio no se comportan igual a todas las frecuencias. Por eso, en RFID se utilizan distintas bandas según la aplicación. Lector y etiqueta tienen que estar diseñados para trabajar en la misma frecuencia, igual que una radio tiene que sintonizar la emisora correcta.
De forma general, podemos agrupar los sistemas RFID en tres grandes categorías según la banda que usan:
- Baja frecuencia (LF): alrededor de 125‑134 kHz.
- Alta frecuencia (HF): en torno a 13,56 MHz, donde se encuadran tecnologías como MIFARE y NFC.
- Ultra alta frecuencia (UHF): entre aproximadamente 433 MHz y 860‑960 MHz.
Sistemas RFID de baja frecuencia (LF)
Los sistemas RFID en baja frecuencia tienen una longitud de onda relativamente grande, lo que les permite penetrar mejor materiales delgados y objetos con alto contenido en agua, como frutas o bebidas. También se comportan razonablemente bien cerca de metales delgados.
Sin embargo, esta ventaja viene con limitaciones importantes: el alcance típico es de solo unos centímetros y la tasa de transmisión de datos es baja, lo que se traduce en memorias reducidas y costes de etiqueta más altos. Son sistemas muy utilizados en control de acceso sencillo, llaves de proximidad antiguas y marcado de animales.
Sistemas RFID de alta frecuencia (HF) y NFC
La banda de alta frecuencia, a 13,56 MHz, es probablemente la más popular a nivel de “maker” y proyectos DIY, porque ahí se encuentran las tarjetas MIFARE y la tecnología NFC (Near-Field Communication) que usan muchos móviles para pagos sin contacto.
Los sistemas HF funcionan bien cerca de metal y en presencia de agua en proporciones medias o altas, y suelen proporcionar un alcance de pocos centímetros hasta en torno a un metro en condiciones ideales. La velocidad de datos sigue siendo modesta, pero suficiente para aplicaciones de identificación, acceso y pequeñas cantidades de información. Muchos estándares globales se basan en HF, lo que facilita la interoperabilidad de equipos y tarjetas.
Sistemas RFID de ultra alta frecuencia (UHF)
En el extremo opuesto tenemos los sistemas UHF, capaces de alcanzar distancias desde algunos centímetros hasta más de 20 metros. Son ideales cuando se necesita leer muchas etiquetas rápidamente y a distancia, por ejemplo, para gestión de inventario en almacenes, conteo de personas en eventos o control de paso en carreras cuando los atletas cruzan la meta.
La contrapartida es que, al tener una longitud de onda más corta, la señal se atenúa más y atraviesa peor el metal y el agua. Aun así, se utilizan extensamente en sistemas de peaje, control de acceso a aparcamientos y seguimiento logístico a gran escala.
El módulo RFID RC522: características y pines
Para proyectos con Arduino, uno de los lectores más populares es el RC522, basado en el chip MFRC522 de NXP. Se trata de un módulo muy económico y extendido, que trabaja en alta frecuencia (13,56 MHz) con tarjetas MIFARE y permite tanto leer como escribir etiquetas compatibles.
Normalmente se vende en un kit que incluye el propio lector, una tarjeta tipo crédito y un llavero RFID. Estas tarjetas suelen ser MIFARE Classic de 1K o 4K, un estándar extremadamente popular en sistemas de transporte, accesos y soluciones de bajo coste. El RC522 genera un campo electromagnético HF y, en la práctica, su alcance útil ronda los 3‑5 cm aunque teóricamente pueda llegar algo más lejos.
En cuanto a la comunicación con el microcontrolador, el RC522 se integra principalmente a través de SPI (Serial Peripheral Interface) y admite velocidades de hasta 10 Mbps. También es compatible con I2C y UART, aunque en la mayoría de ejemplos con Arduino se utiliza SPI por su mayor velocidad y simplicidad en este contexto.
A nivel eléctrico, el módulo trabaja con una tensión de alimentación de entre 2,5 V y 3,3 V. La placa suele traer claramente marcado el pin VCC para conectarlo a 3,3 V. No debes alimentarlo con 5 V directamente o te arriesgas a quemarlo. La parte positiva es que los niveles lógicos suelen ser tolerantes a 5 V, por lo que se puede conectar a pines digitales de Arduino UNO sin necesidad de conversores de nivel para pruebas básicas, aunque en un diseño profesional es aconsejable adaptar niveles.
Pineado del módulo RC522
El RC522 típico incluye 8 pines de conexión hacia el microcontrolador:
- VCC: alimentación, entre 2,5 V y 3,3 V.
- RST: pin de reset; permite apagar y reiniciar el módulo poniendo el nivel a LOW/HIGH.
- GND: masa o referencia de tierra.
- IRQ: pin de interrupción que puede avisar al microcontrolador cuando una etiqueta entra en el campo del lector.
- MISO / SCL / TX: pin multifunción; como MISO en SPI, como SCL en I2C o como TX en UART.
- MOSI: línea de datos de salida del maestro hacia el esclavo en SPI.
- SCK: reloj de la interfaz SPI.
- SS / SDA / RX: pin de selección de esclavo en SPI, SDA en I2C o RX en UART.
En Arduino UNO y otras placas basadas en ATmega328P, los pines SPI están ya definidos por hardware, así que el esquema típico de conexión para usar SPI es:
- VCC → 3,3 V de Arduino.
- GND → GND de Arduino.
- SCK → pin 13 en UNO/Nano.
- MOSI → pin 11 en UNO/Nano.
- MISO → pin 12 en UNO/Nano.
- SS (SDA) → pin 10 (o el que elijas como SS, pero hay que indicarlo en el código).
- RST → por ejemplo, pin 9 de Arduino.
- IRQ → opcional, se puede dejar sin conectar si no se usa interrupción.
En placas como Arduino Mega, Leonardo o Micro, las líneas SPI pueden estar en pines diferentes o en el conector ICSP, así que es importante revisar la tabla de equivalencias de la documentación oficial antes de cablear nada.
Instalación de la librería MFRC522 y lectura básica de etiquetas
Aunque se podría programar el MFRC522 desde cero, la comunicación interna es bastante compleja, así que lo habitual es utilizar la librería desarrollada por Miguel Balboa, disponible en GitHub y en el gestor de bibliotecas del IDE de Arduino. Esta librería encapsula todas las operaciones necesarias para inicializar el lector, detectar tarjetas, autenticar sectores y leer o escribir bloques.
Para instalarla desde el IDE de Arduino, basta con abrir el Gestor de Bibliotecas, buscar “MFRC522” y seleccionar la versión mantenida por la comunidad (Github Community). También es necesario incluir la librería SPI, que ya viene con el propio IDE.
Una vez instalada, el flujo típico en un sketch simple para leer el UID de una etiqueta es:
- Incluir las librerías SPI.h y MFRC522.h.
- Definir los pines RST y SS que usará el lector.
- Crear un objeto MFRC522 pasándole esos pines.
- En setup(), iniciar Serial, SPI y el lector con PCD_Init().
- En loop(), usar PICC_IsNewCardPresent() para saber si hay una tarjeta cerca y PICC_ReadCardSerial() para leer sus datos básicos.
- Acceder al UID mediante mfrc522.uid.uidByte y al tamaño con mfrc522.uid.size.
- Finalizar la comunicación con la etiqueta llamando a PICC_HaltA().
Este tipo de sketch es perfecto para obtener el UID de varias tarjetas o llaveros y hacer pruebas rápidas, por ejemplo, para un control de acceso sencillo donde solo se compara el UID leído con una lista de UIDs autorizados.
Estructura de la memoria en tarjetas MIFARE Classic 1K
Las tarjetas que suelen acompañar al RC522 suelen ser MIFARE Classic 1K. Estas tarjetas ofrecen 1 Kbyte de memoria organizada de forma jerárquica en sectores y bloques, con un sistema de claves y permisos bastante peculiar que conviene entender antes de escribir nada.
La memoria total se divide en 16 sectores numerados del 0 al 15. Cada sector contiene 4 bloques, etiquetados de 0 a 3 dentro de ese sector. Cada bloque almacena 16 bytes de datos, es decir, 16 posiciones numeradas de 0 a 15, por lo que cada sector ofrece 64 bytes.
Dentro de esos 4 bloques por sector, solo 3 están pensados para guardar datos de usuario: el bloque 0, el 1 y el 2 de cada sector (excepto en el sector 0, que tiene particularidades). El último bloque de cada sector, el bloque 3, se conoce como bloque trailer. En él se guardan las claves de cifrado y los bits de acceso que controlan qué operaciones se permiten en ese sector.
En el trailer, los 16 bytes se reparten en:
- Key A: 6 bytes.
- Access Conditions: 3 bytes que definen permisos de lectura/escritura, autenticación y visibilidad de las claves.
- Byte sin uso (U): 1 byte que no se emplea.
- Key B: 6 bytes.
Las tarjetas que vienen de fábrica con los módulos suelen tener Key A y Key B inicializadas a FF FF FF FF FF FF, lo que es extremadamente inseguro, ya que cualquiera que conozca el estándar puede autenticarse y modificar el contenido de la tarjeta. Una práctica relativamente extendida en proyectos caseros es usar las mismas claves en todos los sectores, aunque para seguridad real sería mejor diversificar.
Además, el bloque 0 del sector 0 es especial: ahí se almacena el UID de la tarjeta (normalmente 4 bytes en estas MIFARE Classic) y datos del fabricante. Este bloque se considera de solo lectura en la práctica; intentar modificarlo puede corromper la tarjeta de manera irreversible.
Cambiar las claves Key A y Key B en un sector
Si quieres usar una tarjeta MIFARE en un proyecto con Arduino y RC522 de forma mínimamente seria, lo primero que deberías hacer es cambiar las claves por defecto. Así evitas que cualquiera con un lector y la librería estándar pueda manipular tu tarjeta sin autorización.
La idea básica para actualizar las claves de un sector concreto (por ejemplo, el sector 15) es la siguiente:
- Definir en el código las claves actuales (las de fábrica, si no se han cambiado).
- Definir las nuevas claves Key A y Key B que quieras usar en ese sector.
- Calcular el número de bloque trailer de ese sector, que es sector * 4 + 3 (para el sector 15, el bloque 63).
- Autenticarte primero con Key A actual usando PCD_Authenticate() sobre el bloque trailer.
- Leer el bloque trailer con MIFARE_Read() para obtener su contenido.
- Modificar en un buffer los bytes correspondientes a las nuevas claves.
- Autenticar de nuevo si es necesario (por ejemplo, con Key B).
- Escribir el bloque trailer actualizado con MIFARE_Write().
Durante este proceso es crucial no mover la tarjeta del lector hasta que termine la operación, porque una escritura interrumpida en el bloque trailer podría dejar el sector inaccesible. Una vez cambiadas las claves, deberás actualizar también el código de Arduino para que use esas nuevas claves en futuras operaciones sobre ese sector.
Lectura y escritura de bloques: simulando una tarjeta de transporte
Una aplicación muy ilustrativa de lectura y escritura con MIFARE Classic es simular el comportamiento de una tarjeta de transporte público recargable. La idea es sencilla: la tarjeta almacena un número de viajes en un bloque determinado y el sistema permite cargar viajes (recarga) o consumirlos (validación al subir al bus o tranvía).
Para esto se puede reservar, por ejemplo, el sector 15 para datos de usuario y utilizar uno de sus bloques de datos (por ejemplo, el bloque 60) para guardar el contador de viajes. En el byte 0 del bloque se almacena el número de viajes disponibles. El resto de bytes del bloque podrían usarse para otros datos o simplemente dejarse en cero.
El flujo típico en el código para la parte de recarga sería:
- Definir Key A y Key B actuales que protegen el sector en cuestión (por ejemplo, las que hemos cambiado en el paso anterior).
- Definir el número de sector, el bloque de datos (60) y el bloque trailer (63).
- Declarar un array de 16 bytes (datosBloque) donde el primer byte representará el número de viajes.
- Cada vez que se acerque una tarjeta al lector, leer el bloque 60 usando MIFARE_Read() para obtener los viajes actuales.
- Sumar el número de viajes a recargar (por ejemplo, 10) al valor leído.
- Actualizar datosBloque con el nuevo número de viajes.
- Autenticar con Key A contra el bloque trailer correspondiente.
- Escribir el bloque 60 con MIFARE_Write().
- Volver a leer para verificar que el valor se ha actualizado correctamente.
Para la parte de consumo de viajes (validación en el autobús), el código es prácticamente idéntico, pero en lugar de sumar se resta una unidad al contador. Antes de restar, se comprueba si el valor leídos es cero: si no quedan viajes, se deniega el acceso e invita a recargar. Si el contador es mayor que cero, se decrementa, se escribe de nuevo el bloque y se muestra por pantalla el número de viajes restantes.
En ambos casos es importante manejar correctamente los códigos de retorno de las funciones de la librería MFRC522 (por ejemplo, errores de autenticación o de escritura) y detener siempre la comunicación cifrada con PCD_StopCrypto1() y la propia tarjeta con PICC_HaltA() al final de cada ciclo.
Control de acceso sencillo basado en UID
Otro proyecto clásico con el RC522 y Arduino es un control de acceso básico donde se admite o no la entrada en función del UID de la tarjeta presentada. Este enfoque no usa la memoria interna de la tarjeta, solo su identificador único, y por tanto es bastante limitado en seguridad, pero sirve como ejemplo rápido.
El planteamiento típico es:
- Leer el UID de la tarjeta con las funciones básicas de la librería (PICC_IsNewCardPresent, PICC_ReadCardSerial, etc.).
- Copiar los bytes del UID leído a un array temporal (por ejemplo, ActualUID).
- Definir en el código varios arrays con los UIDs de tarjetas autorizadas (por ejemplo, Usuario1, Usuario2).
- Crear una función de comparación de arrays de bytes que devuelva true si ambos son idénticos.
- Comparar ActualUID con cada UID autorizado y, si alguno coincide, activar una salida digital, mostrar un mensaje de “Acceso concedido” o accionar una cerradura eléctrica.
- Si no coincide con ninguno, mostrar “Acceso denegado” y mantener el sistema cerrado.
En un entorno real, un sistema así es vulnerable a clonación de etiquetas, porque muchos lectores baratos permiten copiar o emular UIDs. Para aumentar la seguridad sería necesario usar la memoria interna de la tarjeta, claves personalizadas y posiblemente mecanismos criptográficos más robustos que los de MIFARE Classic, cuya seguridad está ampliamente cuestionada en la actualidad. Aun así, pedagógicamente es un ejemplo excelente para aprender el flujo de lectura de tarjetas y la integración con actuadores físicos.
Con todo lo anterior ya tienes sobre la mesa los conceptos esenciales de RFID, conoces cómo se comportan las distintas bandas de frecuencia, sabes cómo es por dentro una tarjeta MIFARE Classic 1K, dominas la conexión y uso básico del módulo RC522 con Arduino y has visto en detalle cómo leer y escribir bloques para crear sistemas reales como un control de acceso o una tarjeta de transporte. A partir de aquí el siguiente paso natural es combinar RFID con otros módulos (pantallas LCD, relés, WiFi, bases de datos en la nube) y aprender a controlar bombillas inteligentes para construir soluciones más completas que se acerquen todavía más a los sistemas profesionales que ves a diario en tiendas, transporte público y dispositivos de pago sin contacto.
