0 卖盘信息
BOM询价
您现在的位置: 首页 > 技术方案 >工业控制 > 基于R503指纹传感器与Arduino开发板的接口设计方案

基于R503指纹传感器与Arduino开发板的接口设计方案

来源: eet-china
2022-08-02
类别:工业控制
eye 106
文章创建人 拍明芯城

原标题:指纹传感器与Arduino的接口设计方案

  指纹传感器是应用广泛的感知元件,本项目以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(" Adafruit 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(" Adafruit 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;

  }

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


责任编辑:David

【免责声明】

1、本文内容、数据、图表等来源于网络引用或其他公开资料,版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系拍明芯城(marketing@iczoom.com),本方将及时处理。

2、本文的引用仅供读者交流学习使用,不涉及商业目的。

3、本文内容仅代表作者观点,拍明芯城不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。

4、如需转载本方拥有版权的文章,请联系拍明芯城(marketing@iczoom.com)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。

拍明芯城拥有对此声明的最终解释权。

相关资讯

方案推荐
基于MC33771主控芯片的新能源锂电池管理系统解决方案

基于MC33771主控芯片的新能源锂电池管理系统解决方案

AMIC110 32位Sitara ARM MCU开发方案

AMIC110 32位Sitara ARM MCU开发方案

基于AMIC110多协议可编程工业通信处理器的32位Sitara ARM MCU开发方案

基于AMIC110多协议可编程工业通信处理器的32位Sitara ARM MCU开发方案

基于展讯SC9820超低成本LTE芯片平台的儿童智能手表解决方案

基于展讯SC9820超低成本LTE芯片平台的儿童智能手表解决方案

基于TI公司的AM437x双照相机参考设计

基于TI公司的AM437x双照相机参考设计

基于MTK6580芯片的W2智能手表解决方案

基于MTK6580芯片的W2智能手表解决方案