Arduino দিয়ে ফিঙ্গারপ্রিন্ট সেন্সরের ব্যবহার শিখি

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

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

ফিঙ্গারপ্রিন্ট সেন্সরঃ

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

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

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

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

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

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

ক্রমিক নং  কম্পোনেন্টের নাম মডেল পরিমাণ লিংক
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 পিন ব্যবহার করা হয়েছে। ফিঙ্গারপ্রিন্টের সাপ্লাই ভোল্টেজ এখানে ৩.৩ ভোল্ট দেওয়া হয়েছে।

লাইব্রেরীঃ

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

ডেমো কোডঃ

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

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

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

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

}

ভিডিওঃ

 

সতর্কতাঃ

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

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

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

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

 

Rate this post
Share with your friends
Default image
Nur Mohammad
Engineer Techshop Bangladesh E-mail: [email protected]
Articles: 31

Leave a Reply

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