0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

指纹传感器与Arduino的接口(附代码)

芯情观察猿 来源:芯情观察猿 作者:芯情观察猿 2022-07-08 10:21 次阅读

指纹传感器是应用广泛的感知元件,本项目以R502/R503电容式指纹传感器为例,演示如何通过Arduino开发板录入和检测指纹。项目BOM清单如下:
Arduino开发板 1
指纹传感器R503 1
杜邦线 20
面包板 1


了解电容式指纹传感器


光学指纹传感器的创建指纹图像不同,电容式产品采用微电容电路组成的阵列来收集数据。当手指按压到采集面上时,手指的脊和谷在表皮和芯片之间产生不同的微小电容,芯片通过测量空间中的不同的电磁场得到完整的指纹信息,并通过运放和ADC进行处理。例如,R502/R503就能识别干、湿指纹,而前者更轻巧。

pYYBAGLHkoOAAJZgAABeDKon6rk486.png

以R503为例,该传感器内嵌指纹识别算法和协议,具有指纹采集、比对、搜索和模板存储等功能。R503图像大小192*192,分辨率达508 DPI,可存储200个指纹,FRR≤0.01%,FAR≤0.00001%,支持Arduino、Android、Windows、Linux等。


R503支持低功耗手指检测,工作电压3.3V,采集电流不超过18mA,平均待机电流仅2uA。R503通过RS232 UART接口,通讯速率达57600bps,用于电脑外设、指纹门锁、指纹挂锁、保险柜等。

poYBAGLHkx2AAAFMAABk4VjQny4784.png

把R502/R503与Arduino连接,电电路很简单。

pYYBAGLHkqKAPV0LAAA1u94pE_U725.png



.
把R502/R503的VCC、GND、Tx (黄线)、Rx (绿线)四个引脚分别连接到Arduino开发板的3.3V、GND、D2、D3引脚.,蓝色的中断线不用连接,白色引线接到3.3V引脚上。

pYYBAGLHk3SAIrMOAADcGGXYa4M722.png

源代码及编程


Github仓库有Adafruit编写的关于R502/R503指纹传感器的Arduino库文件。指纹录入和阅读是分开的,录入代码保存在EEPROM存储器中,阅读代码从EEPROM中读取数据并与扫描到的指纹数据校验匹配。
指纹录入代码如下:

#include

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

上传代码后,打开Serial Monitor,监视器将询问位于1-127之间的指纹ID 。

poYBAGLHk6-ATBEwAACSMgfQKyM736.png

现在Serial Monitor显示屏中输入ID号,并发送,然后按照屏幕指令提示录入指纹。

poYBAGLHk8OAUHKmAAECWSag_9w343.png

把希望录入的手指放在传感器上。

一个手指录入成功后,你也可以按照同样的方式再录入其他几个手指的指纹。

pYYBAGLHk9mAf-OqAAB4ZieuYIM135.png

指纹读取代码如下:

#include
int u=0;
int relay=5;

#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()
{
pinMode(relay,OUTPUT);
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");
finger.LEDcontrol(FINGERPRINT_LED_OFF, 0, FINGERPRINT_LED_BLUE);
finger.LEDcontrol(FINGERPRINT_LED_OFF, 0, FINGERPRINT_LED_RED);
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!");
finger.LEDcontrol(FINGERPRINT_LED_FLASHING, 25, FINGERPRINT_LED_PURPLE, 10);
delay(1000);
if(u==0)
{
digitalWrite(relay,HIGH);
u=1;
}
else if(u==1)
{
digitalWrite(relay,LOW);
u=0;
}
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
Serial.println("Communication error");
return p;
} else if (p == FINGERPRINT_NOTFOUND) {
finger.LEDcontrol(FINGERPRINT_LED_FLASHING, 25, FINGERPRINT_LED_RED, 10);
delay(1000);
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;
}


一旦指纹录入成功,就可以上传上述代码,以读取存储在指纹数据库中的指纹信息,通过比对匹配实现门禁、考勤、开机等操作。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    8650

    浏览量

    151437
  • 开发板
    +关注

    关注

    25

    文章

    5084

    浏览量

    97743
  • 指纹传感器
    +关注

    关注

    6

    文章

    196

    浏览量

    63491
  • Arduino
    +关注

    关注

    188

    文章

    6472

    浏览量

    187374
收藏 人收藏

    评论

    相关推荐

    基于Arduino控制指纹传感器模块的指纹识别使用方案

    本篇文章主要介绍如何在Arduino开发板上使用指纹传感器模块FPM10A。我们将向您介绍如何注册新的指纹ID,以及如何查找匹配的指纹
    的头像 发表于 10-28 14:19 7931次阅读

    半导体指纹传感器与光学指纹传感器的技术原理比较

    本帖最后由 eehome 于 2013-1-5 10:07 编辑 半导体传感器可以分为硅电容指纹传感器、半导体压感式传感器、半导体温度感应传感
    发表于 06-04 16:43

    回收指纹传感器模组 收购指纹传感器模组

    回收传感器模组,收购传感器模组,指纹传感器IC、传感器指纹芯片、
    发表于 11-19 17:09

    【开源分享】带有 Arduino 接口的火灾报警传感器

    描述带有 Arduino 接口 PCB 设计板的火灾报警传感器火焰传感器:火焰传感器对普通光敏感。它用于检测火焰或火灾的存在。该模块可以检测
    发表于 06-30 16:12

    怎样用ArduinoUNO创建指纹传感器门锁

    首先,将指纹传感器连接到Arduino UNO。确保通过串行通信获得与Arduino配合使用的指纹传感器
    的头像 发表于 08-01 17:51 6996次阅读

    怎样将敲击传感器Arduino接口

    在这个项目中,我们将了解敲击传感器或振动传感器(有时称为分接传感器)。在此过程中,我们将看到敲击传感器的组件,敲击传感器的工作原理以及如何将
    的头像 发表于 07-30 10:49 9547次阅读

    指纹传感器定义_指纹传感器的应用

    指纹传感器(又称指纹Sensor)是实现指纹自动采集的关键器件。指纹传感器
    发表于 12-23 09:37 3421次阅读

    Arduino雨滴传感器的使用示例代码免费下载

    本文档的主要内容详细介绍的是Arduino雨滴传感器的使用示例代码免费下载。
    发表于 03-27 11:39 43次下载
    <b class='flag-5'>Arduino</b>雨滴<b class='flag-5'>传感器</b>的使用示例<b class='flag-5'>代码</b>免费下载

    霍尔传感器Arduino UNO接口及示例代码

    霍尔传感器应用非常广泛,本文以A3144开关型霍尔传感器为例,介绍霍尔效应传感器以及A3144与Arduino UNO的连接,通过红色LED闪烁检测其附近是否有磁场存在。
    的头像 发表于 08-01 09:14 5584次阅读
    霍尔<b class='flag-5'>传感器</b>与<b class='flag-5'>Arduino</b> UNO<b class='flag-5'>接口</b>及示例<b class='flag-5'>代码</b>

    带有用于AGV的磁带传感器Arduino接口

    电子发烧友网站提供《带有用于AGV的磁带传感器Arduino接口.zip》资料免费下载
    发表于 10-28 16:00 1次下载
    带有用于AGV的磁带<b class='flag-5'>传感器</b>的<b class='flag-5'>Arduino</b><b class='flag-5'>接口</b>

    Arduino UNO板上使用指纹传感器模块FPM10A

    电子发烧友网站提供《在Arduino UNO板上使用指纹传感器模块FPM10A.zip》资料免费下载
    发表于 11-11 09:26 1次下载
    在<b class='flag-5'>Arduino</b> UNO板上使用<b class='flag-5'>指纹</b><b class='flag-5'>传感器</b>模块FPM10A

    Arduino Uno接口超声波传感器开源

    电子发烧友网站提供《与Arduino Uno接口超声波传感器开源.zip》资料免费下载
    发表于 11-30 09:28 1次下载
    与<b class='flag-5'>Arduino</b> Uno<b class='flag-5'>接口</b>超声波<b class='flag-5'>传感器</b>开源

    Arduino指纹传感器教程

    方案介绍尊敬的朋友们,欢迎继续阅读本教程!今天,我们将建立一个有趣的Arduino项目,该项目使用指纹传感器模块。不用再拖延了,让我们开始吧! 我一直想尝试一个指纹
    发表于 01-03 16:34 0次下载

    Arduino指纹传感器教程分享

    电子发烧友网站提供《Arduino指纹传感器教程分享.zip》资料免费下载
    发表于 06-20 09:43 0次下载
    <b class='flag-5'>Arduino</b><b class='flag-5'>指纹</b><b class='flag-5'>传感器</b>教程分享

    指纹传感器的定义 指纹传感器的应用

    指纹传感器的定义 指纹传感器的应用  指纹传感器是一种生物识别技术,通过检测和分析人体
    的头像 发表于 03-05 17:35 3261次阅读