Pages: [1] 2 3 4   Go Down
Author Topic: Control de Acceso con RFID-RC522 y KEYPAD MATRIX 4X3  (Read 13617 times)
0 Members and 1 Guest are viewing this topic.
Murcia
Offline Offline
Full Member
***
Karma: 2
Posts: 109
Aprendiz de novato
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Buenas tardes!

Llevo un tiempo liado con un modesto proyecto que me permita abrir la típica puerta con cerradura eléctrica mediante un sistema de control de acceso RFID-RC522.... CONSEGUIDO

Una vez solucionado esto he querido añadirle un teclado matricial 4 x 3, para poder abrir la puerta también tecleando una secuencia o password determinado.... CONSEGUIDO A MEDIAS.

Ahora mismo mi problema es que no se como "capturar" más de un carácter con el teclado para crear una secuencia de, por ejemplo, 4 caracteres  y poder compararla con otros 4 que definiría como "clave de acceso".

Este es el código que llevo escrito de momento. Funciona todo OK (activa el relé de apertura si el nº serie de la tarjeta RFID termina en "90" y también lo activa si en el teclado pulso la tecla "#"):
Code:
// ARDUINO UNO + RFID-RC522 + KEYPAD MATRIX 4X3
//Sketch que, por medio de un relé, activa la apertura de una cerradura eléctrica
//Funciona indistintamente por RFID mediante una tarjeta (o llave tipo moneda)
//Y tambien introduciendo una secuencia de caracteres determinada en el teclado

#include <Keypad.h>

//CONFIGURACION TECLADO
const byte filas=4;
const byte columnas=3;
byte pinsfilas[filas]={8,6,5,4}; //en orden F1,F2,F3,F4
byte pinscolumnas[columnas]={3,2,14};//en orden C1,C2,C3
char teclas[filas][columnas]=
  {
    {'1','2','3'},
    {'4','5','6'},
    {'7','8','9'},
    {'*','0','#'},
  };
Keypad teclado = Keypad(makeKeymap(teclas),pinsfilas,pinscolumnas,filas,columnas);
//FIN CONFIGURACION TECLADO

#include <SPI.h>
#include <RFID.h>
RFID rfid(10,9); // Pines de conexión del RFID
char tecla; // Variable para almacenar la tecla pulsada en el KeyPad
void setup()
{
  Serial.begin(9600);
  SPI.begin();
  rfid.init();
  pinMode(7,OUTPUT);//Pin que activa el relé de apertura de la puerta
  digitalWrite(7,HIGH);
 
}

void loop()
{
    //INICIO CODIGO RFID
    int codigo = 0;
    int x=500; // tiempo de apertura de puerta
    if (rfid.isCard()) {
     
          Serial.println("IS CARD");
         
          if (rfid.readCardSerial()) {
           
                        Serial.println(" ");
                        Serial.println("El numero de serie de la tarjeta es  : ");
Serial.print(rfid.serNum[0],DEC);
                        Serial.print(" , ");
Serial.print(rfid.serNum[1],DEC);
                        Serial.print(" , ");
Serial.print(rfid.serNum[2],DEC);
                        Serial.print(" , ");
Serial.print(rfid.serNum[3],DEC);
                        Serial.print(" , ");
Serial.print(rfid.serNum[4],DEC);
                        Serial.println(" ");
                        codigo = rfid.serNum[4],DEC;// guardamos en la variable "codigo" el valor del cuarto bloque de caracteres de la tarjeta

          }
         
    }
     rfid.halt();
     //El siguiente IF abre la puerta a aquella tarjeta cuyo CUARTO BLOQUE de caracteres es igual a 90
     if (codigo == 90)
     {
       Serial.println(" ");
       Serial.println("Usuario Autorizado");
       Serial.println(" ");
       //Activa el Relé durante X segundos
       digitalWrite(7, LOW);
       delay(500);
       digitalWrite(7, HIGH);
     }
     //FINAL CODIGO RFID
     
     
     //INICIO CODIGO APERTURA CON TECLADO
     tecla=teclado.getKey();
     if (tecla != NO_KEY)//si se presionó una tecla
       {
         Serial.println(tecla);//imprimir el caracter tecleado en el Monitor Serial
         if (tecla == '#')//si tecleamos el caracter "#" del KeyPad se abre la puerta
           {
           //Activa el Relé durante X segundos
           digitalWrite(7, LOW);
           delay(500);
           digitalWrite(7, HIGH);
           } 
        }
         //FIN CODIGO APERTURA CON TECLADO
}

El último bloque donde capturo con el teclado es donde no se me ocurre como seguir....

Muchas gracias y un saludo!!!
Logged

Palencia, Spain
Offline Offline
God Member
*****
Karma: 25
Posts: 548
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola.
Hecho así al vuelo (probablemente tenga algún fallo, pero lo importante es que entiendas el código):
Code:
char *clave="1234";
char *introducida="xxxx"; // Para guardar espacio en memoria para la clave que introducimos
int indiceTeclado=0;
void loop() {
      tecla=teclado.getKey();
      if (tecla != NO_KEY)//si se presionó una tecla
      {
            if (tecla == '#')//si tecleamos el caracter "#" del KeyPad comprobaremos si abrir la puerta, y reiniciaremos clave introducida
            {
                  if (indiceTeclado==4) // Si no hemos introducido cuatro caracteres, ni comprobamos
                  {
                        bool coincide=true;
                        for (int i=0;i<4;i++){
                              if (clave[i]!=introducida[i])
                              {
                                    coincide=false;
                                    break; //si uno de los caracteres no coincide, salimos del bucle
                              }     
                        }
                        if (coincide)
                        {
                              //Activa el Relé durante X segundos
                              digitalWrite(7, LOW);
                              delay(500);
                              digitalWrite(7, HIGH);
                        }
                  }
                  Serial.println();
                  indiceTeclado=0; // Siempre que se pulse # "borramos" la clave
            }
            else      // Si la tecla no es #
            {
                  if (indiceTeclado < 4) // Cuando existan ya cuatro caracteres "pasamos de recibir más"
                  {
                        introducida[indiceTeclado]=tecla;
                        indiceTeclado++;
                        Serial.print(tecla);
                  }
            }
      }
}
Logged

Murcia
Offline Offline
Full Member
***
Karma: 2
Posts: 109
Aprendiz de novato
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Muchísimas gracias Noter,

Voy a trabajar el código que me has dado a ver si lo consigo.

Un saludo!!!!
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 43
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Es muy buena idea el teclado rdif. Usas tarjeta y luego el teclado???, o el teclado seria para acceso sin tarjeta?

Me podrias explicar como has conectado el arduino al motor de la cerradura ???

Gracias compañero.
Logged

Murcia
Offline Offline
Full Member
***
Karma: 2
Posts: 109
Aprendiz de novato
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola Johnie.

El teclado seria para poder acceser sin tarjeta, sólo tecleando un código determinado (ahora estoy trabajando esa parte).

La conexión a la cerradura es a través de un relé. Ahora mismo, mientras preparo el código, lo tengo conectado a una bombilla para ir comprobando el funcionamiento. Esta tarde sacó unos minutos y hago una foto para que lo veas.

¡Un saludo!
Logged

Murcia
Offline Offline
Full Member
***
Karma: 2
Posts: 109
Aprendiz de novato
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Este es el montaje:



Cuando todo esté 100% operativo, el relé activará la cerradura eléctrica en lugar de la bombilla.

Un saludo!
Logged

Murcia
Offline Offline
Full Member
***
Karma: 2
Posts: 109
Aprendiz de novato
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bueno pues gracias a la ayuda de Noter ya está el código 100% operativo!!!

Aquí lo dejo por si a alguien le resulta de utilidad:

Code:
// ARDUINO UNO + RFID-RC522 + KEYPAD MATRIX 4X3
//Sketch que, por medio de un relé, activa la apertura de una cerradura eléctrica
//Funciona indistintamente por RFID mediante una tarjeta (o llave tipo moneda)
//Y tambien introduciendo una secuencia de caracteres determinada en el teclado
// en este ejemplo la clave será "1234" y el caracter # al final.
//La ultima parte del código referente a la apertura con el KeyPad corresponde
//al usuario "Noter" del Foro Arduino.cc. ¡¡Gracias!!


//INICIO CONFIGURACION TECLADO
#include <Keypad.h>
const byte filas=4;
const byte columnas=3;
byte pinsfilas[filas]={8,6,5,4}; //en orden F1,F2,F3,F4
byte pinscolumnas[columnas]={3,2,14};//en orden C1,C2,C3
char teclas[filas][columnas]=
  {
    {'1','2','3'},
    {'4','5','6'},
    {'7','8','9'},
    {'*','0','#'},
  };
Keypad teclado = Keypad(makeKeymap(teclas),pinsfilas,pinscolumnas,filas,columnas);
//FIN CONFIGURACION TECLADO


#include <SPI.h>
#include <RFID.h>
RFID rfid(10,9); // Pines de conexión del RFID
char tecla; // Variable para almacenar la tecla pulsada en el KeyPad
//____________________________________
char *clave="1234"; // *****1234 ES LA CLAVE DE 4 DÍGITOS PARA QUE ABRA CON EL TECLADO. MODIFICAR*********
char *introducida="xxxx"; // Para guardar espacio en memoria para la clave que introducimos
int indiceTeclado=0;
//____________________________________

void setup()
{
  Serial.begin(9600);
  SPI.begin();
  rfid.init();
  pinMode(7,OUTPUT);//Pin que activa el relé de apertura de la puerta
  digitalWrite(7,HIGH);
 
}

void loop()
{
    //INICIO CODIGO APERTURA POR RFID
    int codigo = 0;
    int x=1000; // tiempo de apertura de puerta
    if (rfid.isCard()) {
     
          Serial.println("IS CARD");
         
          // El siguiente IF muestra en la Pantalla Serial el nº de serie de la tarjeta "escaneada"
          if (rfid.readCardSerial()) {
           
                        Serial.println(" ");
                        Serial.println("El numero de serie de la tarjeta es  : ");
Serial.print(rfid.serNum[0],DEC);
                        Serial.print(" , ");
Serial.print(rfid.serNum[1],DEC);
                        Serial.print(" , ");
Serial.print(rfid.serNum[2],DEC);
                        Serial.print(" , ");
Serial.print(rfid.serNum[3],DEC);
                        Serial.print(" , ");
Serial.print(rfid.serNum[4],DEC);
                        Serial.println(" ");
                        codigo = rfid.serNum[4],DEC;// guardamos en la variable "codigo" el valor del cuarto bloque de caracteres de la tarjeta
                        //si queremos aumentar la seguridad podemos almacenar en otra/s variables más bloques
          }
         
    }
     rfid.halt();
     //El siguiente IF abre la puerta a aquella tarjeta cuyo CUARTO BLOQUE de caracteres es igual a 90
     //si queremos aumentar la seguridad podemos comparar más bloques en lugar de solo el cuarto
     if (codigo == 90)
     {
       Serial.println(" ");
       Serial.println("Usuario Autorizado. Bienvenido");
       Serial.println(" ");
       //Activa el Relé durante X segundos
       digitalWrite(7, LOW);
       delay(x);
       digitalWrite(7, HIGH);
     }
     //FIN CODIGO APERTURA POR RFID
     
     
     //INICIO CODIGO APERTURA CON TECLADO
      tecla=teclado.getKey();
      if (tecla != NO_KEY)//si se presionó una tecla
      {
            if (tecla == '#')//si tecleamos el caracter "#" del KeyPad comprobaremos si abrir la puerta, y reiniciaremos clave introducida
            {
                  if (indiceTeclado==4) // Si no hemos introducido cuatro caracteres, ni comprobamos
                  {
                        bool coincide=true;
                        for (int i=0;i<4;i++){
                              if (clave[i]!=introducida[i])
                              {
                                    coincide=false;
                                    Serial.println(" ");
                                    Serial.println("Clave INCORRECTA");
                                    Serial.println(" ");
                                    break; //si uno de los caracteres no coincide, salimos del bucle
                              }     
                        }
                        if (coincide)
                        {
                              Serial.println(" ");
                              Serial.println("Usuario Autorizado. Bienvenido");
                              Serial.println(" ");                         
                              //Activa el Relé durante X segundos
                              digitalWrite(7, LOW);
                              delay(x);
                              digitalWrite(7, HIGH);
                        }
                  }
                  Serial.println();
                  indiceTeclado=0; // Siempre que se pulse # "borramos" la clave
            }
            else      // Si la tecla no es #
            {
                  if (indiceTeclado < 4) // Cuando existan ya cuatro caracteres "pasamos de recibir más"
                  {
                        introducida[indiceTeclado]=tecla;
                        indiceTeclado++;
                        Serial.print(tecla);
                  }
            }
      }
      //FIN CODIGO APERTURA CON TECLADO
}

Se puede mejorar la seguridad comparando todos los bloques de datos de cada tarjeta RFID así como añadiendo más caracteres a la clave cuando se utiliza el teclado. Eso a gusto de cada uno smiley-wink

Un saludo y muchas gracias de nuevo compañero Noter!!!!
Logged

Palencia, Spain
Offline Offline
God Member
*****
Karma: 25
Posts: 548
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

De nada, Jukar. Un placer haberte ayudado.
Saludos.
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 43
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Mi control de acceso le tengo puesto un display para que mueste por el LCD la información, me llama mucho la atención lo del rele y la cerradura, pero no se como montarlo ese será mi siguiente paso.

Aproposito el codigo del teclado es auto-generado ???
Logged

Murcia
Offline Offline
Full Member
***
Karma: 2
Posts: 109
Aprendiz de novato
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola Jonhie, no se muy bien a que te refieres con lo de auto generado... smiley-red

Cuando lo monte con la cerradura procurare hacer foto de todas las conexiones por sí te sirve. Ahora estoy esperando que me llegue la caja donde montar el módulo RFID.

Mi intención es montar otro control de acceso similar a este pero con una pantalla LCD igual que tu. He estado viendo esta pero no se sí será muy complejo ( es el primer LCD que montó) ni si dispondré de suficientes pones para el proyecto con un Arduino UNO...

http://www.ebay.es/itm/310565065847?ssPageName=STRK:MESINDXX:IT&_trksid=p3984.m1436.l2649


¿Qué te parece?
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 43
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Me refiero que si la clave de acceso se auto-genera, es decir cada dia es una nueva... o tienes que compilar el arduino para la nueva pass..... lo ideal seria, esto:

En mi proyecto de control de acceso consegui conectarlo con una web php, si no tienes la tarjeta el usuario puede acceder a una intranet, esta intranet le generara un id que la mostrara en el LCD. con esa id la pone en la intranet y le abreria la puerta. en mi caso daria el acceso.

Yo tambien estoy esperando que me llegue mi caja para montar el modulo rfid, mi LCD es de 8pines pero solo uso 4 del arduino. Cuando tenga el potenciometro que me falta para el LCD y la caja te pongo unas fotos.
« Last Edit: September 30, 2013, 12:13:05 pm by johnnie » Logged

Murcia
Offline Offline
Full Member
***
Karma: 2
Posts: 109
Aprendiz de novato
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola Jonhie, la clave no es autogenerada, hay que modificarla en el sketch y cargarlo de nuevo en el arduino.

El método que planteas en tu proyecto es realmente muy interesante, nunca se me hubiera ocurrido...

Espero esas fotos smiley-wink

Un saludo!!!
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 43
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola Jonhie, la clave no es autogenerada, hay que modificarla en el sketch y cargarlo de nuevo en el arduino.

El método que planteas en tu proyecto es realmente muy interesante, nunca se me hubiera ocurrido...

Espero esas fotos smiley-wink

Un saludo!!!

Te cuento un poco más.
El usuario si por alguna razón no tuviera las tarjeta rfid, aparte de poder conectarse con el movil como te comente a una intranet que este accesible desde internet, y que al pulsar un icono de la intranet le muestra en el LCD el Random/Semilla para que la ponga en la intranet y le de acceso.
Con esto compruebas de que el usuario esta fisicamente delante del lector y no esta en el bareto de la esquina.
En cuanto lo deje terminado lo avanzaré más metiendole el NFC para el movil por proximidad que tambien es muy muy interesante. Y discriminación horaria que hasta el momento no lo estoy haciendo.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 1
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola Jukar me parece interesante tu proyecto yo soy nuevo en esto de arduino  y me gustaria mucho hacer tu proyecto pero no veo como empesar me encantaria si podrias subir el esquematico de como va conectado todo por la foto que subiste tengo una idea pero seria mucho mejor si me ayudaras con el esquema te lo agradeceria mucho y gracias por tu proyecto te felicito esta muy interesante
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 43
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Por fin me llegaron los componentes que necesitaba.

Te dejo un parde fotos.
Como ves cuando paso el token nfc me dice si tiene acceso o no,
Tambien le meti un sensor de temp y humedad, que solo muestra los datos de la sala si el usuario tiene acceso.
Si te fijas no tengo potencimetro para el LCD le meti una resistencia de 2,2Kons a mi me va bien con esa, si le ponia una inferior el LCD se quedaba iluminado totalmente y si le ponia una superior ni se veia.

si quieres los esquemas te los pueden pasar.


* 20131013_154125.jpg (2610.55 KB, 2448x3264 - viewed 537 times.)
Logged

Pages: [1] 2 3 4   Go Up
Jump to: