Control de
acceso con Arduino y RFID.
En esta entrada explicaremos como montar tu propio
control de acceso usando Arduino como la placa encargada del control y el
módulo RFID-RC522 encargado de la comunicación y la lectura.
Despues de entender el funcionamiento del RFID se te
abrirán las puertas de muchos otros proyectos en los que necesites está
tecnología.
Es fácil. El módulo RFID está serigrafiado. Solo hay que
conectar los pines de la siguiente forma.
En los comentarios del código que más abajo facilitamos
también aparece como conectarlo.
RFID-RC522
Pines
Arduino UNO
SDA
10
SCK
13
MOSI
11
MISO
12
IRQ
No se conecta
GND
GND
RST
5
3,3V
3V3
LED´S
LedPinAbierto (Verde)
2
LedPinCerrado (Azul)
3
Código de prueba.
Antes de cargar el código en Arduino, necesitamos
descargar y añadir la libraría para manejar el módulo RFID.
Puedes descargarla aquí.
Una vez tengamos la librería, cargamos el código en
Arduino.
#include <MFRC522.h>//Descargar e incluir la librería
#include <SPI.h>
/*
Pins SPI UNO Mega2560 Leonardo
1 (NSS) SAD (SS) 10 53 10
2 SCK 13 52 SCK1
3 MOSI 11 51 MOSI1
4 MISO 12 50 MISO1
5 IRQ * * *
6 GND GND GND GND
7 RST 5 ? Reset
8 +3.3V (VCC) 3V3 3V3 3.3V
* No necesario
*/
#define SAD 10
#define RST 9
MFRC522 nfc(SAD, RST);
#define ledPinAbierto 2
#define ledPinCerrado 3
void setup() {
pinMode(ledPinAbierto , OUTPUT);
pinMode(ledPinCerrado, OUTPUT);
SPI.begin();
Serial.begin(115200);
Serial.println("Buscando RC522");
nfc.begin();
byte version = nfc.getFirmwareVersion();
if (! version) {//Entra si no encuentra el módulo.
Serial.print("No ha encontrado RC522");
while(1); //detener
}
Serial.print("Ha encontrado RC522");
Serial.print("Firmware version 0x");
Serial.print(version, HEX);
Serial.println(".");
}
#define AUTHORIZED_COUNT 1 //Para autoriazar más tarjetas ponemos el número aqui y la añadimos abajo
byte Authorized[AUTHORIZED_COUNT][6] = {
{0xE4, 0xBD, 0xF5, 0xE2, 0x4E, }
//,{0x10, 0x14, 0x39, 0x2E, 0xFF, 0xFF, } ejemplo de como autorizar más tarjetas 0x83,.....
};
void printSerial(byte *serial);
boolean isSame(byte *key, byte *serial);
boolean isAuthorized(byte *serial);
void loop() {
byte status;
byte data[MAX_LEN];
byte serial[5];
boolean Abierto = false;
digitalWrite(ledPinAbierto, Abierto);
digitalWrite(ledPinCerrado, !Abierto);
status = nfc.requestTag(MF1_REQIDL, data);
if (status == MI_OK) {
status = nfc.antiCollision(data);
memcpy(serial, data, 5);
if(isAuthorized(serial))
{
Serial.println("Autorizado");
Abierto = true;
}
else
{
printSerial(serial);
Serial.println("NO autorizado");
Abierto = false;
}
nfc.haltTag();
digitalWrite(ledPinAbierto, Abierto);
digitalWrite(ledPinCerrado, !Abierto);
delay(2000);
}//if (status == MI_OK)
delay(500);
}//void loop()
boolean isSame(byte *key, byte *serial)
{
for (int i = 0; i < 4; i++) {
if (key[i] != serial[i])
{
return false;
}
}
return true;
}
boolean isAuthorized(byte *serial)
{
for(int i = 0; i<AUTHORIZED_COUNT; i++)
{
if(isSame(serial, Authorized[i]))
return true;
}
return false;
}
void printSerial(byte *serial)
{
Serial.print("Serial:");
for (int i = 0; i < 5; i++) {// aumentar a 5 para leer el número de la tarjeta completo
Serial.print(serial[i], HEX);
Serial.print(" ");
}
}
Probando el montaje.
Para probar nuestro montaje abrimos el monitor serial de
Arduino y lo hacemos funcionar a 115200 baudios.
El programa, lo primero que hace es buscar el módulo
RFID, si no lo encuentra en el monitor serial se imprimirá un aviso informando
de que no lo ha encontrado.
En el caso de que no encuentre el módulo RFID, tenemos
que comprobar que todas las conexiones estan correctas y que nuestro módulo
RFID esta en buen estado.
Una vez que ya lo encuentra, solo tenemos que acercar
nuestra tarjeta o llavero; seguramente aparezca un mensaje en el que aparece
unos números y las palabras NO AUTORIZADO.
Para autorizar una tarjeta tenemos que añadir su
número de identificación a esta linea de código.
#define AUTHORIZED_COUNT 1 //Para autoriazar más tarjetas ponemos el
número aqui y la añadimos abajo
byte
Authorized[AUTHORIZED_COUNT][6] = {
{0x11, 0x1D, 0xD3, 0xE, 0xD1,}
//,{0x10, 0x14, 0x39, 0x2E, 0xFF, 0xFF, }
ejemplo de como autorizar más tarjetas
0x83,.....
};
Para saber cual es el número de identificación de la
tarjeta, solo tenemos que cambiar un valor en un bucle del código. Esto hace
que cuando la tarjeta no está autorizada nos imprima el número de
identificación de la tarjeta en cuestión.
La línea de código en la que hay que hacer la
modificación es la siguiente.
void
printSerial(byte
*serial)
{
Serial.print("Serial:");
for (int i = 0; i < 5; i++) {// aumentar a 5 para leer el número de la
tarjeta completo
Serial.print(serial[i],
HEX);
Serial.print(" ");
}
Solo tenemos que copiar el número que nos imprime por el
monitor serial y añadirlo como tarjeta utorizada.
Una vez tenemos nuestra tarjeta autorizada solo tenemos
que acercarla al módulo RFID. En el monitor serial nos aparecerá como tarjeta
autorizada y se nos encenderá el led verde.
Si acercamos una tarjeta no autorizada nos imprimirá NO
AUTORIZADA y permanecerá encedido el led Rojo.
RFID-RC522
|
Pines
Arduino UNO
|
SDA
|
10
|
SCK
|
13
|
MOSI
|
11
|
MISO
|
12
|
IRQ
|
No se conecta
|
GND
|
GND
|
RST
|
5
|
3,3V
|
3V3
|
LED´S
|
|
LedPinAbierto (Verde)
|
2
|
LedPinCerrado (Azul)
|
3
|







