Sensor de huellas dactilares DY50 con Arduino

El sensor óptico de huellas dactilares DY50 hace que agregar detección y verificación de huellas dactilares con Arduino sea muy simple. Estos módulos se utilizan normalmente en cajas fuertes: hay un chip DSP de alta potencia que realiza la representación, el cálculo, la búsqueda de características y la búsqueda de imágenes. Se puede conectar a cualquier microcontrolador o sistema con TTL serial. También puede registrar nuevos dedos directamente: hasta 162 huellas dactilares se pueden almacenar en la memoria FLASH integrada.

Características del sensor DY50

  • Supply voltage: 3.6 – 6.0VDC
  • Operating current: 120mA max
  • Peak current: 150mA max
  • Fingerprint imaging time: <1.0 seconds
  • Window area: 14mm x 18mm
  • Signature file: 256 bytes
  • Template file: 512 bytes
  • Storage capacity: 162 templates
  • Safety ratings (1-5 low to high safety)
  • False Acceptance Rate: <0.001% (Security level 3)
  • False Reject Rate: <1.0% (Security level 3)
  • Interface: TTL Serial
  • Baud rate: 9600, 19200, 28800, 38400, 57600 (default is 57600)
  • Working temperature rating: -20C to +50C
  • Working humidy: 40%-85% RH
  • Full Dimensions: 56 x 20 x 21.5mm
  • Exposed Dimensions (when placed in box): 21mm x 21mm x 21mm triangular
  • Weight: 20 grams

Pines del sensor DY50

biometric_file.png

Diagrama de conexión

Instalación de la librería

Una de las librerías que se pueden utilizar para trabajar con el sensor DY50 es la de Adafruit. Para instalarla tenemos que abrir el administrador de librerías de Arduino IDE:

Buscar la librería Adafruit Fingerprint Sensor Library e instalarla:

Ejemplo de código del sensor DY50 para Arduino IDE

La librería viene acompañada de una variedad de ejemplos de código, éstos se encuentran en Archivo -> Ejemplos -> Adafruit Fingerprint Sensor Library.

El siguiente ejemplo fue construido a partir de los ejemplos de la librería:

#include <Adafruit_Fingerprint.h>

//CONFIGURACIONES BIOMÉTRICO
SoftwareSerial mySerial(2, 3);
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
int id_finding;
int id;
int temp;
char resp;

void setup() {
  Serial.begin(9600);  
  while (!Serial);  // For Yun/Leo/Micro/Zero/...

  //SETUP BIOMÉTRICO
  finger.begin(57600);
  if (finger.verifyPassword()) {
    Serial.println("Sensor biometrico encontrado!");
  } else {
    Serial.println("No se encontro el sensor biometrico :(");
    while (1) { delay(1); }
  }
  delay(1000);
}

void loop() {
 //LOOP PARA BIOMéTRICO
  //mensaje = "";
  id_finding = getFingerprintIDez();
  if(id_finding==0){
      Serial.println("Usuario no identificado");
      finger.getTemplateCount();
      id = finger.templateCount +1;
      Serial.print("Desea registrar enn el ID: ");
      Serial.println(id);
      while(!Serial.available());
      if(Serial.readString()=="si"){
        Serial.println("Registrando");
        getFingerprintEnroll(id);
        return;
        }
      Serial.println("Continua");
      
  }else if(id_finding>0){
      Serial.println("Usuario identificado");
      Serial.println("ID: "+String(id_finding));
  }

  //Serial.println(id_finding);
  delay(50);      
}

//FUNCTION TO REGISTER A FINGERPRINT
uint8_t getFingerprintEnroll(int id_enroll) {
  int p = -1;
  //Serial.print("Registrando ID: "); 
  //Serial.println(id_enroll);
  Serial.println("Coloque su dedo");
  temp=0;
  while(temp<5000){
    temp++;
    //Serial.println(temp);
    p = finger.getImage();
    switch (p) {
      case FINGERPRINT_OK:
        Serial.println("Huella leida");
        break;
      default:
        //Serial.println("Unknown error 1");
        break;
    }
    if (p == FINGERPRINT_OK) {
      break;//termina el while
    }
  }
  if (temp>=5000){
    Serial.println("Termino el tiempo");
    return 0;
    }
  // OK success!

  p = finger.image2Tz(1);
  switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Imagen convertida");
      break;
    default:
      Serial.println("Error conviertiendo imagen");
      return p;
  }
  Serial.println("Retire el dedo");
  delay(2000);
  Serial.println("Coloque el dedo nuevamente");
  temp = 0;
  while (temp<5000) {
    temp++; 
    //Serial.println(temp);
    p = finger.getImage();
    if(p == FINGERPRINT_OK){
      Serial.println("Huella leida");
      break;
    }   
  }
  if (temp==5000){
    Serial.println("Termino el tiempo");
    return 0;
    }
  // OK success!
  p = finger.image2Tz(2);
  switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Imagen convertida");
      break;
    default:
      Serial.println("Error convirtiendo imagen");
      return p;
  }
  // OK converted!
  Serial.print("Creando modelo para el ID: ");  
  Serial.println(id_enroll);
  p = finger.createModel();
  if (p == FINGERPRINT_OK) {
    Serial.println("Modelo correcto!");
  } else {
    Serial.println("Error creando modelo");
    return p;
  }   
  
  p = finger.storeModel(id_enroll);
  if (p == FINGERPRINT_OK) {
    Serial.println("Guardado!");
  } else {
    Serial.println("Error guardando");
    return p;
  }
  return 1;   
}
//FUNCIONES PARA EL BIOMÉTRICO
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 0;
 
  return finger.fingerID; 
}

Revisa todos los ejemplos de sensores con Arduino ->