Interfacing Fingerprint Sensor With Arduino

by sainisagar7294 in Circuits > Sensors

5568 Views, 22 Favorites, 0 Comments

Interfacing Fingerprint Sensor With Arduino

mini_thumb.png

This is r307 fingerprint sensor which has a UART interface for communication, let's enroll and test some fingers.

Supplies

mini_IMG_7860.png

Arduino UNO

Fingerprint sensor

Soldering and measuring equipments

Wires and insulation tape

Story:

R307-finger-print-sensor-pinout.jpg
ice_screenshot_20230517-003429.png

In this tutorial, we are interfacing the fingerprint sensor with Arduino. Let’s explore the working of R307 fingerprint sensor. Here I will show you how to enroll the fingerprint inside the Flash of sensor and finally we will match the fingerprints using a separate program and try to glow the onboard Led. These are two simple programs that can be modified for different purposes in future.

Here we are using Arduino UNO for interfacing, and we can use the UART (Serial communication port) because sensor support this interface. UART is the same port which is used to program the Arduino. There is only one serial communication bus (8-bit), to get the data readings on serial monitor and to interface the sensor in parallel Arduino UNO supports a software serial function.

For any prototype project you can use JLCPCB, China based PCB manufacturing company providing 5pcs of 2layer PCB in just $2. JLCPCB just launched the RF PCB and Flex PCB in very low prices, get you hand on best prototyping service in affordable price.

R307 Fingerprint Module:

mini_IMG_7864.png
r307-fingerprint-sensor-module-india-400x400.jpg

R307 Fingerprint Module consists of optical fingerprint sensor, high-speed DSP processor, high-performance fingerprint alignment algorithm, high-capacity FLASH chips and other hardware and software composition, stable performance, simple structure, with fingerprint entry, image processing, fingerprint matching, search and template storage and other functions.

R307 is a finger print sensor module with TTL UART interface. The user can store the finger print data in the module and can configure it in 1:1 or 1: N mode for identifying the person. The FP module can directly interface with 3v and 5v Microcontroller. A logic level converter (like MAX232) is required for interfacing with PC.

Features:-

  • Supply voltage: DC 4.2 ~ 6.0V
  • Supply current: Working current: 50mA (typical) Peak current: 80mA
  • Fingerprint image input time: <0.3 seconds
  • Matching method: Comparison method (1: 1)
  • Search method (1: N)
  • Storage capacity: 127 pieces
  • Communication baud rate (UART): (9600xN) bps, default: 57600bps

The R307 fingerprint module has two interface TTL UART and USB2.0, USB2.0 interface can be connected to the computer; RS232 interface is a TTL level, the default baud rate is 57600, can be changed, refer to a communication protocol; can And microcontroller, such as ARM, DSP and other serial devices with a connection, 3.3V and 5V microcontroller can be connected directly.

Operation Principle:

GT-521F32-Sensor-Working.png

Fingerprint processing includes two parts: fingerprint enrollment and fingerprint matching (the matching can be 1:1 or 1:N). When enrolling, user needs to enter the finger two times. The system will process the two-time finger images, generate a template of the finger based on processing results and store the template. When matching, user enters the finger through optical sensor and system will generate a template of the finger and compare it with templates of the finger library.

For 1:1 matching, system will compare the live finger with specific template designated in the Module; for 1:N matching, or searching, system will search the whole finger library for the matching finger. In both circumstances, system will return the matching result, success or failure.

Interfacing With Arduino (Circuit Diagram):

connections.png

Fingerprint sensor support two logic 3.3 and 5volt which can be set by the onboard fingerprint sensor jumper. We are using the sensor with Arduino uno which works on logic 5v.

  • VCC- 5V
  • GND- GND
  • TX- RX
  • RX- TX

Enrollment the Fingerprints:

enroll.png

The sensor has a syntax to store the data, which is initialized by AT commands through serial monitor. For ease whole the code is written in C language and performs the same action but for this you need Adafruit fingerprint sensor library.

To enroll the fingerprints connect the sensor to Arduino and upload the enrollment code choosing the right COM port. Then go to the serial monitor and check the sensor detection and working. Now to enroll the finger data choose the location by sending 0-127 numbers on the serial monitor. Then follow the instructions as displayed on serial monitor. It take two images of same finger to enroll properly. So you have to use the same finger two times for a successful image capture.

#include <Adafruit_Fingerprint.h>
#include <SoftwareSerial.h> // SoftwareSerial(rxPin, txPin, inverse_logic)
SoftwareSerial mySerial(2, 3); //you can change them if it is not working on 2 or 3

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\nFingerprint 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); }
}
}

uint8_t readnumber(void) {
uint8_t num = 0;

while (num == 0) {
while (! Serial.available());
num = Serial.parseInt();
}
return num;
}

void loop() // program wil repeat this part (loop here)
{
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;
}
}

Downloads

Matching the Fingerprints:

stored.png
My Video1.gif

Now you can use the fingerprints in different programs to give access to some port or data. Here is simple program that will turn on the Arduino onboard led connected to pin D13. On the serial monitor you can see the result in real time. It will also shows the number of total finger print data present in the flash of sensor. There are many control options and features available for the same sensor you can explore the more in the data sheet given here.

#include <Adafruit_Fingerprint.h>
#include <SoftwareSerial.h>

SoftwareSerial mySerial(2, 3);

Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);

void setup()
{
Serial.begin(9600);
while (!Serial); // For Yun/Leo/Micro/Zero/...
delay(100);
Serial.println("fingertest");
pinMode(12, OUTPUT);
pinMode(11, OUTPUT);

// 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);
}
}

finger.getTemplateCount();
Serial.print("Sensor contains "); Serial.print(finger.templateCount); Serial.println(" templates");
Serial.println("Waiting for valid finger...");
}

void loop() // run over and over again

{
getFingerprintIDez();
delay(50); //don't ned to run this at full speed.
digitalWrite(12, LOW);
digitalWrite(11, LOW);
}

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");
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.fingerFastSearch();
if (p == FINGERPRINT_OK) {
Serial.println("Found a print match!");
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
Serial.println("Communication error");
return p;
} else if (p == FINGERPRINT_NOTFOUND) {
Serial.println("Did not find a match");
return p;
} else {
Serial.println("Unknown error");
return p;
}
{digitalWrite(11, HIGH);
delay(3000);
digitalWrite(11, LOW);
Serial.print("Not Found");
Serial.print("Error");
return finger.fingerID;
}

// 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!
{
digitalWrite(12, HIGH);
delay(3000);
digitalWrite(12, LOW);
Serial.print("Found ID #"); Serial.print(finger.fingerID);
Serial.print(" with confidence of "); Serial.println(finger.confidence);



} }

My Arduino Design:

mini_saflj.jpg

Previously I made this Arduino UNO compatible board which has a lot more options than a simple development board. You can directly plug a lot of common sensors, displays and modules. In this development board bluetooth, NRF24 radio trans-receiver and USB to serial outer port is available. See all the info from here. You can download the designs from here and order directly from JLCPCB, Sign-up using this link and get free coupons of $54.