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机等生物识别领域。
  • 热度 3
    2020-10-31 22:46
    13060 次阅读|
    1 个评论
    【嵌入式指纹开发套件】+开箱
    首先感谢面包板社区给予本次试用体验。本次是一款指纹采集的嵌入式模块,由于时间久远官方能提供的资料也是比较少的了,所以目前开箱会基于目前所掌握的自资料来进行。首先看下开发板吧。 首先是可以看到是一个 MCU 核心板,以及一个指纹传感器模块。同时一个 USB 供电及通讯,目前是串口通信。两个按键,核心板上集成了一个三色 LED 进行状态提示。同时板载 JTAG 接口。用来调试程序。 侧面看下,指纹模块是通过 BTB 接口供电和通信,目前和传感器通信方式应该是 SPI 。 板子其实还预留了一个 USB 接口未焊接。 这是上电状态。 对于 MCU ,我接了 ST-link 上去看了下,应该是 F4 系列的,由于有读保护,是没办法去读去 flash 程序。 然后试了下发送一个命令,然后终端就一直往回传数据,应该是一张图片数据,最好可以看到手册中解析出来的效果。 那么本次开箱就这样了。后续看软件开发了。 搜索 复制
  • 热度 21
    2019-6-26 14:10
    1809 次阅读|
    0 个评论
    ​ 生物识别技术在近十年已逐渐发展出多达10种面向,例如日常生活中普遍可见的指纹识别(fingerprint)、或科幻电影中常出现的视网膜识别(retina)与虹膜识别(iris)、再到近两年火热的脸部识别(face recognition)与声纹识别(voice pattern)等。这些技术已逐渐化身为人们的分身,成为我们独一无二的最佳「代言人」,让我们不必再为传统式的长串密码逐一记忆,以及忧于近年来频繁的网络钓鱼攻击造成的密码破解、窃取等风险,用户逐渐以生物特征识别代替长串密码。 我们每天其实无时无刻都离不开「代言人」,尤以常见的指纹为例,早上起床时先解锁手机看邮件看新闻、到了公司使用指纹打卡、午餐时使用指纹解锁移动支付APP、开车前用指纹对车门解锁、进家门前使用指纹智能门锁等,这一系列的小动作着实改变了以往的使用习惯。 另一方面,指纹的应用也有助于提升政府机关的办事效率。例如出国时常使用指纹作为出入境记录,可节省人力查验资源与省去大排长龙的等待时间,亦或是在国内外,刑警用嫌犯遗留的指纹来加速对嫌犯的身份确认。 然而,我们的「代言人」也常会因为不法人士的窃取,例如复制装置上的指纹痕迹便可轻易制作出相同的指纹膜,造成个人资料、企业机密外泄,轻则造成财产上的损失,重则可能危及人生安全等问题。随着愈来愈多智能手机搭载指纹识别技术,整体市场规模不断提升,指纹识别将会更全面性地影响一般消费者日常生活,百佳泰因此投入相当的人力与时间,做了一系列实验来探讨指纹识别在安全性、可用性以及便利性上会碰到的一些状况。 图说:指纹识别技术的安全隐患 业界 vs. 百佳泰检测专家 在业界,对于生物识别认证具有一定规模的国际标准化组织-线上快速身份验证联盟(FIDO,Fast Identity Online),针对指纹,虹膜,人声等生物特征制订出三大开放认证标准机制: § 误识率 (False Accept Rate,FAR):在指纹识别验证,意指不正确的指纹被装置成功接收的出错概率 § 拒识率 (False Reject Rate,FRR):在指纹识别验证,意指正确的指纹被装置拒绝的出错概率 § 冒牌攻击(Impostor Attack Presentation Match Rate,IAPMR) FIDO联盟要求以「无密码」身份验证取代传统输入密码验证,采用更可靠、更安全的验证方式,结合装置端与在线的身分验证,让使用者可透过多种识别方式在FIDO平台达到便利快速的安全身份验证,降低对传统密码的过度依赖性。 身为检测专家的百佳泰亦认同FIDO联盟无密码认证的重要性及未来性,然而,无密码身份验证技术因需考虑到用户各式的生物特征以及不同的使用行为,具备一定的验证困难度。因此,百佳泰提出了相对应的生物识别验证,以确保装置在使用上的便利性及安全性是符合使用者需求。接下来,请跟着我们的实验一同探讨指纹识别到底会存在哪些问题吧! 百佳泰动手实测指纹传感器 目前时下各厂牌手机与笔记本电脑普遍使用的是电容式识别及屏下光学识别技术,百佳泰搜集了含有这两种识别技术的 10款手机与4款笔电 ,进行一连串的指纹实测,首先简单介绍电容式指纹识别和屏下光学识别技术。 § 电容式识别 :包含手机与笔记本电脑上的指纹识别。指纹模块透过人体手指的电荷变化、温度、压力进行扫描,因其技术成熟、价格低廉、及易于安装等因素成为目前主流厂商首选。 § 屏下光学识别 :将指纹识别模块安装在屏幕下,透过OLED显示器发射出的蓝绿光将指纹纹路照亮并记录生物特征后,再透过光线反射穿透屏幕传回至指纹识别模块进行解锁。目前逐渐被用于全屏幕装置中,但因价格与技术门坎稍高,较为不普遍。 日常生活的便利性 你的装置能在任何角度、方向顺心解锁吗? 当使用者将手指放置于桌上的手机进行解锁时,偶尔会发现手机无反应或解锁不成功提示信息。 为了确保指纹识别功能可随时随地正常使用,我们透过不同使用者,并以常见的两种使用习惯来测试指纹模块是否能够精准解锁。 1. 对着装置进行连续按压的登入动作 2. 从不同方向对着装置进行按压登入 图说:各品牌手机与笔电均能达到近九成的指纹识别解锁率 从实验结果中得知,不管是光学的屏下指纹识别或传统的电容式指纹识别都能达到九成以上的解锁成功率,因此可推断出解锁技术不论在重复登入功能、角度或方向上已趋于成熟,也满足使用者对于解锁方便性的期待。 日常生活的便利与安全性的两难 用户的直观体验往往决定了产品的成败关键!然而,为了便利性而牺牲安全性值得吗? 当用户兴奋地启动刚买到的新手机,却被复杂的注册指纹步骤搞的晕头转向;或是手指对准装置的解锁器,却需要长时间解读指纹造成装置无法快速解锁的情况。 经由百佳泰实测分析,发现 指纹注册次数、解锁反应时间 往往是用户最关心的问题。透过结果显示,屏下光学识别要求较多的指纹按压次数(平均需20次),远远大于电容式识别的按压次数,平均在12次左右(仅少数两款需8次的指纹按压便能完成注册)。 另一方面,我们做了关于指纹传感器的起始时间实验。从数据得知,无论是屏下光学式或电容式传感器,装置的平均解锁时间都能维持在816毫秒(ms)左右;等同于用户仅需花费不到眨一次眼的时间,便能快速解锁。此外,在这项实验里,其中一款电容式手机的解锁反应时间更仅花费262毫秒就能解锁,表现相当优异。 然而,「注册次数少」与「解锁反应时间快」真的为衡量指纹识别的最佳搭配指标吗?由于各厂牌有各自开发的算法,在数据结果呈现也不尽相同。倘若厂商为求便利而减少注册次数、提升反应时间,极可能将用户置于在不安全的加密环境中,让不法人士将有迹可循,造成机密外泄/财产损失等问题。 因此,为了提供良好的用户体验,好让使用者提高便利性的同时也能享有安全性,厂商该如何让指纹解锁在这双面刃做出完美平衡,将是厂商的一大课题之一。透过百佳泰的验证测试,可协助您找出装置注册次数与解锁反应时间的最佳平均值,避免因繁杂的注册次数或过长的解锁时间造成使用者的困扰、或接收客诉等问题。 日常生活的便捷性 干扰PK赛,谁才是阻挠消费者方便使用的干扰之王? 以下两种情况是否有似曾相识的感觉。 § 才刚洗完手,家人突然来电,尝试对手机进行解锁,却怎么也解不开,最后电话接不到,手机也被弄得湿湿的。 § 妈妈打算善加利用手机食谱APP烧出一道好菜,本以为油腻的手会无法解锁,却发现油腻腻的手指也能让手机轻松解锁! 针对上述情境,百佳泰特别选择了日常生活中消费者最常见接触使用的三种介质: 液体、油脂、粉末 (其中每个介质又包含了两种不同的产品),来检视各种介质对一般民众的影响。 图说:百佳泰针对常见的六种物质模拟常见的场景进行实验 在下图结果中我们发现,电容式传感器(蓝色圆柱)在这六种媒介上有着40%以上的解锁率,为三种传感器中表现最出色的;反之,藉由屏下指纹解锁的光学式传感器(橘色圆柱)除了在护手霜的实验勇夺第一之外,在其他介质方面普遍都容易受到干扰。言下之意,消费者在使用屏下光学式模块装置之际,遇上较差的用户体验机率最高,这是厂商在模块的设计上则需克服的能力。 此外,在六种介质测试中我们发现,在厨房容易碰到的面粉,或是运动员使用的滑石粉,则是电容式模块的干扰之王,解锁率极低;肥皂水不管对电容式、光学式甚至是笔电触控的传感器都呈现较低解锁率;而橄榄油除了对光学式产生较大影响外,对于电容式装置基本都能顺利解锁。介质测试结果除了可提供模块厂商做参考,另更可以提供给手机品牌商,作为挑选模块厂商的依据。 日常生活的方便性 贴心设计:指纹模块能包容你的缺陷! 每个人手上的指纹都不一定呈现完整状态,有时会因先天或外伤等因素造成指纹缺陷,这让不少消费者担心自身的指纹状况会直接影响解锁成功率。针对此问题,百佳泰深刻了解唯有透过日常真实使用情境模拟才可确切检测并反应出真正的问题点。从实验结果得知,尽管指纹或多或少的被遮蔽了,装置依然能被顺利解锁;然而,如指纹被遮蔽超过一半时,屏下光学识别较不能容易辨别,从而让解锁失败。 这项测试结果对于使用者来说无非是件可喜之事,使用者日后无需为手指上的小缺陷或是小疤痕是否能让装置解锁烦恼,因为相较于本文中列出的其他问题,指纹缺陷对于装置解锁的影响可说是微乎其微。 日常生活的安全性 指纹盗取好Easy,你的身份被复制了吗? 不带钱包出门的生活方式已逐渐被大众接受,许多人喜欢在日常生活中使用指纹透过移动支付APP消费。然而,当使用者暂时将手机放置于桌面时,不法人士可能藉此复制装置上所残留的指纹!轻则财产损失,重则你的身份可能被使用在非法途径中。 在前三项实验中,我们研究了真实指纹对于传感器的敏锐度及辨识度。然而,现今还是有不法人士透过 指纹复制 的诈骗手法来窃取对方的财产。对于这类层出不穷的诈骗手法,我们应当如何防范? 百佳泰透过市面上容易取得的材料,以可塑性白胶为基底再搭配其他物质加工出4种不同类型的指纹模型,实验这4种指纹模型是否能成功破解传感器。 图说:百佳泰实验四种不同材质的指纹模型进行破解 图说:4种材质指纹模型破解情況 透过上述实验结果,新技术的屏下指纹光学识别在复制指膜上风险最大,除了材料3因材质问题所制作出的指纹纹路不明显,无法对所有的传感器进行破解,其他3种材料皆可轻易对屏下指纹光学识别破解。 在制造商们尚未提升传感器辨别假指纹的功能时,消费者如购买带有屏下指纹识别的装置,则要多注意屏幕上的指纹是否有定期擦除,如稍加不留意,不法人士便可窃取指纹,让自己的人身财产处在高危的风险中。换句话说,如厂商能提升传感器对于假指纹的辨识度,便能作为产品的营销利器,兹以证明自家产品安全性优于市面其他产品。 百佳泰指纹识别测试为您找出装置的弱点 市面上存在着各式各样的指纹破解法,使用者只要稍加不留心,个人信息很可能就落入到他人手中!在提升安全性的同时,厂商亦须将使用便利性纳入考虑。本篇文章以屏下光学式、电容式指纹识别为例,研究使用者在日常生活中可能遇到的问题以及该如何防范。根据百佳泰多年测试经验,能针对客户需求,省去选择机种时间并快速找出装置上指纹传感器的弱点,逐一提供解决方案。 在FIDO强调装置与在线进行身份识别结合的同时,百佳泰也致力于帮助用户能摆脱传统先记忆、再输入密码的方式来进行身份验证,朝向无密码时代。当前端装置身分识别技术不断推陈出新,我们亦将会持续导入其他生物识别的测试,例如超音波屏下指纹识别等,为您装置上的传感器进行身份验证机制的把关!
  • 热度 14
    2015-12-29 11:08
    799 次阅读|
    0 个评论
    微信公众号:ittbank   微信公众号搜索"ittbank"加关注,每日提供最新的手机、MID、机顶盒、PC移动周边、安防、电容触摸、液晶屏、摄像头、无线WiFi、智能穿戴、智能硬件等信息,推荐关注!【 微信扫描以下二维码可直接关注 】  
相关资源
  • 所需E币: 0
    时间: 2024-3-12 10:43
    大小: 7.6MB
    上传者: htwdb
    随着计算机技术的飞速发展和生物识别技术的广泛应用,人们越来越多地关注身份认证的安全,指纹识别因其隐私性和便捷性,已经成为当前发展最成熟的身份认证技术,在各个行业领域中都得到了广泛应用.除了有着重要的理论意义和应用价值之外,指纹识别技术也是一门能广泛应用在信息安全、网络安全、犯罪处理等多个领域的综合性技术.本文以本人在校外实习期间参与完成的高性能指纹识别芯片课题为基础,详细介绍了指纹组成、特征及指纹识别算法流程,并对各个步骤的原理和算法具体实现过程做出了详细描述,并结合C语言指纹识别算法,针对PC端对系统时间、系统空间以及函数代码这三个方面提出了一些优化策略和方法.然后详细介绍了用MFC图形化界面设计指纹预处理图形交互界面的流程,通过对C语言各个模块函数的调用展示了指纹录入、指纹预处理的功能,并对界面进行优化,增强了软件界面的灵活性.   本文将研究设计分为"C语言算法描述与优化"和"MFC图形化界面设计"这两个主要部分:(1)C语言算法描述与优化:对指纹识别算法中指纹图像采集、指纹图像预处理、指纹特征提取这三个关键步骤的原理进行了介绍,并结合C语言指纹识别算法,详细描述了各个步骤的原理和算法实现过程.针对PC端系统时间、系统空间的一些优化方案的原理和具体实现进行了说明和概述.主要内容包括系统时间优化的方案如Gabor滤波模块优化、算法数据浮点转定点,系统空间优化的方案如选择合适的数据结构和尽量小的数据类型,并概括了一些实习工作中总结的函数代码优化的方法.(2)MFC图形化界面设计:着重介绍用MFC中的C++类库设计一个指纹预处理系统界面,这个系统界面的目的是评估指纹预处理算法,在MFC对话框类的基础上添加不同的控件,通过对C语言的算法调用,在PC端展示从文件中选择指纹图像、指纹预处理图像显示、各模块阈值自定义设定等功能,并对界面进行优化,实现了界面与控件自适应、界面尺寸控制等功能,增强了软件界面的灵活性.最后,本文对研究工作进行总结,并在本论文的工作基础上提出了一些进一步的优化方案,对课题未来进行展望.
  • 所需E币: 2
    时间: 2023-7-2 23:06
    大小: 6.37MB
    上传者: Argent
    【设计汇总】指纹识别_人脸检测_车牌识别_相机自动调焦
  • 所需E币: 0
    时间: 2023-3-14 00:35
    大小: 1.54MB
    上传者: Argent
    指纹识别参考设计程序
  • 所需E币: 5
    时间: 2023-2-12 21:36
    大小: 1.05MB
    上传者: ZHUANG
    基于DSP指纹识别的智能共享物品柜的设计
  • 所需E币: 5
    时间: 2023-2-10 09:49
    大小: 3.15MB
    上传者: ZHUANG
    面向射频指纹识别的高效IQ卷积网络结构
  • 所需E币: 1
    时间: 2022-7-13 21:55
    大小: 3.28MB
    上传者: czd886
    一种民用小型无人机的射频指纹识别方法.
  • 所需E币: 1
    时间: 2022-1-10 19:10
    大小: 1.01MB
    上传者: Argent
    基于单片机的指纹识别电子密码锁设计
  • 所需E币: 4
    时间: 2022-1-6 09:44
    大小: 246.3KB
    上传者: ZHUANG
    基于嵌入式Linux的指纹识别系统设计
  • 所需E币: 3
    时间: 2022-1-6 09:44
    大小: 2.51MB
    上传者: ZHUANG
    基于嵌入式Linux的指纹识别系统设计与实现
  • 所需E币: 2
    时间: 2022-1-6 11:16
    大小: 2.59MB
    上传者: ZHUANG
    嵌入式自动指纹识别系统设计与算法研究
  • 所需E币: 5
    时间: 2022-1-6 09:08
    大小: 1.41MB
    上传者: ZHUANG
    基于ARM微处理器的嵌入式指纹识别系统设计
  • 所需E币: 5
    时间: 2021-7-15 11:16
    大小: 1.6MB
    上传者: czd886
    基于单片机的指纹识别电子密码锁系统的设计
  • 所需E币: 1
    时间: 2021-4-10 21:30
    大小: 2.89MB
    上传者: ZHUANG
    基于DSP和射频卡的嵌入式指纹识别系统设计与实现
  • 所需E币: 1
    时间: 2021-4-8 10:25
    大小: 942.14KB
    上传者: czd886
    基于指纹识别技术的仪器开关研制
  • 所需E币: 1
    时间: 2021-4-8 13:41
    大小: 169KB
    上传者: czd886
    基于DSP的指纹识别门禁系统设计
  • 所需E币: 1
    时间: 2021-4-8 13:42
    大小: 208.58KB
    上传者: czd886
    基于DSP的指纹识别系统设计
  • 所需E币: 0
    时间: 2021-3-18 16:57
    大小: 481.95KB
    上传者: Argent
    FPGA是一个技术密集型的行业,没有坚实的技术功底,很难形成有竞争力的产品。从技术上来看FPGA未来的发展,至少在几年内还是遵循摩尔定律的规则,工艺不断升级,目前xilinx16nm工艺的FPGA已经成熟商用,xilinx下一代产品会升级到7nm,重点应该还是瞄准通信和可能出现的新兴行业如大数据处理等。有这方面需求的网友不妨来共同学习探讨。
  • 所需E币: 1
    时间: 2021-3-16 17:08
    大小: 2.89MB
    上传者: ZHUANG
    基于DSP和射频卡的嵌入式指纹识别系统设计与实现
  • 所需E币: 1
    时间: 2021-3-16 09:51
    大小: 67.29KB
    上传者: ZHUANG
    基于DSP+CCS+2.2实现指纹识别预处理系统
  • 所需E币: 1
    时间: 2021-3-16 09:51
    大小: 132.14KB
    上传者: ZHUANG
    基于DSP+CCS2.2实现指纹识别预处理系统