前回Arduinoを使って指紋センサーを動かしました。
このモジュールについて事前にいろいろ調べたのですが、出てくる作例はラズパイのGPIOから直接ではなくUSBシリアル変換アダプタを使うというものばかりです。
シリアル変換アダプタ↓
YouTubeに出ている動画も例外なくUSBシリアル変換モジュールを使ってのものばかり(執筆時点)。
前回Arduinoでの実験では3.3Vできちんと動作確認したのでこの変換機は不要ではないのでしょうか?(というか取りたい!)
つまり作例ではこうなっているものを
GPIOに直接接続してこうしたいわけです。
回路がすごくスッキリします。
実際にはpizeroで使いたいの構想なのでアダプタがあるとすっごい邪魔!
えー、結論からすると、取れます!直接動かせました。
今回はその備忘録です。
RaspberryPiのGPIOにあるRXD,TXD端子からのシリアル通信についてこちらのサイトが詳しいので参考にさせていただきました。
ラズパイ3など、Bluetooth搭載のラズパイでGPIOのシリアル通信をするにはすこし面倒な設定の変更が必要だそうです。
シリアルコンソールの無効化
最初に
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を選択
リシアルを選択します。
シリアルからのログインは「いいえ」を選択します。
シリアルを有効にして
finishで終了して再起動するとGPIOのシリアルが有効になります。
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端子のシリアル通信の準備が整いました。
指紋モジュールライブラリのインストール
指紋モジュールのライブラリのインストールはライブラリ本家のこちらのページを参考にさせていただきます。
以降のコマンドは、最初に
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
指紋モジュールとラズパイの接続
Arduinoの時と同じようにGNDと3.3Vに接続します。
センサのRXをラズパイのTXDに、センサのTXをラズパイのRXD端子に接続します。
サンプルプログラム実行
サンプルプログラムを実行しますが、そのままだとUSB変換機に繋がったシリアル接続を読みにいくので、先に設定した/dev/serial0に変更します。
sudo nano /usr/share/doc/python-fingerprint/examples/example_index.py
でソースを変更
/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ディレクトリに保存されます。
実際に読み取ったらこんな感じ↓
白黒でしっかりと読み取れているのが解ります。
最終的にこの動画のようにきちんと動作しました。
(撮影が面倒なので動画は拝借したもの)
今回は狙い通りにラズパイから直接指紋認証モジュールを動かすことに成功しました。
ただ通電している間はずっとLEDが点灯しっぱなしのようなので実際に機器に組み込むには少し対策が必要なようです。
python-fingerprintの実体ファイルは
/usr/lib/python2.7/dist-packages/pyfingerprint/pyfingerprint.py
にあり、ざっくりと見た限り基本的にはモジュールとシリアル通信しているだけっぽいです。これならもしかしたらpython3でも動くかな?
指紋認証に使わない配線はタッチセンサー
この記事によると実は無接続の2本の線は独立したタッチセンサーのようです。
実際に試してみました。
きちんと反応の良いタッチセンサーが機能しています。
指がガラス面に触れた時に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をなんとかするお話です。