martes, 18 de noviembre de 2014

Tutorial#1.03# - Lectura RFID + Arduino Funuino

 
En esta ocasión quiero presentar un pequeño tutorial sobre la plataforma RFID-RC522 que hace poco adquirí. Este módulo es un lector / grabador de información via RFID que soporta los standars  ISO/IEC 14443 A/MIFARE.

Este módulo esta basado en el chipset "MFRC522" que fabrica NXP y que entre sus principales características esta la frecuencia de comunicación a 13.56 MHz, soporte para protocolos I2C y UART,etc.

La características de físicas son:
  • Funcionamiento a 3.3 V
  • Corriente 13 - 26 mA
  • Temp. funcionamiento -20 y 80 ºC
  •  Dimensiones 5.9 x 3.9 x 0.6
 El datasheet del chip puede consultarse aquí.

Los pines de conexión del módulo RFID-RC522 son 8 , tal como se puede apreciar en la imagen superior. Son:

  • SDA: I2C-bus serial data line input/output.
  • SCK: SPI serial clock input.
  • MOSI: SPI master out, slave in.
  • MISO: SPI master in, slave out.
  • IRQ: interrupt request output: indicates an interrupt event.
  • GND: digital ground.
  • RST: Reset
  • 3.3V: Supply source of 3.3V
Una vez conocido por encima el dispositivo que vamos a usar, el proposito es configurarlo con un Arduino Funduino ( Uno ) para validar una tarjeta id y simular el acceso o denegación del mismo. Esto se representará con un par de LEDs ( Rojo y Verde ).

El esquema de conexión es como se muestra a continuación ( el RFID es equivalente al RC522):



Una vez realizada la conexiones pertinentes, procedemos a escribir el codigo de prueba para validad el funcionamiento del sistema.

  1 /* 
  2 Tutorial sobre funcionamiento de lectura de 
  3 RFID modulo RC522 sobre Arduino Funduino.
  4 */
  5 
  6 #include <SPI.h>
  7 #include <RFID.h> 
  8 
  9 #define SDA_I 10
 10 #define RST_I 9
 11 
 12 // Declaración de conexion de SDA y RST de RC522
 13 RFID rfid(SDA_I,RST_I); 
 14 
 15 int led_rojo = 8;
 16 int led_verde = 7;
 17 
 18 // Declaración de codigos / usuarios aceptados 
 19 int numero_serie[5];   
 20 int usuario_valido[1][5]={ {136,414,47,9,83} };
 21 
 22 int contador=0;
 23 int bandera=0;
 24 
 25 void setup(){
 26 // Iniciamos la configuracion     
 27 Serial.begin(9600);
 28 SPI.begin();
 29 rfid.init();
 30 pinMode(led_verde, OUTPUT);
 31 pinMode(led_rojo, OUTPUT);
 32 
 33 }
 34 
 35 // Loop principal de lectura del usuario
 36 
 37 void loop(){ 
 38 digitalWrite(led_verde,LOW);
 39 digitalWrite(led_verde,LOW);
 40 if (bandera==0){
 41         Serial.print("Esperando id......  ");
 42         Serial.println();
 43         delay(1000);
 44         bandera=1;
 45 }
 46 delay(100);    
 47 lectura_usuario();
 48 delay(100);
 49 }
 50 
 51 // Se detecta tarjeta compatible con el protocolo
 52 // y se imprime por pantalla el codigo
 53 
 54 void lectura_usuario(){
 55 contador = 0;
 56 if (rfid.isCard()){ 
 57     if (rfid.readCardSerial()){
 58         Serial.println("Usuario n:  ");
 59         for ( int i=0;i<=4;i++){
 60             numero_serie[i]=rfid.serNum[i];
 61         }
 62         for ( int j=0;j<=4; j++){
 63             Serial.print(numero_serie[j]);
 64         }
 65         delay(500);
 66         contador=1;
 67         comprobacion_id();
 68     }
 69     
 70 }
 71 rfid.halt();
 72 }
 73 
 74 // Se realiza la comparación entre los datos
 75 // leidos y los almacenados en la cadena "usuario_valido"
 76 
 77 
 78 void comprobacion_id(){
 79 int i,j=0;
 80         if ((usuario_valido[i][j])==(numero_serie[j])){
 81             j++;
 82         }
 83         else{
 84         i++;
 85         j=0;    
 86         }
 87         if(i >= 2){ 
 88 
 89                j=5;
 90          }
 91     switch(i)
 92     {
 93     case 0:
 94         usuario_validado();
 95         break;
 96         
 97     default:
 98         usuario_no_validado();
 99         break;
100         
101     }    
102 
103 bandera=0;
104 digitalWrite(led_verde,LOW);
105 digitalWrite(led_rojo,LOW);
106 }
107 
108 // Validacion de usuario mediante mensaje
109 // y encendido de Led Verde
110 
111 void usuario_validado(){
112     if(contador == 1)
113     {
114         Serial.print("  Usuario correcto");
115         Serial.println();
116         digitalWrite(led_verde,HIGH);
117         delay(1000);
118         contador = 0;
119     }
120 }
121 
122 // Negación de usuario mediante mensaje
123 // y encendido de Led Verde
124 
125 
126 void usuario_no_validado(){
127     if(contador == 1)
128     {
129         Serial.print("  Usuario incorrecto");
130         Serial.println();
131         digitalWrite(led_rojo,HIGH);
132         delay(1000);
133         contador = 0;
134     }
135 }

Así pues, solo queda probarlo.......yo en mi caso programé mi codigo para que detectara mi tarjeta "Oyster" de transporte publico de Londres ( archiamiga ! ), tal como muestro en la siguiente imagen:






Hay que decir que no todas las tarjetas valen......teneis que tener en cuenta que deben funcionar con los protocolos MIFARE adecuados ( toda la info en el datasheet)........

A continuación se muestra el Monitor Serial de Atmel Studio 6.2:


...y nada más, a sacarle provecho a la RFID. Yo por mi parte ya tengo un proposito para ella!

    1 comentario: