Fingerprint সেন্সরের সাথে Arduino Uno

<![CDATA[

সর্বদা একটু ভিন্ন কিছু করতেই বেশি পছন্দ করতেন মাসুদ। ইউনিভার্সিটির মধ্যে তার বেশ নাম ডাকও রয়েছে। সবাই যখন আড্ডায় ব্যস্ত থাকতেন, মাসুদ তখন থাকতেন ভার্সিটির ল্যাবে অথবা লাইব্রেরীতে। তাই সে অন্যদের চেয়ে থিউরি-প্র্যাক্‌টিক্যালে বেশ এগিয়ে ছিলেন। Fingerprint সেন্সর নিয়ে তার প্রোজেক্ট বেশ প্রশংসনীয় ছিলো। এবার জুনিয়র ব্যাচের প্রোজেক্ট গাইড লাইন দরকার। স্যারদের থেকে কিছু তথ্য নিয়েছেন, এবং মাসুদের সাথে যোগাযোগ করতে বলে দিয়েছেন। তাই সবাই মিলে মাসুদের শরণাপন্ন হলো, প্রোজেক্ট বিষয়ে ধারণা নেওয়ার জন্য। সাথে দরকার মাসুদের বাস্তবমুখী অভিজ্ঞতার আইডিয়া। মাসুদ জুনিয়রদের উদ্দেশ্য করে বললো, তোমরা বায়োমেট্রিক্স ডিভাইস নিয়ে প্রোজেক্ট করতে পারো। জুনিয়রদের মধ্য থেকে একজন সাথে

সাথেই প্রশ্ন ছুড়ে দিলো, ভাইয়া তাহলে আমরা কোন ডিভাইসটি দিয়ে শুরু করতে পারি? মাসুদ জানালো, আমাদের দেশের সকল ক্ষেত্রেই দেখবে Fingerprint সেন্সরের ব্যবহার অনেক বেড়েছে। সিম ক্রয় থেকে শুরু করে, ড্রাইভিং লাইসেন্স, জাতিয় পরিচয়পত্র নিবন্ধন, পাসপোর্ট। তাই তোমরাও এই সেন্সর নিয়ে শুরু করতে পারো। এতে তোমাদের নতুন একটা বিষয় সেখাও হবে আবার তোমাদের প্রোজেক্টও অন্যদের চেয়ে ভিন্ন হবে। Fingerprint Recognition Module (AS608) নামের সেন্সরটি নিয়ে শুরু করতো পারো । তবে শুরু করার পূর্বে সেন্সরের সম্পর্কে যাবতীয় তথ্য জেনে নিয়ে শুরু করবে। বিশেষ করে, এর সাপ্লাই ভোল্টেজ, পিন বৃত্তান্ত, কানেকশন প্রক্রিয়া ইত্যাদি। এরপর আরও বিস্তারিত বুঝিয়ে দিলেন মাসুদ।

Fingerprint সেন্সরঃ

  • সাপ্লাই ভোল্টেজঃ ৩.৩ ভোল্ট
  • সর্বোচ্চ কারেন্ট সাপ্লাইঃ ৬০ মিলি এম্পিয়ার
  • রেজুলেশনঃ ৫০০ ডিপিআই (DPI)
  • সর্বোচ্চ ফিঙ্গারপ্রিন্ট ইমেজিং সময়: ১ সেকেন্ড

fingerprint sensor AS608 front side

পিন ডায়াগ্রামঃ

ফিঙ্গারপ্রিন্ট সেন্সরটিতে সংযোগ দেওয়ার জন্য রয়েছে একটি ৬ পিনের সকেট। যেখানে রয়েছে

  • GND = GND
  • RX = Serial Receiver (সিরিয়াল রিসিভার)
  • TX = Serial Transmitter (সিরিয়াল ট্রান্সমিটার)
  • 3V3 = সাপ্লাই ভোল্টেজ

fingerprint sensor AS608

Fingerprint সেন্সরটি ৩.৩ ভোল্টে অপারেট হবে। সুতরাং সাপ্লাই ভোল্টেজ অবশ্যই ৩.৩ ভোল্টের বেশি দেওয়া যাবে না। এর ফলে সেন্সর নস্ট হয়ে যাবে।

প্রয়োজনীয় কম্পোনেন্টঃ

কম্পোনেন্টের তালিকা নিচে প্রদান করা হলো।

ক্রমিক নং  কম্পোনেন্টের নাম মডেল পরিমাণ লিংক
Arduino Uno ARD-00028 ১টি কম্পোনেন্ট লিংক
Fingerprint Recognition Module (AS608) MOD-00212 ১টি কম্পোনেন্ট লিংক
Breadboard (830 Point) MIS-00002 ১টি কম্পোনেন্ট লিংক
Silicone Jumper Wire (Male to Male) C&C-00245 প্রয়োজনমত কম্পোনেন্ট লিংক
Active Buzzer AUD-00002 ১টি কম্পোনেন্ট লিংক
LED Red – 5mm PCM-00238 ১টি কম্পোনেন্ট লিংক
LED Green – 5mm PCM-00239 ১টি কম্পোনেন্ট লিংক
330 Ohm 1/4W Resistor PCM-00068 ২টি কম্পোনেন্ট লিংক

সার্কিট কানেকশনঃ

সার্কিট কানেকশন খুবই সহজ করে দেখানো হয়েছে। দুইটা LED সংযোগ হবে, যেখানে Red LED কানেক্ট হবে D8 এ এবং Green LED কানেক্ট হবে D9 এ। Green LED এন্রোল করা ফিঙ্গারের জন্য জ্বলবে, Red LED ভুল ফিঙ্গারের জন্য। একটা অডিও বাজার, যা সাউন্ডের জন্য ব্যবহার করা হয়েছে। বাজারটি কানেক্ট হবে D6 এ। সেন্সরের জন্য সফটওয়্যার সিরিয়াল ব্যবহার করা হয়েছে, এই জন্য Arduino Uno এর D2, D3 পিন ব্যবহার করা হয়েছে। ফিঙ্গারপ্রিন্টের সাপ্লাই ভোল্টেজ এখানে ৩.৩ ভোল্ট দেওয়া হয়েছে।

ডেমো কোডঃ

Enroll Code এবং Fingerprint Code দুটি Adafruit_Fingerprint লাইব্রেরীর মধ্যেই রয়েছে।

Enroll Code

প্রথমেই Finger এনরোল করে নিতে হবে। এই জন্য নিচের দেওয়া কোডটি আপলোড করতে হবে। তারপর সিরিয়াল মনিটর ওপেন করে Fingerprint সেন্সরের উপর আঙ্গুল ধরতে হবে। এরপর পরবর্তী ধাপ অনুসরণ করে ফিঙ্গার এনরোল করতে হবে।

#include <Adafruit_Fingerprint.h>

#if (defined(__AVR__) || defined(ESP8266)) && !defined(__AVR_ATmega2560__)
// 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)
// Set up the serial port to use softwareserial..
SoftwareSerial mySerial(2, 3);

#else
// On Leonardo/M0/etc, others with hardware serial, use hardware serial!
// #0 is green wire, #1 is white
#define mySerial Serial1

#endif


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

  Serial.println(F("Reading sensor parameters"));
  finger.getParameters();
  Serial.print(F("Status: 0x")); Serial.println(finger.status_reg, HEX);
  Serial.print(F("Sys ID: 0x")); Serial.println(finger.system_id, HEX);
  Serial.print(F("Capacity: ")); Serial.println(finger.capacity);
  Serial.print(F("Security level: ")); Serial.println(finger.security_level);
  Serial.print(F("Device address: ")); Serial.println(finger.device_addr, HEX);
  Serial.print(F("Packet len: ")); Serial.println(finger.packet_len);
  Serial.print(F("Baud rate: ")); Serial.println(finger.baud_rate);
}

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

  return true;
}

Fingerprint Code

#include <Adafruit_Fingerprint.h>

#if (defined(__AVR__) || defined(ESP8266)) && !defined(__AVR_ATmega2560__)
// 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)
// Set up the serial port to use softwareserial..
SoftwareSerial mySerial(2, 3);

#else
// On Leonardo/M0/etc, others with hardware serial, use hardware serial!
// #0 is green wire, #1 is white
#define mySerial Serial1

#endif


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);
  delay(5);
  if (finger.verifyPassword()) {
    Serial.println("Found fingerprint sensor!");
  } else {
    Serial.println("Did not find fingerprint sensor :(");
    while (1) { delay(1); }
  }

  Serial.println(F("Reading sensor parameters"));
  finger.getParameters();
  Serial.print(F("Status: 0x")); Serial.println(finger.status_reg, HEX);
  Serial.print(F("Sys ID: 0x")); Serial.println(finger.system_id, HEX);
  Serial.print(F("Capacity: ")); Serial.println(finger.capacity);
  Serial.print(F("Security level: ")); Serial.println(finger.security_level);
  Serial.print(F("Device address: ")); Serial.println(finger.device_addr, HEX);
  Serial.print(F("Packet len: ")); Serial.println(finger.packet_len);
  Serial.print(F("Baud rate: ")); Serial.println(finger.baud_rate);

  finger.getTemplateCount();

  if (finger.templateCount == 0) {
    Serial.print("Sensor doesn't contain any fingerprint data. Please run the 'enroll' example.");
  }
  else {
    Serial.println("Waiting for valid finger...");
      Serial.print("Sensor contains "); Serial.print(finger.templateCount); Serial.println(" templates");
  }
}

void loop()                     // run over and over again
{
  getFingerprintID();
  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.fingerSearch();
  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;
}

Fingerprint Detection

Demo কোডের মধ্যে Fingerprint সেন্সরের এই কোড বেশি ভুমিকা পালন করবে। কারণ এই কোড ব্যবহার করলে বুঝা যাবে কোন ফিঙ্গার Enroll করা হয়েছে।

// Library: Adafruit_Fingerprint
#include <Adafruit_Fingerprint.h> //Adafruit_Fingerprint Sensor Library
#include <SoftwareSerial.h>

int getFingerprintIDez();
int GreenLed = 9;
int RedLed = 8;
int Buzzer = 7;

SoftwareSerial mySerial(2, 3);  //activates serial communication on pin 2 & 3

Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);

void setup()
{
  Serial.begin(9600);  // initialize the serial communications:
  pinMode(GreenLed, OUTPUT);
  pinMode(RedLed, OUTPUT);
  pinMode(Buzzer, OUTPUT);
  finger.begin(57600);
  digitalWrite(RedLed, LOW);
  digitalWrite(GreenLed, LOW);
  digitalWrite(Buzzer, LOW);
}

void loop()  // run over and over again
{
  getFingerprintID();
  delay(100);
}

uint8_t getFingerprintID()
{
  uint8_t p = finger.getImage();

  switch (p)
  {
    case FINGERPRINT_OK:
      break;
    case FINGERPRINT_NOFINGER:
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      return p;
    case FINGERPRINT_IMAGEFAIL:
      return p;
    default:
      return p;
  }

  p = finger.image2Tz();
  switch (p)
  {
    case FINGERPRINT_OK:
      break;
    case FINGERPRINT_IMAGEMESS:
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      return p;
    case FINGERPRINT_FEATUREFAIL:
      return p;
    case FINGERPRINT_INVALIDIMAGE:
      return p;
    default:
      return p;
  }

  // match finger with stored ID#
  p = finger.fingerFastSearch();
  if (p == FINGERPRINT_OK)
  {
    digitalWrite(Buzzer, HIGH);
    digitalWrite(RedLed, LOW);
    digitalWrite(GreenLed, HIGH);
    delay(150);
    digitalWrite(Buzzer, LOW);
    delay(5000);
    digitalWrite(GreenLed, LOW);
  }

  else if (p == FINGERPRINT_NOTFOUND)
  {
    digitalWrite(GreenLed, LOW);

    for (int i=0; i<=2; i++)
    {
     digitalWrite(RedLed, HIGH);
     digitalWrite(Buzzer, HIGH);
     delay(200);
     digitalWrite(RedLed, LOW);
     digitalWrite(Buzzer, LOW);
     delay(200);
    }

    return p;
  }
  else
  {
    return p;
  }

}

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

}

Fingerprint Sensor লাইব্রেরীঃ

Adafruit Fingerprint লাইব্রেরীটি ডিভাইস ম্যানেজার থেকে ইন্সটল করে নিতে হবে।

ভিডিওঃ

GSM মডিউল ব্যবহার করে fingerprint সেন্সরের ব্যবহার দেখতে এই পেজটি দেখতে পারেন।

সতর্কতাঃ

১। Fingerprint সেন্সর ৩.৩ ভোল্টের বেশি ভোল্টেজ সাপ্লাই দেওয়া যাবে না।

২। LED গুলোর ক্ষেত্রে রেজিস্টর বিহীন কানেকশন দেওয়া থেকে বিরত থাকি।

৩। সার্কিট অনুযায়ী কানেকশন নিশ্চিত করতে হবে।

৪। ময়লাযুক্ত আঙ্গুল Fingerprint সেন্সরের উপর দেওয়া যাবে না।

]]>

Nur Mohammad
Nur Mohammad

Senior Research Engineer |
Techshop Bangladesh |
E-mail: nur@techshopbd.com

Leave a Reply

Your email address will not be published. Required fields are marked *

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