Creando un Sistema de Control de Acceso con RFID y Microcontrolador: Una Guía Detallada

La tecnología RFID (Identificación por Radiofrecuencia) ha revolucionado la forma en que interactuamos con el mundo que nos rodea, desde sistemas de pago hasta la gestión de inventarios. Recientemente, pude presenciar la eficacia de esta tecnología en una tienda de deportes, donde al depositar artículos en una caja, estos aparecían automáticamente en una lista, como por arte de magia. Esta experiencia me inspiró a explorar cómo funciona y a replicar su funcionalidad de manera práctica, montando un sistema que combina un microcontrolador, un módulo lector RFID y un LED para indicar el acceso.

Fundamentos de la Tecnología RFID

La identificación por radiofrecuencia es un sistema de comunicación sin contacto que utiliza un canal de radiofrecuencia para identificar etiquetas. El sistema RFID para placas Arduino consta de dos componentes principales: un transpondedor (etiqueta) y un lector de tarjetas. La identificación se basa en un identificador único que tiene cada etiqueta RFID.

Existen diferentes tipos de etiquetas RFID. Algunas son de solo lectura, grabadas con su identificador único durante el proceso de fabricación. Otras, en cambio, son de lectura y escritura, permitiendo almacenar y modificar información. El dispositivo que permite tanto leer como escribir etiquetas RFID es el lector RFID, también conocido como transceptor.

Un aspecto fascinante de los sistemas RFID es su método de alimentación. A diferencia de tecnologías como los infrarrojos, los dispositivos basados en RFID no requieren una línea de visión directa. La alimentación del lector RFID y de la etiqueta RFID difiere significativamente. Por ejemplo, un módulo como el RC522 necesita estar conectado a una fuente de alimentación para funcionar, mientras que las típicas pegatinas RFID que se encuentran en muchos productos carecen de batería o fuente de alimentación propia.

Cuando una etiqueta RFID se acerca a un lector, este último genera un campo electromagnético. Si la etiqueta tiene suficiente energía (inducida por el campo del lector o a través de su propia fuente de alimentación, en el caso de las etiquetas activas), el chip alimentado es capaz de enviar la información almacenada en la etiqueta RFID a través de ondas de radiofrecuencia.

Los sistemas RFID pueden operar en diversas frecuencias dentro del espectro de radiofrecuencia. Las ondas de radio no se comportan de la misma manera en todas las frecuencias. Las bajas frecuencias (LF) tienen un rango de alcance limitado a unos pocos centímetros. La tecnología NFC (Near-Field Communications), una forma de comunicación de corto alcance, se considera parte de las tecnologías RFID de alta frecuencia (HF). Los sistemas RFID basados en ultra alta frecuencia (UHF) generalmente ofrecen un alcance mayor que los tipos LF y HF.

Esquema de funcionamiento de un sistema RFID

El Módulo Lector RFID RC522 y las Tarjetas MIFARE

El módulo lector RFID RC522 está basado en el circuito integrado MFRC522 de la empresa NXP. Este módulo, cuyo coste varía según el proveedor, es uno de los más populares para trabajar con RFID en proyectos de electrónica. Las etiquetas RFID que utiliza este módulo suelen ser tarjetas que emplean la tecnología MIFARE de NXP Semiconductors.

Estas tarjetas MIFARE pueden tener capacidades de memoria de 1K o 4K, organizadas en sectores y bloques. El lector RFID RC522 opera en la alta frecuencia (HF), generando un campo electromagnético de 13,56 MHz. El alcance máximo de este módulo es de aproximadamente 5 cm, lo cual es adecuado para aplicaciones de proximidad.

Una característica muy útil del módulo RC522 es su pin de interrupción (IRQ), que alerta al microcontrolador cuando una etiqueta RFID se acerca al lector. El voltaje de operación del módulo es de 2,5V a 3,3V.

Especificaciones del Módulo RC522:

  • Rango de frecuencias: Banda ISM de 13,56 MHz
  • Interfaz: SPI/I2C/UART
  • Voltaje de operación: 2,5V a 3,3V

Los pines principales del módulo RC522 son:

  • VCC: Pin de alimentación del lector RFID RC522. Admite un voltaje de alimentación entre 2,5V y 3,3V.
  • RST: Pin para encender y apagar el módulo. Mientras el pin esté en estado LOW, el módulo permanecerá apagado con un consumo mínimo. Al cambiar a HIGH, el RC522 se reinicia.
  • GND: Pin de tierra.
  • IRQ: Pin de interrupción que alerta al microcontrolador cuando una etiqueta RFID se acerca.
  • MISO/SCL/TX: Este pin tiene múltiples funciones dependiendo de la interfaz utilizada. Con la interfaz SPI habilitada, funciona como salida de esclavo y entrada de máster.

Es crucial tener precaución al conectar el módulo RC522. Nunca conectes el pin VCC al pin de 5V de una placa como Arduino, ya que esto puede dañar el módulo. Siempre conecta el pin VCC al pin de 3,3V y el pin GND al pin GND de la placa microcontroladora. El pin RST del RC522 se puede conectar a cualquier pin digital del microcontrolador; en muchos ejemplos, se conecta al pin 9. La conexión de los pines SPI dependerá de la placa microcontroladora específica que se esté utilizando.

Diagrama de conexión del módulo RC522 a Arduino

Programando el Lector RFID con Arduino

La comunicación entre un microcontrolador como Arduino y el lector RFID RC522 puede parecer compleja a nivel de programación, pero se simplifica enormemente con el uso de librerías dedicadas. Una de las librerías más populares y mantenidas para programar el lector RFID RC522 es la desarrollada por Miguel Balboa.

Para comenzar, es necesario instalar esta librería en el IDE de Arduino. Una vez instalada, podemos cargar un código de ejemplo para verificar el funcionamiento básico del lector. Este código, al ejecutarse, no escribe datos en la etiqueta RFID, sino que lee la información presente. Al compilar y subir el código a la placa, y luego abrir el monitor serie, se podrá observar la información de las etiquetas RFID que se acerquen al lector.

El proceso es el siguiente:

  1. Carga el código de ejemplo a tu placa Arduino.
  2. Abre el monitor serie del IDE (Ctrl+Shift+M).
  3. Acerca la tarjeta RFID que viene incluida con el lector RC522 al módulo.
  4. Mantén la tarjeta cerca del lector hasta que se muestre toda la información en el monitor serie.

El código mostrará el identificador único (UID) de la tarjeta, su tipo y cualquier dato que pueda leer de los bloques de memoria. El programa está diseñado para leer los detalles de la primera tarjeta detectada y luego continuar escaneando.

// Código de ejemplo para leer UID de una tarjeta RFID RC522#include <SPI.h>#include <MFRC522.h>#define SS_PIN 10 // Pin Slave Select del lector RC522#define RST_PIN 9 // Pin Reset del lector RC522MFRC522 mfrc522(SS_PIN, RST_PIN); // Crea una instancia del objeto MFRC522void setup() { Serial.begin(9600); // Inicializa la comunicación serial SPI.begin(); // Inicializa el bus SPI mfrc522.PCD_Init(); // Inicializa el módulo RC522 Serial.println("Acerca una tarjeta al lector...");}void loop() { // Busca nuevas tarjetas if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // Selecciona una tarjeta if ( ! mfrc522.PICC_ReadCardSerial()) { return; } // Muestra el UID de la tarjeta Serial.print("UID de la tarjeta: "); 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(); // Muestra el tipo de tarjeta Serial.print("Tipo de tarjeta: "); MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak); Serial.println(mfrc522.PICC_GetTypeName(piccType)); delay(4000); // Espera 4 segundos antes de volver a escanear}

🐊 Arduino y ESP32: Cómo Utilizar el Módulo RC522 para Proyectos RFID

Estructura de Memoria y Seguridad en Tarjetas MIFARE

Las tarjetas o etiquetas RFID utilizadas con el lector RC522, típicamente las MIFARE Classic, tienen una memoria organizada en 1K bloques. Esta memoria está dividida 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 para almacenar datos del usuario. El cuarto bloque (bloque 3) es el bloque "Trailer". Los 16 bytes de este bloque Trailer se utilizan para almacenar información crucial de seguridad:

  • Claves de Cifrado (Key A y Key B): Cada una ocupa 6 bytes. Estas claves se utilizan para autenticar el acceso a un sector.
  • Condiciones y Permisos de Acceso: 3 bytes que definen cómo se pueden leer, escribir o acceder los bloques dentro de ese sector.

Para acceder y manipular los datos de un sector, el lector RFID debe autenticarse utilizando una de las claves almacenadas (Key A o Key B) y cumplir con los permisos definidos. El lector debe conocer la clave correcta para poder leer o escribir en el sector.

El bloque 0 del sector 0 es particularmente importante, ya que contiene el UID (Unique Identifier) de la etiqueta RFID. El UID es un identificador único asignado por el fabricante a cada etiqueta.

Vulnerabilidades de Seguridad en MIFARE Classic

A pesar de las medidas de seguridad implementadas, la tecnología MIFARE Classic presenta deficiencias de seguridad que permiten su "hackeo" sin necesidad de una gran inversión. La vulnerabilidad principal radica en la forma en que se gestionan las claves de cifrado y los permisos. Si las claves pueden ser leídas o deducidas, la seguridad del sistema se ve comprometida.

Aunque cada sector tiene su propia clave, es una práctica común utilizar la misma clave para todos los sectores. Si bien se pueden utilizar claves personalizadas, la seguridad se ve comprometida si estas claves no se protegen adecuadamente. Para proyectos personales, se recomienda encarecidamente utilizar claves de cifrado únicas y no compartirlas.

Modificando Claves de Cifrado y Almacenando Datos

La librería MFRC522 permite no solo leer el UID y los datos de las tarjetas, sino también modificar las claves de cifrado y escribir información en los bloques de memoria.

El siguiente fragmento de código ilustra cómo se pueden cambiar las claves Key-A y Key-B en un sector específico. El proceso implica calcular la dirección del bloque Trailer y luego utilizar la función PCD_Authenticate() para verificar las claves actuales antes de escribir las nuevas.

// Ejemplo de función para cambiar claves (simplificado)bool cambiarClaves(byte sector, byte nuevaKeyA[6], byte nuevaKeyB[6]) { byte trailerBlock = sector * 4 + 3; // Calcula el bloque Trailer // Autenticar con las claves actuales para poder modificarlas // (Este paso requiere conocer las claves originales, lo cual es el desafío) if ( ! mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &claveOriginalA[0], mfrc522.uid.uidByte)) { Serial.println("Error al autenticar con Key A original"); return false; } if ( ! mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_B, trailerBlock, &claveOriginalB[0], mfrc522.uid.uidByte)) { Serial.println("Error al autenticar con Key B original"); return false; } // Preparar los datos a escribir en el bloque Trailer byte buffer[18]; // Suficiente para claves, permisos y bloque Trailer // ... (código para configurar buffer con nuevas claves y permisos) ... // Escribir las nuevas claves y permisos en el bloque Trailer if (mfrc522.MIFARE_Write(trailerBlock, buffer, 16) != MFRC522::STATUS_OK) { Serial.println("Error al escribir las nuevas claves en el bloque Trailer"); return false; } Serial.println("Claves de cifrado actualizadas con éxito."); return true;}

Una vez cambiadas las claves, se puede trabajar con mayor seguridad. Es importante recordar que tras actualizar las claves, los datos previamente almacenados que dependan de las claves antiguas podrían volverse inaccesibles si no se gestionan correctamente.

Creando un Sistema de Control de Acceso con LED

Un proyecto práctico que combina estos elementos es un sistema de control de acceso. Este sistema puede utilizarse para conceder o denegar el acceso basándose en el UID de una tarjeta RFID autorizada.

Para implementar este sistema, se necesita:

  1. Un microcontrolador (ej. Arduino Uno).
  2. Un módulo lector RFID RC522.
  3. Un LED (o dos, uno para acceso permitido y otro para denegado).
  4. Resistencias para los LEDs.
  5. Cables de conexión.

El funcionamiento básico es el siguiente:

  • El microcontrolador escanea continuamente el UID de las tarjetas que se acercan al lector RFID.
  • Si el UID de la tarjeta coincide con un UID predefinido y autorizado en el código (una "lista blanca" de UIDs), se encenderá un LED (por ejemplo, verde) durante unos segundos, indicando que el acceso es permitido.
  • Si se acerca una tarjeta con un UID desconocido o no autorizado, se encenderá otro LED (por ejemplo, rojo), indicando que el acceso es denegado.
// Código de ejemplo para control de acceso simple con LED#include <SPI.h>#include <MFRC522.h>#define SS_PIN 10#define RST_PIN 9#define LED_PERMITIDO 7 // Pin del LED verde#define LED_DENEGADO 8 // Pin del LED rojoMFRC522 mfrc522(SS_PIN, RST_PIN);// UID de la tarjeta autorizada (ejemplo)byte uidAutorizado[4] = {0xA1, 0xB2, 0xC3, 0xD4};void setup() { Serial.begin(9600); SPI.begin(); mfrc522.PCD_Init(); pinMode(LED_PERMITIDO, OUTPUT); pinMode(LED_DENEGADO, OUTPUT); Serial.println("Sistema de Control de Acceso RFID"); Serial.println("Acerca una tarjeta autorizada...");}void loop() { // Apagar ambos LEDs al inicio del ciclo digitalWrite(LED_PERMITIDO, LOW); digitalWrite(LED_DENEGADO, LOW); if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } if ( ! mfrc522.PICC_ReadCardSerial()) { return; } bool esAutorizado = true; // Comparar el UID leído con el UID autorizado for (byte i = 0; i < mfrc522.uid.size; i++) { if (mfrc522.uid.uidByte[i] != uidAutorizado[i]) { esAutorizado = false; break; } } if (esAutorizado) { Serial.println("Acceso permitido."); digitalWrite(LED_PERMITIDO, HIGH); // Encender LED verde delay(3000); // Mantener encendido por 3 segundos } else { Serial.println("Acceso denegado."); digitalWrite(LED_DENEGADO, HIGH); // Encender LED rojo delay(3000); // Mantener encendido por 3 segundos } // Esperar un momento para evitar lecturas múltiples rápidas delay(1000);}

Diagrama de conexión para un sistema de control de acceso RFID con Arduino y LED

Simulación de Sistemas de Transporte Público

La flexibilidad de las tarjetas RFID MIFARE Classic permite simular escenarios como las tarjetas de transporte público recargables. En este tipo de sistema, la tarjeta almacena un número de viajes que se van consumiendo al utilizar el transporte.

Para simular esto, se puede dedicar un bloque de memoria en la tarjeta para almacenar el número de viajes. Al recargar la tarjeta, se escribe un nuevo valor en este bloque. Al "gastar" un viaje, se lee el valor actual, se decrementa en uno y se vuelve a escribir el nuevo valor.

El código para recargar y consumir viajes es similar al de lectura y escritura de datos generales. Se debe autenticar en el sector correspondiente, leer el valor del byte que representa los viajes, modificarlo y luego escribirlo de nuevo.

Por ejemplo, si se desea añadir 10 viajes a una tarjeta que inicialmente tiene 0:

  1. Leer el valor del bloque designado (ej. bloque 0, sector 15).
  2. Si el valor es 0, escribir 10 en ese bloque.

Para gastar un viaje:

  1. Leer el valor del bloque.
  2. Si el valor es mayor que 0, decrementar el valor en 1 y escribir el nuevo valor.

Este tipo de implementación demuestra cómo la tecnología RFID puede ser adaptada para diversas aplicaciones prácticas, desde la seguridad hasta la gestión de servicios.

Conclusión

La creación de proyectos utilizando RFID con microcontroladores como Arduino no es una tarea excesivamente complicada, especialmente con la disponibilidad de módulos como el RC522 y librerías robustas. La tecnología RFID, al permitir la identificación sin contacto mediante radiofrecuencia, se ha convertido en una herramienta fundamental en numerosas industrias, incluyendo el control de accesos, el seguimiento de mercancías, y la implementación de sistemas de bonificación.

La combinación de un lector RFID RC522 y una placa Arduino, junto con componentes adicionales como LEDs, abre un abanico de posibilidades para la experimentación y el desarrollo de sistemas interactivos y funcionales. Desde simples sistemas de control de acceso hasta simulaciones de tarjetas de transporte, la RFID ofrece una plataforma versátil para innovar en el campo de la electrónica y la automatización.

La continua evolución de estas tecnologías y la accesibilidad de los componentes hacen que sea más fácil que nunca para los entusiastas y profesionales explorar y construir sus propios sistemas RFID personalizados.

En futuras notas, se presentarán otros proyectos Arduino innovadores que aprovechan al máximo las capacidades de la identificación por radiofrecuencia.

tags: #como #prender #un #led #con #un