Working Principle
The R305 (also sold as FPM10A) is an optical fingerprint sensor module. A CMOS camera illuminated by LEDs captures an image of the fingertip pressed against a glass prism. An on-board DSP extracts minutiae points (ridge endings and bifurcations) and stores them as a compact template. During verification, the sensor captures a new image, extracts minutiae, and compares against stored templates.
Analogy: Imagine taking a close-up photo of a fingerprint and circling every spot where a ridge splits or ends. Those circles become the "password." To unlock, a new photo is taken and compared — if enough circles match, access is granted.
Electrical Characteristics
| Parameter | Value |
|---|---|
| Supply Voltage | 3.6 V – 6.0 V |
| Interface | UART (57600 baud default) |
| Image Resolution | 500 dpi |
| Template Capacity | 162 fingerprints (on-board flash) |
| FAR (False Accept Rate) | <0.001% |
| FRR (False Reject Rate) | <1% |
| Match Time | <1 second (1:162) |
| Current | ~120 mA during capture |
Interfacing with an MCU
The R305 communicates via UART at 57600 baud (or configurable up to 115200). It has 4 wires: VCC, GND, TX, RX. Most modules use a JST connector or colour-coded wires (red=VCC, black=GND, yellow=TX, green/white=RX).
Calibration
The R305 is factory-calibrated for image capture. The enrollment workflow is the key setup step:
- Enrollment: Capture the same finger twice (two templates), then merge and store with an ID number.
- Security level: Adjustable 1–5 (1 = lenient, 5 = strict). Higher levels reduce FAR but increase FRR.
- Clean sensor: Wipe the glass surface regularly — oils and dust degrade image quality and match accuracy.
Code Example
/*
* R305 Fingerprint Verification — Arduino
* Requires: Adafruit_Fingerprint library
* Wiring: TX→Pin2(RX), RX→Pin3(TX), VCC→5V
*/
#include <Adafruit_Fingerprint.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); /* RX=2, TX=3 */
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
void setup() {
Serial.begin(9600);
finger.begin(57600);
if (finger.verifyPassword()) {
Serial.println("Fingerprint sensor found!");
Serial.print("Templates stored: ");
finger.getTemplateCount();
Serial.println(finger.templateCount);
} else {
Serial.println("Sensor not found! Check wiring.");
while (1);
}
}
void loop() {
Serial.println("Place finger on sensor...");
int id = getFingerprintID();
if (id >= 0) {
Serial.print("Match found! ID: "); Serial.println(id);
Serial.print("Confidence: "); Serial.println(finger.confidence);
}
delay(1000);
}
int getFingerprintID() {
uint8_t p = finger.getImage();
if (p != FINGERPRINT_OK) return -1;
p = finger.image2Tz();
if (p != FINGERPRINT_OK) return -1;
p = finger.fingerSearch();
if (p == FINGERPRINT_OK) return finger.fingerID;
return -1;
}
Real-World Applications
Door Access Control System
Small offices and makerspaces use R305 modules in DIY door locks. The sensor stores up to 162 authorised fingerprints. An Arduino compares each scan against the database and actuates a solenoid lock on match. The sub-1% FRR ensures authorised users rarely need to re-scan, while the <0.001% FAR provides strong security for low-traffic environments.
Limitations
- Optical limitations: Wet, dirty, or scarred fingers produce poor images and higher rejection rates.
- Small database: 162 templates is sufficient for small installations; larger systems need R307/R503 (1000+ templates).
- No liveness detection: Basic optical sensors can be spoofed by high-quality silicone fingerprint moulds — capacitive sensors are more secure.
- Power hungry: ~120 mA during capture makes it unsuitable for ultra-low-power battery applications.