何か作ろうにもワンルームじゃ作業スペースもなく、何とか重い腰を持ち上げて
今回は指紋認証センサーのR503をArduinoを使って色々ためしてみたいと思います。
(調べても、日本語サイトが見つからなかったので備忘録がてら書きます。)
指紋認証の仕組みについては調べたら出てくるので記載はしないですが、
指紋認証システムは大きく分けて3種類ほどあるそうで、
「光学式」「静電容量式」「超音波式」と順番に高価で高性能なものになっています。
そして、今回実験するものは「静電容量式」のものを使います。
某リンゴ製のホームボタンとかについているあれですね。
(おなじみのAliで2000円ほどで買いました。高かったです。)
このユニットのスペックをざっくりと書くと、
・電圧 :3.3V
・動作電流 :20mA
・LEDの色 :青、赤、紫
・指紋登録数 :200個
・精度(未登録突破率) :<0.001%
・精度(登録済失敗率) :<1%
・通信ポートレート :(9600×N)bps、N = 1~12(デフォ値N = 6、57600bps)
といった感じで、かなり精度がいいものとなっています。
今回、このセンサーをArduinoで制御していきたいと思います。
このセンサーのデータシートはこちらから見ることができます。
①事前準備
さて、まずは事前に必要なものを準備しましょう。
今回使用したものは以下の通りです。
・指紋認証センサー R503 ←R502でも可。どちらも中身は一緒です。
・Arduino UNO(互換品) ←ArduinoであればNanoでもMegaでもいいです。
・Arduino↔PC間接続コード
・PC (Windows10)
開発環境はお任せします。
では次にライブラリをインストールします。
「Adafruit Fingerprint Sensor Library」というすでに公開されてあるライブラリを使用します。
こちらのGitHub上にライブラリがありますのでこれをArduino IDEにインストールしてください。
光学式の指紋センサーもこのライブラリを使用するため、ご不明な方はそちらもご覧ください。
②配線
次に、配線ですね。
センサーユニットからは計6本の配線が出ております。
以下ご参照ください。
若干配線の色が違いますが、順番は一緒です。
写真だと上から以下の通りで、Arduinoへの配線も記載しておきます。
Pin 1 赤色 :電源DC3.3V →3.3Vへ
Pin 2 黒色 :GND →GNDへ
Pin 3 黄色 :アウトプット(Tx) →デジタルPin2へ
Pin 4 茶色 :インプット(Rx) →デジタルPin3へ
Pin 5 青色 :指検出信号 →未接続
Pin 6 白色 :誘導電源DC3-6V →5Vへ(3.3Vでも大丈夫です。)
Pin5は使用用途がないので今回使いません。
実際にA実験してみました。
センサーに触れていないときは「1(analog時は1023)」を出力し、少しでも振れれば「0(analog時も同様に0)」を出力する線のようです。
analogRead時は触れ加減によって値が変わるかと考えていましたが、そんなことはなく単純に1/0の表現でした。
配線するとこのようになります。
(コネクタは切りました。そのままだと接続できないので。)
以上で環境構築は完了です。
③プログラム
ライブラリをインストールすると、IDEの「スケッチ例」にプログラムが格納されています。指紋登録方法や認証方法などは先ほどの光学式の参考サイトに詳しく記載されていますので、詳細は省きます。
プログラムだけ見ても関数の使い方がよくわからなかったので、ここからは
いろいろ調べながら分かった関数をいくつか記載しておきます。
LED制御
まずは光学式との大きな差で言うとLEDの可否ですね。
静電容量式は「青、赤、紫」のLEDが搭載されています。
制御方法について詳しく説明していきます。
まず、LEDを光らせる関数ですがこのように構成されています。
finger.LEDcontrol(点滅方法, 点滅スピード, LEDの色, 点滅回数);
1.点滅方法
ここでは点灯、消灯、点滅、点滅(呼吸のような)、フェードイン/アウトなどが選べます。
点灯:FINGERPRINT_LED_ON
消灯:FINGERPRINT_LED_OFF
点滅:FINGERPRINT_LED_FLASHING
点滅(呼吸のような):FINGERPRINT_LED_BREATHING
フェードイン:FINGERPRINT_LED_GRADUAL_ON
フェードアウト:FINGERPRINT_LED_GRADUAL_OFF
2.点滅スピード
ここでは点滅時のスピードを制御できます。
制御は0x00~0xffまでなので256段階で調整でき、0~255を設定します。
ここは設定数字の×10msが1サイクルのスピードになります。
点灯時は関係ないので、数字は何でもいいです。
3.LEDの色
LEDは先ほども述べた通り「青、赤、紫」の3種類が組み込まれています。
それぞれのコードは以下になります。
青:FINGERPRINT_LED_BLUE
赤:FINGERPRINT_LED_RED
紫:FINGERPRINT_LED_PURPLE
4.点滅回数
ここでは点滅時の回数を設定できます。
0~infiniteで可能です。回数制限なしの場合、この部分は省力も可能です。
点滅スピードと同様に、点灯時は関係ないです。
以上がLEDの制御方法です。
LEDの同時点灯はできないようなので、注意が必要です。
その他関数
分かったこと書きますといいましたが、そこまで書くことがなくなってきました。
とりあえずスケッチ例に載っていた関数でも書いていきます。
finger.getImage();
センサーへ、指紋パターンを取得するように依頼する関数です。
以下の値を返します。
FINGERPRINT_OK :成功
FINGERPRINT_NOFINGER :センサーに指の検出なし
FINGERPRINT_PACKETRECIEVEERR :センサーとの通信エラー
FINGERPRINT_IMAGEFAI :指紋エラー
finger.image2Tz();
センサーへ、取得した指紋パターンから特徴を識別するよう依頼する関数です。
()内が空白だとデフォルトで1になり、2まで指定できます。
この使い方は、この後紹介するcreateModel()で使います。
以下の値を返します。
FINGERPRINT_OK :成功
FINGERPRINT_IMAGEMESS :指紋が乱雑
FINGERPRINT_PACKETRECIEVEERR :通信エラー
FINGERPRINT_FEATUREFAIL :特徴の識別に失敗
FINGERPRINT_INVALIDIMAGE :特徴の識別に失敗
finger.fingerSearch();
センサーへ、取得した指紋の特徴と、登録してある指紋の特徴が一致するか依頼します。
以下の値を返します。
FINGERPRINT_OK :一致
FINGERPRINT_NOTFOUND :不一致
FINGERPRINT_PACKETRECIEVEERR :通信エラー
finger.createModel();
先ほど紹介したimage2Tz()のところで、image2Tz(1)とimage2Tz(2)に
格納されたモデルからテンプレートを作成します。
以下の値を返します。
FINGERPRINT_OK :成功
FINGERPRINT_PACKETRECIEVEERR :通信エラー
FINGERPRINT_ENROLLMISMATCH :指紋の不一致
finger.storeModel();
createModel()で作成したテンプレートをセンサー内のメモリに登録します。
()内には登録するIDを入れます。
以下の値を返します。
FINGERPRINT_OK :成功
FINGERPRINT_BADLOCATION :登録するIDが無効
FINGERPRINT_FLASHERR :メモリへの書き込みエラー
FINGERPRINT_PACKETRECIEVEERR :通信エラー時
finger.getTemplateCount();
使えそうだなと思ったので記載します。
センサーへ登録してある指紋の数を照会し、finger.templateCountへ格納します。
以下の値を返します。
FINGERPRINT_OK :成功
FINGERPRINT_PACKETRECIEVEERR :通信エラー
ざっとこれくらいですかね。
関数に関しては不明点も多く、こちらのサイトを参考にしました。
ほかの関数も記載あるため、合わせてご覧ください。
このような感じで光らせることができます。
このセンサーを使って、できることを模索していこうと思います。
(金庫とか、部屋のロックとかいろいろできそうですよね~。
海外ではバイクの電源キーにしている人がいました…。)
いろいろ触ってみて感想ですが、ライブラリが充実していて汎用性が高く、
ちょっとした工夫で面白いことができそうです。
認証精度も問題なく、今のところ誤認識はないですね。
また何か面白いことがあれば更新していこうと思います。
では良い工作ライフを!
0 件のコメント:
コメントを投稿