Control de Acceso con Arduino

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.

Materiales necesarios:

Arduino leantecArduino UNO
rfid leantecMódulo RFID
cables leantecCables, leds y resistencias

Algo sobre la tecnología RFID.

El cometido principal de la tecnología RFID es dotar de identidad a objetos, productos, personas, animales… es similar a un número de serie.

La identificación por radiofrecuencia, RFID por sus siglas en ingles de Radio Frequency IDentification, es un sistema para recuperar y almacenar datos de forma remota y automática. Estos datos se almacenan en tarjetas, etiquetas, tags RFID…

Las etiquetas RFID, son unos dispositivos de pequeño tamaño fácil de adherir a cualquier objeto. Estas etiquetas o tags en ingles, tienen en su interior antenas de radiofrecuencia las cuales les permiten responder a peticiones de un emisor-receptor RFID.

Hay dos tipos de etiquetas, las pasivas y las activas. Las pasivas no necesitan alimentación, mientras que las activas si.

La ventaja fundamental de esta tecnología con respecto a otras es que no necesita contacto visual directo para transmitir los datos; como ocurre por ejemplo con la transmisión por infrarrojos.

Conexión del módulo RFID con Arduino

rfid leantec

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

SDA10
SCK13
MOSI11
MISO12
IRQNo se conecta
GNDGND
RST5
3,3V3V3

LED´S

 
LedPinAbierto (Verde)2
LedPinCerrado (Rojo)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 5
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] = {

                            {0x83, 0xF4, 0x8D, 0xC6, 0x3C,}
                           //,{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.

monitor arduino leantec

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.

rfid no encontrado leantec arduino

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.

rfid leantec

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 autorizada.

rfid arduino leantec

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.

rfid leantec arduino autorizado

rfid leantec arduino

Si acercamos una tarjeta no autorizada nos imprimirá NO AUTORIZADA y permanecerá encedido el led Rojo.

rfid leantec

leantec arduino rfid


Esperamos que les sea de utilidad y no olviden que en nuestro blog encontrará muchos otros post de su interes.

Etiquetas: , , ,

61 Comments

  • alejandro dice:

    buenas, el codigo metira un error en <#include me pueden pasar el link de la libreria, ya que me tira sketch_rfid:24:10: error: MFRC522.h: No such file or directory

    exit status 1
    MFRC522.h: No such file or directory

  • pablo dice:

    Hola , la libreria no me funciona

  • andres sierra dice:

    hola amigo tu información es muy completa y de gran ayuda, yo estoy dentro de un proyecto de investigación, como podría hacer para que si alguien trata de acceder con una tarjeta errónea o de otro modo me salte una alarma o algo parecido??

  • johann dice:

    hola me pueden facilitar la libreria que utilizaron del rfid ya que la que esta ahi me salen errores

  • Fernando dice:

    Me pueden mandar el link de la libreria que usaron del rfid
    porque el enlace que pusieron me manda a la pagina principal
    me ayudan por favor

  • jhonny dice:

    Disculpen la pregunta, ya intenté por todo lado, pero no logro compilar, la duda que tngo es, para programar una PN532, que tipo de tarjeta debo seleccionar en el IDE de ARDUINO, ya que si le pongo ARDUINO UNO, me dice error al compilar para ARDUINO UNO

  • Diego Martínez Martija dice:

    Buenos días,

    Estoy intentando hacer una aplicación que lea el contenido de una pegatina nfc. Todos los ejemplos que veo lo que hacen es leer el código de la pegatina y el número de serie pero lo que necesito es leer el contenido. Si he grabado el mensaje «Hola don pepito» que la aplicación de escritorio me lea ese «Hola don pepito» y no el número de serie de la tarjeta. Los ejemplos que hay en internet se limitan a leer el serial de la pegatina.
    He usado programas de ejemplo de internet que se supone que graban información en la pegatina pero no funcionan por que cuando leo la pegatina con NFC tools sale que está vacía

    Hasta ahora cuando leo la pegatina lo que me devuelve son números o códigos extraños y no el texto o el contenido que es lo que me interesa.

    He usado pegatinas MIFARE ultralight, un lector RFID RC522 de funduino y arduino uno. He probado con la librería y RFID.h y tampoco funciona

    Gracias por anticipado

  • Marius dice:

    Hola a todos.
    Necesito crear un código para 5 lectores RFID para abrir la misma puerta, sólo cuando los 5 lectores hayan leído los tag’s que les corresponda. Me puede ayudar alguien?
    Gracias.

  • mariano dice:

    el codigo funciona de 10 la pregunta mia es la siguiente como puedo agregar mas tarjetas o llaveros

  • Jesús Navarro dice:

    Muchas gracias, funciona perfecto, acabas de salvar mi pellejo

  • Oscar dice:

    Muchas gracias!!!
    Me ha funcionado a la perfección.

  • Carlos Aguilar dice:

    Buenas, antes que nada muchas gracias por su aporte.
    Ahora, tengo un problema; probé el programa en un arduino uno y funciono a la perfección, pero al intentar conectarlo en un arduino mega ni siquiera detectaba el lector («No ha encontrado RC522»), no estoy seguro si estoy conectando algo mal, o si tengo que modificar algo para que funcione, ademas para las conexiones con el mega «ST» lo marca con un signo de interrogación así que tampoco se a donde va. Si me pudieran ayudar se os agradecería mucho ya que estoy haciendo un proyecto con muchos I/O y necesito utilizar el mega ya que con el uno me quedaría corto de puertos. Gracias de antemano.

  • Dario dice:

    Hola, Te consulto para hacer una experiencia con mis alumnos. Existe algún RFID con Arduino que pueda identificarse a 5 o 6 metros. Si lo conoces podrías decirme cuales son?? Saludos

  • walter dice:

    Hola,tengo un problema ,la tarjeta leida es D7 5E AD 35 11,en donde se coloca este codigo,no entiendo,al lado de que? con comas o solo..Ayuda.

  • Jairo Najera dice:

    Buenas tardes, cuando cargo el programa en el monitor serial me aparece:
    «Buscando RC522
    Ha encontrado RC522 Firmware versionx12»
    Paso el llavero o la tarjeta y no pasa nada todo queda igual, no se si tenga que ver que descargue la libreria de RFID del link que dejo en esta pagina, pero por ejemplo en el codigo, la primer parte donde estan las librerias

    #include //Descargar e incluir la librería

    #include

    En esa parte, lo que es «SPI.h» me aparece remarcado color naranja, y lo que es «MFRC522.h» sigue del mismo color, tal cual y aparece aqui, no se si eso signifique que no esta llamando a la libreria o que pasara?

  • javier dice:

    me funciono de maravilla, como podria añadirle una salida para que active un rele cuando de autorizado?

    saludos

  • cristian dice:

    hola tengo un problema, no me reconoce las tarjetas y los llaveros no me tira el serial de 5 dígitos hexadecimal me pone Buscando RC522
    Ha encontrado RC522Firmware versión 0x92 y luego no me ve nada ni la tarjeta ni el llavero ya no se con que probar necesito ayuda urgente tengo que rendir este trabajo para calificar nota final y me dieron tiempo hasta el dia 21 que cae martes.

  • Alfredo dice:

    Gracias, funciona de maravilla
    Como puedo hacer para que solo permita 3 intentos para un mismo tag o tarjeta?

  • JORFY dice:

    OYE UNA PREGUNTA COMO ASOCIO UN NOMBRE A UNA TARJETA GRACIAS ….

  • Pedro dice:

    Hola, si hay una tarjeta con una asignación previa en otra parte [A] y la configuro en otra [B], se va a borrar del sitio A?

  • jaedth dice:

    el codigo no me da dice
    ‘class MFRC522’ has no member named ‘begin’
    pero yo ya puse la libreria que nos diste y todavia nada, ya intente con dos librerias de RFID
    :'(

    • Milton dice:

      Desacarga la librería del link que está al inicio de este post y agrégala; si es que descargaste alguna otra libreria desde la gestion de librerías, elimina la carperta que te debe haber generado en la direccion Libraries en tu PC y listo. Tuve el mismo error y con eso se solucionó.

  • joan dice:

    Hola, me funciona el codigo tengo todas las librerias y en el monitor serie me reconoce el Rc522 pero solo me sale esto «Buscando RC522
    Ha encontrado RC522Firmware version 0x11.»
    no me sale ningun numero mas, entonces no puedo configurarla bien.

    Gracias

  • Percy dice:

    Se puede puede clonar la llaves rfid? Si es así, hay alguna forma de hacerlas únicas?

  • Percy dice:

    Se puede clonar una llave rfid? Si es así, hay alguna manera de codificarla para que sea única?

  • Uriel dice:

    Hola buen dia como le podria hacer para poner dos lectores al mismo tiempo?

  • alex dice:

    Hola José,
    Yo e conseguido meter más targetas:
    #define AUTHORIZED_COUNT 2 //Para autoriazar más tarjetas ponemos el número aqui en authorized_count 1,2,3,4,etc…byte Authorized[AUTHORIZED_COUNT][6] = {

    {0x88, 0x4, 0x38, 0x49, 0xFD,},{0x95, 0xEF, 0xCD, 0x65, 0xD2,}
    //despues del primero coma y el codigo

  • jose dice:

    no se entiende donde va el numero que tira la tarjeta y si los que esta en el ejemplo quedan o no podrias explicarnos

  • Juan dice:

    Buenas noches, yo tampoco doy con la manera de añadir mas targetas ,he probado de varias maneras pero siempre me da error al compilar

  • JUAN B dice:

    Compañero no entiendo como poder añadir mas tarjetas.

    gracias

  • Juan dice:

    Muchisimas gracias ,he probado muchos proyectos y ninguno me funciono ,el vuestro a funcionado a la primera ,lo dicho muchisimas gracias y siguir con nosotros.

  • Juan dice:

    Buenas,esta noche probaré este por que he probado un montón de proyectos y todos me dan error de libreria, a ver si por fin consigo uno que funcione.
    Ya comentare

  • shirley ponton anaya dice:

    hola buen día, a mi me funciona muy bien la programación, pero tengo una pregunta. como hago para que me pueda leer mas de una tarjeta. agradezco me puedas colaborar con esto.

  • Gerardo dice:

    Hola! muchas gracias por el aporte! Pero me tira un error que dice:

    ‘class MFRC522’ has no member named ‘begin’

    Que soluciones me recomiendan para este error?

    • df dice:

      Te ha pasado lo mismo que a mi gerardo, descarga la libreria del principio y listo

      • ghost dice:

        Tengo el mismo problema. Ya descargué e incluí la librería y me sigue saliendo el error. También incluí la librería en su última versión buscando a través del IDE, y aún me sale ese error. Algun indicio de qué podría ser?

  • Claudio dice:

    Hola… muchas gracias por el aporte…

  • joan dice:

    no reconoce ninguna tarjeta

  • francisco dice:

    FUNCIONA, , dios , no habia soldado los cables y de ahi el error
    ahora solo saber donde poder mas llaveros

  • francisco dice:

    buenas
    me detecta el RFID y
    no me detecta las tarjetas

    solo muestra
    Buscando RC522
    Ha encontrado RC522
    Firmware version 0xFF.

    lo curioso es que si le quito la energia 3.3V
    me dice:
    Buscando RC522
    Ha encontrado RC522
    Firmware version 0x80.

    es posible esto que sin energia siga encontrando el RFID

    gracias

  • MarcosVE dice:

    Hola buenos días, tengo una duda sobre como enviar los codigos de la tarjerta a otro arduino atraves de Radio Frecuencia para poder implementarlo en una base de datos. Quisiera saber lo que tendria que enviar al otro arduino para que le llegue el codigo.
    Lo siento si es una pregunta tonta, pero soy un estudiante de CS y estoy haciendo el proyecto de final de ciclo con arduino (control de acceso RFID en una clase enviado por RF y leido en base de datos MySQL).

    Muchas gracias y un saludo.

  • harold dice:

    buenos dias yo tengo un arduino leonado pero no entiendo como es la coneccion gracias y si hay que cambiar algo en el docigo

  • alexis dice:

    hola me funciono perfectamente pero sigo teniendo el mismo problema solo me lee el llavero ,me pasa lo mismo que a vicente paso el llavero y lo lee perfecto pero con la tarjeta es distinto no pasa nada ni siquiera sale que esta autorizada , en pocas palabras no pasa nada. espero me puedas ayudar.gracias

    • Leantec Robotics&Electronics dice:

      Hola Alexis.

      ¿Tiene acceso a alguna otra tarjeta RFID de algún otro sistema electrónico? Si pudieras probar con una tarjeta que seguro funcione podemos averiguar más fácilmente cual es el problema.

      Un saludo.
      Servicio técnico Leantec.

  • josefernandez dice:

    Buenas Tardes, muy agradecido, funciona a la perfección !!!

    José

  • Vicente dice:

    Hola. Gracias en primer lugar, por compartir conocimientos entre los que no sabemos, pero nos gusta experimentar.

    Tengo que decirles que el montaje está realizado según el tutorial. El monitor serie me reconoce el módulo RFID, pero no lee las tarjetas que le presento; es decir, no me dice que estén o no autorizadas, y el led sigue en rojo, sin encender el led verde.

    He revisado el montaje varias veces, pero no encuentro dónde podría estar el fallo que cometo… Podrían darme una pista…?

    Saludos cordiales

    • Leantec Robotics&Electronics dice:

      Buenos días Vicente.

      ¿Las tarjetas con las que estás probando son las misma que el módulo traía? ¿Con el llavero funciona?
      ¿Tiene a su alcance alguna tarjeta de alguna otra máquina que pueda probar?

      Si todo esta bien, y en el monitor serial aparece que ha reconocido el módulo, solo se nos ocurre que el problema este en las tarjetas que está utilizando.

      Un saludo.
      Servicio técnico Leantec.

  • josfraba dice:

    Hola:
    No funciona. Al compilar saltan errores porque en el programa hay referencias a rutinas que no están en la librería MFRC522.h. (he descargado la versión existente al 2015.07.11.
    También hay referencia a «nfc» que no está declarado.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *