指紋センサーについて最終回です。
前回はLEDのON-OFF操作が自由に出来るようになりました。
前々回は内蔵のタッチセンサーを扱えるようになりました。
今回は「タッチセンサーが反応したらLED点灯させて指紋認証し、指が離れたらLEDを消灯する」という動作になるよう過去2つのプログラムを組み合わせます。
このように動きます。
コードです。
#!/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()
けっこうヤッツケ感があるコードで改善の余地がありますがひとまず狙いどおりに動いたので今回の目的は達成しました。
今回は認証成功時にサンプルの通りに文字列吐かせてるだけですが、これで何かしら操作をすれば「指紋認証式◯◯」の完成!となります。
<pizeroでのモジュールだけの最小構成>
また、課題も見つかりました。
高頻度にしつこく認証させていると最終的にシリアル受信に失敗してエラー吐いてモジュール自体が止まります。
一度モジュール自体がエラーで止まってしまうとラズパイを再起動させてもシリアル信号自体を受け付けなくなっているので通信確立できません。もしモジュールの再起動命令が存在していたとしても送れません。これは致命的です。
改善策としてエラー時にはFETで物理的にモジュール自体の電源を一度断って再起動させることにしました。(2秒ぐらい電源を切ると確実に通信確率できます。)
見事な空中配線^^;
電源制御に使用したFETはNchパワーMOSFET 2SK4017(Q) (60V5A)
作成予定の指紋認証ロックシステムの最小構成の動作確認をした動画です。
3Dプリンターで作ったロック機構と連動させました。
エラー時でも自動でモジュールの電源遮断して再起動までバッチリです。
指紋認証モジュール、なかなか使えます。
面白かったのでもう一個買いましたとさ^^v以上です。