miércoles, 24 de febrero de 2016

Control de acceso con el módulo RFID RC522


Hoy les voy a presentar el módulo RFID-RC522 en una de sus facetas, es este caso, leer el número de serie de una tarjeta o llavero MIFARE 1K, para posteriormente compararlo con unos números de serie previamente guardados dentro del programa y actuar en consecuencia según coincidan o no. MIFARE es una tecnología de tarjetas inteligentes sin contacto (TISC), de las más ampliamente instaladas en el mundo, es equivalente a las 3 primeras partes de la norma ISO 14443 Tipo A de 13.56 MHz con protocolo de alto nivel.
La tarjeta MIFARE 1K (la más común de todas) tiene 16 sectores independientes que pueden configurarse para almacenamiento de información general. El primer bloque (número 0),  se usa comúnmente como directorio de la tarjeta y contiene el número de serie (UID), mientras que el bloque 3 contienen las llaves de seguridad Key A y Key B por lo que tampoco son hábiles para almacenar datos, con lo que quedan otros 13 bloques para almacenar datos. Estos dispositivos son muy utilizados como monederos en los transportes públicos. Para diferenciar las tarjetas y los llaveros, las he marcado con su número de serie como se puede observar en la siguiente imagen.

Tarjetas y llaveros MIFARE 1K

El módulo RFID RC522 (identificación por radiofrecuencia) se alimenta a  3.3V, le vamos a comunicar con nuestro Arduino a través del protocolo de comunicación SPI (10 Mbit/s), tiene un consumo aproximado de 26 mA cuando está trabajando a pleno rendimiento y la distancia máxima de lectura es de 6 cm, además este módulo utiliza un sistema avanzado de modulación y demodulación para todo tipo de dispositivos pasivos de 13.56 MHz,  maneja el ISO14443A y soporta el algoritmo de encriptación Quick CRYPTO1 y MIFARE.

Módulo RFID RC522

En este POST simplemente vamos a ir leyendo los números de serie de varios llaveros y tarjetas MIFARE, con la premisa de que si pasamos cualquiera de las dos tarjetas por el lector, se encenderá el LED de color verde durante 3 segundos (mensaje: usuario válido!!!) y si pasamos cualquier llavero se encenderá el LED de color rojo (mensaje: usuario no válido!!!).
Por último decir que los Smartphone disponen de una tecnología de comunicación inalámbrica similar a la RFID denominada NFC (comunicación de campo cercano), por lo que si acercamos la parte trasera de nuestro Smartphone al lector RFID RC522, previamente activado el NFC, conseguiremos leer el número de serie NFC de nuestro Smartphone y a su vez activar una alarma sonora durante y encender el LED de color rojo al mismo tiempo durante 3 segundos (mensaje: usuario no válido!!!). A través del monitor serie podremos comprobar el número de serie de los diferentes dispositivos y si el usuario es válido o no, cuando pasemos por el lector una tarjeta, un llavero o en su defecto un Smartphone con NFC.

Monitor serie del IDE de Arduino


Lista de Materiales:


·         Arduino UNO Rev.3.

·         Cable USB tipo A-B.

·         Módulo RFID RC522.

·         2 tarjetas y 3 llaveros MIFARE 1K.

·         Smartphone con NFC (Opcional).

·         Protoboard.

·         Cables de conexión.


Código del programa:





Video:

34 comentarios:

  1. Donde se pueden bajar las librrias. Gracias

    ResponderEliminar
    Respuestas
    1. http://miarduinounotieneunblog.blogspot.com.es/2015/12/anadiendo-las-librerias.html?m=1

      Eliminar
  2. hola amigo cres que se puedan conectar dos Módulo RFID RC522 al mismo arduino... saludos

    ResponderEliminar
    Respuestas
    1. Si se puede, declarando un pin CS (Chip select) diferente para cada dispositivo y teniendo en cuenta que las líneas MISO, MOSI y SCK son comunes, solamente puedes tener un dispositivo activo para la comunicación, activándolo o no a través del pin CS que tengas asignado (creo recordar que se activa a nivel bajo --> LOW). Saludos

      Eliminar
  3. Saludos Mariano, No dejaste el código en TXT para probarlo.

    ResponderEliminar
  4. hola amigo tenia en mente crear un proyecto donde pueda conectar varios modulos rfid a un tarjeta mega de arduino crees que sea posible

    ResponderEliminar
  5. buenas tardes, gracias por tu aporte, tengo varias dudas acerca del RFID.
    mi idea es hacer un proyecto que vincule el ID de una tarjeta, con una base de datos y haci poder consultar varios datos de una persona solo con ese ID.
    ahora, para mi seria mejor que ese ID pudiera ser modificable, por ejemplo en lugar de ello poner un RFC.
    mi pregunta es, si esto es posible? o a fuerzas usar el ID default.
    he visto que las graban pero no encuentro su funcion o para que sirve

    ResponderEliminar
  6. buenas, solo me detecta el primero como valido, si los intercambio, sigue el primero valido, el segundo no valido, sabes porque puede ser.

    gracias

    ResponderEliminar
  7. ok, ya lo he visto, pero si quiero que los dos sean validos, tarjeta y llavero como lo hago??

    ResponderEliminar
  8. Tienes que leer los ID de los dos dispositivos y almacenarlos dentro de la variable int numero_serie_valido[2][5] = {{20,182,242,95,15},{176,144,83,157,238}}; (cambia los números por los de tus ID)

    ResponderEliminar
  9. Hola, buen proyecto, pero que se tiene que modificar para que mas tarjetas sen validas, porque de las dos que pongo solo una me es valida. gracias.

    ResponderEliminar
  10. Hola Mariano, muy interesante tu blog, se ve que trabajas mucho sobre el y eso esta bueno!!
    Te quería hacer una consulta con respecto al NFC de los teléfonos. Cuento un Galaxy S6 y cada vez que lo paso a través del lector RFID el código que lee es distinto. Eso es normal? o tengo que tomar una parte del mismo nada mas?
    Un saludo

    ResponderEliminar
  11. Sencillo, funcional y muy bien explicado, si señor ole.
    Para complicarlo un poco, como podríamos incluir un lcd 16x2 i2C y un teclado por si fallase el tag.
    Muchas gracias.

    ResponderEliminar
    Respuestas
    1. Si buscas por mi BLOG tienes un POST donde explico la conexion del LCD que mencionas y otro con un teclado numerico de 16 teclas. Saludos

      Eliminar
  12. Hola Mariano, perdona que te moleste. Cambio los números de tus ID por los que tengo yo pero solo me da como valido el primero, el resto no.
    He probado a cambiarlos por otros y he metido hasta 6 ID como validos cambiando por supuesto el número de IDs admitidos pero me sigue dando como valido únicamente el primer ID que pongo. Me trae de cabeza. ¿Podrías echarme una mano a ver que ocurre?
    Un saludo y muchas gracias.

    ResponderEliminar
  13. La matriz int numero_serie_valido[2][5] = {{20,182,242,95,15},{176,144,83,157,238}}; es la que almacena los ID válidos. Es la que tienes que modificar, ademas hay una parte del código que la tienes que modificar si utilizas mas de dos...

    if(i >= 2) // Números de serie válidos, en este caso 2
    {
    j=6;
    }
    }
    Y creo recordar que con eso ya te valdría.

    ResponderEliminar
  14. La matriz int numero_serie_valido[2][5] = {{20,182,242,95,15},{176,144,83,157,238}}; es la que almacena los ID válidos. Es la que tienes que modificar, ademas hay una parte del código que la tienes que modificar si utilizas mas de dos...

    if(i >= 2) // Números de serie válidos, en este caso 2
    {
    j=6;
    }
    }
    Y creo recordar que con eso ya te valdría.

    ResponderEliminar
  15. OK maestro, lo voy a trastear y ya te diré.
    Muchisimas gracias.

    ResponderEliminar
  16. Hola Mariano, perdona que te moleste de nuevo.
    Quería consultarte como puedo hacer que me reconozca el NFC del móvil para poder utilizar los TAG o el NFC indistintamente, he probado varias cosas en el código pero no doy con ello, el codigo del NFC siempre me lo da como no valido, el resto funciona genial.
    Un saludo y muchas gracias.

    ResponderEliminar
  17. Tienes que realizar una lectura del código NFC de tu dispositivo varias veces y ver que parte es la que no varía, ya que genera una parte aleatoria cada vez que li utilizas para mayor seguridad en pagos...una vez que lo tengas es modificar la parte del código con la parte fija de tu NFC.
    / Solo se ejecuta si acercamos el NFC del Smartphone y está activado
    if(numero_serie[0] == 8) // Primer dígito del número de serie del NFC de tu Smartphone.

    En mi caso al realizar varias lecturas del codigo NFC de mi smartphone solo se mantenía fijo el dígito cero que era el 8 como te muestro en el código...los demas dígitos variaban de manera aleatoria.

    ResponderEliminar
  18. He leído varias veces como me dices el código del NFC del móvil pero siempre arroja el mismo número de serie (1-2-3-4-4), el cual pongo en la linea de números de serie validos pero siempre me lo da como usuario no valido, he probado todo lo que se me ha ocurrido, incluso suprimir todas las lineas referentes a lo del NFC y el zumbador pero no hay manera de que considere la ID del NFC como usuario valido.
    ¿Podrías echarme una mano?
    Un saludo y muchísimas gracias.

    ResponderEliminar
  19. El NFC se evalúa al final del código y no junto con los TAGS porque difiere de el en algunos aspectos. Si el número de serie de tu NFC es (1-2-3-4-4)lo tendrías que evaluar de la siguiente manera.

    // Solo se ejecuta si acercamos el NFC del Smartphone y está activado
    if(numero_serie[0] == 1 && numero_serie[1] == 2 && numero_serie[2] == 3 && numero_serie[3] == 4 && numero_serie[4] == 4) { AQUÍ EL CÓDIGO QUE QUIERAS QUE TE REALICE CUANDO EL NFC ES CORRECTO O ACTIVAR UNA VARIABLE QUE HAGA QUE SE CUMPLA OTRA CONDICIÓN DEL CÓDIGO}

    Como una vez leído el NFC se almacena en la matriz llamada numero_serie[5] te recomiendo que después de que realices las operaciones oportunas la vacíes para nuevas entradas...

    for(int i=0; i>5; i++)
    {
    numero_serie[i]=0;
    }

    Muy a tener en cuenta que el TAG y el NFC como te he comentado se evalúan a parte y de diferente manera. Un saludo

    ResponderEliminar
    Respuestas
    1. // Función que se ejecuta cuando el usuario no es válido O UTILZAS NFC
      void usuario_no_valido()
      {
      // Solo se ejecuta si acercamos el NFC del Smartphone y está activado
      if(numero_serie[0] == 1 && numero_serie[1] == 2 && numero_serie[2] == 3 && numero_serie[3] == 4 && numero_serie[4] == 4)
      {
      Serial.println("Usuario válido!!!");
      // ENCIENDES O ACTIVAS LO QUE QUIERAS AQUÍ……………
      digitalWrite(zumbador,HIGH);// Zumbador encendido
      }
      else
      {
      Serial.println("Usuario no valido!!!");
      digitalWrite(LED_Rojo,HIGH);// LED Rojo encendido
      digitalWrite(LED_Verde,LOW);// LED Verde apagado
      delay(3000);
      digitalWrite(LED_Rojo,LOW); // LED Rojo apagado
      digitalWrite(zumbador,LOW); // Zumbador apagado
      }
      // VACÍAS EL NÚMERO DE SERIE
      for(int i=0; i>5; i++)
      {
      numero_serie[i]=0;
      }
      }

      Eliminar
  20. hola queria saber cuantos usuarios pudes programar en un arduino mega

    ResponderEliminar
  21. No lo se, seria calcularlo, primero ver lo que ocupa cada posición dentro del array y en base a ello calcular cuantas posiciones podrías acumular dentro del array. Pero te aseguro que son muchas

    ResponderEliminar
  22. Buena tarde, tengo un proyecto de inventario, quisiera saber como puedo guardar el ID del tag cuando la tarjeta RC522 la lea.

    gracias

    ResponderEliminar
  23. buenas tardes, excelente proyecto me sirvio mucho, solo una pregunta, como se podria registrar una hora en cuanto pasa la tarjeta???

    ResponderEliminar
  24. Hola Mariano, Me podrías pasar la librería? Gracias

    ResponderEliminar
    Respuestas

    1. http://miarduinounotieneunblog.blogspot.com.es/2015/12/anadiendo-las-librerias.html?m=1. Saludos

      Eliminar
    2. Y. Te molesto otra vez, como hiciste para darle una clave a las tarjetas? "{{20,182,242,95,15},{176,144,83,157,238}};"

      Eliminar
    3. Utilizo la clave (ID) que traen las tarjetas almacenado por defecto. Saludos

      Eliminar