Giới thiệu cảm biến vân tay, hướng dẫn sử dụng cảm biến vân tay với Arduino, thực hành làm bộ mở khóa cửa bằng cảm biến vân tay và Arduino

Mục lục:

1. Giới thiệu cảm biến vân tay

Công nghệ cảm biến vân tay ngày càng thông dụng và phát triển. Không chỉ được sử dụng để tích hợp tính năng bảo mật trên các dòng smartphone đời mới. Công nghệ cảm ứng vân tay còn được ứng dụng tích hợp vào các thiết bị hiện đại khác như: Laptop, Tivi, Khóa cửa, Máy chấm công…. Vậy cảm biến vân tay là gì? Hãy cùng Nshop tìm hiểu để biết về tính năng, và cách hoạt động của công nghệ cảm biến vân tay nhé.

  • Định nghĩa:

Cảm biến vân tay hay còn có tên gọi khác là cảm biến nhận diện vân tay là một dạng lưu trữ vân tay của người dùng bằng công nghệ sinh trắc học với những loại sóng khác nhau, sau đó lưu lại những bề mặt lồi lõm và cả lớp da của tay để lưu lại nhằm đảm bảo tính bảo mật khi người dùng đăng nhập vào thiết bị.

  • Nguyên lý hoạt động:

Về cơ bản, cảm biến vân tay là một hệ thống có khả năng lưu bản in vân tay của người dùng một cách nhanh chóng nhờ một hệ thống được đặt dưới khung quét. Người dùng đặt tay lên khung quét và các cảm biến trên khung quét sẽ lưu lại các hình ảnh đó và các phân mềm, vi xử lý sẽ phân tích hình ảnh này theo các vị trí lồi/lõm trên đầu ngón tay của bạn. Khi đặt ngón tay lên trên một thiết bị đọc dấu vân tay, ngay lập tức thiết bị này sẽ quét hình ảnh ngón tay đó và đưa vào hệ thống. Hệ thống sẽ xử  lý dấu vân tay, chuyển sang dạng dữ liệu số rồi đối chiếu các đặc điểm của vân tay đó với dữ liệu đã được lưu trữ trong hệ thống.

  • Ưu nhược điểm của cảm biến vân tay:

Ưu điểm:

  1. So với các thiết bị thông thường việc mở khóa bằng cảm biến vân tay sẽ nhanh hơn với độ nhạy cao: chỉ cần chạm hoặc vuốt nhẹ
  2. Không cần ghi nhớ mật khẩu, dễ dàng thao tác, tiếp cận dễ dàng với người dùng
  3. Có tính bảo mật, xác thực cao: do vân tay của mỗi người là khác nhau

Nhược điểm:

  1. Không thể mở thiết bị nếu vân tay của bạn bị xước, biến dạng mà không có phương án dự phòng
  2. Cảm biến vân tay là một hệ thống xác thực, không có chức năng bảo vệ dữ liệu. Chính vì vậy người khác có thể sử dụng ngón tay của bạn mở khóa thiết bị khi bạn ngủ hoặc mất ý thức.

Cảm biến này sẽ sử dụng một camera chuyên dụng để chụp lại hình ảnh của dấu vân tay trên bề mặt kính, bề mặt kính của cảm biến loại này được phủ một lớp chất liệu đặc biệt giúp dấu vân tay hiển thị được rõ nét hơn trên bề mặt lớp mặt kính. Bức ảnh sau khi được hệ thống camera chụp lại sẽ được nén lại và chuyển sang tín hiệu số để chuyển đến khối xử lý hình ảnh phía sau.

Công nghệ này có nhược điểm là nhận dạng vân tay lâu. Thiếu độ chính xác cao, khả năng xử lý dấu vân tay mất nhiều thời gian hơn so với các loại khác.

    • Cảm biến điện dung:

Cảm biết loại này dựa trên nguyên lý cảm ứng điện từ, bề mặt cảm biến sẽ được bố trí một ma trận tụ điện, ma trận này sẽ có nhiệm vụ tái tạo lại hình ảnh vân tay khi được lấy mẫu. Khi ngón tay của người dùng đặt trên bề mặt cảm biến, ngay lập tức nó sẽ tạo nên sự thay đổi điện dung trong từng con tụ trên ma trận tụ điện, tùy vào độ nông sâu của dấu vân tay ở từng điểm mà trị số tụ điện sẽ khác nhau. Dựa vào trị số điện dung ở từng node hệ thống sẽ dựng lại ảnh vân tay trên ngón vừa lấy mẫu để gửi về khối xử lý và so sánh.

Cảm biến loại này có cấu tạo mỏng và có độ bảo mật cao hơn cảm biến quang học vì thế nó được áp dụng ở các thiết bị cá nhân như máy điện thoại di động hoặc một số dòng thiết bị cao cấp khác.

  • Ứng dụng của cảm biến vân tay
    • Hệ thống khóa cửa vân tay
    • Két sắt
    • Máy chấm công
    • Kiểm soát ra vào
    • Điện thoại thông minh…

2. Hướng dẫn sử dụng cảm biến vân tay với Arduino

Để sử dụng cảm biến vân tay với arduino ta cần chuẩn bị một cảm biến vân tay, board mạch Arduino, máy tính đã cài đặt Arduino. Các bạn có thể tham khảo các sản phẩm có sẵn tại shop:

Sau khi tải và cài đặt phần mềm tiến hành cài thư viện cho cảm biến vân tay:

Link thư viện: https://github.com/adafruit/Adafruit-Fingerprint-Sensor-Library

Tiến hành kết nối cảm biến với Arduino theo sơ đồ sau:

Cảm biến vân tay          Arduino Uno

5V —> 5V

TX  —> 2

RX —> 3

0V —> GND

Ở đây mình sử dụng cảm biến R307, một cảm biến sẽ có một sơ đồ chân khác nhau, các bạn cần xác định đúng chân trước khi kết nối:

Sau khi kết nối, tiến hành test cảm biến: Mở Arduino, đầu tiên nạp code enroll để đăng ký vân tay:

Sau khi nạp code, mở Serial chọn baud: 9600

Nhập ID -> Enter

Sau đó đặt ngón tay lên cảm biến để học vân tay:

Đến khi cổng Serial hiện Stored là đã học thành công vân tay vào ID 1, các bạn có thể học tương tự các vân tay bằng cách chọn ID từ 1 -> 127  và làm như trên.

Sau khi học vân tay xong chúng ta mở code fingerprint để kiểm tra các vân tay vừa học:

Sau khi nạp code, mở Serial chọn baud: 9600

Đặt ngón tay mà bạn lưu là ID 1: nếu đúng Serial sẽ báo Found ID #1

Khi bạn đặt 1 ngón tay khác mà bạn chưa học vào cảm biến, cổng Serial sẽ báo Did not find a match:

Như vậy là chúng ta đã kiểm tra được cảm biến vân tay hoạt tốt, từ đó ta có thể kết hợp với các linh kiện khác để tạo thành một sản phẩm hoàn chỉnh theo ý muốn.

3. Thực hành: làm bộ khóa cửa bằng cảm biến vân tay hoàn chỉnh

Để thực hiện một bộ khóa cửa hoàn chỉnh, chúng ta cần chuẩn bị các linh kiện sau:

  • Arduino UNO R3 DIP x1
  • Cảm biến nhận dạng vân tay R307 x1
  • LCD 1602 kèm module I2C x1
  • Module 1 Relay Với Opto Cách Ly Kích H/L (5VDC) x1
  • Khóa Chốt Điện Từ LY-03 12VDC x1
  • Nút nhấn x4

Sơ đồ kết nối:

Hướng dẫn sử dụng:

Đăng kí vân tay: Nhấn nút Enroll để đăng kí vân tay, chọn địa chỉ lưu ID vân tay bằng cách nhấn Up hoặc Down sau đó nhấn Ok. Đặt ngón tay cần đăng kí vào cảm biến cho đến khi màn hình báo Stored!.

Xóa vân tay: Nhấn nút Del để xóa vân tay, chọn địa chỉ ID mà bạn cần xóa bằng cách nhấn UP hoặc Down sau đó nhấn Ok. Màn hình báo Figer Deleted Successfully là thành công.

Mở khóa điện từ: Nhấn giữ Up/Down 2s để bắt đầu kiểm tra, lúc này đặt ngón tay vào cảm biến, nếu vân tay đúng khóa điện từ sẽ tự động mở 5s sau đó đóng; nếu vân tay không đúng màn hình sẽ báo Finger Not Found Try Later và khóa chốt sẽ không mở.

Code:

#include<LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
#include <SoftwareSerial.h>
#include <Adafruit_Fingerprint.h>
SoftwareSerial fingerPrint(2, 3);
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&fingerPrint);
uint8_t id;
#define enroll A0
#define del A1
#define up A2
#define down A3
#define openLight 4
#define closeLight 5
#define door 6
void setup() {
  // put your setup code here, to run once:
  lcd.begin();
  delay(100);
  Serial.begin(9600);
  pinMode(enroll, INPUT_PULLUP);
    pinMode(up, INPUT_PULLUP); 
    pinMode(down, INPUT_PULLUP); 
    pinMode(del, INPUT_PULLUP); 
    pinMode(openLight, OUTPUT);
    pinMode(closeLight, OUTPUT);
    pinMode(door, OUTPUT);
    digitalWrite(door, LOW);
    lcd.begin();
    lcd.print("Cam Bien Van Tay");
    lcd.setCursor(0,1);
    lcd.print("    by Nshop");
    delay(2000);
    finger.begin(57600);
    Serial.begin(9600);
    lcd.clear();
    lcd.print("Finding Module");
    lcd.setCursor(0,1);
    delay(1000);
    if (finger.verifyPassword()) 
    {
      Serial.println("Found fingerprint sensor!");
      lcd.clear();
      lcd.print("Found Module ");
      delay(1000);
    } 
    else 
    {
    lcd.clear();
    lcd.print("Module not Found");
    lcd.setCursor(0,1);
    lcd.print("Check Connections");
    while (1);
    }
}

void loop() {
  // put your main code here, to run repeatedly:
  lcd.setCursor(0,0);
       lcd.print("Press UP/Down ");
       lcd.setCursor(0,1);
       lcd.print("to start System");
       digitalWrite(closeLight, HIGH);
       if(digitalRead(up)==0 || digitalRead(down)==0)
       {
        for(int i=0;i<5;i++)
        {
          lcd.clear();
          lcd.print("Place Finger");
          delay(2000);
          int result=getFingerprintIDez();
          if(result>=0)
          {
              digitalWrite(openLight, HIGH);
              digitalWrite(door, HIGH);
              digitalWrite(closeLight, LOW);
              lcd.clear();
              lcd.print("Allowed");
              lcd.setCursor(0,1);
              lcd.print("Gete Opened   ");
              delay(5000);
              digitalWrite(closeLight, HIGH);
              digitalWrite(door, LOW);
              digitalWrite(openLight, LOW);
              lcd.setCursor(0,1);
              lcd.print("Gate Closed   ");
              return;
           }
         }
       }
       checkKeys();
       delay(1000);          
}
void checkKeys()
{
   if(digitalRead(enroll) == 0)
   {
    lcd.clear();
    lcd.print("Please Wait");
    delay(1000);
    while(digitalRead(enroll) == 0);
    Enroll();
   }

   else if(digitalRead(del) == 0)
   {
    lcd.clear();
    lcd.print("Please Wait");
    delay(1000);
    delet();
   }  
}

void Enroll()
{
   int count=0;
   lcd.clear();
   lcd.print("Enroll Finger    ");
   lcd.setCursor(0,1);
   lcd.print("Location:");
   while(1)
   {
     lcd.setCursor(9,1);
     lcd.print(count);
     lcd.print("  ");
     if(digitalRead(up) == 0)
     {
       count++;
       if(count>25)
       count=0;
       delay(500);
     }

     else if(digitalRead(down) == 0)
     {
       count--;
       if(count<0)
       count=25;
       delay(500);
     }
     else if(digitalRead(del) == 0)
     {
          id=count;
          getFingerprintEnroll();
          return;
     }

       else if(digitalRead(enroll) == 0)
     {        
          return;
     }
 }
}

void delet()
{
   int count=0;
   lcd.clear();
   lcd.print("Delete Finger    ");
   lcd.setCursor(0,1);
   lcd.print("Location:");
   while(1)
   {
     lcd.setCursor(9,1);
     lcd.print(count);
     lcd.print("  ");
     if(digitalRead(up) == 0)
     {
       count++;
       if(count>25)
       count=0;
       delay(500);
     }

     else if(digitalRead(down) == 0)
     {
       count--;
       if(count<0)
       count=25;
       delay(500);
     }
     else if(digitalRead(del) == 0)
     {
          id=count;
          deleteFingerprint(id);
          return;
     }

       else if(digitalRead(enroll) == 0)
     {        
          return;
     }
 }
}

uint8_t getFingerprintEnroll() 
{
  int p = -1;
  lcd.clear();
  lcd.print("finger ID:");
  lcd.print(id);
  lcd.setCursor(0,1);
  lcd.print("Place Finger");
  delay(2000);
  while (p != FINGERPRINT_OK)
  {
    p = finger.getImage();
    switch (p)
    {
    case FINGERPRINT_OK:
      lcd.clear();
      lcd.print("Image taken");
      break;
    case FINGERPRINT_NOFINGER:
      lcd.clear();
      lcd.print("No Finger");
      break;
    case FINGERPRINT_PACKETRECIEVEERR:
      lcd.clear();
      lcd.print("Comm Error");
      break;
    case FINGERPRINT_IMAGEFAIL:
      lcd.clear();
      lcd.print("Imaging Error");
      break;
    default:
       lcd.clear();
      lcd.print("Unknown Error");
      break;
    }
  }

  // OK success!

  p = finger.image2Tz(1);
  switch (p) {
    case FINGERPRINT_OK:
      lcd.clear();
      lcd.print("Image converted");
      break;
    case FINGERPRINT_IMAGEMESS:
       lcd.clear();
       lcd.print("Image too messy");
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      lcd.clear();
      lcd.print("Comm Error");
      return p;
    case FINGERPRINT_FEATUREFAIL:
      lcd.clear();
      lcd.print("Feature Not Found");
      return p;
    case FINGERPRINT_INVALIDIMAGE:
      lcd.clear();
      lcd.print("Feature Not Found");
      return p;
    default:
      lcd.clear();
      lcd.print("Unknown Error");
      return p;
  }
  
  lcd.clear();
  lcd.print("Remove Finger");
  delay(2000);
  p = 0;
  while (p != FINGERPRINT_NOFINGER) {
    p = finger.getImage();
  }
  p = -1;
   lcd.clear();
      lcd.print("Place Finger");
      lcd.setCursor(0,1);
      lcd.print("   Again");
  while (p != FINGERPRINT_OK) {
    p = finger.getImage();
  }

  // OK success!

  p = finger.image2Tz(2);  
  p = finger.createModel();   
  p = finger.storeModel(id);
  if (p == FINGERPRINT_OK) {
    lcd.clear();
    lcd.print("Stored!");
    delay(2000);
  } else if (p == FINGERPRINT_PACKETRECIEVEERR) {
    return p;
  } else if (p == FINGERPRINT_BADLOCATION) {
    return p;
  } else if (p == FINGERPRINT_FLASHERR) {
    return p;
  }
  else {
    return p;
  }   
}

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)
  {
   lcd.clear();
   lcd.print("Finger Not Found");
   lcd.setCursor(0,1);
   lcd.print("Try Later");
   delay(2000);  
  return -1;
  }
  return finger.fingerID; 
}

uint8_t deleteFingerprint(uint8_t id) 
{
  uint8_t p = -1;  
  lcd.clear();
  lcd.print("Please wait");
  p = finger.deleteModel(id);
  if (p == FINGERPRINT_OK) 
  {
    lcd.clear();
    lcd.print("Figer Deleted");
    lcd.setCursor(0,1);
    lcd.print("Successfully");
    delay(1000);
  } 
  
  else 
  { 
    lcd.clear();
    lcd.print("Something Wrong");
    lcd.setCursor(0,1);
    lcd.print("Try Again Later");
    delay(2000);
    return p;
  }   
}

Qua bài viết này chúng ta đã hiểu rõ hơn về cảm biến vân tay và đã có thể tự làm một dự án đơn giản ứng dụng vào cuộc sống rồi. Các bạn có thể sáng tạo và tạo ra nhiều thiết bị có hiệu quả cao hơn, chúc các bạn thành công!!!