--- title: Fingerprint door lock (RF) date: 2025-06-05 layout: post project: true thumbnail: thumb_sm.jpeg --- Wanted to unlock the door with fingerprint, wirelessly to avoid drilling. 2024-11: Started with basic 433MHz RF modules and two Arduinos. Connected the data lines of the transceivers to the UART RXD/TXDs of the MCUs. Unreliable—constant packet loss. 2025-01: Switched to RFM69 modules. Implemented the driver from scratch. Checked the datasheet, audited code, cross-checked with RadioHead and RFM69 drivers. Driver non-functional. ATmega328P chips run at 5V, while RFM69s run at 3.3V. Suspect logic-level converter (LLC) issues. Not enough swing? 2025-04: Ditched the RFM69s with NRF24L01+ modules—data pins are 5V tolerant, no LLC required. Implemented the driver over six weekends. Wireless modules are now operational. Encrypted the RF channel with XOR cipher—sufficient for the threat model; key recycled to resist replay attacks: ``` static inline void keygen(char *buf, uint8_t n) { int i, imax; uint8_t sreg; uint16_t seed; sreg = SREG; cli(); seed = TCNT1; SREG = sreg; for (i = 0, imax = n - 1; i < imax; i++, seed++) buf[i] = tab[(seed % tablen)]; buf[imax] = '\0'; } ``` Protocol: FPM sends SYN. Servo responds with session key. Both XOR-ed with a static key. Session key is used thereafter. Private command set serves as an authentication layer for the endpoints. 2025-05: Ported the Adafruit C++ drivers for R503 and FPM10A fingerprint sensors to C. Chose R503 for the lock due to its built-in LEDs and better form factor. 2025-06: Designed two PCBs for FPM (front) and servo (back) controllers:
Footprint (front) |
PCB (front) |
Footprint (back) |
PCB (back) |