Buscador

viernes, 3 de enero de 2014

Control de acceso con lector de tarjetas RFID usando Arduino


En este tutorial explicaré cómo montar un lector de tarjetas y tags ( llaves ) de tipo RFID (por si alguien se anima y se quiere instalar un sistema de control de puerta en casa :) )

Si lo que quieres es leer tu tag para saber su código, por favor ve aquí

Pero antes tenemos que saber un poco qué es el RFID. El RFID quiere decir " Identificación por RadioFrecuencia.

Cada tag contiene un numero único ( algo asi como su propio DNI ) y al interactuar con un lector RFID, se realiza un intercambio de información. Dicho tag le envía al lector su número de identificación ( su ID).

Existen dos tipos de RFID, los pasivos y los activos.  Los pasivos no llevan pila y se alimentan con la señal electromagnética  que les induce el lector RFID, y los activos llevan alimentación propia ( eso permite mayor alcance).


En el siguiente proyecto se realizará la detección de dos tag ( una es una tarjeta y la otra un tag ) y se le dará acceso al primer tag, pero al segundo no.

Abajo del post está el código entero y listo para usarse incluídas todas las librerías necesarias

Procesos que hará el programa:

1) Leerá el numero de la tag.
2) Lo comprobará con una lista interna de numeros aceptados.
3) Si es correcto, abrirá la puerta, si no, dará mensaje de error.
4) También comprobará cuándo se cierra la puerta ( mediante un interruptor) y avisará si está abierta.



Materiales:

x1 lector RFID que funcione por SPI a una frecuencia de 13'56MHz.

x2 Tags ( o más )
x1 Arduino uno (con mi arduino mega 2560 compatible no me acababa de ir bien)
x2 LED ( uno rojo y otro verde)
x1 switch ( simulará el sensor de la puerta, para saber si se ha cerrado o no )
x1 resistencia 1K (para hacer un pull-down con el switch)
x2 resistencias 220 ohm (para los LED)


Conexiones:



Las librerías tenéis que incluirlas en la carpeta " libraries " de vuestro IDE de arduino

Diagrama de flujo: (es aproximado al código, tan sólo es para tener una idea del flujo del programa)








Código:

//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
*/
 //-----------------------------------------------variables, includes, funciones, etc-------------------------------------------------
#include <spi.h>
#include <rfid.h>
 
#define SS_PIN 10
#define RST_PIN 9
 
RFID rfid(SS_PIN, RST_PIN);
 
char orden;
int led_verde = 8;
int led_rojo = 7;
int sensor_puerta = 6;
int contador = 0;//<==========================esta variable sirve para evitar bucles de impresión de " usuario correcto " o " usuario incorrecto"
int estado_puerta = 0;
int puerta_abierta = 0;
int contador_estado_puerta = 0;
int i = 0 ;
int numero_serie[5]; // aqui guardaremos el número que nuestro sensor RFID detectará
int usuario[1][5]={ {36,238,94,1,149} }; // lo he hecho asi para poder añadir más en un futuro
 
 //-----------------------------------------------variables, includes,funciones, etc-------------------------------------------------
 
void setup()
{
Serial.begin(9600);
pinMode(led_verde, OUTPUT);
pinMode(led_rojo, OUTPUT);
pinMode(sensor_puerta,INPUT);
SPI.begin();
rfid.init();
}
 
void loop()
{
   comprobar_puerta();
 
 
  if(estado_puerta == 1)
  {
             for(int i = 0 ; i < 60; i++)  // aquest bucle fa que cada segon envii un " Alerta, la puerta està abierta"
               {
            leer_usuario();
                  delay(1);
               }
 
               Serial.println("Alerta, la puerta esta abierta");
 
   }else
      {
         leer_usuario();
         }
}
 
 
void abrir_puerta()
{
 
  comprobar_puerta();
 
  if(estado_puerta == 0)
  {
 digitalWrite(led_verde,HIGH);
 Serial.println("puerta abierta");
        puerta_abierta = 1;
 contador = 1;
  }else{
        Serial.println("Error, La puerta esta abierta");
        contador = 1;
       }
}
 
void cerrar_puerta()
{
  comprobar_puerta();
 
  if(estado_puerta == 0)
  {
        digitalWrite(led_verde,LOW);
  Serial.println("Puerta cerrada");
  contador = 1;
  }else{
        Serial.println("Error, La puerta esta abierta");
        contador = 1;
       }
}
 
void comprobar_puerta()
{
  estado_puerta = digitalRead(sensor_puerta);
 
  if((estado_puerta == 0) && (puerta_abierta == 1) && (contador_estado_puerta == 0) )  // puerta cerrada pero le hemos dado la señal de abrir
  {
     delay(100);
 
         if((estado_puerta == 0 ) && (puerta_abierta == 1))
          {
            contador_estado_puerta = 2;
          }
   }
 
 
if(estado_puerta == 1) // puerta abierta y le hemos dado la señal de abrir
  {
    delay(100);
 
   if ((estado_puerta == 1 ) && (puerta_abierta == 1) && (contador_estado_puerta == 2 ) )
          {
            contador_estado_puerta = 1;
          }
  }
 
 
  if((estado_puerta == 0) && (puerta_abierta == 1) && (contador_estado_puerta == 1) ) // si la puerta está cerrada y ha pasado por los anteriores
  {
     delay(100);
 
         if((estado_puerta == 0 ) && (puerta_abierta == 1) && (contador_estado_puerta == 1))
          {
            contador_estado_puerta = 3;
            puerta_abierta = 0;
            delay(2000);
            cerrar_puerta();
          }
   }
}
 
 
void comprobar_usuario()  // con este bucle miramos si alguno de nuestros usuarios coincide con el array rfid.serNUM ( el numero que está para comprobar)
{
  i=0;
for(int j=0; j<=5; ) // numero de digitos de nuestro tag
 {
   if( (usuario[i][j]) == (numero_serie[j]))
     {
      j++;
      }else{
             i++;
             j=0;
           }
 
   if(i >= 2) // ese numero es el numero máximo de usuarios que pondremos
     {
      j=5;
     }
 
 
switch(i)
{
  case 0:
  usuario_correcto();
  break;
 
  default:
  usuario_incorrecto();
  break;
 
}
 }
}
 
void leer_usuario()
{
contador = 0;
    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(int i=0; i<=4 ; i++) // y lo imprimimos
                {
                Serial.print(numero_serie[i]);
                }
 
                Serial.println(" "); // esto es para que quede más bonito y el " usuario correcto " o " usuario incorrecto " aparezcan debajo y no pegados
                delay(500); // para que no se imprima constantemente el mismo numero
                contador = 1;
               comprobar_usuario();
             }
    }
    rfid.halt();
}
 
void usuario_correcto()
{
 if(contador == 1)
  {
   Serial.println("Usuario correcto");
   abrir_puerta();
   contador = 0;
  }
}
 
 
void usuario_incorrecto()
{
 if(contador == 1)
  {
   Serial.println("Usuario incorrecto");
   error();
   contador = 0;
  }
}
 
 
 
void error()
{
     digitalWrite(led_verde,LOW);
      
  for(int j = 0; j < 4 ; j++)
  {
   digitalWrite(led_rojo,HIGH);
   delay(500);
   digitalWrite(led_rojo,LOW);
   delay(500);
  }
 
}


Código (disculpad por el desorden de código :P )
Librerías

Fuentes:

http://es.wikipedia.org/wiki/RFID

http://es.wikipedia.org/wiki/Serial_Peripheral_Interface

La librería RFID  que yo he usado, ha sido creada por Miguel Balboa.
La librería SPI que yo he usado, ha sido creada por Cristian Maglie.



132 comentarios:

hola, soy nuevo en esto, y tengo poca idea, me he dispuesto a hacer este proyecto, y funciona, pero me da el numero de tarjeta y usuario incorrecto, y mi duda es, donde cambio en el código para que ese numero de tarjeta de usuario autorizado, gracias y perdón por la ignorancia. un saludo

Si tienes pensado usar más de un usuario, aquí te dejo el código modificado:

https://docs.google.com/uc?export=download&id=0B1bGeZbEvf0BVDFTWDVLblduanc


un saludo!

p.d. Disculpa el desorden del código, si ahora lo volviese a hacer, crearía una librería para ello y usaría interrupciones.

Y si sólo usarás un usuario:

int usuario[1][5]={ {36,238,94,1,149} }; <--- cambia el 36 238 94 1 149 por el número de tu tag.

un saludo!

Gracias, me lié porque al leer la tarjeta no me da el numero así, pero ya lo solucione con otro código, y sacar el numero nuevo para que funcione, pero se agradece la ayuda, sobre todo a gente que como yo no tenemos mucha idea y queremos aprender. gracias.

De nada! un saludo y ánimos con tus proyectos!

como se cual es el numero de mi tag???

Hola Tania, en mis tags no venía marcado de ninguna forma. Lo conseguí leyendo el tag con mi módulo RFID.

un saludo!

ok disculpa por la pregunta es que soy nueva en esto, no he podido conseguir leer mis taggs tengo un rfid mudule v1.1 he compilado en el entorno de arduino varios programas para la lectrutra de mis trajetas y ninguna me ha servido cres que me puedas ayudar ??

Hola Tania, ¿ cual es el modelo exacto del módulo RFID que usas? los tags y el módulo RFID son de la misma frecuencia? ¿Qué protocolo de comuniciación usa tu módulo (serie, SPI ,etc) ?

Hola soy nuevo en esto... es una gran aplicación, pero ya pegue la lidrerias y todo, pero cuando copeo el codigo en mi sketch, me manda un error "RFID does not name a type" y menciona que el rfid no ha sido declarado.

Saludos. gracias

Crees que pueda funcionar con un modulo RFID el PN532?

Hola Ricardo, te recomendaría asegurarte que:

·tengas instaladas las librerías

·que tu versión de Arduino sea bastante nueva ( porque en las viejas iba a buscar el #include "WProgram.h" y en las nuevas va a buscar el #include "Arduino.h")

·que tu módulo RFID sea por SPI y no por serie.

respecto el módulo RFID que me comentaste ( PN532) sabes si es serie o SPI?

un saludo y espero haber podido ayudarte con tus dudas!

hola amigo disculpa para que despues de un tiempo si acepta la tarjeta active un led k simula abrindo puerta y despues d unos segundos cierre la puerta

Si te funciona entonces genial! ¿ qué módulo era el tuyo ? un saludo!

El código de mi tag es 3144248164207, ¿como lo divido para que sea autorizado?

Hola Jaimenet, prueba con esta combinación: 31 442 481 64 207 , creo que puedes crear la que quieras ( por ejemplo: 314 424 816 4 207, etc)

pruébalo y nos dices, un saludo!

Hola Kleid, el orden era: 3 144 248 164 207. Para saber el orden del tag debes modificar el código agregando un espacio. Al imprimirlo en pantalla

for(int i=0; i<=4 ; i++) // y lo imprimimos
{
Serial.print(" ");
Serial.print(numero_serie[i]);

}

Muchísimas gracias Jaimenet! lo tendré en cuenta y muchísimas gracias por tu aportación.

un saludo!

Hola, estoy pensando en desarrollar un proyecto similar usando una tarjeta y un tag rfid, básicamente si no se detecta tanto la tarjeta como el tag se denegara la salida. Cabe mencionar que soy nuevo en este tipo de desarrollos por lo que recurro a ustedes ya que un consejo, punto de vista o cualquier ayuda no me caerían para nada mal.

hola... como muchos, soy novato en esto del RFID tengo una pregunta, los módulos de RFID solo leen a pocas distancias?
he visto en aparcamientos de hoteles que te dan una tarjeta RFID con la cual , cuando la tarjeta esta a una distancia de unos 4 metros ya la puerta comienza a abrir, que tipo de sensores se usa para hacer algo así? o eso lo determina la tarjeta?
de antemano, gracias por la respuesta!

Hola Carlos, tiene que detectarlos simultáneamente? Porque de ser así lo veo un poco complicado, ya que el módulo RFID ( como mínimo el que yo uso ) sólo puede leer un tag a la vez.

Una solución sería que primero pasases uno y después el otro ( o que cuando lea, lea primero uno, guardase el número y después leyese el otro y mirase si son los dos números que busca).

También podrías añadir otro módulo RFID, así podrías leer las dos a la vez. No sé si existe algún tipo de módulo que acepte dos números a la vez.

¿Es muy necesario que lea los dos al mismo tiempo? porque si no, podrías hacer lo que te comenté arriba ( lo de que lea uno, guarde dicho número, lea el siguiente y mire los números )

un saludo!

Hola Saya! pues depende, ¿ hablamos de un tag activo o un tag pasivo? si es pasivo, ronda de los escasos centímetros a los 10 metros aproximadamente. Y si es activo, creo que puede llegar hasta unos 200-300 metros. Aunque personalmente creo que el módulo RFID ( el que se encarga de leer el número del tag) ha de tener potencia también, ya que si no, la señal no llegaría. En el link de wikipedia que adjunté, creo que hablan un poco de eso:


Etiquetas pasivas:

[...] Las etiquetas pasivas suelen tener distancias de uso práctico comprendidas entre los 10 cm (ISO 14443) y llegando hasta unos pocos metros (EPC e ISO 18000-6), según la frecuencia de funcionamiento y el diseño y tamaño de la antena. [...]


Etiquetas activas:

[...] Muchas etiquetas activas tienen rangos efectivos de cientos de metros y una vida útil de sus baterías de hasta 10 años. [...] . Además de mucho más rango (500 m), tienen capacidades de almacenamiento mayores y la habilidad de guardar información adicional enviada por el transceptor. [...]


un saludo!

Hola Kleid, gracias por tomar el tiempo de leer mi comentario, te comento que no es necesario que sea simultáneamente creo que si podría hacerlo de la manera que me recomiendas y esperar a tener los dos para compararlos pero necesito que sea muy rápido digamos un segundo crees que sea posible?

Hola Carlos! yo creo que es totalmente posible, aunque claro, lo mejor sería hacerlo y así salir de dudas. Si tienes los materiales sería lo mejor, porque así podrías comprobar si realmente funciona.

un saludo!

Hola, al pasar el tag me lo reconoce y se activa el led verde , le doy al interruptor de estado puerta y se apaga el led verde.
hasta ahí bien, pero al pasar el tag la segunda vez ya no se apaga el led verde.
Que puede estar pasando? he comprobado todo una y otra vez pero no veo nada mal.

Hola Pablo! si mal no recuerdo, el led verde puede apagarse de dos formas posibles:

· Pasado un tiempo
· Mediante el interruptor

un saludo!

Amigo me compila pero no me sube al arduino... me sale este mensaje:

avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_getsync(): timeout communicating with programmer

Compilo cualquier otro proyecto y si me sube, ayuda por favor tu proyecto es bastante interesante.

Hola que tal, tengo un lector Adafrut PN532, funciona para este código? soy nuevo en esto del RFID, saludos y gracias

Hola Ing. Yair Zarza, lo mejor sería que lo probases, aunque vi 2 tipos: el serie y el SPI. ¿ cuál tienes tú? si tienes el serie dudo muchísimo que vaya, pero si es el SPI quizás es compatible, aunque ya te digo que lo mejor sería que hicieses la prueba y nos cuentas.

un saludo!

Hola David! vuelvo a escribirte, pues parece ser que mi mensaje no se posteó correctamente. Encontré unas páginas web donde explican el problema aunque a mí no me pasó... ¿ tu arduino es el original o es una copia? porque si es una copia, quizás bastaría son soldarle un condensador entre los pad de auto-reset que llevan las PCB de Arduino.

Una prueba que podrías hacer es darle al botón de reset al pulsar el botón de cargar el sketch en tu PCB de Arduino.

Las páginas web eran estas:

http://stackoverflow.com/questions/19645441/avrdude-stk500v2-receivemessage-timeout


http://spainlabs.com/foro/viewtopic.php?f=9&t=767

https://groups.google.com/forum/#!topic/asrob-uc3m-impresoras-3d/1VRk97iwNGk

un saludo!

Este comentario ha sido eliminado por el autor.

Ya lo resolví...hay un error en el código escrito arriba...

#include spi.h
#include rfid.h

reemplazar por mayusculas:

#include SPI.h
#include RFID.h

espero a alguien le sirva...de ahi todo lo demás funciona correctamente

Hola que tal, gracias por responder, si puedo ocuparlo como SPI pero me dice que para SPI tengo que cerrar SEL0 y SEL1, están físicamente en la tarjeta, pero la verdad no entiendo como podría cerrarlo dada la forma de los pines, tendría que soldar? o se cierran desde el programa? para mayor referencia podría mandar foto de la tarjeta. saludos y gracias

Hola Rosend Zen, ¿podrías mandarme alguna referencia de la tarjeta que usas por favor? así me haría una idea del uso de los pines " SEL0 " y " SEL1 " y un poco como es la tarjeta en general.

un saludo!

Gracias por la pronta respuesta, tengo un lector Adafrut PN532 http://nicegear.co.nz/obj/images/adafruit-pn532-nfc-rfid-controller-shield-for-arduino-2.jpg como se ve en la imagen. están los pines SEL0 y SEL1 cerca de los pines Digitale 10 y 8 respectivamente y como podrás observar en la parte del lector trae la leyenda: "For SPI close SP0 and SP1", gracias por la ayuda saludos!! excelente semana.

Hola Rosend Zen, te recomendaría que para tu dispositivo, primero probases con estas URL donde hay librerías expresamente para tu dispositivo, y cuando confirmes que funciona correctamente , experimentes con otras y así aprendas mejor como funciona, un saludo!.

Aquí puedes bajarte las librerías tanto para I2C como SPI para tu módulo:

https://learn.adafruit.com/adafruit-pn532-rfid-nfc/arduino-library

También te adjunto el esquemático de tu aparato,

http://www.adafruit.com/datasheets/PN532_Breakout_Schematic_v1.0.pdf

donde en la esquina inferior derecha podrás leer lo siguiente

UART SPI I2C
SEL0 0 0 1
SEL1 0 1 0

Muchísimas gracias amigo, pero por lo que leo, la librería SPI de la pagina de Adafrut es para la tarjeta breakout, el diagrama es también de la breakout, aun así lo probaré esperando funcione y comento el resultado, al momento de escribir esto buscaba una imagen que encontre de como se cierra SEL0 y SEL 1 y me encontré con esto

http://forums.adafruit.com/viewtopic.php?f=31&t=46217

baje la librería de la pagina que me pasaste y de la que acabo de encontrar, aun no se si sean las mismas pero ojala funcione.

Comento el resultado

Muchas gracias por la ayuda!!

Saludos!!

Hola gracias por el tutorial el problema mio es que todo va bien excepto que acepta todas las tarjetas por validas

Hola Nacho! ¿podrías hacerme llegar tu código de alguna forma por favor? ( ya sea colgándolo aquí o subiéndolo en algún sitio) así podría decirte mejor qué le puede fallar.

un saludo!

Hola, muchas gracias por el tutorial! tengo una duda, si quisiera implementar un LCD 16x2 cual seria el codigo? como seria la conexion a la protoboard? y si es podible por el numero de compuertas del arduino libres?

Hola DreamQuest, podrías usar los pines 2,3,4,5 para los datos ( creo que iban del D4 al D7 ) y A0,A1 para RS y E. Realmente no sería muy complicado, bastaría con incluir la librería LiquidCrystal y una vez declarar los pines como te indiqué arriba. Después tendrías que cambiar (en el código) todos los comentarios que se envían por serie, hacerlos imprimir por el LCD.

un saludo!

Que tal como escribo mis tags en el codigo por que al poner el numero de mi tag me marca error :(

Buenas Robert! tendrías que cambiar estos números:

int usuario[1][5]={ {36,238,94,1,149} };

Si es la primera vez que pasas el tag, seguramente no sabrás qué números van en cada parte del índice del array ( o sea, si en la primera posición va un 12 o un 123 o un 1, etc) lo que deberías de hacer es que te imprimiese por serial tu número de tag, y pides que te deje un espacio entre medio. Yo modificaría la función " leer usuario " añadiendo un pequeño trozo de código, el siguiente:

dentro la función leer usuario (), encontrarás esto:

for(int i=0; i<=4 ; i++) // y lo imprimimos
{
Serial.print(numero_serie[i]);
}

añades debajo el Serial.print esto: Serial.print(" ");

así dejará un pequeño espacio y verás cómo está dividido tu código y podrás guardarlo correctamente en el array.


un saludo y hasta pronto!!

Te agradesco solo que la verdad no se mucho de programacion y no se como tendria que ir acomo dado, si me pudieras explicar un poco mas te lo agradeceria mucho :)

Hola Robert, es fácil en serio, te lo pondré más fácil:

cambia esta función:


void leer_usuario()
{
contador = 0;
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(int i=0; i<=4 ; i++) // y lo imprimimos
{
Serial.print(numero_serie[i]);
}

Serial.println(" "); // esto es para que quede más bonito y el " usuario correcto " o " usuario incorrecto " aparezcan debajo y no pegados
delay(500); // para que no se imprima constantemente el mismo numero
contador = 1;
comprobar_usuario();
}
}
rfid.halt();
}



por esta función:

void leer_usuario()
{
contador = 0;
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(int i=0; i<=4 ; i++) // y lo imprimimos
{
Serial.print(numero_serie[i]);
Serial.print(" ");
}

Serial.println(" "); // esto es para que quede más bonito y el " usuario correcto " o " usuario incorrecto " aparezcan debajo y no pegados
delay(500); // para que no se imprima constantemente el mismo numero
contador = 1;
comprobar_usuario();
}
}
rfid.halt();
}

ya lo copie y me aparecio esto:
sketch_dec20a:7: error: 'RFID' does not name a type
sketch_dec20a.ino: In function 'void setup()':
sketch_dec20a:29: error: 'SPI' was not declared in this scope
sketch_dec20a:30: error: 'rfid' was not declared in this scope
sketch_dec20a.ino: In function 'void leer_usuario()':
sketch_dec20a:164: error: 'rfid' was not declared in this scope
sketch_dec20a:186: error: 'rfid' was not declared in this scope

Ya quedo el codigo, pero sigo teniendo el mismo problema. Al pasar los tags no pasa nada :(

Hola Robert! supongo que lo de " ya quedo el codigo " querrá decir que lograste encontrar el error ( si no es así, mándame el código y lo miramos) sólo por curiosidad, tendrás abierta la ventana del puerto serial , no? ( pulsando control + shift + m , con el código cargado y con la IDE de Arduino abierta )

un saludo!

Ya quedo el codigo quise decir que ya lo cargue, no se si este correcto jejeje y si si tengo abierta la ventana del puerto serial...

No puedo subir el codigo esta muy extenso

Copia el código en un .txt y lo subes en mediafire o algun tipo de servidor

un saludo!

Una duda ay que escribir en las tarjetas antes de usarlas??

http://www.mediafire.com/view/j7ogcp3lot65vab/codigo.txt
Aqui esta el codigo

Buenos días Robert! tu problema es muy sencillo, básicamente copiaste todo el código 2 veces, y sólo tenías que cambiar un trocito. Si te fijas en el que me mandaste, tiene dos funciones " setup() " y dos funciones " loop() " y ninguna función puede repetir el nombre dentro del código.

Para solucionarlo, borra la primera mitad ( la segunda mitad he visto que le pusiste el trozo correctamente, con el " print(" "); ) así que sería tan fácil como eliminar la primera parte y probar, si no te da errores de compilación, ya sería un gran logro. Si te continuase fallando, dímelo y lo miramos.

un saludo!

p.d. Hay tarjetas programables a las que les puedes dar tú un número de serie. Las mías no son así, así que ya venían con un número de serie por defecto ( las mías son de sólo lectura y existen otras a las que puedes leer y escribir un nuevo número).

Si el error fue que lo copie dos veces pero solo en el archivo de texto, por que en el IDE esta bien, de todos modos te doy de nuevo el link del codigo

http://www.mediafire.com/view/j7ogcp3lot65vab/codigo.txt

Hola Robert! sólo por curiosidad:

· ¿Has instalado las librerías necesarias?
· ¿Has reiniciado la IDE de Arduino?

porque se queja de que no están declaradas las funciones de las librerías, quizás es eso. ¿Podrías confirmarlo por favor?


un saludo!

Pues las librerias ya las instale son la RFID y la SPI, y si reiniciar la IDE quiere decir reiniciar toda la computadora, tmbn ya lo hice y nada...

La libreria RFID al declararla no aparece en color naranja como las demas, tendra algo que ver esto?

Hola Robert! te cuento:

Acabo de compilar el último código que me diste, me da 0 errores así que el código no es.
la librería SPI a mí me sale de color, pero la RFID no. Aunque si a mí me va tu código, es evidente que el problema se reduce a:

· Problema con la IDE de Arduino
· Problema con las librerías

Te recomendaría que intentases con otra IDE y que revisases una vez más las librerías que estén bien instaladas, yo uso la IDE 1.5.6-r2 por si puede darte alguna ayuda.

un saludo!

y de donde puedo descargar las librerias?

crees que sirva la 1.0.6 ? por que la que me dices no esta...

Prueba con el 1.0.6 a ver que tal, pero si me preguntas sobre las librerías, me imagino que no las instalaste. Las tienes al final del tutorial, donde sale:

Código (disculpad por el desorden de código :P )
Librerías

Fuentes:

http://es.wikipedia.org/wiki/RFID

http://es.wikipedia.org/wiki/Serial_Peripheral_Interface

La librería RFID que yo he usado, ha sido creada por Miguel Balboa.
La librería SPI que yo he usado, ha sido creada por Cristian Maglie.


un saludo!

Ya hice todo lo que me dijiste y sigo sin tener exito... algun otro consejo?

Si tienes teamviewer, puedo conectarme y le echo un vistazo, me parece muy muy raro que no te vaya...

un saludo!

no tengo pero podemos hablar por correo electronico

Hola recien estoy usando arduino y tengo el Módulo Lector/escritor Rfid Rc522 y lo quiero utilizar con arduino uno....y no se cual es el codigo para leer el numero de mis tag...si me podrian ayudar por favor

Viendo que tanta gente lo pedía, he creado un post donde adjunto el código para poder leer las tag RFID, la dirección es la siguiente:

http://geekchickens.blogspot.com.es/2014/12/leer-codigo-modulo-rfid-rfid-rc522.html

un saludo!

Como puedo agregar otro tag? para leer varios tags?

Hola robert, vi todo tus comentarios, y la verdad es que tengo el mismo problema que tu. la libreria RFID.h no me funciona? y ademas la descargue de un sitio no confiable. Sera posible que me digas el favor de decirme en que pagina consigo esa libreria. ya que esa es la q necesito con urgencia. cuando incluyo , no sale en anaranjado. Esa te funciono?? necesito ayuda con eso Gracias. este es mi correo McLarenzor.09@gmail.com

Aqui esta la libreria: http://www.electrodragon.com/w/File:Rfid-master.zip saludos..

Hola disculpa estoy usando el código para mas de un usuario y me abre la puerta con cualquiera tarjeta creo que el problema radica al comprobar usuario si ya solucionaste el problema me gustaría que me ayudaras

hola amigo Kleid disculpa como hago para una lectora con comunicación Wiegand (datos 0 y 1).. porfa ayudame ..gracias

Buenas tardes Gabriel, por favor tendrías que concretarme más sobre tu duda, no entiendes el protocolo de comunicación Wiegand , quieres unir un lector RFID con tu Arduino usando dicho protocolo o tienes un tercer aparato que usa ese protocolo y quieres unir un lector RFID, el aparato y el Arduino?

un saludo!

p.d. aquí hay una librería sobre el protocolo Wiegand en Arduino https://github.com/monkeyboard/Wiegand-Protocol-Library-for-Arduino

Que tal buenas tardes, he leido todos los comentarios pero no he podido aun resolver mi problema, estoy usando el codigo para leer el codigo del tag y al compilar me sale este mensaje de error:

C:\Users\ACER\Desktop\Escuela\Domotico\libraries\RC522_RFID-master/RFID.h:9:25: fatal error: application.h: No such file or directory
#include "application.h"
^
compilation terminated.
Error de compilación

Utilize la libreria de RFID que recomendaste de Miguel Balboa pero al exportarla al programa me aparece con el nombre de no se si eso tambien este causando algun conflicto.

Agradeceria si alguien me puede ayudar por que ya eh utilizado diferentes codigos y ninguno me ha servido.

Hola Teresa, creo que tu problema radica en dónde incluyes la librería, has de incluirla dentro del directorio de tu arduino, en mi caso:

D:\Tot\informàtica\Programes\arduino-1.5.6-r2\libraries\_______libreria_que_incluyo_____


un saludo!

hola muy buenas tardes una pregunta de casualidad lo tendrías en java, es que la verdad no se manejar c++, me seria de mucha utilidad tu código mil gracias.

Buenas tardes Josse, hasta donde yo sé, Arduino sólo puede programarse en el processing de Arduino, no sé si existe alguna forma de compilar código Java para Arduino, aunque me parece un poco raro sinceramente. Creo que te sería más fácil aprender el lenguaje de Arduino que no es nada difícil. Sobre el C++, creo que eso son las librerías pero en este proyecto yo no creé ninguna, usé unas ya hechas. Te recomiendo enormemente que aprendas C++, ya que si sabes Java no te costará nada y verás como te ayuda mucho en la programación de micros ( sobretodo te ayudaría C, pero eso ya lo dejo a tu elección)

un saludo!

Como se puede agregar un tag, pero que no sea directamente en el codigo, un ejemplo un teclado matricial 3x3 y con el 4321 De pass pueda administrarlo y agregar ese tag

Tengo un problema cuando añado dos tags. Resulta que en el momento que añado mas de un tag, cambio por ejemplo un numero de usuario de una tarjeta para que me la de incorrecta y al final me la da como válida. Los números no coinciden y toma el número igualmente.¿Cual es el problema?

COMO PUEDO CAMBIAR EL NUMERO DE MIS TAGS ?PUES TODOS ME SALEN IGUALES AL LEERLOS CON EL LECTOR.
ALGUN PROGRAMA EN PARTICULAR
GRACIAS

Estimados todos,

Buenas tardes, por favor me podrían ayudar con una duda, estoy ejecutando el software para un programador de etiquetas RFID (mProV1.6nc) pero al inicializar el programa tengo el siguiente error:

---------------------------
mPro
---------------------------
Access violation at address 004E6334 in module 'mProV1.6nc.exe'. Read of address 0000003E.
---------------------------
Aceptar
---------------------------

Muchas gracias :)

Saludos,
Jessy

Buenos días Jessy,

Este error te lo da el compilador de Arduino o ese programa llamado "mProV1.6nc.exe" ? porque si es el segundo caso, lamento decirte que es la primera vez que escucho de ese programa y no tengo ni idea de lo que es... ¿Has probado que no pueda ser algún driver instalado que de ese error? ¿Probaste a ejecutarlo como admin? ¿Probaste en modo compatibilidad?

En esta página web ( el primer resultado en google escribiendo el código de error ) comentan cosas de cómo solucionar el " access violation address error " ( no el mismo número, pero supongo que podría funcionar):

http://www.tomsguide.com/faq/id-2119014/fix-access-violation-address-error.html

prueba y si no puedes coméntanoslo e intentaremos echarte una mano

un saludo!

Hola amigo, necesito comprar un modulo rfid rc522 para arduino, tienes disponible?
gracias

Buenas tardes Rigo! lamentablemente no... probaste por ebay o en dx.com?

un saludo!!

Omar Vázquez

Podrías venderme un lector RFID que funcione por SPI a una frecuencia de 13'56MHz, me urge. y cual es el costo del mismo y si pudieras tener tarjetas te lo agradecería.
espero me puedas responder pronto

HOLA TENGO EL PROBLEMA QUE SOLO ME MUESTRA LA LECTURA DE LA TARJETA UNA VEZ Y LUEGO SE QUEDA TRABADO ¿COMO PODRIA HACER QUE HAGA VARIAS LECTURAS?

Muy buen artículo Kleis, completo y con explicaciones detalladas. Mis felicitaciones!

BUENAS NOCHES A TODOS, ALGUIEN PODRIA AYUDARME QUIERO PROGRAMAR UN SISTEMITA PARA USAR LOS RFID, QUE ME RECOMIENDAN, TIENEN ALGUN EJEMPLO DE COMO CONTROLARLOS Y DE COMO ACTIVAR ALGO SI EL RECEPTOR RFID DETECTA ALGUN RFID ACTIVO O PASIVO PASANDO CERCA DE EL, GRACIAS...

Hola, espero que aun este disponible la ayuda de este post :D
sabes como escribir informacion en las tarjetas ?

Se queda trabado tras una lectura (correcta o incorrecta). como podria solucionar l problema. gracias.

Interfaz Java y Arduino.

Tutorial diseño de interfaz con Java bajo NetBeans para controlar Arduino desde el puerto serie / USB, odrás encender y apagar un Led, recibir mensajes de textos o comandos desde Arduino.

Ver tutorial.
http://www.slideshare.net/Metaconta2/interfaz-java-y-arduino

Saludos.

Me ha encantado tu traajo, sobre todo el algoritmo para más de una llave, saludos !!

Problema: una vez que lee la tarjeta el sistema se queda colgado, no acepta mas lecturas y el led de activado/verde se queda colgado, no se apaga ni acepta mas lecturas aun activando o desactivando el switch

a demás todos los usuarios son correctos aunque no hayan sido agregados :(

Disculpa, como seria para conectar los pines del RFID RC522 a una placa de Arduino MEGA 2560????
Tengo el código que hice para el modelo UNO:

Geovanni:
para el MEGA conectas asi:
SDA a pin 53
SCK a pin 52
RST a pin 9
MOSI a pin 51
MISO a pin 50
3.3 a 3.3v.
GND a GND
y debes declarar en el sketch que:
SS (SDA) es 53
y RST es 9
Espero te sirva.
Saludos

Hola, me encanto este tutorial. Yo estoy haciendo un proyecto muy parecido, la diferencia es que éste es para un evento. Es para 2000 personas, hasta la lectura de acceso si es correcto, lectura y todo eso voy bien. Ahora, yo lo que quiero generar es que al finalizar la entrada de usuarios, me genere un informe de cuantas personas accesdieron y dieron "luz verde" y cuantas tuvieron problemas de acceso y dieron "luz roja" y si es posible, la fecha y hora que entro cada persona que participó del evento. Si pudiaras contactarte conmigo, te lo agradecería. ferferrer@gmail.com
Muchisimas gracias!

TIENES ALGUN NUMERO DE TELEFONO PARA COMPRAR EL RFID Y LOS CHIPS

Buenas Fernando! Lo que dices tú se podría realizar añadiendo un RTC al arduino ( la forma fácil ) o mediante un timer que se dispare cada segundo usarlo como un RTC ( la forma difícil). Ese aparato va conectado a una base de datos o el propio dispositivo guarda todas las claves? si es así, tendrás que pasar 2000 tarjetas por el sensor para poderlas guardar en el aparato?

un saludo!

Buenas Adan! te recomiendo echarle una ojeada a "las típicas páginas web chinas" que todos conocemos, ahí encontrarás lo que buscas.

un saludo!

hola amigo muy buen proyecto, en estos momentos estoy realizando uno parecido, un control de entrada con rfid, y un sensor ultrasonido y el servomotor simulando un parqueadero , por el momento he podido hacer q el servo se mueva simulando que la puerta se abre si el usuario esta registrado, pero no he podido es que el servomotor se baje hasta que el vehículo pase totalmente el ultrasonido lo tengo es configurado con un delay.
me podria hacer el favor de ayudarme para que el servo se quede quieto hasta que el automóvil pase

Buenas Víctor! podrías adjuntar una URL con tu código para echarle un vistazo por favor?

un saludo!

hola, mire este es el codigo que estoy trabajando gracias por su colaboración
http://pastebin.com/CWXgQiXj

Buenas tardes Victor! creo que el problema está en este trozo de aquí:

if (status == MI_OK && distancia <= 20 ) {
status = nfc.antiCollision(data);
memcpy(serial, data, 5);
if(chekaKey(serial)){
Serial.println("DOC.ANGELA AUTORIZAD@");
imprimeClave(serial);
lcd.setCursor(0,1);
lcd.print("ANGELA AUTORIZAD@");
Abierto = true;
myservo.write(90);


}


Lo que imagino que ocurrirá es que sólo pasará una vez, ya que es un if(), tendrías que añadir un while ( en mi opinión, no tendrías que borrar nada de lo que tienes, sólo añadir un while y dentro de éste, que vaya comprobando constantemente la distancia del vehículo) y como condición, que fuese hasta que detectase el vehículo a X distancia ( esa distancia sería una vez el automóvil estuviese fuera del rango de la barrera).


Lamentablemente no puedo simular tu proyecto por falta de materiales, así que te invitaría a modificar ese trozo de código y me comentas los resultados.


un saludo!




Hola, este código está bajo ARDUINO UNO, yo tengo ARDUINO MEGA, como sería el tema de los pins?

Saludos y gracias!

Buenas tardes Fernando! pues en teoría, si las " capas de abstracción " están bien hechas, tendría que ser totalmente compatible. La "magia" de arduino es en parte que su mismo código sirve para cualquier microchip que le quieras adaptar su sintaxis, así que en teoría tendría que ser compatible.

Cuando lo montaste, te dió algún tipo de error?

un saludo!

Hola buenas. mi pregunta es como poder guardar una variable int en un bloque de la tarjeta para que cada vez que valla pasando por el lector se valla descontando un 1 a esa variable?

Buenas tardes! normalmente este tipo de tarjetas llevan una ID que no puede ser cambiada, aunque también existen unas que son programables, pero no puedes añadirles código dentro para que ejecuten algún tipo de acción. Imagino que te referirás a modificar el código fuente.

Yo lo que te recomendaría hacer es tener esa ID anotada en algún array dentro del código fuente de tu arduino y cuando se acceda con dicha tarjeta, descontar 1 a una variable para esa ID.

un saludo!

hola estoy leyendo esto y probando.

Yo quiero algo asi pero solo que cuando acepte el usuario correcto me abra un pinout para un rele un par de segundos.

con tu programa consigo hacerlo pero despues se queda pillado no aceptando mas tarjetas.

que puedo hacer?

Buenas David! ¿ Por qué no añades en la función abrir_puerta() las modificaciones que te interesen ? Simplemente tendrías que añadir ahí tu activación del relé, algo así:


void abrir_puerta()
{
comprobar_puerta();

if(estado_puerta == 0)
{
//-------------------------------------modificación aquí
digitalWrite(_TU_PIN_DEL_RELE,HIGH);
delay(_TIEMPO_QUE_NECESITES_);
digitalWrite(_TU_PIN_DEL_RELE,LOW);
//------------------------------------final

Serial.println("puerta abierta");
puerta_abierta = 1;
contador = 1;
}
else
{
Serial.println("Error, La puerta esta abierta");
contador = 1;
}
}



hola como estan quisiera que me asesoren con el mismo proyecto pero usando un lector wiegand 26 y el arduino uno como sería la programación para que lea las tarjetas RFID de antemano le agradezco un mundo

Muy buenas Freddy! hasta donde yo sé, el wiegand 26 es un protocolo y no un lector en concreto, ¿podrías decirme el modelo de lector que quieres usar ?

un saludo!

Hola Kleid, me gustó mucho tu tutorial. ¿Sabes como puedo leer una tarjeta en dos ocasiones consecutivas? Gracias

Muy buenas Melissa!
Te recomiendo que eches una ojeada al nuevo tutorial sobre RFID que hice, donde uso una librería actualizada que está funcional.
Aunque en el nuevo tutorial lo uso para hacer un login en el ordenador, te servirá igual el código, tan sólo tendrás que modificar alguna parte.

En el nuevo tutorial ( http://geekchickens.blogspot.com.es/2017/10/control-acceso-ordenador-login-mediante.html ) verás que en el código fuente ( se puede descargar al final de ese post ) hay un if en el loop() que es el siguiente:

if ( ! mfrc522.PICC_IsNewCardPresent()){ return; } // si no hay una nueva tarjeta, volvemos al loop

Simplemente, sería comentando ese if y podrías leer dos veces ( o más ) la misma tarjeta RFID.

Un saludo!

hola buenas un favor saben como leer el numero de serie del lector.. no de las tarjetas, por protocolo wiegand. gracias de ante mano

Muy buenas Joel!
La verdad nunca lo hice, ¿qué lector sería?
un saludo!

Hola amigo, tengo un error en el codigo, Arduino:1.8.5 (Windows 10), Tarjeta:"Arduino/Genuino Uno"
fatal error: rfid.h: No such file or directory

#include

^

compilation terminated.

exit status 1
Segun yo es porque no tengo la libreria, he intentado solucionar pero no he podigo, me podrias ayudar? de antemano gracias

Muy buenas 70!

Eso es porque no tienes instalada la librería de RFID. En los nuevas IDE de arduino no hace falta que lo hagas de forma manual, puedes ir a "Sketch -> include library -> Manage Libraries..." y allá buscas MFRC522 ( puedes buscar por RFID y probar otras ).

Este código está bastante desactualizado respecto a la librería, eso quiere decir que hay funciones que ya no tienen el mismo nombre y tendría que actualizarlo para que funcionase con la misma librería, un día que tenga tiempo lo haré :P

Un saludo!

Buenas quisiera hacer una consulta. te jode si lo hablamos mejor. por que son varias la preguntas. por que no entiendo una parte ;)

Muy buenas!

Mejor déjalas numeradas y así quizás podamos ayudar a otras personas en tu misma situación.

Un saludo!

Dale. yo te quería consultar, por que yo tengo que hacer un proyecto, y elije hacer una cerradura eléctrica para una puerta con RFID, el asunto es si ese código me serviría para hacerlo. Pero mi profesor me dijo que averigüe sobre una "interfaz de gestión" para que? para que cada vez que tenga que agregar algún usuario, no tenga que modificar el código, y si lo hago como hacerlo. esa es una duda.
Y la otra seria, por que te veo canchero en el tema es hacer lo mismo pero con lector de huella digital (reemplazaría el RFID) pero este proyecto seria un pasador de falta para un colegio.
el alumno pasaría su huella y si llega tarde le suma la falta y sino ausente, etc. la pregunta de todo esto seria si me darías una mano. yo estoy estudiando esto y me vendría bien tu ayuda ;)

Muy buenas Leandro!


Primero de todo, yo lo que haría, sería definir si quieres usar el RFID o la huella, ya que van un poco distinto ( el RFID devuelve un cierto o falso pero el lector de huellas devuelve "qué tan probable" es que el dedo sea correcto. Yo te recomendaría usar el RFID, es más rápido y simple.



Sobre la interfaz de gestión ( imagino que habla de la interfaz de
usuario, lo que el usuario final verá y usará para comunicarse con
tu aparato ).

Si tienes posibilidad de usar un ordenador/smartphone te
recomendaría mucho hacer toda la interfaz de usuario en un
programa y te comunicas por (usb / bluetooth / ethernet) al
lector, te ahorrarías muchas horas de trabajo con el arduino.

Si es estrictamente necesario que la interfaz esté en el arduino,
te recomendaría usar un LCD de caracteres ( los típicos de 16x2 )
y que hubiesen dos opciones en el display, la de añadir y eliminar
usuarios. Para poder añadir o eliminar el usuario, tendrías
que pasar una llave RFID que sería la llave del administrador.



Veo que comentas sobre que el aparato pueda llevar un control
de los alumnos, en ese caso ¿el arduino miraría las IDs a una
base de datos? ¿una microSD?. Lo ideal sería que se conectase
a un ordenador donde pudiese enviarle la ID que leyó.

El lector lo único que haría sería enviarle al PC la ID que
ha leído y el programa del PC tomaría todas las acciones
como por ejemplo mirar la hora, ponerle la falta, etc. Y
entonces le devolvería un comando al lector para
dejarle pasar.



Sobre el programa de gestión, desconozco qué lenguajes de
programación sabes, pero te recomendaría que hicieses uno
que permitiese interacción por (usb / bluetooth / ethernet).
Y que, mediante alguna librería existente, te hablases
con una base de datos en SQL (por poner un ejemplo).


Coméntame qué tal lo ves y qué opciones preferirías usar
y qué limitaciones te imponen, así podría ayudarte
mejor con tu proyecto.


Un saludo!

La verdad preferia usarlo con un RFID. Me ofrecieron usarlo para no hacerlo tan comun el tema de la interfaz seria para no estar modificando el codigo cada ves que se le agregue un usuario. Yo se que por el tema de que capaz que podamos ayudar a alguien con el mismo problema que yo. Pero no seria mas comodo hablar por un chat. Capaz desconfias de mi y lo entiendo. Yo digo para no estar entrando en la publicacion. Sino seguimos asi. Por que yo tendria mas dudas con respecto al proyecto

Digo desconfiar en sentido de que no me conoces jaja. Fijate si podes

Muy buenas Leandro!

Preferiría hablarlo todo por aquí, así los próximos usuarios pueden tomar ideas de nuestra conversación y les puede ayudar alguna de las cosas que comentemos.

¿La interfaz puedes hacerla para PC o es necesario que esté dentro el arduino?

¿Qué lenguajes de programación conoces?

Un saludo!

Bueno dale seguimos por este medio. la cosa es así, conozco un poco el lenguaje assembly y el lenguaje C, el lenguaje del arduino ni idea por eso necesitaría tu ayuda y como tenemos el mismo proyecto te molesto a vos jaja. la interfaz la puedo hacer desde una PC pero si no te jode me podes tirar los Pro y Contras. yo justo hoy Lunes 16/4 tengo esta materia. las reglas serian maso menos así. no puedo usar arduino solo, yo tengo que adaptarle una placa y que arduino me la controle, después hasta lo que yo se no me impiden mas nada. yo necesitaría ayuda con la programación una ves que te informe por completo si no es molestia.... muchas gracias y espero tus preguntas.

capaz no me explique bien, cuando digo interfaz de gestión, seria para no estar modificando el código (numero del tag del RFID) en la programación.
y te pregunto para vos que me decís usamos RFID o huella o me das una mano para hacer la cerradura eléctrica o el pasador de faltas (ese nombre jaj ). espero tu respuesta.

Muy buenas Leandro!
Arduino puede programarse en ensamblador de AVR y C, el lenguaje de arduino ( que está entre processing y C++) no es estrictamente necesario así que si quieres, lo puedes programar en esos lenguajes.

Haz el programa de gestión en PC, te será mucho más fácil y cómodo, mírate Qt, WxWidgets o uno de esos, te servirá para crear toda la interfaz y creo recordar que tienen ayudas en cosas como USB y bases de datos ( creo que WxWidgets no tiene para USB pero Qt sí ).

Ya me irás contando de los avances a ver qué tal va.

Un saludo!

Eso serian programas de youtube o paginas, como lo busco ahi? Muchad graciaz

y cambia mucho si en vez de hacerlo con RFID lo hago con huella digital... seria todo lo mismo pero en vez de RFID lo hago con la huella digital.. muchas gracias....

Muy Interesante el tutorial de control de acceso. Gracias por la información.

Publicar un comentario

-