jueves, 25 de enero de 2018

Lectura de llavero y tarjeta con el módulo RFID MFRC-522 en Arduino




Después de criticar duramente la tecnología RFID puede resultar irónico  para muchos lectores que escriba un artículo en el que muestre su uso con Arduino. La tecnología me encanta y solo estoy en contra de los abusos de poder que pueden causar al conjunto de la población.

El RFID o identificación por radiofrecuencia (del inglés Radio Frequency Identification) es un sistema de almacenamiento y recuperación de datos remoto que usa dispositivos denominados etiquetas, tarjetas o transpondedores RFID. El propósito fundamental de la tecnología RFID es transmitir la identidad de un objeto (similar a un número de serie único) mediante ondas de radio. Las tecnologías RFID se agrupan dentro de las denominadas Auto ID (automatic identification, o identificación automática).

Las etiquetas RFID (RFID tag en inglés) son unos dispositivos pequeños, similares a una pegatina, que pueden ser adheridas o incorporadas a un producto, un animal o una persona. Contienen antenas para permitirles recibir y responder a peticiones por radiofrecuencia desde un emisor-receptor RFID. Las etiquetas pasivas no necesitan alimentación eléctrica interna, mientras que las activas sí lo requieren. Una de las ventajas del uso de radiofrecuencia (en lugar, por ejemplo, de infrarrojos) es que no se requiere visión directa entre emisor y receptor.

Para este proyecto, usaremos los siguientes componentes:




  • 1 LED verde
  • 1 LED rojo
  • 2 resistencias de 330 Ohmios
  • varios cables protoboard
  • 1 módulo RFID MFRC-522 que viene con llavero y tarjeta
  • 1 placa protoboard
  • 1 pila de 9V como fuente de alimentación o el puerto USB de tu computadora.

El módulo RFID MFRC-522 utiliza 3.3V como voltaje y se controla a través del protocolo SPI, por lo que es compatible con casi cualquier microcontrolador como Arduino o tarjeta de desarrollo.

El RC522 utiliza un sistema avanzado de modulación y demodulación para todo tipo de dispositivos pasivos de 13.56Mhz. El dispositivo maneja el ISO14443A y soporta el algoritmo de encriptación Quick CRYPTO1 y MIFARE.

El circuito MF RC522 es utilizado para comunicación inalámbrica a 13.56Mhz para escribir o leer datos de aplicaciones de bajo consumo de energía, bajo costo y tamaño reducido. Ideal para dispositivos portátiles o tarjetas.

Características

Modelo: MF522-ED
Corriente de operación: 13-26mA a 3.3V
Corriente de standby: 10-13mA a 3.3V
Corriente de sleep-mode: <80µA
Corriente máxima: 30mA
Frecuencia de operación: 13.56Mhz
Distancia de lectura: 0 a 60mm
Protocolo de comunicación: SPI
Velocidad de datos máxima: 10Mbit/s
Dimensiones: 40 x 60 mm
Temperatura de operación: -20 a 80ºC
Humedad de operación: 5%-95%
Máxima velocidad de SPI: 10Mbit/s

El paquete Incluye:

1 x Módulo RC522
1 x Tarjeta en blanco del estándar S50
1 x Tarjeta en forma de llavero azul S50
1 x Regleta de pines rectos
1 x Regleta de pines curvos

He probado el código que aparece en la web leantec.es y funciona correctamente. Para utilizar el módulo RFID MFRC-522 hay que tener instaladas las librerías SPI y la librería MFRC522 que puedes descargar aquí.



Para ver los resultados en el monitor Serial debe estar a una velocidad de 115200 baudios.

El código busca el módulo RFID MFRC-522 y si no lo encuentra, imprime un mensaje de que no lo ha encontrado en el monitor serial.

Si encuentra el módulo RFIF MFRC-522, al acercar la tarjeta o el llavero que viene con el módulo, aparecerá un mensaje con unos números y un texto: "No Autorizado".

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 qué el módulo RFID MFRC-522 imprima un mensaje de "Autorizado" cuando se acerca la tarjeta o el llavero, hay que añadir el número hexadecimal identificativo y único de la tarjeta y el llavero que  en el ejemplo gráfico aparece en un recuadro en rojo.

Código:
// Para autorizar la tarjeta y el llavero ponemos sus números identificativos a continuación
#define AUTHORIZED_COUNT 2
byte Authorized[AUTHORIZED_COUNT][6] = {
{0x5F, 0x97, 0xDB, 0xE9, 0xFA}, // Número identificativo  y único de mi tarjeta
{0x5D, 0xDE, 0x15, 0xA3, 0x35} // Número identificativo y único de mi llavero
};
Para determinar el número de identificación del llavero y la tarjeta , hay que cambiar una pequeña parte del código y así imprime el número de identificación del llavero y la tarjeta y lo muestra en la ventana del monitor serial de la interfaz gráfica de Arduino.

Código:
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(" ");
    }
Código de lectura de llavero y tarjeta RFID con el módulo RFID MFRC-522 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 2 //Para autorizar más tarjetas ponemos el número aqui y la añadimos abajo
byte Authorized[AUTHORIZED_COUNT][6] = {

 {0x5F, 0x97, 0xDB, 0xE9, 0xFA},        //Tarjeta
 {0x5D, 0xDE, 0x15, 0xA3, 0x35}   //Llavero
 };
                          
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(" ");
    }
}

Código para descargar: https://drive.google.com/open?id=1i0ejXXsUh8x3ZP_sPYNcsrh5CueaCPcr

Nota importante: He tenido que poner el código hexadecimal identificativo y unico del llavero y la tarjeta que venían con mí módulo RFID MFRC-522. Si quieren que funcione en su caso particular, tendrán que determinar los números identificativos de su llavero y tarjeta para sus módulos RFID que son únicos.

Fuentes:

http://www.leantec.es/blog/29_Control-de-acceso-con-Arduino-y-RFID-.html
https://es.wikipedia.org/wiki/Wikipedia:Portada