Control de Acceso con Arduino: Un Sistema RFID Paso a Paso

La tecnología de Identificación por Radiofrecuencia (RFID) ha revolucionado la forma en que interactuamos con objetos y sistemas, permitiendo la lectura y captura de información almacenada en etiquetas mediante ondas de radio. Un proyecto fascinante y accesible para entusiastas de la electrónica es la creación de un sistema de control de acceso utilizando un lector RFID y una placa Arduino Uno. Este sistema no solo demuestra la potencia de la tecnología RFID, sino que también abre la puerta a innumerables aplicaciones prácticas, desde la gestión de inventario hasta la seguridad personalizada.

Diagrama de conexión de un lector RFID RC522 con Arduino Uno

Fundamentos de la Tecnología RFID

La Identificación por Radiofrecuencia, o RFID, es un sistema que se basa en la comunicación inalámbrica entre dos componentes principales: el lector RFID y las etiquetas RFID. El lector, también conocido como transceptor, es el dispositivo encargado de emitir ondas de radio para detectar y comunicarse con las etiquetas. Las etiquetas RFID, por su parte, son pequeños chips económicos que almacenan datos y pueden ser de varios tipos. Existen etiquetas RFID de solo lectura, cuyo identificador único se graba durante el proceso de fabricación, y otras de lectura y escritura, que permiten modificar la información almacenada.

Un aspecto fundamental de cómo funciona un sistema RFID es su sistema de alimentación. A diferencia de tecnologías que requieren visión directa, como los infrarrojos, los dispositivos RFID no necesitan una línea de visión clara entre el lector y la etiqueta. La alimentación de ambos componentes es distinta. Mientras que un módulo lector RFID, como el popular RC522, necesita estar conectado a una fuente de alimentación eléctrica para funcionar, las típicas pegatinas RFID que encontramos en productos de consumo no poseen baterías ni fuentes de alimentación externas.

El funcionamiento se basa en la emisión de un campo electromagnético por parte del lector. Cuando una etiqueta RFID se encuentra dentro de este campo, se alimenta de forma inalámbrica. Una vez alimentado, el chip de la etiqueta es capaz de enviar la información almacenada a través de radiofrecuencia al lector. Este intercambio de información se realiza en diversas frecuencias dentro del espectro radioeléctrico, cada una con características de alcance y comportamiento distintas.

Las tecnologías RFID se clasifican comúnmente por su rango de frecuencia:

  • Baja Frecuencia (LF): Opera típicamente entre 125-134 kHz. Su rango de alcance está limitado a unos pocos centímetros.
  • Alta Frecuencia (HF): Incluye tecnologías como NFC (Near-Field Communications), que operan a 13,56 MHz. NFC es una tecnología de corto alcance que se considera una subcategoría de las RFID de alta frecuencia.
  • Ultra Alta Frecuencia (UHF): Opera generalmente entre 860 MHz y 960 MHz, ofreciendo un alcance significativamente mayor que los tipos LF y HF.

El módulo lector RFID RC522, objeto de este proyecto, opera en la banda de alta frecuencia, específicamente a 13,56 MHz, utilizando el circuito integrado MFRC522 de NXP Semiconductors. Este módulo, que suele venir integrado en una placa con antena, ofrece un alcance máximo de aproximadamente 5 cm, lo que lo hace ideal para aplicaciones de control de acceso y lectura cercana.

Etiquetas RFID de diferentes tipos: llavero, tarjeta y pegatina

El Módulo Lector RFID RC522

El módulo RC522 es una opción muy popular y asequible para integrar la tecnología RFID en proyectos con Arduino. Está basado en el circuito integrado MFRC522 de NXP, y suele presentarse en un módulo compacto con una antena integrada.

Especificaciones clave del módulo RC522:

  • Rango de frecuencias: Banda ISM de 13,56 MHz.
  • Interfaz: Admite comunicación SPI, I2C y UART, aunque para Arduino, SPI es la más comúnmente utilizada.
  • Voltaje de operación: 2,5V a 3,3V. Es crucial no conectar el pin VCC directamente al pin de 5V de Arduino, ya que esto puede dañar el módulo. Se debe utilizar el pin de 3,3V de Arduino.
  • Corriente: El consumo de corriente puede variar, pero es relativamente bajo.
  • Pin de interrupción (IRQ): Una característica muy útil que alerta al microcontrolador cuando una etiqueta RFID se acerca al lector.
  • Pin RST: Permite encender y apagar el módulo. En estado LOW, el módulo está apagado y consume mínima energía. En estado HIGH, el módulo se reinicia.

Conexión del RC522 con Arduino Uno:

La conexión física entre el módulo RC522 y la placa Arduino Uno se realiza a través de varios pines, utilizando principalmente la interfaz SPI para una comunicación rápida y eficiente.

  • VCC: Se conecta al pin de 3,3V de Arduino.
  • GND: Se conecta al pin GND de Arduino.
  • RST: Se puede conectar a cualquier pin digital de Arduino. En este proyecto, se sugiere conectarlo al pin 9.
  • IRQ: También se conecta a un pin digital de Arduino, típicamente el pin 2, que soporta interrupciones.
  • SCK (SPI Clock): Se conecta al pin SCK de Arduino (normalmente el pin 13).
  • MOSI (SPI Master Out Slave In): Se conecta al pin MOSI de Arduino (normalmente el pin 11).
  • MISO (SPI Master In Slave Out): Se conecta al pin MISO de Arduino (normalmente el pin 12).
  • SDA (SPI Slave Select / I2C Data): Para SPI, este pin se utiliza como pin de selección del esclavo (SS) y se conecta a un pin digital de Arduino, como el pin 10.

Es vital seguir cuidadosamente el diagrama de conexión para asegurar el correcto funcionamiento del sistema y evitar daños a los componentes.

Diagrama de pines del módulo RFID RC522

Programación del Lector RFID con Arduino

La comunicación entre Arduino y el lector RFID RC522, aunque compleja a nivel de programación, se simplifica enormemente gracias a librerías dedicadas. La librería MFRC522, desarrollada y mantenida por Miguel Balboa, es una de las más populares y robustas para este fin.

Instalación de la Librería MFRC522:

Para comenzar, es necesario instalar esta librería en el Entorno de Desarrollo Integrado (IDE) de Arduino:

  1. Abre el IDE de Arduino.
  2. Ve a Sketch > Incluir Librería > Administrar Librerías....
  3. En la barra de búsqueda, escribe "MFRC522".
  4. Selecciona la librería "RFID by Miguel Balboa" y haz clic en "Instalar".

Código Básico para Lectura de Tarjetas RFID:

El siguiente código permite leer el Identificador Único (UID) de una tarjeta o llavero RFID y mostrarlo en el monitor serie. Este es el primer paso para implementar un sistema de control de acceso, ya que el UID es la "huella digital" única de cada etiqueta.

#include <SPI.h>#include <MFRC522.h>// Pin definitions for the RC522 module#define RST_PIN 9 // Reset pin#define SS_PIN 10 // Slave Select pin (SDA)MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instancevoid setup() { Serial.begin(9600); // Initialize serial communication SPI.begin(); // Initialize SPI bus mfrc522.PCD_Init(); // Initialize MFRC522 module Serial.println("Acerca una tarjeta al lector..."); Serial.println("Escaneando..."); Serial.println();}void loop() { // Look for new cards if ( ! mfrc522.PICC_IsNewCardPresent()) { return; // If no new card is present, exit the loop } // Select one of the cards if ( ! mfrc522.PICC_ReadCardSerial()) { return; // If the UID cannot be read, exit the loop } // Print the UID of the card 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(); // Print card type Serial.print("Tipo de tarjeta: "); MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak); Serial.println(mfrc522.PICC_GetTypeName(piccType)); // Optional: Print data blocks if readable (MIFARE Classic) // This part is more advanced and requires authentication // For now, we focus on reading the UID and type. delay(4000); // Delay for 4 seconds before scanning again}

Para utilizar este código:

  1. Carga el sketch en tu placa Arduino Uno.
  2. Abre el "Monitor Serie" (Herramientas > Monitor Serie o Ctrl+Shift+M).
  3. Acerca la tarjeta o llavero RFID que viene con el lector al módulo RC522. Mantén la tarjeta cerca hasta que se muestre toda la información.

El monitor serie mostrará el UID de la tarjeta en formato hexadecimal y el tipo de tarjeta detectada. Este UID es fundamental para la autenticación en sistemas de control de acceso.

Módulo rfid-rc522 para Arduino o esp32 para control de acceso

Implementación de Control de Acceso

El siguiente paso lógico es utilizar el UID leído para implementar un sistema de control de acceso. Esto implica tener una lista de UIDs autorizados y comparar el UID leído con esta lista. Si hay una coincidencia, se concede el acceso; de lo contrario, se deniega.

Código para Verificación de Acceso y Señalización:

Este código extiende el ejemplo anterior para incluir la lógica de autorización. Se define un UID "maestro" o autorizado. Si el UID leído coincide con este, se activa un LED durante 3 segundos, indicando que el acceso es permitido.

#include <SPI.h>#include <MFRC522.h>// Pin definitions#define RST_PIN 9#define SS_PIN 10#define LED_PIN 7 // Pin for the access granted LEDMFRC522 mfrc522(SS_PIN, RST_PIN);// Authorized UID (replace with your actual authorized card's UID)byte authorizedUID[] = { 0xAA, 0xBB, 0xCC, 0xDD }; // Example UIDvoid setup() { Serial.begin(9600); SPI.begin(); mfrc522.PCD_Init(); pinMode(LED_PIN, OUTPUT); digitalWrite(LED_PIN, LOW); // Ensure LED is off initially Serial.println("Sistema de Control de Acceso RFID"); Serial.println("Acerca una tarjeta autorizada...");}void loop() { if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } if ( ! mfrc522.PICC_ReadCardSerial()) { return; } Serial.print("UID Leído: "); bool match = true; // Assume a match initially for (byte i = 0; i < mfrc522.uid.size; i++) { Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(mfrc522.uid.uidByte[i], HEX); // Compare with authorized UID if (i < sizeof(authorizedUID) && mfrc522.uid.uidByte[i] != authorizedUID[i]) { match = false; // Mismatch found } } Serial.println(); if (mfrc522.uid.size != sizeof(authorizedUID)) { match = false; // UIDs have different lengths, so no match } if (match) { Serial.println("¡Acceso Concedido!"); digitalWrite(LED_PIN, HIGH); // Turn on LED delay(3000); // Keep LED on for 3 seconds digitalWrite(LED_PIN, LOW); // Turn off LED } else { Serial.println("Acceso Denegado. Tarjeta no autorizada."); // Optionally, you could add a buzzer or another indicator for denied access } Serial.println("Escaneando de nuevo..."); delay(2000); // Delay before next scan}

Para que este código funcione:

  1. Reemplaza byte authorizedUID[] = { 0xAA, 0xBB, 0xCC, 0xDD }; con el UID real de tu tarjeta autorizada. Puedes obtener el UID de tu tarjeta ejecutando el código de lectura básica anterior y anotando el valor que aparece en el monitor serie.
  2. Conecta un LED (con su resistencia limitadora de corriente) al pin digital 7 de Arduino. El cátodo del LED (pata corta) va a GND y el ánodo (pata larga) va al pin 7.
  3. Carga el código y abre el monitor serie. Al acercar la tarjeta autorizada, el LED se encenderá.

Este sistema básico puede ser ampliado para gestionar múltiples UIDs autorizados, almacenar esta información en una memoria EEPROM de Arduino o incluso enviarla a un servidor para un control centralizado.

Seguridad y Consideraciones Avanzadas

Las tarjetas RFID MIFARE Classic, comúnmente utilizadas con el módulo RC522, tienen una estructura de memoria organizada en sectores y bloques. Cada sector (generalmente 16 en total) se divide en 4 bloques. De estos, 3 bloques son para datos y el último bloque, conocido como "Trailer Block", contiene las claves de cifrado (Key A y Key B) y los permisos de acceso para ese sector.

Las claves de cifrado (Key A y Key B), de 6 bytes cada una, y las condiciones de acceso (3 bytes) residen en este bloque trailer. Para leer o escribir en un sector, el lector debe autenticarse primero utilizando la clave correcta. La seguridad de este sistema, sin embargo, presenta deficiencias. El UID de la tarjeta es fácilmente legible y, con el conocimiento adecuado, las claves de cifrado de las tarjetas MIFARE Classic pueden ser extraídas o brute-forced, lo que permite modificar o clonar tarjetas.

Estructura de un sector MIFARE Classic con bloques de datos y trailer

Es crucial ser consciente de estas limitaciones de seguridad. Para aplicaciones que requieren alta seguridad, se deben considerar tecnologías RFID más avanzadas o implementar capas adicionales de seguridad. Si se utilizan las claves por defecto, la seguridad es mínima. Es altamente recomendable cambiar las claves por defecto por claves personalizadas y únicas para cada tarjeta y sector, y nunca compartirlas.

Reescritura de Claves de Cifrado:

La librería MFRC522 permite modificar las claves de cifrado. El proceso implica autenticarse con las claves actuales, calcular el bloque trailer y luego escribir las nuevas claves. La función PCD_Authenticate() es esencial para este propósito.

// Ejemplo conceptual de cómo cambiar claves (requiere manejo de errores y lógica adicional)bool cambiarKeys(byte sector, byte newKeyA[6], byte newKeyB[6]) { byte trailerBlock = (sector * 4) + 3; // Calculate trailer block number // Authenticate with current keys (e.g., default keys for initial change) if (!mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, new byte[]{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, mfrc522.uid.uidByte)) { Serial.println("Error de autenticación para Key A"); return false; } // Prepare data for writing new keys and access conditions byte buffer[18]; // 16 bytes data + 2 bytes CRC // Copy new Key A for (int i = 0; i < 6; i++) buffer[i] = newKeyA[i]; // Define access conditions (example: can read/write all blocks with Key A or B) // This part is complex and depends on desired permissions. // For simplicity, let's assume default access conditions or a known set. buffer[6] = 0xFF; buffer[7] = 0x07; buffer[8] = 0x80; // Example access bits // Copy new Key B for (int i = 0; i < 6; i++) buffer[9 + i] = newKeyB[i]; // Access bits are repeated or defined differently for Key B access buffer[15] = 0xFF; buffer[16] = 0x07; buffer[17] = 0x80; // Example access bits // Write the new keys and access conditions to the trailer block if (!mfrc522.MIFARE_Write(trailerBlock, buffer, 18)) { Serial.println("Error al escribir en el bloque trailer"); return false; } Serial.println("Claves actualizadas exitosamente."); return true;}

Es fundamental entender que una vez que se cambian las claves de cifrado, los datos almacenados en los sectores correspondientes solo podrán ser accedidos utilizando las nuevas claves. Esto añade una capa de seguridad, pero también requiere una gestión cuidadosa de las claves.

Aplicaciones Prácticas y Casos de Uso

La versatilidad de los sistemas RFID con Arduino se extiende a una amplia gama de aplicaciones. Un ejemplo práctico, inspirado en sistemas de transporte público, es la creación de tarjetas recargables para viajes.

Simulación de Tarjeta de Transporte Recargable:

Imaginemos una tarjeta que almacena el número de viajes disponibles. El sistema puede leer la tarjeta, verificar el número de viajes, y al ser utilizada (por ejemplo, en un autobús o tranvía), decrementar este contador.

  1. Recarga de Viajes: Un código específico puede añadir un número determinado de viajes a la tarjeta. El byte 0 de un bloque en el sector 15 podría almacenar el número de viajes.
  2. Consumo de Viajes: Otro código, utilizado en el punto de validación (como una máquina expendedora o torniquete), leería la tarjeta, verificaría si hay viajes disponibles, y si es así, decrementaría el contador.

Este tipo de aplicación, aunque simple en su concepto, demuestra cómo los datos almacenados en las etiquetas RFID pueden ser dinámicos y gestionados por un sistema externo.

La tecnología RFID se utiliza en muchos ámbitos. Por ejemplo, en tiendas como Decathlon, se emplean sistemas RFID para la gestión de inventario y el pago rápido. Al depositar los artículos en una caja, el sistema identifica automáticamente todos los productos, agilizando el proceso de compra.

La plataforma de distribución de componentes electrónicos Transfer Multisort Elektronik (TME) ofrece un vasto catálogo de productos, incluyendo componentes para proyectos RFID, lo que facilita a los desarrolladores y aficionados la adquisición de todo lo necesario para sus innovaciones.

En resumen, los sistemas RFID con Arduino ofrecen una plataforma accesible y potente para explorar el mundo de la identificación automática y el control de acceso. Desde proyectos sencillos de lectura de UIDs hasta aplicaciones más complejas de gestión de datos y seguridad, la tecnología RFID, combinada con la flexibilidad de Arduino, permite materializar ideas innovadoras. La clave reside en comprender los principios básicos, seleccionar los componentes adecuados y programar de manera efectiva para obtener los resultados deseados.

tags: #lector #rfid #en #monitor #serial #arduino