DreamerDreamのブログ

夢想家の夢です。〜揚げたてのモヤっとしたものをラフレシアと共に〜

指紋センサー「DY50」をタッチセンサー連動で指紋認証させる

 

 

指紋センサーについて最終回です。

前回はLEDのON-OFF操作が自由に出来るようになりました。

dreamerdream.hateblo.jp

 

前々回は内蔵のタッチセンサーを扱えるようになりました。

dreamerdream.hateblo.jp

 

今回は「タッチセンサーが反応したらLED点灯させて指紋認証し、指が離れたらLEDを消灯する」という動作になるよう過去2つのプログラムを組み合わせます。

 

このように動きます。

youtu.be

 

コードです。

#!/usr/bin/python3

# -*- coding: utf-8 -*-

 

from pyfingerprint.pyfingerprint import PyFingerprint

import hashlib

import time

import RPi.GPIO as GPIO

import sys

import os

import atexit

 

#TouchSenser

Senser = 18

 

f = None

f_finger = False

 

## Tries to initialize the sensor

try:

    f = PyFingerprint('/dev/serial0', 57600, 0xFFFFFFFF, 0x00000000)

    if ( f.verifyPassword() == False ):

        raise ValueError('The given fingerprint sensor password is wrong!')

 

except Exception as e:

    print('The fingerprint sensor could not be initialized!')

    print('Exception message: ' + str(e))

    exit(1)

 

#print('Currently used templates: ' + str(f.getTemplateCount()) +'/'+ str(f.getStorageCapacity()))

 

def search():

  print('Waiting for finger...')

 

  ## Wait that finger is read

  for i in range(5):

    if( f.readImage() ):

      break

    time.sleep(1)

    if 4<=i:

      return 0

 

  try:

    f.led_off()

 

    ## Converts read image to characteristics and stores it in charbuffer 1

    f.convertImage(0x01)

 

    ## Searchs template

    result = f.searchTemplate()

 

    positionNumber = result[0]

    accuracyScore = result[1]

 

 

    if ( positionNumber == -1 ):

      print('No match found!')

      time.sleep(1)

      return 0

 

    else:

      print('Found template at position #' + str(positionNumber))

      print('The accuracy score is: ' + str(accuracyScore))

      f.loadTemplate(positionNumber, 0x01)

      characterics = str(f.downloadCharacteristics(0x01)).encode('utf-8')

      print('SHA-2 hash of template: ' + hashlib.sha256(characterics).hexdigest())

 

  except:

    return 0

 

 

def senser_callback( gpio_pin ):

  global f_finger

  if GPIO.input(Senser) == 0 and f_finger is False:

    f_finger = True

    try:

      f.led_on()

    except:

      pass

    search()

 

def end():

  GPIO.cleanup()

 

def standby():

  global f_finger

  GPIO.setmode(GPIO.BCM)

  GPIO.setup(Senser, GPIO.IN, pull_up_down=GPIO.PUD_UP)

  GPIO.add_event_detect(Senser, GPIO.BOTH, bouncetime=50)  

  GPIO.add_event_callback(Senser, senser_callback)  # setInterrupt

  atexit.register(end)

 

  while True:

    if GPIO.input(Senser) == 1:

      print('.')

      try:

        f.led_off()

      except:

        pass

      f_finger = False

    time.sleep(5)

 

if __name__=='__main__':

  standby()

 

けっこうヤッツケ感があるコードで改善の余地がありますがひとまず狙いどおりに動いたので今回の目的は達成しました。

 

今回は認証成功時にサンプルの通りに文字列吐かせてるだけですが、これで何かしら操作をすれば「指紋認証式◯◯」の完成!となります。

f:id:DreamerDream:20220218090537p:plain

<pizeroでのモジュールだけの最小構成>

 

 

また、課題も見つかりました。

高頻度にしつこく認証させていると最終的にシリアル受信に失敗してエラー吐いてモジュール自体が止まります。

 

一度モジュール自体がエラーで止まってしまうとラズパイを再起動させてもシリアル信号自体を受け付けなくなっているので通信確立できません。もしモジュールの再起動命令が存在していたとしても送れません。これは致命的です。

改善策としてエラー時にはFETで物理的にモジュール自体の電源を一度断って再起動させることにしました。(2秒ぐらい電源を切ると確実に通信確率できます。)

f:id:DreamerDream:20220218222652p:plain

見事な空中配線^^;

電源制御に使用したFETはNchパワーMOSFET 2SK4017(Q) (60V5A)

 

 

作成予定の指紋認証ロックシステムの最小構成の動作確認をした動画です。

3Dプリンターで作ったロック機構と連動させました。

youtu.be

エラー時でも自動でモジュールの電源遮断して再起動までバッチリです。

 

指紋認証モジュール、なかなか使えます。

面白かったのでもう一個買いましたとさ^^v以上です。

 

 

kampa.me