风筝
发表于: 2019-5-17 15:00:59 | 显示全部楼层

生物识别技术作为一种可靠的认证系统已经被使用很长一段时间了。现今存在很多复杂的生物识别系统,它可以通过他的心跳节奏甚至是他的DNA来识别一个人。其他可行的方法包括语音识别、人脸识别、虹膜扫描和指纹识别。其中指纹识别是最广泛使用的方法,从简单的考勤系统到智能手机到安全检查等等,我们都可以看到它的影子。


在本篇文章中,我们将学习如何基于Aduino开发板使用流行的GT511C3指纹传感器(FPS)。指纹传感器有很多种型号,我们已经学会了如何使用它们来构建出勤系统、投票机、安全系统等设计。但GT511C3更先进,具有高精度和更快的响应时间,因此我们将学习如何在Arduino开发板使用该指纹传感器,在Arduino上注册指纹,然后在需要时检测指纹。所以让我们开始吧。


所需的组件

●    Arduino Nano / UNO

●    GT511C3指纹传感器

●    1602液晶屏

●    按钮

●    连接线

●    面包板


GT511C3指纹传感器(FPS)模块

在深入了解项目之前,让我们了解GT511C3指纹传感器模块及其工作原理。这种传感器与我们的智能手机中常用的电容式和超声波指纹传感器非常不同。 GT511C3是一款光学指纹传感器,这意味着它依赖于指纹图像来识别其图案。是的,你猜的不错,传感器实际上有一个摄像头,它可以拍摄指纹,然后使用功能强大的内置ARM Cortex M3 IC处理这些图像。下图显示了带有引脚分布的传感器的正面和背面。

GT511C3-Fingerprint-Sensor-FPS-Module.jpg

GT511C3指纹传感器(FPS)模块


如您所见,传感器有一个由蓝色LED环绕的摄像头(黑点),这些LED必须点亮才能拍出清晰的指纹图像。然后使用与EEPROM配合的ARM微控制器处理这些图像并将其转换为二进制值。该模块还有一个绿色SMD LED指示电源。每个指纹图像为202x258像素,分辨率为450dpi。传感器最多可以注册200个指纹,每个指纹模板都会分配0到199的ID格式。然后在检测过程中,它会自动将扫描的指纹与所有200个模板进行比较,如果找到匹配,则会给出该特定的ID号。 ARM微控制器上使用Smack Finger 3.0算法的指纹。传感器可以在3.3V至6V的电压下工作,并通过9600的串行通信进行通信。通信引脚(Rx和Tx)据说只能承受3.3V的电压,但是数据表没有详细说明。 GT511C3 FPS的引脚输出如下所示。

GT511C3-FPS-Pinout.png

除了串行通信之外,模块还可以使用上一张图片中所示的引脚通过USB连接直接连接到计算机。连接到计算机后,可以使用SDK_DEMO.exe应用程序控制模块,该应用程序可以从链接下载。该应用程序允许用户注册/验证/删除指纹以及识别指纹。该软件还可以帮助您读取传感器捕获的图像,值得一试。或者,即使传感器与Arduino连接,您也可以使用此软件,我们将在本文后面讨论。


关于传感器的另一个有趣特征是传感区域周围的金属外壳。正如我之前所说,必须打开蓝色LED才能让传感器工作。但在传感器应主动等待指纹的应用中,不可能始终保持LED开启,因为它会加热传感器并因此损坏传感器。因此,在这些情况下,金属外壳可以连接到MCU的电容式触摸输入引脚,以检测它是否被触摸。如果是,则可以打开LED并且可以开始感测过程。此方法未在此处演示,因为它超出了本文的范围。


传感器在3.3V下工作时,消耗约130mA电流。注册手指需要将近3秒,识别它需要1秒。但是,如果登记的模板计数较少,则识别速度将很高。有关传感器的更多详细信息,请参阅ADH-Tech的数据表,该数据表是该模块的官方制造商。


将GT511C3指纹传感器与Arduino连接

GT511C3 FPS有两个电源引脚,可以通过Arduino的+ 5V引脚和两个通信引脚Rx和Tx供电,可以连接到Arduino的任何数字引脚进行串行通信。此外,我们还添加了一个按钮和一个LCD来显示传感器状态。 GT511C3 FPS与Arduino连接的完整电路图如下所示。

Circuit-Diagram-for-Connecting-GT511C3-Finger-Print-Sensor-with-Arduino.png


由于Rx和Tx引脚是3.3V电平,我们在Rx侧使用了一个分压器将5V转换为3.3V。 10k电阻和22k电阻将来自Arduino Tx引脚的5V信号转换为3.3V,然后到达FPS的Rx引脚。传感器也可以通过3.3V供电,但要确保您的Arduino可以为传感器提供足够的电流。我们已将4位模式的LCD连接到由Arduino的5V引脚供电。按钮连接到引脚D2,当按下该按钮时,程序将进入注册模式,用户可以在其中注册新手指。注册后,程序将保持扫描模式,扫描任何触摸传感器的手指。

Circuit-Hardware-for-Connecting-GT511C3-Finger-Print-Sensor-with-Arduino.jpg


Arduino与GT511C3

如前所述,GT511C3 FPS通过串行通信进行通信,传感器理解十六进制代码,并且对于每个十六进制代码执行特定操作。如果您感兴趣,可以查看数据表以了解所有十六进制值及其相应的功能。但是,幸运的是我们bboyho已经创建了一个库,可以直接与Arduino一起使用来注册和检测指纹。可以从以下链接下载GT511C3 FPS的Github库:GT511C3 Arduino Library

该链接将下载ZIP文件,然后您必须按照Sketch  - > Include Library  - > Add .ZIP Library命令将其添加到Arduino IDE中。添加库后重新启动IDE,您应该能够在File  - > Example  - > Fingerprint Scanner TTL下找到GT511C3 FSP的示例程序,如下所示

Arduino-with-GT511C3-Finger-Print-Sensor.png


您应该看到四个示例程序,闪烁程序将闪烁FPS上的蓝色LED,注册和ID指针程序可用于相应地注册和识别手指。请注意,即使已关闭电源,一旦注册了手指,模块将始终记住该手指。


Serial Pass-through程序可以上传到Arduino以使用我们在本文前面讨论过的Demo_SDK.exe应用程序。要删除任何指纹模板或在计算机上保存副本,可以使用此SDK应用程序。


为GT511C3指纹传感器编程Arduino

我们的目标是编写一个程序,当按下按钮时,该程序将注册一个手指,并显示已注册的手指的ID号。我们还应该能够在LCD上显示所有信息,以使项目成为独立的项目。完成相同操作的完整代码在本页底部给出。在这里,我们拆成小片段,以帮助您更好地理解。


我们一如既往地通过包含所需的库来开始程序,在这里我们将需要FPS_GT511C3库用于FPS模块,SoftwareSerial库用于使用D4和D5进行串行通信,Liquid crystal库用于连接LCD。然后我们需要提到FPS和LCD连接到哪些引脚。如果按照电路图,则FPS为4和5,LCD为D6至D11。代码如下所示

  1. #include "FPS_GT511C3.h" //Get library from https://github.com/sparkfun/Fingerprint_Scanner-TTL
  2. #include "SoftwareSerial.h" //Software serial library
  3. #include <LiquidCrystal.h> //Library for LCD

  4. FPS_GT511C3 fps(4, 5); //FPS connected to D4 and D5

  5. const int rs = 6, en = 7, d4 = 8, d5 = 9, d6 = 10, d7 = 11; //Mention the pin number for LCD connection
  6. LiquidCrystal lcd(rs, en, d4, d5, d6, d7);//Initialize LCD method
复制代码

setup()函数中,我们在LCD上显示一些介绍性消息,然后初始化FPS模块。命令fps.SetLED(true)将打开传感器上的蓝色LED,您可以在不需要时将其关闭fps.SetLED(false),因为如果连续打开传感器会加热传感器。我们还将引脚D2作为输入引脚并将其连接到内部上拉电阻,以便将按钮连接到引脚。

  1. void setup()
  2. {
  3.   Serial.begin(9600);
  4.   lcd.begin(16, 2); //Initialise 16*2 LCD
  5.   lcd.print("GT511C3 FPS"); //Intro Message line 1
  6.   lcd.setCursor(0, 1);
  7.   lcd.print("with Arduino"); //Intro Message line 2
  8.   delay(2000);
  9.   lcd.clear();

  10.   fps.Open();         //send serial command to initialize fp
  11.   fps.SetLED(true);   //turn on LED so fps can see fingerprint

  12.   pinMode(2,INPUT_PULLUP); //Connect to internal pull up resistor as input pin
  13. }
复制代码

void loop函数内部,我们必须检查按钮是否被按下,如果按下,我们将注册一个新的手指并使用注册enroll函数将其模板与ID号一起保存。 如果不是,我们将继续等待在传感器中按下手指。 如果按下,我们将通过使用1:N方法将指纹与所有登记的指纹模板进行比较来识别指纹。 一旦发现ID,我们将显示欢迎信息,然后显示ID。 如果指纹与任何已登记的手指不匹配,则id计数将为200,在这种情况下,我们将显示welcome unknown。

  1.   if (digitalRead(2))//If button pressed
  2.   {
  3.   Enroll(); //Enroll a fingerprint
  4.   }

  5. // Identify fingerprint test
  6.   if (fps.IsPressFinger())
  7.   {
  8.     fps.CaptureFinger(false);
  9.     int id = fps.Identify1_N();
  10.       lcd.clear();
  11.       lcd.print("Welcome:");
  12.       if (id==200) lcd.print("Unkown  "); //If not recognised
  13.       lcd.print(id);
  14.       delay(1000);
  15.   }
复制代码

enroll()函数必须采用三个样本输入才能成功注册一个手指。 一旦注册,将创建该特定手指的模板,除非用户通过HEX命令强制它,否则不会删除该模板。 注册手指的代码如下所示。 IsPressFinger方法用于检查是否检测到手指,如果是,则使用CaptureFinger捕获图像,最后使用Enroll1、Enroll2和Enroll3三个不同的样本成功注册一根手指。 如果成功注册,LCD将显示手指的ID号,否则将显示带代码的失败消息。 代码1表示未完全捕获指纹,因此您必须再次尝试。 代码2是内存故障指示,代码3是指示手指已经注册。

  1. void Enroll() //Enrol function from library exmaple program
  2. {
  3.   int enrollid = 0;
  4.   bool usedid = true;
  5.   while (usedid == true)
  6.   {
  7.     usedid = fps.CheckEnrolled(enrollid);
  8.     if (usedid==true) enrollid++;
  9.   }
  10.   fps.EnrollStart(enrollid);
  11.   // enroll
  12.   lcd.print("Enroll #");
  13.   lcd.print(enrollid);
  14.   while(fps.IsPressFinger() == false) delay(100);
  15.   bool bret = fps.CaptureFinger(true);
  16.   int iret = 0;
  17.   if (bret != false)
  18.   {
  19.     lcd.clear();
  20.     lcd.print("Remove finger");
  21.     fps.Enroll1();
  22.     while(fps.IsPressFinger() == true) delay(100);
  23.     lcd.clear(); lcd.print("Press again");
  24.     while(fps.IsPressFinger() == false) delay(100);
  25.     bret = fps.CaptureFinger(true);
  26.     if (bret != false)
  27.     {
  28.       lcd.clear(); lcd.print("Remove finger");
  29.       fps.Enroll2();
  30.       while(fps.IsPressFinger() == true) delay(100);
  31.       lcd.clear(); lcd.print("Press yet again");
  32.       while(fps.IsPressFinger() == false) delay(100);
  33.       bret = fps.CaptureFinger(true);
  34.       if (bret != false)
  35.       {
  36.         lcd.clear(); lcd.print("Remove finger");
  37.         iret = fps.Enroll3();
  38.         if (iret == 0)
  39.         {
  40.           lcd.clear(); lcd.print("Enrolling Success");
  41.         }
  42.         else
  43.         {
  44.           lcd.clear();
  45.           lcd.print("Enroll Failed:");
  46.           lcd.print(iret);
  47.         }
  48.       }
  49.       else lcd.print("Failed 1");
  50.     }
  51.     else lcd.print("Failed 2");
  52.   }
  53.   else lcd.print("Failed 3");
  54. }
复制代码

使用Arduino处理GT511C3指纹传感器

现在我们的硬件和代码已准备就绪,现在是时候测试我们的项目了。将代码上传到Arduino并启动它,我只是使用micro-usb端口为项目供电。在启动时,我们应该在LCD上看到介绍消息然后它应该显示“Hi!..”。这意味着FPS已准备好扫描手指,如果按下任何已注册的手指,它将显示“Welcome”,然后是该手指的ID号,如下所示。

Interfacing-GT511C3-Finger-Print-Sensor-with-Arduino.jpg

如果必须注册新手指,我们可以使用按钮进入注册模式并按照LCD指令注册手指。注册过程完成后,LCD将再次显示“Hi!..”,表示已读取该符号以再次识别手指。

Testing-GT511C3-Finger-Print-Sensor-with-Arduino.jpg

从本文中,您可以使用指纹传感器模块在此基础上开发许多有趣的东西。希望您理解本教程并喜欢构建有用的东西,如果您有任何问题,请在本帖下面进行回复。


代码

本文使用的完整代码如下: main.rar (1.21 KB, 下载次数: 42)

跳转到指定楼层
cityfeng
发表于: 2020-12-24 15:37:08 | 显示全部楼层


路过看看!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 705 | 回复: 1492



手机版|

GMT+8, 2024-11-8 05:47 , Processed in 0.058685 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表