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

    文章

    7639

    浏览量

    148495
  • 开发板
    +关注

    关注

    25

    文章

    4429

    浏览量

    93996
  • 指纹传感器
    +关注

    关注

    6

    文章

    191

    浏览量

    63321
  • Arduino
    +关注

    关注

    184

    文章

    6427

    浏览量

    184838
收藏 人收藏

    评论

    相关推荐

    指纹传感器及其在指纹鼠标中的应用

    指纹传感器及其在指纹鼠标中的应用指纹传感器(FPS200) 运用图像搜索技术,通过改变传感器电容
    发表于 08-11 20:21

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

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

    指纹识别传感器的应用

      单触型传感器与划擦型传感器是两种新型固态指纹传感器,都是通过在触摸过程中电容的变化来进行信息采集。本文对两类传感器的工作原理和特点进行了
    发表于 10-29 15:11

    指纹传感器的工作原理和应用

      本文对两类传感器的工作原理和特点进行了详细分析,并介绍在互联网安全认证、汽车无钥匙进入系统等的应用。  前市场上有两种固态指纹传感器:第一种是单次触摸型传感器,要求手指在
    发表于 11-16 16:08

    基于MBF200支持多种接口模式的指纹传感器

    是富士通公司推出的一款固态指纹传感器芯片,该芯片具有自动指纹检测功能,可支持多种接口模式,设计方便。本文详细介绍了MBF200的特性,给出了其在USB总线
    发表于 04-19 07:00

    指纹识别传感器的原理是什么

    我们了解过了指纹识别的大致流程后,这篇文章用来介绍指纹识别硬件中最重要的部分,传感器。其实传感器、芯片也要符合物理学的基本原理,他们都是物理学的原理的一种实现,我们可以从光、电、声、热
    发表于 05-20 07:03

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

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

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

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

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

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

    怎样将敲击传感器Arduino接口

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

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

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

    如何将指纹传感器Arduino板一起使用

    电子发烧友网站提供《如何将指纹传感器Arduino板一起使用.zip》资料免费下载
    发表于 10-26 14:53 0次下载
    如何将<b class='flag-5'>指纹</b><b class='flag-5'>传感器</b>与<b class='flag-5'>Arduino</b>板一起使用

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

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

    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>教程分享