Сканер отпечатков пальцев FPC1020

Обновлений по моему замечательному проекту авторизации без пароля WebAuthn не было уже довольно давно. Проект, при этом, вполне себе жив и продолжается. Последняя проблема, с которой я столкнулся, это то, что сканер отпечатков с интерфейсом UART и микроконтроллером не обеспечивает должной безопасности и нужно подключить его напрямую. Поэтому я заказал в Китае пару сканеров, доставка которых заняла больше полутора месяцев.

Модули, которые я нашел в продаже — FPC1020AM и FPC1020AP, произведенные компанией Fingerprints. Это емкостные сканеры с разрешением 192×192 пикселей при 508 точках на дюйм и интерфейсом SPI. По фотографии понять реальный размер было непросто и я был крайне удивлен, какие они миниатюрные.

Описание модулей можно найти в интернере, так что я не буду описывать их полностью. Напишу лишь, как я их подключал.

Модуль FPC1020AM подключается при помощи гибкого шлейфа с шестнадцативыводным разъемом модели BM10NB(0.8)-16DS-0.4V(51).

FPC1020AM module and Hirose connectors

Назначение выводов у этого сканера следующее:

FPC1020AM fingerpint scanner pinout

Модуль FPC1020AP выполнен в корпусе LGA с контактными площадками с нижней стороны корпуса. Информацию по его подключению найти было не так просто, но в конце концов получилось.

FPC1020AP fingerpint scanner module

Один из документов описывает размеры корпуса и нумерацию выводов, другой их назначение.

FPC1020AP fingerpint scanner pinout

Контактные площадки организованы в матрицу 7×7, строки которой пронумерованы от A до G, а столбцы от 1 до 7.

FPC1020AP fingerpint scanner package

Внимание, модули требуют напряжение питания 1.8V!

В моем репозитории можно скачать библиотеку для Eagle CAD.

Тестовая плата

Для тестирования обоих модулей я заказал простую печатную плату с выводами и регулятором напряжения.

Test board for FPC1020 fingerprint scanners

Схема очень проста — модули напрямую подключены на выводы. На плату можно распаять модули обоих типов. Для напряжения 1.8V используется микросхема LP2985 с кермическими конденсаторами.

Платы были изготовлены при помощи сервиса JLCPCB. Обе платы я распаивал при помощи фена и паяльной пасты. Получилось довольно просто и заработало с первого раза.

Completed test boards

Подключение тестовых плат к NodeMCU выглядит следующим образом:

  • GND <-> GND
  • +3.3V <-> GND
  • RST <-> D2 (GPIO 4)
  • IRQ <-> D1 (GPIO 5)
  • CS <-> D8 (GPIO 15)
  • CLK <-> D5 (GPIO 14)
  • MOSI <-> D7 (GPIO 13)
  • MISO <-> D6 (GPIO 12)

Test board connected to NodeMCU

Простой скрипт для Arduino инициализирует шину SPI и получает идентификатор устройства из соответсвующего регистра.

#include "Arduino.h"

#include "SPI.h"

#define FPC_IRQ 5
#define FPC_RST 4

class FPC1020
{
public:
    void init()
    {
        // Chip select
        pinMode(SS, OUTPUT);
        digitalWrite(SS, HIGH);

        // IRQ / data ready
        pinMode(FPC_IRQ, INPUT);
        digitalWrite(FPC_IRQ, LOW);

        // RST
        pinMode(FPC_RST, OUTPUT);
    }

    void reset()
    {
        digitalWrite(FPC_RST, LOW);
        delay(10);
        digitalWrite(FPC_RST, HIGH);
    }

    uint16_t hardware_id() {
        digitalWrite(SS, LOW);
        SPI.write(0xFC);
        uint16_t status = SPI.transfer16(0x0);
        digitalWrite(SS, HIGH);

        return status;
    }
};

FPC1020 fpc;

void setup()
{
    Serial.begin(115200);
    SPI.begin();

    fpc.init();
    fpc.reset();

    delay(300);

    Serial.println("FPC1020 test");
    Serial.print("Hardware ID: ");
    Serial.println(fpc.hardware_id());
}

void loop()
{
    delay(1000);
}

Обе платы выдали правильный Hardware ID = 522 (0×20A), следовательно модули работают и подключены правильно.

Следующим шагом будет получение отпечатка пальца, но для этого я буду использовать уже ESP IDF, так как именно на этом фреймворке я разрабатываю свой авторизатор.