Андрей Овчаров

маленькое невинное хобби

Андрей Овчаров

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

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

Модули, которые я нашел в продаже - FPC1020AM и FPC1020AP, произведенные компанией Fingerprints. Это емкостные сканеры с разрешением 192x192 пикселей при 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 (0x20A), следовательно модули работают и подключены правильно.

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