tag 标签: 指纹传感器

相关博文
  • 热度 9
    2022-7-8 10:24
    2142 次阅读|
    0 个评论
    指纹传感器是应用广泛的感知元件,本项目以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 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 。 现在Serial Monitor显示屏中输入ID号,并发送,然后按照屏幕指令提示录入指纹。 把希望录入的手指放在传感器上。 一个手指录入成功后,你也可以按照同样的方式再录入其他几个手指的指纹。 指纹读取代码如下: #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; } 一旦指纹录入成功,就可以上传上述代码,以读取存储在指纹数据库中的指纹信息,通过比对匹配实现门禁、考勤、开机等操作。
  • 热度 13
    2022-5-12 10:36
    1143 次阅读|
    0 个评论
    本项目利用GT511C3指纹传感器(FPS)模块,在Aduino开发板上实现了一个高精度、快速响应的指纹扫描仪。项目通过Arduino录入指纹,在需要的时候检测、验证指纹,还可通过硬姐智造PCBA一站式服务将项目从DIY拓展到新兴的生物识别市场。 所需的组件: Arduino UNO开发板 GT511C3指纹传感器模块 162A LCD显示屏 1K电阻 2K电阻 10K电位器 按钮 连接跳线 面包板 了解GT511C3指纹传感器模块 与电容式、超声波指纹传感器模块不同,GT511C3指纹传感器模块采用光学技术。该模块内置一个摄像头,可以拍摄指纹图案,再由内部HOLTEK ARM Cortex M3 MCU处理这些指纹图案。该扫描仪模块最多可保存200次指纹扫描,并为每个指纹分配一个从0到199的ID。 该光学传感器模块外形小巧,可轻松集成到具有串行UART接口的应用中。模块有四根线:两根线用于TX和RX,两根线用于电源。传感器可在3.3-6V电压范围内工作,通信引脚(Rx和Tx)可承受3.3V电压。 GT511C3模块可通过USB直接与计算机连接。使用USB连接时,可使用SDK_DEMO.exe应用程序控制此模块。此应用程序允许用户录/验证/删除指纹。 GT511C3模块的特性和规格: 工作电压:3.3-6VDC 工作电流:<130mA 工作温度:~20°C ~ +60°C CPU:ARM Cortex M3内核(Holtek HT32F2755) 最大指纹数:200个指纹 传感器:光学传感器 串行通信:UART(默认:9600波特)和USB v1.1 错误接受率 (FAR):< 0.001% 错误拒绝率 (FRR): < 0.01% 注册时间 < 3 秒(3个指纹) 识别时间:<1.0秒(200个指纹) GT511C3指纹传感器模块有4个引脚,红色线是VCC,黑色是GND,绿色线是Rx,白色线是Tx。 GT511C3 SDK演示软件 GT511C3 SDK是一套快速入门套件。使用时,首先将指纹传感器连接到USB转TTL模块,将红色线连接到VCC,黑色线连接到GND,绿色线连接到Tx,白色线连接到Rx。 USB转TTL FTDI模块与GT511C3指纹传感器的UART连接 接下来,按以下操作在电脑上使用SDK: 1. 下载 SDK_DEMO.exe 2. 解压文件夹。 3. 进入解压后的目录 4. 打开 SDK_DEMO.exe 可执行文件。 5. 在“串行端口号”下拉菜单中选择FTDI枚举的COM端口。 6. 在波特率的下拉菜单中选择9600。 7. 单击打开按钮。 连接正确后,将显示固件版本和设备序列号,以及其他选项,例如录取、验证、识别、获取图像、删除、获取数据库等。如果要删除指纹,只需单击“全部删除”选项即可完成。 将GT511C3模块与Arduino连接 根据线路图,将指纹传感器与Arduino连接起来。 由于传感器UART引脚仅承受3.3V电压,本项目使用了一个由2K电阻和1K电阻组成的分压器网络,将绿色线(Rx)连接到Arduino开发板的D5引脚,将白色线(Tx)连接到Arduino开发板的D4引脚。 GT511C3 Arduino库 现在要做的,就是把GT511C3 Arduino库上传到Arduino IDE。该库由Sparkfun编写,已经在其他类型的指纹传感器上进行了测试。 以下是指纹录入代码: #include "FPS_GT511C3.h" #include "SoftwareSerial.h" FPS_GT511C3 fps(4, 5); // digital pin 5(arduino Tx, fps Rx) // digital pin 4(arduino Rx, fps Tx) void setup() { Serial.begin(9600); //default baud rate delay(100); fps.Open (); fps.SetLED(true); Enroll(); } void Enroll() { int enrollid = 0; // find open enroll id bool okid = true; while (okid == true) { okid = fps.CheckEnrolled(enrollid); if (okid==true) enrollid++; } fps.EnrollStart(enrollid); // enroll Serial.print("Press finger to Enroll #"); Serial.println(enrollid); while(fps.IsPressFinger() == false) delay(100); bool bret = fps.CaptureFinger(true); int iret = 0; if (bret != false) { Serial.println("Remove finger"); fps.Enroll1(); while(fps.IsPressFinger() == true) delay(100); Serial.println("Press same finger again"); while(fps.IsPressFinger() == false) delay(100); bret = fps.CaptureFinger(true); if (bret != false) { Serial.println("Remove finger"); fps.Enroll2(); while(fps.IsPressFinger() == true) delay(100); Serial.println("Press same finger yet again"); while(fps.IsPressFinger() == false) delay(100); bret = fps.CaptureFinger(true); if (bret != false) { Serial.println("Remove finger"); iret = fps.Enroll3(); if (iret == 0) { Serial.println("Enrolling Successfull"); } else { Serial.print("Enrolling Failed with error code:"); Serial.println(iret); } } else Serial.println("Failed to capture third finger"); } else Serial.println("Failed to capture second finger"); } else Serial.println("Failed to capture first finger"); } void loop() { delay(100); } 上传代码后,打开串口监视器,系统将要求你放置一个手指,进行录入并注册。 以下是读取指纹的代码: #include "FPS_GT511C3.h" #include "SoftwareSerial.h" FPS_GT511C3 fps(4, 5); // digital pin 5(arduino Tx, fps Rx) // digital pin 4(arduino Rx, fps Tx) void setup() { Serial.begin(9600); //default baud rate delay(100); fps.Open (); fps.SetLED(true); } void loop() { // Identify fingerprint test if (fps.IsPressFinger()) { fps.CaptureFinger(false); int id = fps.Identify1_N(); if (id <200) { Serial.print("Verified ID:"); Serial.println(id); } else { Serial.println("Finger not found"); } } else { Serial.println("Please press finger"); } delay(100); } 再次上传代码并进行测试。上传代码后,打开串口监视器,系统将请求放置手指进行验证。你可以放置刚刚注册的手指,也可以随意放一个指头上去,让设备自己读取你的指纹并进行验证对比。 采用Arduino和LCD屏的便携式指纹扫描仪 经过对GT511C3的了解和使用,我们在上述电路图中再添加一个LCD显示屏,就构成了一个简单的便携式指纹扫描仪。 GT511C3指纹传感器、LCD显示屏与Arduino开发板的连接电路图 这里,我们通过一个按钮开关,将GT511C3连接到Arduino数字引脚2。按下按钮时,传感器将进入指纹录入模式。新添加的16x2字符LCD显示屏,用来显示用户与指纹传感器交互时的实时数据。 增加了LCD显示屏后,组合了指纹录入、验证和LCD显示库的完整代码如下: #include const int rs = 12, en = 11, d4 = 10, d5 = 9, d6 = 8, d7 = 7; LiquidCrystal lcd(rs, en, d4, d5, d6, d7); #include "FPS_GT511C3.h" #include "SoftwareSerial.h" FPS_GT511C3 fps(4, 5); // digital pin 5(arduino Tx, fps Rx) void setup() { Serial.begin(9600); //default baud rate lcd.begin(16, 2); delay(100); fps.Open (); fps.SetLED(true); pinMode(2, INPUT_PULLUP); //Connect to internal pull up resistor as input pin lcd.setCursor(4, 0); lcd.print("GT511C3"); lcd.setCursor(3, 1); lcd.print("FPS Sensor"); delay(2500); } void loop() { read_fps(); if (digitalRead(2) == 0) //If button pressed { Enroll(); //Enroll a fingerprint } delay(100); } void Enroll() { int enrollid = 0; // find open enroll id bool okid = true; while (okid == true) { okid = fps.CheckEnrolled(enrollid); if (okid == true) enrollid++; } fps.EnrollStart(enrollid); // enroll Serial.print("Press finger to Enroll #"); Serial.println(enrollid); lcd.setCursor(0, 0); lcd.print("Put Finger to"); lcd.setCursor(0, 1); lcd.print("Enroll: #"); lcd.print(enrollid); while (fps.IsPressFinger() == false) delay(100); bool bret = fps.CaptureFinger(true); int iret = 0; if (bret != false) { Serial.println("Remove finger"); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Remove finger"); fps.Enroll1(); while (fps.IsPressFinger() == true) delay(100); Serial.println("Press same finger again"); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Put same finger"); lcd.setCursor(0, 1); lcd.print("again"); while (fps.IsPressFinger() == false) delay(100); bret = fps.CaptureFinger(true); if (bret != false) { Serial.println("Remove finger"); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Remove finger"); fps.Enroll2(); while (fps.IsPressFinger() == true) delay(100); Serial.println("Press same finger yet again"); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Put same finger"); lcd.setCursor(0, 1); lcd.print("yet again"); while (fps.IsPressFinger() == false) delay(100); bret = fps.CaptureFinger(true); if (bret != false) { Serial.println("Remove finger"); iret = fps.Enroll3(); if (iret == 0) { Serial.println("Enrolling Successfull"); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Enrolling"); lcd.setCursor(0, 1); lcd.print("Successfull"); } else { Serial.print("Enrolling Failed with error code:"); Serial.println(iret); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Enrolling Failed"); lcd.setCursor(0, 1); lcd.print(iret); } } else Serial.println("Failed to capture third finger"); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Failed Capturing"); lcd.setCursor(0, 1); lcd.print("third finger"); } else Serial.println("Failed to capture second finger"); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Failed Capturing"); lcd.setCursor(0, 1); lcd.print("second finger"); } else Serial.println("Failed to capture first finger"); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Failed Capturing"); lcd.setCursor(0, 1); lcd.print("first finger"); } void read_fps() { // Identify fingerprint test if (fps.IsPressFinger()) { fps.CaptureFinger(false); int id = fps.Identify1_N(); if (id < 200) { Serial.print("Verified ID:"); Serial.println(id); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Verified ID:"); lcd.setCursor(0, 1); lcd.print(id); } else { Serial.println("Finger not found"); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Finger Not Found"); } } else { Serial.println("Please press finger"); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Please Put "); lcd.setCursor(0, 1); lcd.print("Finger"); } delay(100); } 选择Arduino Nano开发板型号和COM端口并上传。代码上传完成后,LCD显示屏会提示放置手指,同时,指纹模块中的蓝色LED将会点亮。 如果要录入指纹,请按下按钮,然后扫描手指3次。完成后,指纹录取完毕。 要验证指纹,请将同一根手指放在指纹模块上。 上面就是一个便携式指纹扫描仪模型的制作全过程了。如果你觉得这个项目非常好,还想进行小批量生产,就需要将其中的面包板换成PCB板。这里的PCB打样很简单,硬姐智造PCBA一站式“打样+批量”服务可满足创客的各种定制需求,把项目从DIY拓展到指纹锁、POS机等生物识别领域。
  • 热度 2
    2020-11-17 16:24
    1877 次阅读|
    0 个评论
    Fingerprint Cards AB (Fingerprints™) 于今日发布新型超窄弧面的电容式指纹传感器,继FPC1540传感器取得成功之后,独特弧面的FPC1542传感器将实现最新无边框智能手机设计的创新。 随着对手机侧边集成指纹的需求增长,弧面传感器为客户提供了增强的设计灵活性,同时通过无缝集成改善用户体验,该传感器可以兼作电源按钮或音量控制,或用于操作相机快门和滚动。 传感器可以涂上多种颜色,以补充智能手机设计的美感。 FPC1542扩展了Fingerprints的电容式传感器产品组合,Fingerprints的产品现在已集成到455多种不同移动设备型号的正面,背面和侧面。 “随着智能手机设计不断改善用户体验,生物识别技术继续充当创新和差异化的推动者,”Fingerprints 移动事业部高级副总Ted Hansson如是说,“作为电容式传感器市场的领导者,我们看到了对提供最大设计灵活性而又不影响安全性或功能性的传感器需求不断增长。 随着这种新型传感器的推出,我们为客户带来了真正独特的产品,从而将增强的用户体验和优化的设计提升到了一个新的水平。” Fingerprints 将于Q4量产该产品,且首部搭载该产品的手机预期于Q1 2021上市。
  • 热度 28
    2014-9-8 14:11
    982 次阅读|
    0 个评论
    市场上主流的电子锁是基于密码设计的。密码锁的最大的缺陷是密码容易被他人窃取、猜测及遗忘。随着生物技术的发展,越来越多的活体技术应用到识别系统中,如指纹、掌纹、人脸、虹膜等。相对于其它的活体识别技术,指纹识别系统以其可实现性强,成本相对低廉,同时又具备较高的安全性,被越来越多的应用到各种场合。文章给出了一种新型的指纹锁架构,并详细论述了系统的各个组成部分以及指纹识别算法的实现流程。文章对降低系统功耗和增加保密性都提出了独特的方法。 随着科学技术的飞速发展和大规模的集成芯片的出现,现有的门锁系统也正在经历着升级换代的变换。第一代电子门锁采用的是密码识别方法,解决了机械门锁更换的灵活性,即钥匙的设置和更改掌握在了使用者的手中;但由于密钥与使用者非强相关,松耦合,授权难以管理,在安全性方面存在着极大的隐患。第二代电子门锁采用最先进的生物特征识别技术,提供了一种更为安全可靠、使用方便的身份识别新途径。 生物特征识别技术主要是利用虹膜、人脸、指纹、掌纹、语音这几种人体生物特征的一种来做识别的。虹膜、人脸需要使用到影像成像系统,设备过于复杂,仅用于高端系统,难以普及应用;语音系统最为简单,但由于容易被模仿,安全性相对较低;指纹和掌纹仅使用扫描成像,相对比较简单,易于推广,尤其是指纹识别技术,采用逐行扫描系统,识别传感器可以做得非常小,具有很高的可行性和实用性。 指纹锁系统主要可用在保险箱、实验室、楼道的身份确认及相关控制;随着智能家居概念的兴起,也越来越多的应用到高档住宅中。 1 指纹锁的架构 本指纹锁系统的硬件结构主要包括:指纹识别头、主处理微控制器、电源管理、电控锁机构以及门锁功能所需的红外感应、告警电路等,其中核心部分是指纹识别头和主处理微控制器。本指纹锁系统的硬件结构框图如图1所示。 图1 指纹门锁硬件结构框图 本指纹锁通过指纹识别头获取原始指纹数据,通过主处理器的处理提取出相关指纹特征,然后与存储器内的指纹模板做比较,如果指纹特征吻合,则通过指示灯做出相应的指示,同时输出门锁开启信号,打开门锁;在门锁开启状态,也可通过相应按键操作,进行指纹模板存储。 辅助处理器用于系统的电源管理,即管理主处理器的上下电。本设计采用层级包容架构设计,主处理器功能强大,处理功能相对复杂,功耗较高;辅助处理器功能非常简单,仅负责电源管理,完成对系统的上下电处理(除了自身不下电)。该架构有三个优点,第一,功耗极其低,在系统待机模式下,主处理器部分根本就不耗电,系统可超长时间待机工作。第二,采用层级架构,两个处理器功能完全解耦,软件可分别自由演化。第三,超可靠性,程序随着代码行数的增加,异常情况成指数倍的增长,所以主处理器程序长时间工作的可靠性大大降低,本架构由于采用了辅助处理器的方案,主处理器绝大多数时间处理断电状态,每次工作时,都经历了重新上电过程,因此原则上主处理器做到了永不死机的可靠性;而辅助处理器工作极其简单:检测触摸,然后给主处理器上电,等待主处理器空闲信号,然后给主处理器下电。程序代码行非常简短,工作可靠性极高。 【分页导航】 第1页: 指纹锁的架构 第2页: 指纹传感器的选型/指纹算法的选型 第3页: 主CPU的选型/辅助CPU的选型 2 指纹传感器的选型 在指纹产品中,指纹传感器和指纹算法是关键。指纹处理的过程是采集指纹图像,然后对指纹图像进行处理,所以能否采集到清晰的指纹图像是指纹处理的关键,指纹传感器是指纹图像的采集部件,因此,指纹传感器的性能将直接影响到指纹产品的性能。 目前采用的指纹传感器从分类上主要分为半导体指纹传感器和光学指纹传感器。半导体的指纹传感器又分为面状指纹传感器和条状指纹传感器(即滑动式指纹传感器/刮擦式指纹传感器)。 选用半导体指纹传感器主要要考虑以下几个指标: (1)抗静电性能,—般要求大于15kv,否则易被击穿。 (2)分辨率。一般至少要求256dpi,否则对细指纹不易分辩,比如银行、医院、超市等不宜应用。 (3)对干湿手指的适应性(尤其是涂有护手霜的手指)。 (4)使用寿命要求。传感器的使用寿命的要求一般要达到可使用100万次。 (5)产品一致性和适应性,不同地区人的指纹有不同的特征,所以要选用高适应性的指纹传感器。 由于本文中的指纹读头在设计中的要求体积尽量小,因此选用的是美国AuthenTec公司的AES2510的刮擦式指纹传感器。其选用的理由如下: (1)采用其最新的“The Power of Touch”技术,属于接触式的,对干湿手指不敏感。 (2)易用且能提供快速的指纹成像,具有导航功能。 (3)低功耗、小CPU占用率的特性。 (4)出货量大,成本低。 (5)尺寸相当微小,只有12mm×5mm×1.86mm。 其外观图如图2所示: 图2 AES2510实物图 3 指纹算法的选型 指纹识别算法是指纹识别的核心。常见的指纹算法有:BIOKEY指纹识别算法、Fingerpass指纹识别算法、TOUCHSEC指纹识别算法、OpenBio指纹识别算法、FAA指纹识别算法等等,国内也有许多公司也自主研发了许多具有专利的指纹识别算法,在网上也有许多公开算法的源码。在设计初期,选用公开的算法源码,会造成调试的不方便,同时算法的指标也不确定是否满足需求;大公司的指纹识别算法一般又要价比较高,谈判困难;因此最合理的方法是选用指纹厂家提供的识别算法进行开发验证,Autllentec提供的算法相对也比较成熟可靠,由于使用其指纹传感器,指纹识别算法收取费用相对较低,如果使用量较大,甚至可以免费赠送。 在我们的设计中,采用的是Authentec提供的指纹识别算法,最后验证设计结果在认假率、拒真率、比对时间上均满足需求。 【分页导航】 第1页: 指纹锁的架构 第2页: 指纹传感器的选型/指纹算法的选型 第3页: 主CPU的选型/辅助CPU的选型 4 主CPU的选型 主CPU的选型主要关注的指标是运算速度及功耗,有的厂商的产品侧重于低功耗,有的侧重于运算速度。来自于几家厂商提供的一组测试数据见表1,分别显示了不同的CPU在运算指纹匹配算法所需要的时间。 表1 运行指纹匹配算法时间对比表 由于我们采用了层级包容式架构,因此对主处理器的功耗指标不太关心,选用更高的处理速度,能给用户带来了更好的体验。本指纹锁选择的CPU是BF531。ADSP-BF531系列处理器是Blaclkflin系列产品的成员之一,是一个高度集成的片上系统解决方案。其功能框图如图3所示: ~~~~~~``` 图3 BF531的功能框图 ADSP-BF53 l是主频高达400 MHz高性能Black—fin处理器,其内核包括:2个16位MAC,2个40位ALU,4个8位视频ALu,以及1个40位移位器;对于指纹对比计算有很强的处理能力,另外,厂家又提供了为该处理器量身定做的指纹对比算法。 5 辅助CPU的选型 由于指纹锁在设计时提出的存储指标为100枚指纹,大概所需内存为lMByte以上,因此必须使用外部存储设备。为了最大限度的降低成本,我们使用SDRAM芯片来替代外部的SRAM,因此就必然导致设备的外部功耗增加,对于使用电池供电的设备,这几乎是不能容忍的,为此我们使用一个超低功耗的辅助CPU来进行设备管理。 通常情况下,主CPU的所有电路均不上电,辅助CPU感应到有手触摸锁柄时,则通过IO口控制主CPU上电,主CPU和指纹传感器开始工作,指纹比对成功后,启动开锁。无论对比是否成功,等待固定一段时间后,主CPU均会进入空闲状态,向辅助CPU发送空闲信号,辅助CPU对主CPU断电。 由于辅助CPU是长期工作,永不断电的,选则的基本原则就是超低功耗,架构简单,极高的可靠性。本文选择的是TI的MSP430F2001,MSP430单片机拥有0.5uA的超低待机电流和250uA/MIPs的运行功耗,是目前业界公认的低功耗单片机。其提供了5种低功耗模式,主要面向电池供电的应用。功能框图如图4所示: 图4 MSP430F2001的功能框图 MSP430F200l的特性描述如下:低工作电压(1.8V-3.6V);超低功耗(活动模式为220μA at 1 MHz,2.2 V,待机模式为0.5μA,关闭模式为0.1μA);五种省电模式;从待机模式唤醒1μs。 6 其它 本方案中还采取了其它降功耗措施: 主处理器的LDO改为DC/DC开关芯片,提高工作时的电源效率; 开锁继电器的先用大电流驱动1秒使其吸合,然后通过调整控制端的占空比为30%,让其进行4秒的维持状态; 7 结束语 本设计通过合理选择器件,围绕低成本、低功耗、高运算性能、电池供电等特性要求优化电路,设计完成的新型指纹锁电路在性能指标、稳定性、兼容性低硬件成本方面具有非常大优势。 通过本设计制作出数台样机,在仅使用两节5号电池不更换的情况下,每天开锁3次,已连续可靠的工作了2年。 本设计完成的指纹锁,可以广泛应用于工业门标禁、指纹考勤、国防安全等众多领域。 【分页导航】 第1页: 指纹锁的架构 第2页: 指纹传感器的选型/指纹算法的选型 第3页: 主CPU的选型/辅助CPU的选型
  • 热度 24
    2014-7-10 21:59
    1262 次阅读|
    0 个评论
    1.主要内容 本模块采用xilinx公司的Spartan 3E系列XC3S500E型FPGA作为核心控制芯片,通过富士通公司的MFS300滑动式电容指纹传感器对指纹图象进行提取,然后对提取的指纹图像进行灰度滤波、图像增强、二值化、二值去噪、细化等预处理,得到清晰的指纹图象,再从清晰的指纹图象中提取指纹特征点,存入外部FLASH作为建档模板。指纹比对时,采用同样的方法获得清晰的指纹图像,建立比对模板,然后将比对模板与建档模板利用点模式匹配算法进行比对,得出比对结果。该模块利用嵌入式软核实现系统的管理,利用硬件实现指纹识别,保证了系统功能的完整性与识别的正确性。该识别模块可用于门禁、考勤、安检、保险箱柜等很多方面,也可和计算机等设备联机使用,满足各个方面的不同需求,因此它的设计具有很广泛的应用前景和市场价值。 2.项目关键技术及创新点的论述 2.1.项目的关键技术 2.1.1 指纹图像的采集 本模块利用美国富士通公司的MFS300滑动式电容指纹传感器对指纹图像进行提取和保存。这款指纹传感器采用标准CMOS 技术,含有8 位A/D 变换器,能在2.8 V~5 V 的宽电压范围内工作,能自动检测到是否有指纹到达传感器,并实现在线采集。它能在保证指纹图像高分辨率(500dpi)的同时大大减小了传感器的尺寸(13.3×3.6mm2)。然后XC3S500E利用其SPI端口通过读写MFS300内部的寄存器,实现对它的控制,以完成指纹采集的任务。 2.1.2 指纹图像的预处理 图像预处理的主要步骤包括:方向图计算、图像增强、二值化、二值去噪、细化等。预处理的目的是改善输入指纹图像的质量,以提高特征提取的准确性。原始指纹图像一般存在噪声污染、脊线断裂或脊线模糊等问题,需要进行图像增强(使用滤波技术)以改善质量。由于指纹特征仅包含在脊线的形状结构中,所以,通过二值化和细化把深浅不一、宽度不同的脊线变成灰度相同、单像素宽的细脊线,以便于特征提取。 2.1.3 指纹图像的特征提取与比对 系统通过细节特征提取算法对预处理后的指纹图像进行全局特征和细节特征的提取,将获得指纹图像特征参数存入外设FLASH中,建立指纹数据库。在识别模式时,系统用同样的方式提取指纹图像特征参数,存入扩展SRAM中,然后将外设FLASH和扩展SRAM中的数据利用点模式匹配算法进行比对,最终将比对结果输出。 2.1.4 系统整体需要考虑的问题 有效的指纹辨识系统不仅仅依赖于辨识算法,还需要考虑很多其他方面的问题,它包括注册和辨识过程、排斥欺骗和安全考虑等。我们必须对这些问题提出应对办法,才能实现有效的辨识。 2.2 系统创新点 纵览全球诸多指纹识别事件:出入关按指纹、开门按指纹、领社保按指纹、上班考勤按指纹、幼儿园接送孩子按指纹、银行取款按指纹、超市购物按指纹付款、洗衣服按指纹进行分工、打手机按指纹、上电脑按指纹等等新现象层出不穷,指纹识别已经与人们的生活休戚相关。指纹化产品呈现出广阔的市场开发前景和巨大的利润空间。 由于此开发板具有VGA、RS232、键盘/鼠标等接口,可以很方便的在很多产品得到应用,使产品具有指纹识别的功能。例如,它可以与指纹保险箱(柜)、指纹门锁、IC卡系统、汽车启动系统连接使用,也可以统购RS232和计算机等设备联机使用。同时,目前的指纹识别认证系统大都采用DSP或者ARM来实现,这样的嵌入式系统很难实现小型化集成化,更无法SOC,使得指纹识别在小型化便携式产品中的应用得到局限,而本模块以FPGA作为核心控制系统,由于FPGA具有高度集成、低功耗、短开发周期等优点,所以如果本模块设计成功,可以实现指纹识别模块的小型化、集成化和SOC,使得指纹识别可以应用到更多的领域,为人们的生活带来更多的便利和安全,同时也具有更广阔的市场开发前景和更大的利润空间。 3. 技术成熟性和可靠性论述 本模块采用xilinx公司Spartan 3E系列XC3S500E型FPGA作为核心控制芯片,这款芯片采用90ns的先进工艺,最大容量50万门,足以满足设计的要求。美国富士通公司的MFS300滑动式电容指纹传感器采用标准CMOS 技术,含有8 位A/D 变换器,能在2.8 V~5 V 的宽电压范围内工作,能自动检测到是否有指纹到达传感器,并实现在线采集。它能在保证指纹图像高分辨率(500dpi)的同时大大减小了传感器的尺寸(13.3×3.6mm2)。系统利用XC3S500E的SPI端口和MPS300进行数据传输,使得传输更方便,传输速度更快、抗干扰能力更强。再加上该模块利用嵌入式软核实现系统的管理,利用硬件实现识别算法,保证了系统功能的完整性与识别的正确性。而识别算法我们采用美国FBI推荐的特征点匹配算法来实现指纹的识别,更保证了系统功能的实现。 4. 项目实施方案 4.1.方案基本功能框图及描述 用框图的方式并加以简单的描述简述实施本项目的技术方案。 图1 系统结构框图 系统采用xilinx公司Spartan 3E系列XC3S500E型FPGA作为核心控制芯片,通过MFS300滑动式电容指纹传感器进行指纹图象的采集,自动A/D转换,并将转换后的数字信号通过SPI端口传送给FPGA核心控制单元,以进行指纹登记或指纹对比。内扩展的SRAM和Flash 分别用作存储指纹程序运行时的临时数据和指纹数据信息。PROM在上电时对FPGA 进行程序配置。键盘用于实现模块模式的切换和模块密码设置等功能。RS23接口可以与计算机等设备进行联机操作,方便系统功能的扩展。该系统利用嵌入式软核实现系统的管理,利用硬件实现识别算法,保证了系统功能的完整性与识别的正确性。 4.2.需要的开发平台 需要的硬件开发平台是:初级板Spartan-3E 以partan 3E系列XC3S500E型FPGA作为核心控制系统,利用其SPI端口访问MFS300传感器的寄存器实现数据采集任务,在其内部嵌入DSP软核,实现对图像的预处理、特征参数的提取和匹配,利用其外设FLASH存储指纹数据信息,建立指纹数据库;通过LCD显示模块建立人机交互界面等。 需要的软件开发平台是:Xilinx ISE 9.1i、Matlab等; 利用Xilinx ISE 9.1i完成对FPGA的控制,利用Matlab实现滤波器的仿真,算法的研究,软核的制作等。 4.3.方案实施过程中需要开发的模块 需要具体开发的模块包括数据采集模块、原始图像的预处理模块、算法识别验证模块(通过Matlab实现Dsp算法,作为软核嵌入FPGA)、键盘操作模块、LCD显示模块等。 4.4.系统最终要达到的性能指标 能准确有效地完成指纹特征参数的提取和指纹的辨识验证。
相关资源