La tecnología de Identificación por Radiofrecuencia (RFID) ha revolucionado la forma en que interactuamos con objetos y sistemas, permitiendo la comunicación inalámbrica a corta distancia. Cuando esta potente tecnología se combina con la versatilidad de Arduino, se abren un sinfín de posibilidades para crear soluciones de seguridad personalizadas y eficientes. Un ejemplo práctico y accesible de esta sinergia es la implementación de un sistema de control de acceso vehicular RFID con Arduino. Este sistema no solo ofrece una alternativa moderna a las llaves tradicionales, sino que también sienta las bases para aplicaciones más complejas en el ámbito industrial y doméstico.

Fundamentos de la Tecnología RFID
La Identificación por Radiofrecuencia (RFID) es una tecnología que utiliza ondas de radio para identificar objetos o personas. Un sistema RFID consta de dos componentes principales: las etiquetas RFID (tags) y los lectores RFID (readers). Las etiquetas RFID son pequeños dispositivos que contienen un microchip y una antena. Estos microchips almacenan un identificador único. Los lectores RFID, por su parte, son dispositivos que emiten ondas de radio y reciben las señales de las etiquetas. En el contexto de nuestro proyecto, el módulo RC522 actuará como lector, y las tarjetas o llaveros que vienen con él serán las etiquetas.
Es crucial entender cómo funcionan estos componentes, especialmente en lo que respecta a su alimentación. Un módulo lector RFID, como el RC522, requiere una conexión a una fuente de energía para operar. Sin embargo, las etiquetas RFID pasivas, como las típicas pegatinas o tarjetas que se utilizan, no poseen una batería propia. Su alimentación proviene de la energía electromagnética emitida por el lector RFID. Cuando el lector emite ondas de radio, estas inducen una corriente en la antena de la etiqueta, activando el chip y permitiendo que este envíe la información almacenada. Este fenómeno de "alimentación por inducción" es uno de los aspectos más fascinantes de la tecnología RFID.
A diferencia de tecnologías como los infrarrojos, los dispositivos basados en RFID no requieren una línea de visión directa para comunicarse. Esto se debe a que las ondas de radio pueden penetrar ciertos materiales y no se ven obstaculizadas por obstáculos físicos de la misma manera.
Tipos de Etiquetas RFID y Frecuencias de Operación
Las etiquetas RFID existen en diferentes formatos, cada uno con sus propias características y aplicaciones. Existen etiquetas RFID de solo lectura, cuyo identificador es grabado durante el proceso de fabricación y no puede ser modificado. Por otro lado, hay etiquetas RFID de lectura y escritura, que permiten almacenar y modificar información, lo que las hace más versátiles para aplicaciones dinámicas.
Un sistema RFID puede operar en diversas frecuencias dentro del espectro de radiofrecuencia. Las ondas de radio no se comportan de la misma manera a todas las frecuencias, lo que influye en el alcance y la velocidad de comunicación.
- Baja Frecuencia (LF): Opera típicamente en el rango de 125-134 kHz. Su principal ventaja es la capacidad de operar a través de metales y en entornos difíciles, pero su rango de alcance está limitado a unos pocos centímetros.
- Alta Frecuencia (HF): Incluye tecnologías como NFC (Near-Field Communications), que opera a 13.56 MHz. NFC es una tecnología de corto alcance, ideal para transacciones seguras y comunicación entre dispositivos cercanos. Los sistemas RFID basados en HF ofrecen un alcance moderado, generalmente hasta unos pocos metros, y son comunes en tarjetas de pago, control de acceso y etiquetado de productos.
- Ultra Alta Frecuencia (UHF): Opera en el rango de 860 MHz a 960 MHz (y otras bandas según la región). Los sistemas RFID basados en UHF generalmente ofrecen un alcance mucho mayor que los tipos LF y HF, pudiendo alcanzar decenas de metros en condiciones óptimas. Son ideales para la gestión de inventarios a gran escala, seguimiento de activos y aplicaciones logísticas.
El módulo lector RFID RC522, que es el corazón de nuestro proyecto, está específicamente diseñado para operar en la banda de Alta Frecuencia (HF), utilizando una frecuencia de 13.56 MHz, y se basa en el circuito integrado MFRC522 de la empresa NXP.

El Módulo Lector RFID RC522 y su Interacción con Arduino
El módulo lector RFID RC522 es una solución económica y popular para implementar sistemas RFID. Está basado en el circuito integrado MFRC522 de NXP Semiconductors, el mismo fabricante de la tecnología MIFARE utilizada en muchas de estas etiquetas.
Características Técnicas del RC522
- Voltaje de Operación: El módulo RC522 opera a un voltaje de entre 2.5V y 3.3V. Es crucial no conectarlo directamente a un pin de 5V de Arduino, ya que esto podría dañar permanentemente el módulo. Se debe utilizar el pin de 3.3V de Arduino para alimentar el VCC del módulo.
- Rango de Frecuencias: Opera en la banda ISM de 13.56 MHz, lo que lo hace compatible con las etiquetas RFID MIFARE.
- Interfaz de Comunicación: Soporta varias interfaces de comunicación, incluyendo SPI, I2C y UART. La interfaz SPI es la más comúnmente utilizada para la comunicación con microcontroladores como Arduino.
- Alcance Máximo: El alcance de lectura típico del módulo RC522 es de aproximadamente 5 cm. Este alcance es suficiente para muchas aplicaciones de control de acceso, donde se requiere proximidad.
- Pin de Interrupción (IRQ): Una característica muy útil del módulo RC522 es su pin de interrupción (IRQ). Este pin alerta al microcontrolador cuando una etiqueta RFID se acerca al lector, permitiendo una gestión más eficiente del tiempo y los recursos del microcontrolador.
- Pin de Reset (RST): Este pin se utiliza para encender y apagar el módulo. Mantener el pin RST en estado LOW lo mantiene apagado con un consumo mínimo de energía. Cambiar el estado a HIGH reinicia el RC522.
Conexión del RC522 a Arduino
La correcta conexión del módulo RC522 a una placa Arduino es fundamental para su funcionamiento. A continuación, se detallan las conexiones típicas:
- VCC: Conectar al pin de 3.3V de Arduino.
- GND: Conectar al pin GND de Arduino.
- RST: Conectar a un pin digital de Arduino (por ejemplo, el pin 9). Este pin se puede usar para reiniciar el módulo.
- MISO/SCL/TX: Este pin tiene múltiples funciones dependiendo de la interfaz de comunicación utilizada. Para la interfaz SPI, funciona como salida de esclavo (Master In, Slave Out).
- SCK: Pin de reloj para la comunicación SPI.
- MOSI/SDA/RX: Este pin tiene múltiples funciones. Para la interfaz SPI, funciona como entrada de esclavo (Master Out, Slave In).
- NSS/CS/RX: Pin de selección de esclavo (Chip Select) para SPI.
Es importante consultar la documentación específica de la placa Arduino que se esté utilizando, ya que la ubicación de los pines SPI puede variar.

Programación del Lector RFID con Arduino y Librerías
La comunicación entre Arduino y el lector RFID RC522, aunque compleja a nivel de protocolo, se simplifica enormemente gracias a las librerías de software disponibles. Una de las librerías más populares y robustas para programar el módulo RC522 es la desarrollada y mantenida por Miguel Balboa. Esta librería abstrae gran parte de la complejidad subyacente, permitiendo a los desarrolladores centrarse en la lógica de la aplicación.
Librería MFRC522 de Miguel Balboa
Esta librería proporciona funciones para interactuar con el módulo RC522, incluyendo la inicialización, la lectura de etiquetas, la autenticación y la escritura de datos. Para utilizarla, es necesario instalarla en el IDE de Arduino. Una vez instalada, se puede incluir en el código del sketch de la siguiente manera:
#include <SPI.h>#include <MFRC522.h>// Definición de pines#define RST_PIN 9#define SS_PIN 10 // O el pin Chip Select (CS) que estés usandoMFRC522 mfrc522(SS_PIN, RST_PIN); // Crea una instancia del objeto MFRC522Lectura de Etiquetas RFID
El primer paso para trabajar con el sistema es ser capaz de leer el identificador único (UID) de las etiquetas RFID. El siguiente fragmento de código ilustra cómo se puede hacer esto:
void loop() { // Busca nuevas tarjetas if ( ! mfrc522.isCard() ) { return; } // Selecciona una tarjeta y obtiene su UID if ( ! mfrc522.readCardSerial() ) { return; } // Muestra el UID en el Monitor Serie Serial.print(F("UID de la tarjeta leída:")); for (byte i = 0; i < mfrc522.serNumLength; i++) { Serial.print(mfrc522.serNum[i] < 0x10 ? " 0" : " "); Serial.print(mfrc522.serNum[i], HEX); } Serial.println(); // Opcional: Mostrar tipo de tarjeta y otros datos si es posible // ... delay(4000); // Espera 4 segundos antes de intentar leer de nuevo}Para ejecutar este código, se debe cargar en la placa Arduino, abrir el Monitor Serie (Herramientas > Monitor Serie) y acercar una tarjeta RFID compatible con el lector RC522. La información del UID de la tarjeta se mostrará en el monitor. Es importante dejar la tarjeta junto al lector hasta que se muestre toda la información.
🐊 Arduino y ESP32: Cómo Utilizar el Módulo RC522 para Proyectos RFID
Estructura de las Tarjetas MIFARE Classic y Seguridad
Las tarjetas o etiquetas RFID que utiliza el lector RC522, y que son compatibles con la tecnología MIFARE Classic, tienen una estructura de memoria organizada en sectores y bloques. Una tarjeta MIFARE Classic de 1K está típicamente organizada en 16 sectores (numerados del 0 al 15). Cada sector, a su vez, se divide en 4 bloques (numerados del 0 al 3).
De estos 4 bloques por sector, solo 3 bloques (bloques 0, 1 y 2) se pueden utilizar directamente para almacenar datos del usuario. El cuarto bloque, conocido como el bloque "Trailer" (bloque 3), contiene información crítica de seguridad: las claves de cifrado (Key A y Key B) y las condiciones de acceso para ese sector. Cada bloque tiene un tamaño de 16 bytes. El bloque Trailer, por lo tanto, también tiene 16 bytes, divididos de la siguiente manera:
- Clave A (6 bytes): Una de las claves de autenticación para acceder al sector.
- Condiciones de Acceso (4 bytes): Definen los permisos para leer, escribir y acceder a los datos y claves del sector.
- Clave B (6 bytes): La otra clave de autenticación para acceder al sector.
Para acceder o modificar datos dentro de un sector, el lector RFID debe autenticarse primero utilizando una de estas claves (Key A o Key B) y cumpliendo las condiciones de acceso especificadas. El lector RC522 utiliza la función PCD_Authenticate() de la librería MFRC522 para realizar esta autenticación.
Vulnerabilidades de Seguridad en MIFARE Classic
A pesar de la estructura de seguridad implementada, la tecnología MIFARE Classic presenta deficiencias significativas en su cifrado. El problema radica en que las claves de autenticación y las condiciones de acceso, aunque protegidas, pueden ser vulnerables a ataques criptográficos. No se requiere una gran inversión para "hackear" MIFARE Classic, ya que existen algoritmos y herramientas disponibles que permiten recuperar las claves de autenticación de muchos sectores.
Esto significa que si las claves por defecto no se cambian o si se utilizan claves débiles y predecibles, un atacante podría acceder y modificar los datos de la tarjeta. Por esta razón, es altamente recomendable personalizar las claves de cifrado de las tarjetas MIFARE Classic, especialmente si se van a utilizar para aplicaciones sensibles.
El UID y su Importancia
El UID (Unique Identifier) es un número de serie único que MIFARE asigna a cada etiqueta RFID durante su fabricación. Este UID se almacena en el bloque 0 del sector 0 de la tarjeta. A diferencia de los datos en otros bloques, el UID de la mayoría de las tarjetas MIFARE Classic no se puede modificar. Sin embargo, existen algunas técnicas y tarjetas especiales que permiten clonar o incluso modificar el UID, lo que añade otra capa de complejidad a la seguridad.
En un sistema de control de acceso, el UID de una tarjeta es típicamente lo que se registra en la base de datos del sistema como una credencial válida.
Personalización y Aplicaciones Prácticas
La capacidad de leer y escribir datos en las tarjetas RFID abre un abanico de posibilidades para crear sistemas personalizados.
Reescritura de Claves de Cifrado
Una de las personalizaciones más importantes es la reescritura de las claves de cifrado para mejorar la seguridad. El siguiente fragmento de código ilustra cómo se puede implementar esta funcionalidad, utilizando la función cambiarKeys():
bool cambiarKeys(byte sector, byte keyA[6], byte keyB[6]) { // Calcula el número del bloque Trailer byte trailerBlock = (sector * 4) + 3; // Autentica con las claves actuales (si las conocemos) para poder escribir las nuevas // Si las claves son por defecto, podemos intentar autenticar con ellas. // Si ya las hemos cambiado, necesitaremos las nuevas claves para poder modificarlas de nuevo. if ( ! mfrc522.PCD_Authenticate(PICC_CMD_MF_AUTH_KEY_A, trailerBlock, keyA, mfrc522.uid.uidByte, mfrc522.uid.size) ) { if ( ! mfrc522.PCD_Authenticate(PICC_CMD_MF_AUTH_KEY_B, trailerBlock, keyB, mfrc522.uid.uidByte, mfrc522.uid.size) ) { Serial.println(F("Fallo al autenticar para cambiar claves.")); return false; } } // Escribe las nuevas claves en el bloque Trailer MFRC522::StatusCode status; status = mfrc522.MIFARE_Write(trailerBlock, keyA, 16); // Escribimos Key A, Access Bits y Key B en el mismo bloque if (status != MFRC522::STATUS_OK) { Serial.print(F("Error al escribir las nuevas claves en el bloque ")); Serial.println(trailerBlock); return false; } Serial.print(F("Claves de cifrado actualizadas para el sector ")); Serial.println(sector); return true;}Es fundamental entender que una vez que se actualizan las claves de cifrado, los datos en los bloques del sector solo podrán ser accedidos utilizando estas nuevas claves. Por lo tanto, es importante almacenar de forma segura las claves recién establecidas.
Simulación de Tarjetas de Transporte Público
Una aplicación práctica muy interesante es la simulación de tarjetas de transporte público recargables. Este tipo de tarjetas, como las utilizadas en autobuses o tranvías, almacenan un número de viajes disponibles que se van consumiendo. Podemos replicar esta funcionalidad utilizando las tarjetas MIFARE Classic:
- Almacenamiento de Viajes: Se puede designar un bloque específico (por ejemplo, en el sector 15) para almacenar el número de viajes disponibles. El byte 0 de este bloque podría representar la cantidad de viajes.
- Recarga de Viajes: Un programa específico podría leer la tarjeta, añadir un número determinado de viajes (por ejemplo, 10 viajes) a la cantidad existente y escribir el nuevo valor de vuelta en la tarjeta.
- Consumo de Viajes: Otro programa, ejecutado en un lector en el vehículo, leería la tarjeta, decrementarían el contador de viajes en uno y escribirían el valor actualizado.
El siguiente código muestra cómo se podría implementar la lógica para añadir viajes a una tarjeta:
void recargarViajes(int numeroViajesAAgregar) { byte sector = 15; // Sector donde se almacenan los viajes byte bloque = 1; // Bloque dentro del sector para almacenar el número de viajes // Autenticar con las claves del sector // ... (código de autenticación) ... byte buffer[16]; MFRC522::StatusCode status; // Leer el bloque actual status = mfrc522.MIFARE_Read(sector * 4 + bloque, buffer, 16); if (status != MFRC522::STATUS_OK) { Serial.println(F("Error al leer el bloque de viajes.")); return; } // Calcular el nuevo número de viajes int viajesActuales = buffer[0]; // Suponiendo que el byte 0 contiene el número de viajes int nuevosViajes = viajesActuales + numeroViajesAAgregar; // Asegurarse de que no exceda un límite (opcional) if (nuevosViajes > 99) { // Límite de 99 viajes nuevosViajes = 99; } buffer[0] = (byte)nuevosViajes; // Actualizar el byte con el nuevo número de viajes // Escribir el bloque actualizado status = mfrc522.MIFARE_Write(sector * 4 + bloque, buffer, 16); if (status != MFRC522::STATUS_OK) { Serial.println(F("Error al escribir el bloque de viajes actualizado.")); return; } Serial.print(F("Se han añadido ")); Serial.print(numeroViajesAAgregar); Serial.print(F(" viajes. Total: ")); Serial.println(nuevosViajes); Serial.println(F("Proceso de recarga finalizado."));}Al cargar este código y acercar una tarjeta, se podría observar cómo el número de viajes aumenta. De manera similar, se podría implementar la lógica para decrementar los viajes al usar el transporte.

Creación de un Sistema de Control de Acceso Vehicular con Arduino
La aplicación más directa de esta tecnología es la creación de un sistema de control de acceso vehicular. Este sistema puede gestionar el acceso a garajes, estacionamientos privados o áreas restringidas.
Componentes Necesarios
Para construir un sistema básico de control de acceso vehicular RFID con Arduino, se requerirán los siguientes componentes:
- Placa Arduino Uno (o similar): El cerebro del proyecto, encargado de procesar la información de la tarjeta RFID y controlar los actuadores.
- Módulo Lector RFID RC522: Para leer las etiquetas y tarjetas RFID.
- Etiquetas RFID (Tags): Tarjetas o llaveros RFID compatibles con el RC522. Cada etiqueta tiene un UID único.
- Relé: Para activar o desactivar el mecanismo de apertura de la barrera vehicular (por ejemplo, un motor o un solenoide).
- LEDs (Verde y Rojo): Para indicar visualmente si el acceso ha sido concedido o denegado.
- Resistencias (220Ω): Para proteger los LEDs.
- Fuente de Alimentación: Para Arduino y el módulo RC522.
- Mecanismo de Barrera Vehicular: Un motor, actuador o solenoide para controlar la apertura/cierre.
Conexión del Hardware
La conexión de los componentes es crucial para el correcto funcionamiento del sistema:
- Módulo RC522: Conectar según se describió anteriormente (VCC a 3.3V, GND a GND, RST a un pin digital, y los pines SPI a los pines SPI de Arduino).
- LED Verde (Acceso Concedido): Ánodo (pata larga) a una resistencia de 220Ω, y el otro extremo de la resistencia al pin digital 7 de Arduino. Cátodo (pata corta) a GND.
- LED Rojo (Acceso Denegado): Ánodo (pata larga) a una resistencia de 220Ω, y el otro extremo de la resistencia al pin digital 8 de Arduino. Cátodo (pata corta) a GND.
- Relé: Los pines de control del relé se conectan a un pin digital de Arduino (por ejemplo, pin 12). Los contactos del relé se conectan en serie con el circuito de alimentación del mecanismo de barrera vehicular.
Lógica de Programación
La lógica del programa de control de acceso se basa en leer el UID de la tarjeta presentada y compararlo con una lista de UIDs autorizados almacenados en la memoria de Arduino.
Definición de Tarjetas Autorizadas: Se define un array de bytes que contiene los UIDs de las tarjetas que tendrán permiso de acceso. Es esencial reemplazar los UIDs de ejemplo con los UIDs reales de tus tarjetas. Para obtener el UID de una tarjeta, se puede usar el código de lectura básica previamente mostrado.
byte masterCard[4] = {0xDE, 0xAD, 0xBE, 0xEF}; // ¡REEMPLAZA ESTO CON EL UID DE TU TARJETA MAESTRA!// Puedes añadir más tarjetas autorizadas a un array o una estructura más compleja.Función de Comparación de UID: Una función que compara el UID leído de la tarjeta presentada con los UIDs autorizados.
bool esTarjetaAutorizada(byte uid[4]) { // Compara el UID leído con la tarjeta maestra for (byte i = 0; i < mfrc522.serNumLength; i++) { if (uid[i] != masterCard[i]) { return false; // Los UIDs no coinciden } } return true; // Los UIDs coinciden}Lógica Principal del Loop:
void loop() { if ( ! mfrc522.isCard() ) { return; // No hay tarjeta presente } if ( ! mfrc522.readCardSerial() ) { return; // No se pudo leer el UID } if (esTarjetaAutorizada(mfrc522.serNum)) { // Tarjeta autorizada: Encender LED verde, activar relé por un tiempo, apagar LED rojo. digitalWrite(7, HIGH); // LED Verde ON digitalWrite(8, LOW); // LED Rojo OFF digitalWrite(12, HIGH); // Activar relé (ej. abrir barrera) delay(5000); // Mantener barrera abierta por 5 segundos digitalWrite(12, LOW); // Desactivar relé delay(1000); // Pequeña pausa antes de apagar LED verde digitalWrite(7, LOW); // LED Verde OFF } else { // Tarjeta no autorizada: Encender LED rojo, apagar LED verde. digitalWrite(7, LOW); // LED Verde OFF digitalWrite(8, HIGH); // LED Rojo ON delay(2000); // Mantener LED rojo encendido por 2 segundos digitalWrite(8, LOW); // LED Rojo OFF } // Esperar un tiempo antes de la próxima lectura para evitar lecturas múltiples delay(2000);}
Al subir este código a la placa Arduino, abrir el Monitor Serie y acercar una tarjeta cuyo UID coincida con masterCard, se activará el LED verde y el relé. De lo contrario, se encenderá el LED rojo.
Consideraciones Adicionales y Mejoras
- Gestión de Múltiples Tarjetas: Para un sistema real, se necesitaría una forma de almacenar y gestionar una lista más amplia de UIDs autorizados. Esto podría implicar el uso de memoria EEPROM de Arduino, una tarjeta SD, o incluso la comunicación con un servidor externo a través de un módulo Ethernet o Wi-Fi.
- Seguridad de las Claves: Si se implementa la escritura de datos en las tarjetas, es fundamental utilizar claves de cifrado fuertes y personalizadas para evitar accesos no autorizados.
- Integración con Sistemas Existentes: El sistema puede integrarse con sistemas de automatización del hogar o de seguridad existentes.
- Control de Acceso Vehicular vs. Personal: Si bien el enfoque es vehicular, la misma lógica se aplica para el control de acceso de personas a edificios o habitaciones, simplemente adaptando el actuador (por ejemplo, un pestillo eléctrico en lugar de un relé para una barrera).
La implementación de un control de acceso vehicular RFID con Arduino es un proyecto gratificante que demuestra el poder de la electrónica de código abierto y la tecnología RFID para crear soluciones prácticas y personalizadas. Desde la simple lectura de un UID hasta la gestión de transacciones y la seguridad avanzada, las posibilidades son vastas.