Robotics | Arcade | Electronics

Cart

Your Cart is Empty

Back To Shop

Control de acceso con Arduino y RFID.

Control de Acceso con Arduino

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 leantec Arduino UNO
rfid leantec Módulo RFID
cables leantec Cables, 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

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

63 thoughts on “Control de acceso con Arduino y RFID.

  1. Hola como estas? no se si llegue muy tarde al post, tome parte de tu codigo para mi proyecto con un ESP32 y el MFRC522.
    En mi caso implemento esta funcion que yo cree:

    ///////////////////////////////////////////////////////////////////////////////////////////////////
    void uid_DATA (void)
    {
    byte serial[4];

    mfrc522.PICC_UIDSOLA(&(mfrc522.uid)); //esta funcion fue creada en mfrc522.cpp y declarada en mfrc522.h

    printSerial (serial); //me deberia imprimir el serial de mi tarjeta RFID (UID creo yo)

    if(isAuthorized(serial))
    {
    Serial.println(«Autorizado»);
    //Abierto = true; //en mi caso no ocupo los leds
    }
    else
    {
    printSerial(serial);
    Serial.println(«NO autorizado»);
    //Abierto = false;
    }
    }
    //////////////////////////////////////////////////////////////////

    El problema que yo tengo es que siempre me da AUTORIZADO para cualquier tarjeta PICC que utilice, en mi caso probe con la que me trae de prueba el MFRC522 y con una tarjeta de colectivo que funciona con la misma frecuencia. Cuando el codigo que vos hiciste me lee la tarjeta me devuelve un valor: EC 0 FC 3F F, sin embargo este valor me lo devuelve para cualquier tarjeta que yo ingrese y no se porque, entonces me da como autorizado a cualquier tarjeta que yo ingrese, no logro solucionar ese problema con el codigo que vos hiciste.

  2. Copie el código e incluí la librería que sugieren, pero me aparece un error que no reconoce nfc.begin entonces pensé que estaba tal vez mal escrito y lo corregí por mfrc522 y siguió compilando y se detenía donde encontraba nfc por lo tanto cambie por mfrc522 pero da otro error que no reconoce getFirmwareVersion, por favor me podría ayudar, gracias.

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

  4. 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??

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

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

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

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

    1. debes crear una funcion con arreglos para usuarios autorizados, leyendo primero el codigo hexadecimal y lo guardas para cada nuevo usuario

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

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

  11. 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?

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

  13. 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
    :'(

    1. 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ó.

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

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

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

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

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

  19. 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?

      1. 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?

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

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

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

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

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

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

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

    1. Hola josfabra,

      Gracias por el consejo.

      Acabamos de verificar que todo esté bien y parece funcionar a la perfección. Por favor, asegúrese de que el código lo tiene tal y como está en la web. Hemos copiado y pegado el código tal cual está y no nos ha dado ningún error.

      Esperamos su respuesta.

      Un saludo,
      Servicio Técnico leantec.es
      http://www.leantec.es

Deja una respuesta

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

Cart

Your Cart is Empty

Back To Shop