DreamerDreamのブログ

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

指紋センサー「DY50」をRaspberryPiのGPIOから直接動かす方法 備忘録

前回Arduinoを使って指紋センサーを動かしました。

dreamerdream.hateblo.jp

 

 

 

このモジュールについて事前にいろいろ調べたのですが、出てくる作例はラズパイのGPIOから直接ではなくUSBシリアル変換アダプタを使うというものばかりです。

 

シリアル変換アダプタ↓

 

 

YouTubeに出ている動画も例外なくUSBシリアル変換モジュールを使ってのものばかり(執筆時点)。

youtu.be

 

前回Arduinoでの実験では3.3Vできちんと動作確認したのでこの変換機は不要ではないのでしょうか?(というか取りたい!)

つまり作例ではこうなっているものを

f:id:DreamerDream:20220216122036p:plain

GPIOに直接接続してこうしたいわけです。

f:id:DreamerDream:20220216122047p:plain

回路がすごくスッキリします。

実際にはpizeroで使いたいの構想なのでアダプタがあるとすっごい邪魔!

 

えー、結論からすると、取れます!直接動かせました。

今回はその備忘録です。

 

RaspberryPiのGPIOにあるRXD,TXD端子からのシリアル通信についてこちらのサイトが詳しいので参考にさせていただきました。

ラズパイ3など、Bluetooth搭載のラズパイでGPIOのシリアル通信をするにはすこし面倒な設定の変更が必要だそうです。

www.ingenious.jp

 

シリアルコンソールの無効化

最初に

cat /boot/cmdline.txt

 

で現在の設定を一度確認してみます。

console=serial0,115200 console=tty1 root=PARTUUID=acc2f6a1-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles

 

この「serial0,115200」を取り除く必要があるそうです。

他のサイトではこれを直接消している例もありましたが、ラズパイの設定から王道の消し方があるみたいなのでそちらを実行します。

 

sudo raspi-config

でInterfaceOptionを選択

f:id:DreamerDream:20220216122452p:plain

リシアルを選択します。

f:id:DreamerDream:20220216122505p:plain

シリアルからのログインは「いいえ」を選択します。

f:id:DreamerDream:20220216122516p:plain

シリアルを有効にして

f:id:DreamerDream:20220216122540p:plain

finishで終了して再起動するとGPIOのシリアルが有効になります。

f:id:DreamerDream:20220216122553p:plain

cat /boot/cmdline.txt

でもう一度確認すると最初のものからserial以降が取れています。

console=tty1 root=PARTUUID=acc2f6a1-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles

 

 

Bleutoothモジュールの切り替え

次に、Bluetoothの搭載されたラズパイではデフォルトでBluetoothのシンボリックリンクがメインになっているそうで、メインの/dev/serial0をGPIOに変更する作業が必要とのことです。

 

sudo nano /boot/config.txt

 

で最終行に

dtoverlay=disable-bt 

 

を追記します。

 

現在の状態を確認

 ls -l /dev | grep serial

 

serial0にttyS0(bluetooth)、serial1にttyAMA0(GPIOserial)が割り当てられれています。

lrwxrwxrwx  1 root root           5  2月 16 19:57 serial0 -> ttyS0

lrwxrwxrwx  1 root root           7  2月 16 19:57 serial1 -> ttyAMA0

 

設定を反映させるために再起動させます。

sudo reboot

再度確認すると

ls -l /dev | grep serial

 

GPIOserialがメインのserial0に割り当てられるようになりました。

lrwxrwxrwx  1 root root           7  2月 16 20:05 serial0 -> ttyAMA0

lrwxrwxrwx  1 root root           5  2月 16 20:05 serial1 -> ttyS0

 

 

そして、使わないBluetoothを無効化します。

sudo systemctl disable hciuart

 

もしBluetoothを使う場合はminiuart-btの設定をすればラズパイの速度は落ちるものの使えるという情報も得ましたがBluetoothを使う予定が無いので今回は試しません。

 

以上でGPIO上のTXD,RXD端子のシリアル通信の準備が整いました。

 

 

指紋モジュールライブラリのインストール

指紋モジュールのライブラリのインストールはライブラリ本家のこちらのページを参考にさせていただきます。

tutorials-raspberrypi.com

 

以降のコマンドは、最初に

sudo bash

 

を打ってrootでコマンド操作する必要があります。

 

パッケージソースのインストール

 wget -O - http://apt.pm-codeworks.de/pm-codeworks.de.gpg | apt-key add -

 wget http://apt.pm-codeworks.de/pm-codeworks.list -P /etc/apt/sources.list.d/

 

パッケージの更新とpythonライブラリのインストール

apt-get update

 apt-get install python-fingerprint

エラーが発生した場合は以下を実行(エラーがなければ特に何もインストールされない)

apt-get -f install

rootを出ます。

exit

 

 

指紋モジュールとラズパイの接続

f:id:DreamerDream:20220216143105p:plain

Arduinoの時と同じようにGNDと3.3Vに接続します。

センサのRXをラズパイのTXDに、センサのTXをラズパイのRXD端子に接続します。

f:id:DreamerDream:20220216144021p:plain

 

サンプルプログラム実行

サンプルプログラムを実行しますが、そのままだとUSB変換機に繋がったシリアル接続を読みにいくので、先に設定した/dev/serial0に変更します。

sudo nano /usr/share/doc/python-fingerprint/examples/example_index.py

でソースを変更

f:id:DreamerDream:20220216142820p:plain

/dev/ttyUSB0 を /dev/serial0 に書き直します。

ボーレートはArduinoの場合は9600指定しましたがデフォルトでOK?のようです。

 

※書きながら気が付きましたが、もしかしたら、上記の「Bluetoothモジュールの切り替え」をせずともttyAMA0を直接指定してやるだけで良かったのかもしれません・・・(試してません)

 

実行すると

sudo python2 /usr/share/doc/python-fingerprint/examples/example_index.py 

指紋が登録されているとTrueだというリストです。

Currently used templates: 1/150

Please enter the index page (0, 1, 2, 3) you want to see: 0

Template at position #0 is used: False

Template at position #1 is used: True

Template at position #2 is used: False

Template at position #3 is used: False

ただ使われているか否か、それだけ。

 

/usr/share/doc/python-fingerprint/examples/

ディレクトリの中には他にも

example_delete.py          example_downloadimage.py   example_enroll.py          example_generaterandom.py  example_index.py           example_search.py  

というサンプルファイルが入っています。

 

example_enroll.py は指紋を読み取ります。

保存する番号を押し1度指を置いて案内が出たら離し、再度置くと登録されます。

example_search.pyは指紋から登録した番号を表示します。

example_delete.pyは登録した指紋を番号から消します。

example_generaterandom.pyはランダム数字を返すようで、用途は不明です。

面白いのは

example_downloadimage.py

を実行すると読み取った指紋のbmp画像が/tmpディレクトリに保存されます。

実際に読み取ったらこんな感じ↓

f:id:DreamerDream:20220216150818j:plain

白黒でしっかりと読み取れているのが解ります。

最終的にこの動画のようにきちんと動作しました。

(撮影が面倒なので動画は拝借したもの)

www.youtube.com

 

今回は狙い通りにラズパイから直接指紋認証モジュールを動かすことに成功しました。

ただ通電している間はずっとLEDが点灯しっぱなしのようなので実際に機器に組み込むには少し対策が必要なようです。

python-fingerprintの実体ファイルは

/usr/lib/python2.7/dist-packages/pyfingerprint/pyfingerprint.py

にあり、ざっくりと見た限り基本的にはモジュールとシリアル通信しているだけっぽいです。これならもしかしたらpython3でも動くかな?

 

指紋認証に使わない配線はタッチセンサー

DY50 | innomatic

この記事によると実は無接続の2本の線は独立したタッチセンサーのようです。

実際に試してみました。

youtu.be

 

きちんと反応の良いタッチセンサーが機能しています。

指がガラス面に触れた時にLOW出力になるようです。

簡単なコードですが一応貼っておきます。

 

タッチセンサーはT-3Vを3.3Vに、T-OUTをGPIO18に繋いでいます。

 touch_test.py 

#!/usr/bin/python3

#coding:utf-8

 

import RPi.GPIO as GPIO

import sys

import os

import atexit

import time

 

#TouchSenser

Senser = 18

 

def senser_callback(gpio_pin):

  #ピンの値を出力

  print( GPIO.input(Senser) )

 

def end():

  #GPIOの開放

  GPIO.cleanup()

 

def standby():

  #GPIO初期化

  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) 

  #終了時指定

  atexit.register(end)

 

  #無限ループ

  while True:

    time.sleep(60)

 

if __name__=='__main__':

  standby()

 

これを使ってタッチセンサーが感知したときだけ指紋認証するようコードを組めばLEDが長持ちするかもしれません。

 

まだサンプルしか見ていませんが、「ZFM-20」でググると兄弟分のモジュールも沢山ヒットしますのでスタンバイモードなど参考になる術が見つかるかもしれません。

 

同じようにラズパイで動くか不安でモジュールの購入を悩んでいる方の参考になれば幸いです。

 

次回は、点灯しっぱなしのLEDをなんとかするお話です。

dreamerdream.hateblo.jp

 

 

 

 

kampa.me