セキュリティ検証をやってみよう！！～指紋認証デバイス製作～ 

#用意するもの
1.Arduino(今回は[Arduino Uno](https://www.amazon.co.jp/Arduino-Rev3-ATmega328-%E3%83%9E%E3%82%A4%E3%82%B3%E3%83%B3%E3%83%9C%E3%83%BC%E3%83%89-A000066/dp/B008GRTSV6)を使用)
2.USBケーブル　type-B
3.[ジャンパーケーブル](https://www.amazon.co.jp/%E3%82%B5%E3%83%B3%E3%82%B3%E3%83%BC%E9%9B%BB%E5%95%86-UL1007-%E8%80%90%E7%86%B1%E3%83%93%E3%83%8B%E3%83%AB%E7%B5%B6%E7%B8%81%E9%9B%BB%E7%B7%9A-UL1007-AWG-28/dp/B071Z6HWKM/ref=sr_1_6?dchild=1&keywords=%E9%9B%BB%E7%B7%9A&qid=1625622644&sr=8-6)
4.ブレッドボード
5.[指紋認証センサ(FPM10A)](https://www.amazon.co.jp/gp/product/B07Y89MR83/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1)

※5のFPM10Aは海外製で、Amazonなどの通販サイトでは同仕様の製品が複数あります。
買う際に到着日はよく確認して選定して下さい。
（私は1度税関で止められ、買い直しました。）

#指紋認証センサ
![MicrosoftTeams-image (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1628744/8d482059-babe-6216-570b-21fe61db80a8.png)
これが指紋認証センサです。
電源、GND、TX、RXの4つのケーブルで接続されます。
(TX,RXでシリアル通信により、データの送受信が行われます。）
赤枠の部分に指を置いて認証します。

#ケーブル
コネクタのケーブルを補強します。
![コネクタ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1628744/2bcd91ff-f0ee-1ec8-ab23-a8a937e8c2c7.png)
赤枠部はブレッドボードに差し込む際には細すぎるので、ジャンパーをはんだ付けして補強します。
![コネクタ (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1628744/bf79029b-3034-12aa-b579-dda39d51f509.png)
補強するケーブルは使う箇所だけで大丈夫です。

#指紋認証センサ（FPM10A)とArduinoの接続
FPM10Aのピン番号右から1番目です。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1628744/b72e37f9-e233-af08-579e-1c788ab04bdd.png width="50%">

ケーブルは以下のようにします。

| FPM10A | Arduino Uno |
|:--:|:--:|
| 1.VCC（赤） | 5V |
| 2.GND（黒） | GND |
| 3.TX（黄） |  D2 |
| 4.RX（白） |  D3 | 
＊FPM10Aの5,6はNCです。ケーブルの色は購入するものによって、違います。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1628744/79ad3479-8148-75e2-9a84-59f9a1a84779.png width="60%">
抵抗やコンデンサは必要ありません。
配線の設定はこれで完了です。
#Arduino環境構築
今回、OSは**Windows**を使用しました。

以下のアドレスよりダウンロード、インストールしてください。 
https://www.arduino.cc/en/main/software

また、FPM10A用のライブラリをダウンロード,解凍し、ライブラリに保存してください。 
https://github.com/adafruit/Adafruit-Fingerprint-Sensor-Library/archive/master.zip

#指紋の登録
Arduino IDEで`ファイル＞スケッチ例＞Adafruit Fingerprint Senosr Liberary＞enroll`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1628744/a8d4839a-5b9e-791d-e0dc-ba91fdc11898.png)
`#if`～`#end if`の間で`SoftwareSerial mySerial(2, 3);`だけを残し、あとはコメントアウトしてください。

```cpp:enroll
//#if (defined(__AVR__) || defined(ESP8266)) && !defined(__AVR_ATmega2560__)
// For UNO and others without hardware serial, we must use software serial...
// pin #2 is IN from sensor (GREEN wire)
// pin #3 is OUT from arduino  (WHITE wire)
// Set up the serial port to use softwareserial..
SoftwareSerial mySerial(2, 3);

//#else
// On Leonardo/M0/etc, others with hardware serial, use hardware serial!
// #0 is green wire, #1 is white
//#define mySerial Serial1

//#endif
```

ボードの設定は以下のようになります。
`ツール＞ボード＞ボードマネージャー`より`Arduino Uno`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1628744/a7408248-aac3-a69b-3ece-fc83f5303329.png)

USBケーブルをArduinoに接続し、`シリアルポート`を確認して、「書き込み」をクリックします。
![sozai1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1628744/a45cf944-3bfe-d92b-fb76-1fb2df773b26.png)

書込みが完了すると、赤枠のメッセージが表示
シリアルモニタ（黄枠）をクリックします。
![sozai2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1628744/a592dac4-22de-e149-65d0-d7ffbf88e99d.png)

シリアルモニタが以下のように表示されれば、指紋登録の待ち受け状態です。
ボーレート（赤枠）が`9600`になっているか確認してください。
![sozai3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1628744/ff5760a2-accc-aa1e-1641-fe735fbfc2ee.png)

1～127の数字を最上部の入力フォームに入力します。この数の範囲で指紋を登録できます。
数字を入力し、センサに指を当てると登録処理が開始します。
認識すると、赤枠のようにIDが表示されます。
![sozai4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1628744/3703e3cd-a746-8697-3d1a-e2df7d97527a.png)

もう一度、同じ指を当てて、赤枠の`Stored!`が表示されれば、登録完了です。
![sozai5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1628744/1b16b21f-558d-c7ec-1e7c-d5eadbf893cf.png)

#指紋認証テスト
Arduino IDEで`ファイル＞スケッチ例＞Adafruit Fingerprint Senosr Liberary＞fingerprint`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1628744/bb72c247-b70f-d83d-aa94-468b68753a91.png)
`enroll`と同じように初期宣言を編集します。

```cpp:fingerprint
//#if (defined(__AVR__) || defined(ESP8266)) && !defined(__AVR_ATmega2560__)
// For UNO and others without hardware serial, we must use software serial...
// pin #2 is IN from sensor (GREEN wire)
// pin #3 is OUT from arduino  (WHITE wire)
// Set up the serial port to use softwareserial..
SoftwareSerial mySerial(2, 3);

//#else
// On Leonardo/M0/etc, others with hardware serial, use hardware serial!
// #0 is green wire, #1 is white
//#define mySerial Serial1

//#endif
```

「書込み」をクリックし、シリアルモニタに`No finger detected`と表示されます。
また、センサのLEDが点滅します。
![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1628744/d0eb4588-d300-f0f5-a72d-442d05c776eb.gif)

指を当てた時、成功した場合、IDの番号と整合率（`confidence`）が表示されます。
失敗した場合、`Communication error`が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1628744/3da1b286-3f6e-b299-5a5a-76c2d3d2898f.png)

所感ですが、センサの精度はスマホに内蔵されてるものと比べると、比較的高いように思います。
（接触部の表面積が大きいから？）

#参考
Arduino MicroとFPM10Aで指紋認証し文字出力させました。
https://qiita.com/yasui_teco/items/476ddd34a51b1429eee9

#次回、ファームウェア解析をやっていきます。