Merhaba arkadaşlar, bu yazımızda adafruit firmasının bizlere sunmuş olduğu Arduino Parmak İzi Okuyucu sensörünü nasıl kullanabileceğimize bir göz atacağız. Bu sensör ile hayal gücünüzü kullanarak bir çok uygulama yapabilirsiniz. Parmak izi ile odanızın kapısını açabilir, yada alarm sistemi yapar eve girdiğinizde parmak izinisi okutmazsanız siren çaldırabilirsiniz vs. kedi biyometrik imzanız ile güvenlik sağlayabilirsiniz.

Parmak izi Okuyucu Sensor

Parmak izi Okuyucu Sensor

Sensör kompak olarak imal edilmiş fakat üzerinde montaj için delik yerleri olmadığından bir yere sabitlemek için biraz zahmet istemekte yada 3D printerdan özel aparat yapmanız gerekmektedir. 4 pin soketi ayrı olarak kutu içinden çıkmakta, alt tarafındaki yuvasına kolayca takılabilmektedir.

Parmak izi Okuyucu Sensor Connector

Parmak izi Okuyucu Sensor Connector

Arduino Parmak İzi Okuyucu Adafruit Fingerprint Sensör Özellikleri:

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

Kullanıma geçmeden önce aşağıdaki adresten adafruit fingerprint kütüphanesini indirip Arduino Ide’ sine eklemeniz gerekmektedir.

https://github.com/adafruit/Adafruit-Fingerprint-Sensor-Library

Parmak izi Okuyucu Sensor Kütüphanesi Github

Parmak izi Okuyucu Sensor Kütüphanesi Github

İndirdiğiniz Adafruit-Fingerprint-Sensor-Library-master.zip dosyasını Arduino IDE > Sketch > Include Library > Add .zip Library diyerek ekleyin.

Programa geçmeden önce Adafruit Fingerprint Sensörünün Arduino ile bağlantısını yaparak Arduino Uno‘ yu bilgisayara bağlayın. Ben ilk başta Arduino Mega kullandım ama yüklemeler sırasında arduino mega software serial’ ın “Did not find fingerprint sensor 🙁” hatasını aldığımı gördüm. O yüzden aynı hatayı sizde alırsanız Arduino Uno veya başka bir kart kullanmayı deneyin. Aşağıdaki sarı renkte gözüken kablo gerçekte beyaz renktedir.

Parmak izi Okuyucu Sensor Arduino Bağlantısı

Parmak izi Okuyucu Sensor Arduino Bağlantısı

Adafruit Fingerprint sensörünü test etmek için ilk önce kendi hafızasına parmak izimizi yüklememiz gerekiyor. Bunun için yüklediğimiz kütüphane içerisindeki örnek kodlardan “enroll” kodunu kullanacağız. File > Examples > Adafruit Fingertprint Sensor Library > enroll kodunu açın. Hiç bir şey değiştirmenize gerek yok portu seçerek direk yükleyin.

Parmak izi Okuyucu Sensor Arduino Programı

Parmak izi Okuyucu Sensor Arduino Programı

Adafruit Fingertprint Sensor enroll code
/*************************************************** 
  This is an example sketch for our optical Fingerprint sensor

  Designed specifically to work with the Adafruit BMP085 Breakout 
  ----> http://www.adafruit.com/products/751

  These displays use TTL Serial to communicate, 2 pins are required to 
  interface
  Adafruit invests time and resources providing this open source code, 
  please support Adafruit and open-source hardware by purchasing 
  products from Adafruit!

  Written by Limor Fried/Ladyada for Adafruit Industries.  
  BSD license, all text above must be included in any redistribution
 ****************************************************/

#include <Adafruit_Fingerprint.h>

// On Leonardo/Micro or others with hardware serial, use those! #0 is green wire, #1 is white
// uncomment this line:
// #define mySerial Serial1

// For UNO and others without hardware serial, we must use software serial...
// pin #2 is IN from sensor (GREEN wire)
// pin #3 is OUT from arduino  (WHITE wire)
// comment these two lines if using hardware serial
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);

Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);

uint8_t id;

void setup()  
{
  Serial.begin(9600);
  while (!Serial);  // For Yun/Leo/Micro/Zero/...
  delay(100);
  Serial.println("\n\nAdafruit Fingerprint sensor enrollment");

  // 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) { delay(1); }
  }
}

uint8_t readnumber(void) {
  uint8_t num = 0;
  
  while (num == 0) {
    while (! Serial.available());
    num = Serial.parseInt();
  }
  return num;
}

void loop()                     // run over and over again
{
  Serial.println("Ready to enroll a fingerprint!");
  Serial.println("Please type in the ID # (from 1 to 127) you want to save this finger as...");
  id = readnumber();
  if (id == 0) {// ID #0 not allowed, try again!
     return;
  }
  Serial.print("Enrolling ID #");
  Serial.println(id);
  
  while (!  getFingerprintEnroll() );
}

uint8_t getFingerprintEnroll() {

  int p = -1;
  Serial.print("Waiting for valid finger to enroll as #"); Serial.println(id);
  while (p != FINGERPRINT_OK) {
    p = finger.getImage();
    switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Image taken");
      break;
    case FINGERPRINT_NOFINGER:
      Serial.println(".");
      break;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      break;
    case FINGERPRINT_IMAGEFAIL:
      Serial.println("Imaging error");
      break;
    default:
      Serial.println("Unknown error");
      break;
    }
  }

  // OK success!

  p = finger.image2Tz(1);
  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;
  }
  
  Serial.println("Remove finger");
  delay(2000);
  p = 0;
  while (p != FINGERPRINT_NOFINGER) {
    p = finger.getImage();
  }
  Serial.print("ID "); Serial.println(id);
  p = -1;
  Serial.println("Place same finger again");
  while (p != FINGERPRINT_OK) {
    p = finger.getImage();
    switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Image taken");
      break;
    case FINGERPRINT_NOFINGER:
      Serial.print(".");
      break;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      break;
    case FINGERPRINT_IMAGEFAIL:
      Serial.println("Imaging error");
      break;
    default:
      Serial.println("Unknown error");
      break;
    }
  }

  // OK success!

  p = finger.image2Tz(2);
  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!
  Serial.print("Creating model for #");  Serial.println(id);
  
  p = finger.createModel();
  if (p == FINGERPRINT_OK) {
    Serial.println("Prints matched!");
  } else if (p == FINGERPRINT_PACKETRECIEVEERR) {
    Serial.println("Communication error");
    return p;
  } else if (p == FINGERPRINT_ENROLLMISMATCH) {
    Serial.println("Fingerprints did not match");
    return p;
  } else {
    Serial.println("Unknown error");
    return p;
  }   
  
  Serial.print("ID "); Serial.println(id);
  p = finger.storeModel(id);
  if (p == FINGERPRINT_OK) {
    Serial.println("Stored!");
  } else if (p == FINGERPRINT_PACKETRECIEVEERR) {
    Serial.println("Communication error");
    return p;
  } else if (p == FINGERPRINT_BADLOCATION) {
    Serial.println("Could not store in that location");
    return p;
  } else if (p == FINGERPRINT_FLASHERR) {
    Serial.println("Error writing to flash");
    return p;
  } else {
    Serial.println("Unknown error");
    return p;
  }   
}

Kodu yükledikten sonra serial monitör penceresini açın (sağ üst köşeden veya Ctrl+Shift+M). İlk önce sensörü bulacaktır daha sonra sizden parmak izinizi hangi hafızaya kaydetmek istediğinizi isteyecektir. 1 ile 127 arasında bir değer girin enter’ a basın. Ben 2.’ yi seçtim.

Parmak izi Okuyucu Sensor Kayıt Yapma

Parmak izi Okuyucu Sensor Kayıt Yapma

Ve istediğiniz bir parmağınızı okuycuya bastırın. Okuduğu zaman sizden parmağınızı çekmeniz için “Remove finger” yazısını ekrana basacaktır. Parmağınızı çekin ve doğrulamak için aynı parmağınızı tekrar adafurit fingerprint sensörün ekranına basın.

Parmak izi Okuyucu Sensor Kayıt Yapma

Parmak izi Okuyucu Sensor Kayıt Yapma

Yukarıdaki gibi Stored! yazdıysa başarılı olmuştur. Bir sonraki parmak izinizi hafızadaki başka bir adrese kaydetmek için aynı işlemleri yeniden yapmak için sensör hazır beklemektedir. Bu enroll kodunun amacı bu kadar arkadaşlar.

Şimdi fingerprint koduna geçelim. Bu kod ise sadece parmak izlerini okuyarak hafızadakiler ile karşılaştırıp id numaralarını ve okuduğu süreyi ekrana basmaktadır.

Adafruit Fingertprint Sensor fingerprint code
/*************************************************** 
  This is an example sketch for our optical Fingerprint sensor

  Designed specifically to work with the Adafruit BMP085 Breakout 
  ----> http://www.adafruit.com/products/751

  These displays use TTL Serial to communicate, 2 pins are required to 
  interface
  Adafruit invests time and resources providing this open source code, 
  please support Adafruit and open-source hardware by purchasing 
  products from Adafruit!

  Written by Limor Fried/Ladyada for Adafruit Industries.  
  BSD license, all text above must be included in any redistribution
 ****************************************************/


#include <Adafruit_Fingerprint.h>

// On Leonardo/Micro or others with hardware serial, use those! #0 is green wire, #1 is white
// uncomment this line:
// #define mySerial Serial1

// For UNO and others without hardware serial, we must use software serial...
// pin #2 is IN from sensor (GREEN wire)
// pin #3 is OUT from arduino  (WHITE wire)
// comment these two lines if using hardware serial
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);

Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);

void setup()  
{
  Serial.begin(9600);
  while (!Serial);  // For Yun/Leo/Micro/Zero/...
  delay(100);
  Serial.println("\n\nAdafruit finger detect test");

  // 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) { delay(1); }
  }

  finger.getTemplateCount();
  Serial.print("Sensor contains "); Serial.print(finger.templateCount); Serial.println(" templates");
  Serial.println("Waiting for valid finger...");
}

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); 

  return finger.fingerID;
}

// 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);
  return finger.fingerID; 
}

Bu kod sayesinde projelerimizi hayata geçirebiliriz. Yani başlangıçta bahsettiğimzi gibi bir kapıya parmak izi sensörü koyarak enroll ile örneğin 5. adrese kayıt yaptığımızı düşünün, sonra yukarıdaki fingerprint kodu ile parmak izi okutulduğunda eğer id numarası 5 ise kapıyı aç komutu verdirebiliriz.

Parmak izi Okuyucu Sensor Kontrol

Parmak izi Okuyucu Sensor Kontrol

Ben 1. ve 2. adrese farklı parmaklarımı kaydetmiştim. Okuttuğumda ise gelen veri yukarıdaki gibidir. Farklı parmağımı okuttuğumda ise ekrana veri gelmemektedir. İsterseniz kodlarla oynarak doğru veya yanlış gibi veriler yazdırabilirsiniz.

Adafruit Fingerprint Sensor Kullanım Videosu


0 yorum

Bir cevap yazın

Avatar placeholder

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.