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)
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(" ");
}
}
#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][
{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(" ");
}
}
El sensor biométrico de huella digital |
Conexiones:
- GND : Negro
- Pin D2 : Verde
- Pin D3: Blanco
- 5V: Rojo
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.
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;
}
*****************************
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(&
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.
}
// 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.
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
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