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

原创 面包板社区 2022-07-24 20:00

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


了解电容式指纹传感器


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

 

 

以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,用于电脑外设、指纹门锁、指纹挂锁、保险柜等。

 

 

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


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

 

 

源代码及编程


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 portfinger.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 。



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



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


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



指纹读取代码如下:

#includeint 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 portfinger.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;}


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


作者:硬之城Allchips, 来源:面包板社区

链接:https://mbb.eet-china.com/blog/3975615-433079.html

版权声明:本文为博主原创,未经本人允许,禁止转载!


(
END
)
更多精彩视频

面包板社区 面包板社区——中国第一电子人社交平台 面包板社区是Aspencore旗下媒体,整合了电子工程专辑、电子技术设计、国际电子商情丰富资源。社区包括论坛、博客、问答,拥有超过250万注册用户,加入面包板社区,从菜鸟变大神,打造您的电子人脉社交圈!
评论
  • 时源芯微EMC(电磁兼容)领域,充斥着众多专业术语,令人眼花缭乱。1 电磁兼容(EMC)定义:指电气装置或系统在共同的电磁环境条件下,既能保持正常功能,又不会对周围环境产生不良影响。2  电磁环境Electromagnetic Environment定义:指存在于某一特定场所的所有电磁现象的总和。3半电波暗室Semi-anechoic Chamber定义:一种屏蔽室,除地面安装反射接地平板外,其余内表面均覆盖有吸波材料。4 远场Far Field定义:在天线辐射的场域中,功率密度与距离
    时源芯微 2024-12-31 10:52 110浏览
  • “新时代,共享未来”2024年11月5日-10日,第七届中国国际进口博览会在上海圆满落幕。其中,3万平方米的汽车展区展览面积,也让观众笑谈进博会再次进入“车展”时间。全球15大整车品牌,40多家企业参展,其中不乏耳熟能详,七届进博会“全勤生”的国际知名OEM,也会有首次参加的“新面孔”,它们共同构成了今年汽车展区的“全家福”。近年来,中国汽车进口均超百万辆。因此,对跨国车企来说,中国市场的重要性不言而喻。同时,在电动化和智能化赛道中弯道超车的中国汽车市场,也是全球汽车行业竞争最为激烈的市场,在这
    艾迈斯欧司朗 2024-12-30 17:05 59浏览
  • 在当今数字化时代,嵌入式系统无处不在,从我们手中的智能手机、智能手表,到汽车中的电子控制系统、工业自动化设备,嵌入式开发技术的发展历程宛如一部波澜壮阔的科技史诗,深刻地改变了我们的生活和社会的运作方式。萌芽阶段(20 世纪 60 - 70 年代)嵌入式开发的起源可以追溯到 20 世纪 60 年代。当时,计算机技术刚刚兴起,体积庞大且价格昂贵。为了满足特定设备的控制需求,工程师们开始尝试将计算机技术应用于一些专用系统中。这一时期,嵌入式系统的概念逐渐萌芽。1965 年,美国数字设备公司(DEC)推
    Jeffreyzhang123 2024-12-31 10:08 128浏览
  • 高精度,抗干扰,设计灵活……一句话总结:打铁还需自身硬!2040年,人形机器人的数量或将超过人类,达到100亿个。 10月29日,沙特投资倡议论坛,在谈及AI和人形机器人赛道时,马斯克再一次大胆预测,描绘出上述令人震撼的未来景象,且预估每台机器人的价格将稳定在2万-2.5万美元之间。当下,技术飞速发展,众多机器人公司如雨后春笋般涌现。余建华,艾迈斯欧司朗资深应用工程师,深感对这个市场的期待,他表示每一个机器人关节的背后,都离不开位置传感器的精准掌控。这片市场的潜力,让人憧憬不已。在工业及消费中
    艾迈斯欧司朗 2024-12-30 17:25 55浏览
  • 感光百科:4000万片出货量背后的“技术经”目前,仅单点dToF,艾迈斯欧司朗的累积出货量就已超过了4000万片。大量采用的背后必然代表无数用户对这一技术的认可和信赖。究竟是什么魔力,让dToF传感器拥有如此强大的吸引力?又是怎样的know-how积累让艾迈斯欧司朗的dToF产品如此受到青睐?让我们再次回到底层原理来探究dToF 4000万片出货量背后的“技术经”。01、底层原理决定应用上限dToF传感器,顾名思义,直接飞行时间测量,基于光速不变,测量光子从发射端到接收端的光程差,从而直接计算二
    艾迈斯欧司朗 2024-12-30 18:21 92浏览
  •         在之前的文章中,我们介绍了IEEE 802.3cz[1]协议,MultiGABSE-AU物理层中XMII、PCS子层以及两个可选功能的相关内容,本篇将介绍MultiGABSE-AU物理层PMA子层及PMD子层的相关机制。PMA子层        PMA子层位于PCS子层和PMD子层之间,规范中定义了PMA子层的三个功能:PMA Transmit、PMA Receive及PHY Control。&nbs
    经纬恒润 2024-12-30 18:16 104浏览
  • 本文介绍Linux系统查看硬件配置及常用调试命令,方便开发者快速了解开发板硬件信息及进行相关调试。触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。查看DDR获取内存信息下面数字以MB为单位。root@ido:/# free -mtotalused free shared buff/cache availableMem:
    Industio_触觉智能 2024-12-31 10:01 70浏览
  • 产品概述MG600Q2YMS3 是一款基于硅基碳化物(SiC)技术的高功率N沟道MOSFET模块,适用于高功率开关和电机控制应用,如轨道牵引系统。其设计旨在满足高效能和快速切换需求,为工业和能源领域提供可靠解决方案。主要特性1. 高电压和电流能力   耐压 (VDSS):1200 V   漏极电流 (ID):600 A2. 高效率与低损耗   碳化硅材料降低导通损耗和开关损耗,实现更高的转换效率。3. 快速切换性能 支持高频操作,适用于
    东芝铠侠代理 2024-12-31 10:33 74浏览
  • 近日,紫光展锐正式推出高性能4G 智能穿戴平台W377E。该产品面向不同的应用场景,拥有丰富特性和超低功耗,进一步壮大紫光展锐的智能穿戴产品组合。紫光展锐面向中高端和海量的智能穿戴市场,持续提供技术先进、高效安全、高质可靠的解决方案。 紫光展锐W377E采用四核A53架构,支持13M摄像头,video 1080P 30fps,集成了Wi-Fi、蓝牙和GPS功能。W377E搭载Android 8.1系统,提供更加丰富多样的APP体验,支持在线好友聊天、支付宝等功能,且支持64位系统的AP
    紫光展锐 2024-12-31 16:26 122浏览
  • 根据Global Info Research项目团队最新调研,预计2030年全球CAN-Bus总线电缆产值达到2287百万美元,2024-2030年期间年复合增长率CAGR为3.6%。一、行业概述CAN-Bus总线电缆是一种专门用于CAN总线(Controller Area Network,控制器局域网络)通信系统中的电缆。CAN总线是一种广泛应用于汽车、工业自动化、机器人等领域的串行通信协议,主要用于微控制器和设备之间的数据交换。CAN-Bus电缆负责在多个设备间传输数据,保证信息的稳定传输和
    GIRtina 2024-12-31 11:00 102浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦