INoX プログラミング道場

LG3DとかID-01とかロボットプログラミングとかSunSPOTとかArduinoとかAndroidとかそのへんの情報です。

全体表示

[ リスト ]

デジットにてまた奇妙なデバイスを発見。

その名も

高性能DSPタイプ指紋スキャンモジュール


イメージ 1


シリアルで簡単に制御♪
ってあったので、早速購入。
でもお高いんでしょ〜。はい高いです。¥8995也。まあこの手のデバイスはこんなもんでしょ。

デバイス名は、ZFM-20だ。中国が産地の模様。


最初、Arduinoじゃデバッグし辛いと思い、PCとUSBシリアルで実験。
しかし、うんともすんとも言わん。壊れてんのか?
むむ、困った。


そこでいろいろggrしてると、adafruitでArduino用のライブラリが用意されているではないですか!

さすが、神様、adafruit様、GitHub様である。

早速、DL。適当にワイヤリングしてプログラム実行。

イメージ 2


あっさり動いたww

自分の才能の無さを改めて感じたのであった。

プログラムは2つに分かれている。
enroll.pde で指紋の登録だ。
fingerprint.pde で登録した指紋の検出を行う。


センサー側は、SoftwareSerialで十分問題ない。


んがしかし、これでだけでは面白くない。
デジットみたいに

イメージ 3
(C) デジット

こんなのしたーーいい、よってことで指紋画像を取り出して表示することに挑戦。


adafruitには画像取得のAPIが無いので自力で取得する必要がある。


まず、データシーと見ながらいろいろ調べる。
画像サイズは、256*288 pix。シリアルモードでは1画素を2byteで表現する。
つまり1画素あたり16階調となる。
USBモードもあるようでこちらは8bitカラーになる模様。
ただし、J1からピンを引き出さないといけないみたい。

今回はシリアルなので、16階調。
データは、UpImage(0x0A)で取得する。

1回のコマンドあたり、128byteの画像データが取得できる。
128x2=256pix。つまり1コマンドあたり1ライン分のデータが取得できる。
だもんで、288回繰り返せば全データが取得できるという按配だ。

さっそく、データを取得してみる。

取得したデータをシリアルに出してみる。
全部で、36864byte。一応全データ取得できたみたいだ。

表示装置が無いので、とりあえずPCで表示アプリ作って表示してみる。
その結果・・・


イメージ 4


            / ̄ ̄\       ?
          / ─  ─\
          |   (●)(●)|
     ____. .|   (__人__) |
   /      \   ` ⌒´  ノ
  /  ─    ─\       .}
/    (●)  (●) \     }
|       (__人__)    |    ノ.ヽ
/     ∩ノ ⊃  /∩ノ ⊃|  |
(  \ / _ノ |  |/ _ノ |  |
.\ “  /__|  | /__|  |
  \ /___ //___ /


ぐぬぬ・・
およそ指紋には見えない。。

データは完全に取れているようなので通信系は問題ない模様。
チェックサムも問題ない。
こりゃ困ったぞ。暗号化とかされてる様子も無い。


んでもってまたまた、ggrまくり。
そこで妙なソフトを拾った。


イメージ 5


SFGDemoV2.0

怪しさ抜群だがとりあえず試してみる。
Arduinoにはシリアルをそのままスルーするプログラムを書き込む。

イメージ 10


adafruitのサンプルにblankがあったのはこれで使うためか。

イメージ 6


見事に検出!!!
(赤の四角は自主規制)


むむ、じゃあ結局何がおかしいのか。。


調べまくって、ぐぬぬを繰り返しながらようやく原因が判明。


GenImg(0x01)を送ってからでないと正常に画像が取得できないのであった。

早速、GenImgを送ってから画像取得!!

イメージ 7


おおーーーー!!  ・・・??


            / ̄ ̄\       ??
          / ─  ─\
          |   (●)(●)|
     ____. .|   (__人__) |
   /      \   ` ⌒´  ノ
  /  ─    ─\       .}
/    (●)  (●) \     }
|       (__人__)    |    ノ.ヽ
/     ∩ノ ⊃  /∩ノ ⊃|  |
(  \ / _ノ |  |/ _ノ |  |
.\ “  /__|  | /__|  |
  \ /___ //___ /



なんか途中で切れてるぞ。
さすがにこれはおかしい。。

どうも、Arduinoのシリアルでオーバフローしているらしい。
センサー側は、9600まで落として全力でHWシリアルに出しているのだが、追いつかない場合がある模様。
シリアルは重いみたいだな。
ただ、だいたいコツはつかんだので、まずはPCのアプリのみで取得できるように実装。

基本的に以下の2つのコマンドを書き込むだけで画像を取得できる。

0xEF 0x1 0xFF 0xFF 0xFF 0xFF 0x1 0x0 0x3 0x1 0x0 0x5
0xEF 0x1 0xFF 0xFF 0xFF 0xFF 0x1 0x0 0x3 0xA 0x0 0xE

イメージ 8


おーー。完璧!!
なお、画像取得コマンドで、途中でデータを取得しないでリセットとかするとセンサーがハマったままになったりするので注意。
とにかく全データ取りきることが重要。


とりあえず、画像が取れることは確認できたので、今度はこれを表示するにはどうすればよいか考える。

画像サイズは、256*288だ。
結構でかいので画像をフルに出せるグラフィック液晶はあまりない。
そいでもって前に買った4Dsystemsの uLCD28PT(SGC) を採用する。
解像度は、240x320 なので、どうやってもハミ出すのだが、まあ隅っこのデータは重要でないので大丈夫だろう。

基本的に、1ライン受信ごとに、1ライン描画すれば丸く収まるのだが、この描画が遅くてセンサーからのデータ受信に追いつかずオーバフローしてしまう。
シリアルが、オーバフローすると、センサー側はデータの転送を止めてしまうので厄介だ。
ちなみに、センサーとは9600bps、LCDとは115200bpsという全力仕様なのだが、これでも追いつかない。

1ラインごとに描画するのは不可能だ。
であれば、どこかに保存しておけばいいのではないか!?

幸いなことに、uLCD28PTにはSDスロットがついており、SDカードに保存できる。

早速実験・・・

やはりシリアルが絡むので、途中で止まってしまう。


ぐぬぬ・・・・。
万策尽きたか。
メモリに保存できればいいが、普通のArduinoだと、2KBとかそこら。Dueで96KBらしいので全部オンメモリできるけど高い&3.3V駆動かよ。。


Arduinoで外付けメモリ的なものないのかよってggrってたら


あった!

23K256

イメージ 9
(C) スイッチサイエンス

だがしかし、23K256は32KBで、画像データは36KBである、4KBほど入らんがまあ
どうせLCDも全部表示できないので両サイドを切り落として、32KBに収まるようにうまいことやることにする。

これまたありがたいことにすぐに使えるArduinoライブラリ付き!
SPIなんで高速化が期待できる。だがしかし油断はならんぞ。
これが最後のチャンスだ。


イメージ 11


せっせとワイアリングして

イメージ 12

実行!!スキャン!


イメージ 13


おおおーーーー!!キターーーーー。

1ラインごとにSRAMに書き込む。
心配していた書き込み速度だが若干余裕があるようだ。
進捗も表示したかったので、間引きながら受信データ量を表示する。
この進捗も毎ラインごとに表示するとハマる。受信ループはかなりシビアな感じだ。

全データ受信できればこっちのもの。
あとはゆっくり描画すればよい。




途中からなんか方向性が違ってきたような気もするが、いろいろArduinoの限界と可能性を感じたプロジェクトでした。

閉じる コメント(0)

コメント投稿

顔アイコン

顔アイコン・表示画像の選択

名前パスワードブログ
絵文字
×
  • オリジナル
  • SoftBank1
  • SoftBank2
  • SoftBank3
  • SoftBank4
  • docomo1
  • docomo2
  • au1
  • au2
  • au3
  • au4
投稿

開く トラックバック(0)


.


プライバシー -  利用規約 -  メディアステートメント -  ガイドライン -  順守事項 -  ご意見・ご要望 -  ヘルプ・お問い合わせ

Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.

みんなの更新記事