Tutorial mdulo Lector RFID RC522
Publicado por
Tutoriales
0Comentarios
Los lectores RFID(Radio Frequency IDentification) en la actualidad
estn teniendo bastante acogida en los sistemas de identificacin,
su uso abarca desde sistemas de seguridad, acceso de personal,
identificacin y logstica de productos, como llaves de puertas
elctricas, entre otras aplicaciones.
Su principio de funcionamiento consiste en pasar un TAG, cerca de
un lector RFID, el TAG tiene la capacidad de enviar informacin al
lector. Dicha informacin puede ser desde un simple cdigo o todo
un paquete de informacin guardo en la memoria del Tag.
Los TAGs viene en diferentes modelos, los ms comunes son en
tarjetas y en llaveros, pero tambin vienen como etiquetas
adhesivas e incluso ya viene incrustados en algunos productos. Los
Tags tienen internamente una antena y un microchip, encargado
de realizar todo el proceso de comunicacin, la energa lo obtiene
de la seal de radiofrecuencia, que si bien la energa en la seal es
pequea, es suficiente para hacer trabajar el microchip, esto es la
razn por la que es necesario acercarlos a una pequea distancia
generalmente menor a 10 cm. Pero existen Tags activos, que
incorporan bateras, estos tiene alcance de varios metros de
distancia.
Mdulo RFID RC522
Es el que usaremos en este tutorial, este mdulo funciona como
Lector y Grabador de Tags RFID.
Este mdulo utiliza un sistema de modulacin y demodulacin de
13.56MHz, frecuencia que en la actualidad utiliza la tecnologa
RFID.
EL mdulo se comunica por SPI, por lo que se puede implementar
con cualquier microcontrolador con interfaz SPI, como un Arduino.
Bien, empecemos a armar nuestro proyecto:
Conexin del entre el mdulo RFID y
Arduino
Mdulo
RC522
Arduino Uno,
Nano
Arduino
Mega
SDA (SS)
10
SCK
13
52
MOSI
11
51
MISO
12
50
IRQ
No conectado
No conectado
GND
GND
GND
RST
3.3V
3.3V
3.3V
53
Como se observa en la conexin, el mdulo trabaja con un voltaje
de 3.3V, por lo que la parte lgica tambin debera trabajar con el
mismo nivel de voltaje, para prueba y testeo se puedo conectar
directamente a los pines del Arduino (nivel TTL 5V), pero se
recomienda usar conversores de niveles de voltaje.
Programacin del Mdulo RC522: Lectura
del cdigo de identificacin
Para poder trabajar el Modulo en Arduino es necesario descargar
su librera correspondiente, la que usaremos ser una de las ms
comunes, la desarrollada por Miguel Balboa.
Librera RFID
Una vez descargada, importamos la librera a nuestro IDE de
Arduino, con esto estamos listos para programar.
A continuacin se muestra un sketch para leer el cdigo de
identificacin de nuestros Tags
#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN
9 //Pin 9 para el reset del RC522
#define SS_PIN
10 //Pin 10 para el SS (SDA) del RC522
MFRC522 mfrc522(SS_PIN, RST_PIN); //Creamos el objeto para el RC522
void setup() {
Serial.begin(9600); //Iniciamos la comunicacin serial
SPI.begin();
//Iniciamos el Bus SPI
mfrc522.PCD_Init(); // Iniciamos el MFRC522
Serial.println("Lectura del UID");
}
void loop() {
// Revisamos si hay nuevas tarjetas presentes
if ( mfrc522.PICC_IsNewCardPresent())
{
//Seleccionamos una tarjeta
if ( mfrc522.PICC_ReadCardSerial())
{
// Enviamos serialemente su UID
Serial.print("Card 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();
// Terminamos la lectura de la tarjeta actual
mfrc522.PICC_HaltA();
}
}
}
Como se observa es fcil de entender, pero expliquemos las
funciones
referentes
al
mdulo
RC522
Instanciar el RC522
#define RST_PIN
9 //Pin 9 para el reset del RC522
#define SS_PIN
10 //Pin 10 para el SS (SDA) del RC522
MFRC522 mfrc522(SS_PIN, RST_PIN);
Es necesario utilizar la librera MFRC522.h, solo es necesario
especificar los pines Reset y SDA(SS) del mdulo, los dems pines
trabajan con los pines SPI del Arduino.
Iniciar el RC522
SPI.begin();
//Iniciamos el Bus SPI
mfrc522.PCD_Init(); // Iniciamos el MFRC522
Esta funcin inicia y configura al RC522 para su posterior lectura,
solo es necesario llamarlo una vez por lo que generalmente se lo
llama en void setup()
Ver si hay una tarjeta presente
mfrc522.PICC_IsNewCardPresent()
Esta funcin nos devuelve verdadero o falso dependiendo si hay
una tarjeta presente cerca al mdulo RC522.
Seleccionar una tarjeta para la lectura
mfrc522.PICC_ReadCardSerial()
Se llama a esta funcin cuando queremos comunicarnos con una
tarjeta, nos devuelve un valor verdadero si logra seleccionar una
tarjeta para la lectura, de lo contrario nos retorna un valor falso.
Obtener el tamao del cdigo de identificacin
mfrc522.uid.size
Nos retorna el tamao en Bytes del cdigo de identificacin de la
tarjeta seleccionada.
Leer el cdigo de identificacin
mfrc522.uid.uidByte
Para acceder al cdigo de identificacin es recomendable indexar
la variable por ejemplo mfrc522.uid.uidByte[0] para el byte en la
posicin
inicial.
Finalizar la lectura.
mfrc522.PICC_HaltA();
Con esta funcin le indicamos que hemos terminado la lectura de
la tarjeta presente y IsNewCardPresent() devolver falso para esta
tarjeta mientras no se retire. Si despus de retirar la tarjeta, si se
ingresa nuevamente la misma tarjeta se le considera como una
nueva tarjeta.
En el sketch, el cdigo de identificacin lo enviamos por el puerto
serial, para visualizar el cdigo es necesario abrir el Monitor Serial
del IDE de Arduino.
Una Aplicacin Simple: Control de acceso
usando RFID
Bien, visto el ejemplo anterior, ahora apliqumoslo para un control
de acceso, que puedes aplicarse en una puerta elctrica, caja
fuerte, sistema de encendido, desactivar alarmas, etc.
Para este ejemplo estamos usando 4 Tags de los cuales solo dos
deben tener acceso al sistema. Para implementar esto partimos del
sketch anterior y solo le agregamos unas lneas ms al final del
programa para comparar los cdigos y determinar si tienen o no
acceso.
A continuacin se muestra el Sketch.
#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN
9 //Pin 9 para el reset del RC522
#define SS_PIN
10 //Pin 10 para el SS (SDA) del RC522
MFRC522 mfrc522(SS_PIN, RST_PIN); ///Creamos el objeto para el RC522
void setup() {
Serial.begin(9600); //Iniciamos La comunicacion serial
SPI.begin();
//Iniciamos el Bus SPI
mfrc522.PCD_Init(); // Iniciamos el MFRC522
Serial.println("Control de acceso:");
}
byte ActualUID[4]; //almacenar el cdigo del Tag ledo
byte Usuario1[4]= {0x4D, 0x5C, 0x6A, 0x45} ; //cdigo del usuario 1
byte Usuario2[4]= {0xC1, 0x2F, 0xD6, 0x0E} ; //cdigo del usuario 2
void loop() {
// Revisamos si hay nuevas tarjetas presentes
if ( mfrc522.PICC_IsNewCardPresent())
{
//Seleccionamos una tarjeta
if ( mfrc522.PICC_ReadCardSerial())
{
// Enviamos serialemente su UID
Serial.print(F("Card 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);
ActualUID[i]=mfrc522.uid.uidByte[i];
}
Serial.print("
");
//comparamos los UID para determinar si es uno de nuestros usuarios
if(compareArray(ActualUID,Usuario1))
Serial.println("Acceso concedido...");
else if(compareArray(ActualUID,Usuario2))
Serial.println("Acceso concedido...");
else
Serial.println("Acceso denegado...");
// Terminamos la lectura de la tarjeta tarjeta actual
mfrc522.PICC_HaltA();
}
}
}
//Funcin para comparar dos vectores
boolean compareArray(byte array1[],byte array2[])
{
if(array1[0] != array2[0])return(false);
if(array1[1] != array2[1])return(false);
if(array1[2] != array2[2])return(false);
if(array1[3] != array2[3])return(false);
return(true);
}
Y el resultado lo podemos observar al pasar los Tags y visualizarlo
en el monitor serial.
En lugar de enviarlo serialmente la confirmacin se puede
programar para activar una salida digital, que puede estar
conectado a una chapa elctrica, una alarma, etc. depender de la
aplicacin
en
particular
que
estn
trabajando.
Es bueno aclarar que si bien cumple el objetivo, no es una forma
100% segura, cualquiera que sepa del tema podra clonar las
tarjetas. Para una mayor seguridad es necesario trabajar con los
bloques de la memoria interna del TAG, pudindose configurar una
clave para la lectura, adems se podra trabajar con un cdigo
mayor a los 4 bytes del UID, incluso se podran trabajar con varios
datos. (La lectura y escritura de bloques de memoria se ver en un
prximo tutorial)