domingo, 11 de febrero de 2018

CONTROL DE ACCESO MEDIANTE HUELLA DIGITTAL Y RFID

CONTROL DE ACCESO MEDIANTE HUELLA DIGITAL Y RFID

ORIGEN DEL PROYECTO 

El concepto del proyecto radica de la necesidad de poder controlar un acceso, ya sea puerta de garaje o puerta principal de tu casa, mediante tus propias huellas dactilares guardadas posteriormente o mediante tarjetas RFID.


DESCRIPCIÓN

El proyecto consta de un Módulo Lector RFID - RC522 y un lector de huellas digital, ambos sensores controlados por Arduinos.
Se mostrará mediante una LCD si el acceso está permitido o no y se activaran los LEDs correspondientes ( VERDE o ROJO).

En el comienzo nuestra puerta permanecerá cerrada y, mediante nuestros sensores, seremos capaces de poder accionar el motor de la misma.
Hemos tenido que utilizar 2 Arduinos Uno ya que no disponíamos de un Arduino Mega donde disponemos de mas entradas y salidas para la conexión de todos nuestros dispositivos en el mismo.

La pantalla LCD es una 16022 la cual va conectada a los Arduino mediante bus I2C, el cual permite conectar nuestra pantalla al Arduino con solo 4 cables.



PLANIFICACIÓN DEL PROYECTO (Gantt Project)




   
                                                                    COMPONENTES

Módulo RFID - RC522

MONTAJE

PINES 


A continiación el codigo:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3F,16,2);

/*
* MOSI: Pin 11 /
* MISO: Pin 12
* SCK: Pin 13
* SAD: Pin 10
* RST: Pin 5
*/

#include <SPI.h>
#include <MFRC522.h>
#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);
    nfc.begin();
   
    lcd.init();
    lcd.backlight();
    lcd.clear();
   
    lcd.setCursor(2, 0);
    lcd.print("CONTROL ACCESO");
    lcd.setCursor(2, 1);
    lcd.print("BIENVENIDO");
    delay(1000);

    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 autoriazar más tarjetas ponemos el número aqui y la añadimos abajo
byte Authorized[AUTHORIZED_COUNT][6] = {

                            {0x80, 0x3E, 0x5D, 0x7A, 0x99,},{0xF0, 0xDC, 0x83, 0x7C, 0xD3,}
                           //,{0x10, 0x14, 0x39, 0x2E, 0xFF, 0xFF, } ejemplo de como autorizar más tarjetas  0x83,.....
                           
                          };
                         
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))
    {
     printSerial(serial);
     lcd.setCursor(2, 1);
     lcd.print("AUTORIZADO :)");
      Abierto = true;
     
    }
    else
    {
      printSerial(serial);
     
     lcd.setCursor(2, 1);
     lcd.print("NO AUTORIZADO");
      Abierto = false;
     
    }
   
    nfc.haltTag();
    digitalWrite(ledPinAbierto, Abierto);
    digitalWrite(ledPinCerrado, !Abierto);

    delay (5000);

    lcd.clear();
   
    lcd.setCursor(2, 0);
    lcd.print("CONTROL ACCESO");
    lcd.setCursor(2, 1);
    lcd.print("BIENVENIDO");

  }//if (status == MI_OK)

  delay(200);
}

//void loop()

byte status;
  byte data[MAX_LEN];
  byte serial[5];
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.println();
        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(" ");
    }   


Imágenes integradas 3
El sensor biométrico de huella digital

Imágenes integradas 2


Conexiones:
  • GND : Negro
  • Pin D2 : Verde
  • Pin D3: Blanco
  • 5V: Rojo

El dispositivo tiene la capacidad de almacenar hasta 162 huellas dactilares en su memoria FLASH interna.
En nuestro caso para guardar las huellas digitales correspondiente vamos a utilizar un programa llamado SFGEnroll.
Para ello tenemos que conectar nuestro dispositivo en el Arduino y subirle este programa.
Código:

// this sketch will allow you to bypass the Atmega chip
// and connect the fingerprint sensor directly to the USB/Serial
// chip converter.
// Red connects to +5V
// Black connects to Ground
// White goes to Digital 0
// Green goes to Digital 1
void setup() {}
void loop() {}

Una vez subido el programa y cableado nuestro sensor, abrimos el programa y registramos las huellas que creamos oportunas.


Imágenes integradas 1


Una vez registradas nuestras huellas solo falta ejecutar la comprobación de dichas huellas.
Código:

/***************************************************

 ****************************************************/
int verde = 6; // Conectar salida digital 6 a led verde
int rojo = 7; // Conectar salida digital 7 a led rojo
int abierto = 0;
int cerrado = 1;// Iniciamos el sistema con la puerta cerrada.
#include <Adafruit_Fingerprint.h>
#include <SoftwareSerial.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Conexiones de la pantalla LCD al adaptador
LiquidCrystal_I2C lcd(0x3F,16,2);

int getFingerprintIDez();

// pin #2 is IN from sensor (GREEN wire)
// pin #3 is OUT from arduino  (WHITE wire)
SoftwareSerial mySerial(2, 3);


Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);

void setup() 
{
  Serial.begin(9600);
  lcd.init();
  lcd.backlight();
  lcd.clear(); //Para arduino UNO A4 (SDA), A5 (SCL)

  pinMode(verde, OUTPUT);
  pinMode(rojo, OUTPUT);
  Serial.println("fingertest");

  // set the data rate for the sensor serial port
  finger.begin(57600);
 
  if (finger.verifyPassword()) {
    Serial.println("Found fingerprint sensor!");
  } else {
    Serial.println("Did not find fingerprint sensor :(");
    while (1);
  }
  Serial.println("Waiting for valid finger...");
  digitalWrite(verde, LOW);
  digitalWrite(rojo, LOW);
  //Mensajes a traves del LCD
  lcd.setCursor(0, 0);
        lcd.print("CONTROL ACCESO ");
        // Situamos el cursor en la primera casilla de la segunda fila
        lcd.setCursor(0, 1);
        lcd.print("BIENVENIDO");
 delay(1000);

}

void loop()                     // run over and over again
{
  getFingerprintIDez();
  delay(50);            //don't ned to run this at full speed.
}

uint8_t getFingerprintID() {
  uint8_t p = finger.getImage();
  switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Image taken");
      break;
    case FINGERPRINT_NOFINGER:
      Serial.println("No finger detected");
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      return p;
    case FINGERPRINT_IMAGEFAIL:
      Serial.println("Imaging error");
      return p;
    default:
      Serial.println("Unknown error");
      return p;
  }

  // OK success!

  p = finger.image2Tz();
  switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Image converted");
      break;
    case FINGERPRINT_IMAGEMESS:
      Serial.println("Image too messy");
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      return p;
    case FINGERPRINT_FEATUREFAIL:
      Serial.println("Could not find fingerprint features");
      return p;
    case FINGERPRINT_INVALIDIMAGE:
      Serial.println("Could not find fingerprint features");
      return p;
    default:
      Serial.println("Unknown error");
      return p;
  }
 
  // OK converted!
  p = finger.fingerFastSearch();
  if (p == FINGERPRINT_OK) {
    Serial.println("Found a print match!");
  } else if (p == FINGERPRINT_PACKETRECIEVEERR) {
    Serial.println("Communication error");
    return p;
  } else if (p == FINGERPRINT_NOTFOUND) {
    Serial.println("Did not find a match");
    return p;
  } else {
    Serial.println("Unknown error");
    return p;
  }  
 
  // found a match!
  Serial.print("Found ID #"); Serial.print(finger.fingerID);
  Serial.print(" with confidence of "); Serial.println(finger.confidence);
 
}

// returns -1 if failed, otherwise returns ID #
int getFingerprintIDez() {
  uint8_t p = finger.getImage();
  if (p != FINGERPRINT_OK)  return -1;

  p = finger.image2Tz();
  if (p != FINGERPRINT_OK)  return -1;

  p = finger.fingerFastSearch();
  if (p != FINGERPRINT_OK)  return -1;
 
  // found a match!
  Serial.print("Found ID #"); Serial.print(finger.fingerID);
  Serial.print(" with confidence of "); Serial.println(finger.confidence);
  if (finger.fingerID == 3){
 
  lcd.setCursor(0, 1);
  lcd.print("PUERTA ABIERTA ");
  digitalWrite(verde, HIGH);
  delay(3000);
  digitalWrite(verde, LOW);

  lcd.setCursor(0, 0);
  lcd.print("CONTROL ACCESO ");
  lcd.setCursor(0, 1);
  lcd.print("BIENVENIDO     ");
 
  }
 
  else if (finger.fingerID != 3){
  lcd.setCursor(0, 1);
  lcd.print("ACCESO DENEGADO");
 
  digitalWrite(rojo, HIGH);
  delay(3000);
  digitalWrite(rojo, LOW);

  lcd.setCursor(0, 0);
  lcd.print("CONTROL ACCESO ");

  lcd.setCursor(0, 1);
  lcd.print("BIENVENIDO     ");
   
  }
  return finger.fingerID;
}


Aparte de mostrar por pantalla si nuestro acceso está o no permitido, hemos colocado dos LEDs para referenciar dicha acción.
VERDE --> Acceso permitido
ROJO --> Acceso denegado

Para esto he realizado una placa con el programa Proteus.
ESQUEMÁTICO DE LA PLACA

PCB DE LA PLACA

VISTA 3D DE LA PLACA
COLOCACIÓN DE PLACA EN MAQUETA
2 x Led 2.2v
2 x resistencia 330 ohm


IMÁGENES
MOTOR EXTRAÍDO DE UNA DISQUETERA PARA NUESTRA MAQUETA
MODULO I2C
TOTAL DE COMPONENTES

No hay comentarios:

Publicar un comentario