长期以来,生物识别技术一直被用作可靠的身份验证系统。今天存在复杂的生物识别系统,可以通过他的心跳节奏甚至他的 DNA 来识别一个人。其他可行的方法包括语音识别、人脸识别、虹膜扫描和指纹扫描。其中指纹识别是使用最广泛的方法,我们可以从简单的考勤系统到智能手机再到安全检查等等。
在本教程中,我们将学习如何在Arduino 中使用流行的 GT511C3 指纹传感器 (FPS)。有许多可用的 FPS,我们已经学会了如何使用它们来构建考勤系统、投票机、安全系统等设计。但 GT511C3 更先进,精度更高,响应时间更快,所以我们将学习如何使用它使用 Arduino 在其上注册指纹,然后在需要时检测指纹。所以让我们开始吧。
所需材料
Arduino纳米/UNO
GT511C3 指纹传感器
16x2液晶屏
Pot – 10k 和 1k、10k、22k 电阻器
按钮
连接电线
面包板
GT511C3 指纹传感器 (FPS) 模块
在深入项目之前,让我们了解GT511C3 指纹传感器模块及其工作原理。该传感器与我们智能手机中常用的电容式和超声波指纹传感器非常不同。GT511C3是一种光学指纹传感器,这意味着它依靠您的指纹图像来识别其图案。是的,你没看错,传感器内部实际上有一个摄像头,它可以拍摄你的指纹照片,然后使用强大的内置 ARM Cortex M3 IC 处理这些图像。下图显示了传感器的正面和背面以及引脚。
如您所见,传感器有一个被蓝色 LED 包围的摄像头(黑点),必须点亮这些 LED 才能拍摄清晰的指纹图像。然后通过使用ARM 微控制器与 EEPROM 耦合来处理这些图像并将其转换为二进制值。该模块还有一个绿色 SMD LED 来指示电源。每个指纹图像为 202x258 像素,分辨率为 450dpi。该传感器最多可以注册 200 个指纹,并且为每个指纹模板分配一个 ID 表格,从 0 到 199。然后在检测过程中,它可以自动将扫描的指纹与所有 200 个模板进行比较,如果找到匹配项,它会使用Smack Finger 3.0给出该特定指纹的 ID 号ARM 微控制器上的算法。该传感器可以在 3.3V 至 6V 的电压范围内工作,并通过9600 的串行通信进行通信。据说通信引脚(Rx 和 Tx)只能承受 3.3V,但数据表并没有具体说明。GT511C3 FPS 的引脚如下所示。
除了串行通信外,该模块还可以使用上图所示的引脚通过 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 来显示传感器状态。Arduino GT511C3 指纹传感器接口的完整电路图 如下所示。
由于 Rx 和 Tx 引脚可承受 3.3V电压,我们在 Rx 侧使用分压器将 5V 转换为 3.3V。10k 电阻和 22k 电阻将来自 Arduino Tx 引脚的 5V 信号在到达 FPS 的 Rx 引脚之前转换为 3.3V。传感器也可以由 3.3V 供电,但请确保您的 Arduino 可以为传感器提供足够的电流。我们已经连接了由 Arduino 的 5V 引脚供电的 4 位模式的 LCD。一个 按钮连接到引脚 D2,按下该按钮后,程序将进入注册模式,用户可以注册新手指。注册后,程序将保持在扫描模式以扫描任何手指触摸传感器。
Arduino GT511C3 指纹传感器库
如前所述,GT511C3 FPS 通过串行通信进行通信,传感器理解十六进制代码,并且针对每个十六进制代码执行特定操作。如果您有兴趣,可以查看数据表以了解所有十六进制值及其相应的功能。但是,幸运的是,bboyho已经创建了一个库,可以直接与 Arduino 一起使用来注册和检测指纹。
该链接将下载一个 ZIP 文件,然后您必须按照命令Sketch -》 Include Library -》 Add .ZIP Library将其添加到您的 Arduino IDE 。添加库后,重新启动 IDE,您应该能够在 File -》 Example -》 Fingerprint Scanner TTL 下找到 GT511C3 FSP 的示例程序,如下所示
您应该看到四个示例程序,闪烁程序将闪烁 FPS 上的蓝色 LED,注册和 ID 手指程序可用于相应地注册和识别手指。请注意,一旦注册的手指将始终被模块记住,即使它已关闭电源。
串行直通程序可以上传到 Arduino 以使用我们在本文前面讨论的Demo_SDK.exe应用程序。要删除任何指纹模板或在您的计算机上保存副本,可以使用此 SDK 应用程序。
Arduino指纹传感器代码
我们的目标是编写一个程序,当按下按钮时注册手指并显示已注册手指的 ID 号。我们还应该能够在 LCD 上显示所有信息,以使项目成为一个独立的项目。完成相同操作的完整代码在本页底部给出。在这里,我将其分解为小片段,以帮助您更好地理解。
与往常一样,我们通过包含所需的库来开始程序,这里我们需要 FPS_GT511C3 库用于我们的 FPS 模块,软件串行使用 D4 和 D5 进行串行通信以及液晶用于 LCD 接口。然后我们需要提到 FPS 和 LCD 连接到哪些引脚。如果您按照这样的电路图进行操作,则 FPS 为 4 和 5,LCD 为 D6 至 D11。相同的代码如下所示
#include "FPS_GT511C3.h" //从 https://github.com/sparkfun/Fingerprint_Scanner-TTL 获取库 #include "SoftwareSerial.h" //软件串行库 #include//LCD 库 FPS_GT511C3 fps(4, 5); //FPS连接到D4和D5 const int rs = 6, en = 7, d4 = 8, d5 = 9, d6 = 10, d7 = 11; //记液晶连接的管脚号 LiquidCrystal lcd(rs, en, d4, d5, d6, d7);//初始化液晶方法
在setup函数中,我们在 LCD 上显示一些介绍性消息,然后初始化 FPS 模块。命令 fps.SetLED(true) 将打开传感器上的蓝色 LED,您可以在不需要时通过 fps.SetLED(false) 将其关闭,因为如果持续打开它会加热传感器。我们还将引脚 D2 作为输入引脚,并将其连接到内部上拉电阻,以便将按钮连接到引脚。
无效设置() { 序列.开始(9600); lcd.begin(16, 2); //初始化16*2 LCD lcd.print("GT511C3 FPS"); //介绍消息行 1 lcd.setCursor(0, 1); lcd.print("与 Arduino"); //介绍消息第 2 行 延迟(2000); lcd.clear(); fps.Open(); //发送串口命令初始化fp fps.SetLED(true); //打开 LED 以便 fps 可以看到指纹 pinMode(2,INPUT_PULLUP); //连接到内部上拉电阻作为输入引脚 }
在void 循环函数中,我们必须检查按钮是否被按下,如果按下,我们将注册一个新手指并使用注册函数将其模板与 ID 号一起保存。如果不是,我们将继续等待手指按下传感器。如果按下,我们将通过使用 1:N 方法将指纹与所有注册的指纹模板进行比较来识别指纹。一旦发现 ID 号,我们将显示欢迎,然后显示 ID 号。如果指纹与任何已注册的手指不匹配,则 id 计数将为 200,在这种情况下,我们将显示欢迎未知。
if (digitalRead(2))//如果按下按钮 { Enroll(); //注册指纹 } // 识别指纹测试 if (fps.IsPressFinger()) { fps.CaptureFinger(false); int id = fps.Identify1_N(); lcd.clear(); lcd.print("欢迎您:"); if (id==200) lcd.print("未知"); //如果无法识别 lcd.print(id); 延迟(1000); }
注册功能必须采用三个样本输入才能成功注册一根手指。注册后,将为该特定手指创建一个模板,除非用户通过 HEX 命令强制它,否则该模板将不会被删除。登记手指的代码如下所示。IsPressFinger方法用于检查是否检测到手指,如果是,则使用CaptureFinger捕获图像然后最后将 Enroll1、Enroll2 和 Enroll3 用于三个不同的样本,以成功注册一个手指。如果注册成功,LCD 会显示手指的 ID 号,否则会显示带有代码的失败消息。代码 1 表示指纹没有被清晰地捕获,因此您必须重试。代码 2 是内存失败指示,代码 3 表示手指已被登记。
void Enroll() //从库示例程序中注册函数 { int enrollid = 0; bool usedid = true; while (usedid == true) { usedid = fps.CheckEnrolled(enrollid); if (usedid==true) 注册ID++; } fps.EnrollStart(enrollid); // 注册 lcd.print("注册 #"); lcd.print(enrollid); 而(fps.IsPressFinger() == false) 延迟(100); bool bret = fps.CaptureFinger(true); int iret = 0; 如果(布雷特!=假) { lcd.clear(); lcd.print("移除手指"); fps.Enroll1(); 而(fps.IsPressFinger() == true) 延迟(100); lcd.clear(); lcd.print("再按一次"); 而(fps.IsPressFinger() == false) 延迟(100); 布雷特 = fps.CaptureFinger(true); 如果(布雷特!=假) { lcd.clear();lcd.print("移除手指"); fps.Enroll2(); 而(fps.IsPressFinger() == true) 延迟(100); lcd.clear(); lcd.print("再按一次"); 而(fps.IsPressFinger() == false) 延迟(100); 布雷特 = fps.CaptureFinger(true); 如果(布雷特!=假) { lcd.clear();lcd.print("移除手指"); iret = fps.Enroll3(); if (iret == 0) { lcd.clear(); lcd.print("报名成功"); 否则 { lcd.clear(); lcd.print("注册失败:"); lcd.print(iret); } } else lcd.print("失败 1"); } else lcd.print("失败 2"); } else lcd.print("失败 3"); }
GT511C3指纹传感器与Arduino的工作
现在我们的硬件和代码已经准备好,是时候测试我们的项目了。将代码上传到 Arduino 并启动,我只是使用 micro-usb 端口为项目供电。在启动时,我们应该在 LCD 上看到介绍信息,然后它应该显示“Hi!。.”。这意味着 FPS 已准备好扫描手指,如果按下任何注册的手指,它会说“欢迎”,然后是该手指的 ID 号。
如果必须注册新手指,我们可以使用按钮进入注册模式并按照 LCD 说明注册手指。注册过程完成后,LCD 将再次显示“Hi!。.”,表示已读取以再次识别手指。完整的工作可以在下面链接的视频中找到。
/*
* 带有 GT511C2 指纹传感器 (FPS) 的 Arduino
* 注册和检测手指的代码
* 适用于:www.circuitdigest.com
* 日期:6-5-19
* 代码作者:Aswinth
*
* 将 FPS 的 Tx 连接到 Arduino 引脚 D4 和FPS 到 D5 的 Rx
*/
#include "FPS_GT511C3.h" //从https://github.com/sparkfun/Fingerprint_Scanner-TTL获取库 ;
#include "SoftwareSerial.h" //软件串口库
#include
FPS_GT511C3 fps(4, 5); //FPS连接到D4和D5
const int rs = 6, en = 7, d4 = 8, d5 = 9, d6 = 10, d7 = 11; //记液晶连接的管脚号
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);//初始化液晶方法
无效设置()
{
序列.开始(9600);
lcd.begin(16, 2); //初始化16*2 LCD
lcd.print("GT511C3 FPS"); //介绍消息行 1
lcd.setCursor(0, 1);
lcd.print("与 Arduino"); //介绍消息第 2 行
延迟(2000);
lcd.clear();
fps.Open(); //发送串口命令初始化fps
fps.SetLED(true); //打开 LED 以便 fps 可以看到指纹
pinMode(2,INPUT_PULLUP); //连接到内部上拉电阻作为输入引脚
}
void loop()
{
if (digitalRead(2)==0)//如果按下按钮
{
Enroll(); //注册指纹
}
// 识别指纹测试
if (fps.IsPressFinger())
{
fps.CaptureFinger(false);
int id = fps.Identify1_N();
lcd.clear();
lcd.print("欢迎您:");
if (id==200) lcd.print("未知"); //如果无法识别
lcd.print(id);
延迟(1000);
}
其他
{
lcd.clear(); lcd.print("嗨!....."); //准备扫描时显示hi
}
}
void Enroll() //从库示例程序中注册函数
{
int enrollid = 0;
bool usedid = true;
while (usedid == true)
{
usedid = fps.CheckEnrolled(enrollid);
if (usedid==true) 注册ID++;
}
fps.EnrollStart(enrollid);
// 注册
lcd.clear();
lcd.print("报名#");
lcd.print(enrollid);
而(fps.IsPressFinger() == false) 延迟(100);
bool bret = fps.CaptureFinger(true);
int iret = 0;
如果(布雷特!=假)
{
lcd.clear();
lcd.print("移除手指");
fps.Enroll1();
而(fps.IsPressFinger() == true) 延迟(100);
lcd.clear(); lcd.print("再按一次");
而(fps.IsPressFinger() == false) 延迟(100);
布雷特 = fps.CaptureFinger(true);
如果(布雷特!=假)
{
lcd.clear();lcd.print("移除手指");
fps.Enroll2();
而(fps.IsPressFinger() == true) 延迟(100);
lcd.clear(); lcd.print("再按一次");
而(fps.IsPressFinger() == false) 延迟(100);
布雷特 = fps.CaptureFinger(true);
如果(布雷特!=假)
{
lcd.clear();lcd.print("移除手指");
iret = fps.Enroll3();
if (iret == 0)
{
lcd.clear(); lcd.print("报名成功");
}
其他
{
lcd.clear();
lcd.print("注册失败:");
lcd.print(iret);
}
}
else lcd.print("失败 1");
否则 lcd.print("失败 2");
}
else lcd.print("失败 3");
}
评论
查看更多