Página principal
Arduino

RFID RC522


En este montaje realizamos un lector de tarjetas RFID RC522  - ISO/IEC 14443 Type A 13.56 MHz.
Basado en el chip  Philips/NXP MFRC522 RFID chip (Chip Datasheet) .
El módulo montado se puede comprar por menos de 3 € , y 10 tarjetas por menos de 2€ .

Tarjetas RFID.

Módulo.


Esquema.


Circuito montado.

Para realizar este montaje estuve viendo varias páginas donde explicaban diferentes modos de leer tarjetas RFID.
La mas completa es https://github.com/miguelbalboa/rfid  con una librería muy completa. Al principio no me funcionaba con arduino 1.05 daba errores al compilar, pero después de instalar la última versión 1.69 me funcionó.
Otra página  no utilizaba ningún tipo de librería https://labitat.dk/wiki/RFID_RC522-AN, funcionaba con cualquier versión de arduino.
La utilizada se encuentra en http://geekchickens.blogspot.com.es/, es una librería sencilla RFID, dos ficheros que se copian en un directorio que se llama RFID en el directorio de librerias  (libraries).
/*
SETA43
http://www.seta43.netau.net/
http://seta43.blogspot.com.es/
*/
/* basado en  GeekChickens
//http://geekchickens.blogspot.com.es/
/*
SDA es el pin 10
SCK es el pin 13
MOSI es el pin 11
MISO es el pin 12
RST es el pin 9
*/

#include <SPI.h>
#include <RFID.h>
 
#define SS_PIN 10
#define RST_PIN 9

#define DEBUG 0
 
RFID rfid(SS_PIN, RST_PIN);
 
int numero_serie[5];
unsigned char  usuariosON[10][5]={ 151,44,65,197,63,
                                   214,191,212,72,245,
                                   206,12,97,113,210,
                                   78,179,151,113,27,
                                   190,187,151,113,227, } ;
const int ledPinOK =  2;
const int ledPinERROR =  3;    // Sound

void setup()
{
  Serial.begin(9600);
  SPI.begin();
  pinMode(ledPinOK, OUTPUT);
  pinMode(ledPinERROR, OUTPUT);
  rfid.init();
  Serial.println("Inicia ");
#if DEBUG
  for(int z=0; z<5 ; z++)
   {
      Serial.print("Usuario "); Serial.print(z);Serial.print("-> ");
      for(int i=0; i<=4 ; i++)
                {
                  Serial.print(usuariosON[z][i]);
                  Serial.print(",");
                }
      Serial.println(" ");
   }
#endif  
   digitalWrite(ledPinOK, LOW);
   digitalWrite(ledPinERROR, LOW);
}
 
void loop()
{
  int i,z;
 
    if (rfid.isCard())
    {
           if (rfid.readCardSerial())
            {
                Serial.print("Numero usuario: "); // guardamos el numero del usuario
                for(int i=0; i<=4 ; i++)
                {
                  numero_serie[i] = rfid.serNum[i];
                }
 
                for(i=0; i<=4 ; i++) // y lo imprimimos
                {
                  Serial.print(numero_serie[i]);
                  Serial.print(",");
                }               
               
                if(-1==detectarUsuario())
                {
                   //Error Usuario
                   for(z=1; z<12 ; z++)
                     if(z&1)
                       {
                        for(i=0; i<200 ; i++)  {digitalWrite(ledPinERROR, i&1); delay(1);}
                       }
                       else
                       {
                        delay(200);
                       }                          
                }
                else
                {
                 //Ok usuario
                  digitalWrite(ledPinOK, HIGH);
                  for(i=0; i<100 ; i++)  {digitalWrite(ledPinERROR, i&1); delay(3);}                 
                }
            
                delay(1000);
                digitalWrite(ledPinOK, LOW);
                digitalWrite(ledPinERROR, LOW);
             }
    }
    rfid.halt();
}

unsigned int detectarUsuario()
{
 char f1;
 int z,i;
 Serial.println();
 Serial.println("Chequeando usuario");
  for(z=0; z<5 ; z++)
   {
     f1=0;
      for(i=0; i<=4 ; i++)
                {                 
                  if(usuariosON[z][i]==numero_serie[i]) f1++;
                }
      if(f1==5)
        {
          Serial.print("OK-Usuario ");
          Serial.println(z);
          return(z);
        }      
   }
  Serial.println("Error Usuario ");
  return(
-1);
}

Existen un numero de tarjetas prefijadas en que pueden activar el pin 2 , para abrir una puerta o lo que se quiera.
Estas tarjetas se encuentran memorizada en la variable:
unsigned char  usuariosON[10][5]={ 151,44,65,197,63,
                                   214,191,212,72,245,
                                   206,12,97,113,210,
                                   78,179,151,113,27,
                                   190,187,151,113,227, } ;

Cualquier tarjeta que no este en la variable usuariosON activara el pin 3 y sonará un pitido de alarma durante unos segundos.
El programa es sencillo, sin muchas complicaciones, es simplemente una aproximación a la tarjetas RFID.
Si quisiéramos hacer una llave mas segura, deberíamos poner un teclado que nos pida una clave secreta asignada a dicha tarjeta.

VIDEO

PROGRAMAS


Saludos.
Juan Galaz

Bibliografía:
https://labitat.dk/wiki/RFID_RC522-AN
https://sites.google.com/a/mail.utec.edu.sv/arduino-seguridad-con-tecnologia-rfid/home
http://geekchickens.blogspot.com.es/search/label/RFID
https://github.com/miguelbalboa/rfid
https://es.wikipedia.org/wiki/RFID