Robotics, Sensors

Interfacing R502/R503 Capacitive Fingerprint Sensor with Arduino

Overview

In this tutorial we will learn about Interfacing R502/R503 Capacitive Fingerprint Sensor with Arduino. Fingerprint sensor module capturesstores, and matches the user’s fingerprint. It is generally used to give access control to users or to determine their presence.

There are many fingerprint sensors available in the market and we used R305/R307 Optical fingerprint sensors in some earlier projects like Attendance System and Biometric Security System. We also used advanced fingerprint sensor like GT511C3 which has high accuracy and faster response time. Instead of the optical method, it uses a camera image processing method to detect fingerprints.

In this post, we will go through the details and specifications of the R502/R503 Capacitive Fingerprint Sensor & learn how the Capacitive Fingerprint Sensor works. Apart from this, we will interface the R502/R503 Capacitive Fingerprint Sensor with Arduino using the Adafruit Library and then learn the method to enroll and test fingerprints.

Bill of Materials

S.N.Components NameQuantityPurchase Links
1Arduino Nano Board 1RoboticsDnA.in
2R502/R503 Fingerprint Sensor1RoboticsDnA.in
3Connecting Wires20 RoboticsDnA.in

How Capacitive Fingerprint Sensor works?

The Capacitive fingerprint sensor works using a different algorithm compared to the optical fingerprint sensors. Instead of creating a traditional image of a fingerprint, capacitive fingerprint scanners use arrays of tiny capacitor circuits to collect data.

Capacitive Fingerprint Sensor Design

As capacitors store electrical charge, connecting them up to conductive plates on the surface of the scanner allows them to be used to track the details of a fingerprint. The stored charge will be changed slightly when a finger’s ridge is placed over the conductive plates. Conversely, an air gap will leave the charge at the capacitor relatively unchanged. An op-amp integrator circuit is used to track these changes, which can then be recorded by an analog-to-digital converter.

Once captured, this digital data is analyzed to look for distinctive and unique fingerprint attributes. They can then be saved for comparison at a later date.


R502/R503 Capacitive Fingerprint Sensor

R502 R503 Capacitive Fingerprint Sensor

The R502/R503 is the most popular and low-cost Capacitive Fingerprint Sensor available on the market. The chip is designed by integrating image collecting and algorithm chips together. The best part about R502/R503 is that it flexibly adapts to the conditions of the fingers, whether it is dry fingers, wet, light texture, or old fingers with a high recognition rate. The difference between R502 with R503 is that R502 is thinner and smaller, compared to R503.

The fingerprint sensor works at 3.3V and has a current consumption of 18mA during Fingerprint acquisition & average standby current of 2uA. It uses the RS232 UART interface and communicates with a default baud rate of 57600bps. It can store a maximum of 200 fingerprints. The R502/R503 fingerprint module has support for Arduino , Android, Windows, and Linux. For more information, you can refer to R502/R503 Datasheet.


Features & Specifications

  • Interface: RS232 (TTL)
  • Resolution: 508 DPI
  • Voltage: DC 3.3V
  • Working current(Fingerprint acquisition): 18mA
  • Standby current(finger detection): Typical touch standby voltage: 3.3V, Average current: 2uA
  • Fingerprint capacity: 200
  • Sensing Array: 192*192 pixel
  • LED Color: Bule and Red
  • Scanning Speed: < 0.2 second
  • Verification Speed: < 0.3 second
  • Matching Method: 1:1; 1:N
  • FRR (False Rejection Ratio): ≤0.01%
  • FAR (False Acceptance Ratio): ≤0.00001%
  • Communications baud rate (UART):(9600 Ă— N) bps where N = 1 ~ 12(default N = 6, ie 57600bps)

R502/R503 Pinout

There are total 6 wires basically pinout of R502/R503 Fingerprint Sensor which are as follows.

R502 Pinout

Interfacing R502/R503 Capacitive Fingerprint Sensor with Arduino 

Now let us see how we can interface R502/R503 Capacitive Fingerprint Sensor with Arduino . The connection diagram is fairly simple.

Capacitive Fingerprint Sensor Arduino

The fingerprint sensor is a UART Module. Connect the VCC & GND pin of R502/R503 to Arduino 3.3V & GND pin. Similarly, connect the Tx (Yellow Wire) & Rx (Green Wire) to D2 & D3 OF Arduino respectively. The blue wire is an interrupt wire which remains unconnected. Connect the white wire to 3.3V.

R502 R503 Arduino

You can directly connect the fingerprint sensor module with Arduino using jumper wires.

Source Code/Program

There is an Arduino library available for R502/R503 Capacitive Fingerprint Sensor from Adafruit. You can download the Adafruit Fingerprint Sensor Library from the Github repository.

There are two separate codes for enrolling and reading fingerprint data. The enroll code will save the fingerprint data in EEPROM Memory. While the fingerprint read code will read the fingerprint stored in EEPROM memory and match with the scanned one.

Enroll Code
#include <Adafruit_Fingerprint.h>


#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);  s
witch (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;
}


After uploading the code, open the Serial Monitor. The monitor will ask you to type the fingerprint ID which lies between 1 to 127.

Now enter the ID number in the Serial Monitor Screen and send it. You can then follow the screen instruction to enroll your fingerprint.

You can put your finger on the fingerprint sensor that you want to enroll.

Once fingers are enrolled, you can upload the above code to read the fingerprint that is stored in the fingerprint database.

Enroll Code
#include <Adafruit_Fingerprint.h>
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;
}
After uploading the code, open the Serial Monitor. The monitor will ask you to type the fingerprint ID which lies between 1 to 127.

You can put your finger on the fingerprint sensor and read the data stored.

For More Information Please Contact RoboticsDna Technical Team

Leave a Reply

Your email address will not be published. Required fields are marked *