Arduino MicroとFPM10Aで指紋認証し文字出力させました

##はじめに
私はマイコンボード Arduino Micro と 光学指紋指紋モジュール FPM10A を使って、簡単な電子工作をしました。
指紋認証し定型文を出力させるまでの手順を細かくまとめておきます。

##準備
次のものを揃えてください。

- [Arduino Micro](https://www.switch-science.com/catalog/1120/)
- [FPM10A指紋認証モジュール] (https://www.amazon.co.jp/gp/product/B07PHTRHXR)
- [ジャンパワイヤ](https://www.amazon.co.jp/gp/product/B073ZDYJQQ) (4本オスがあれば十分ですが)
- [ブレッドボード](https://www.switch-science.com/catalog/2283/)
- microUSBケーブル
- [はんだこて](https://www.yodobashi.com/product/100000001000632541/)
- [はんだこて台](https://www.yodobashi.com/product/100000001000594278/)
- [はんだ](https://www.yodobashi.com/product/100000001002587666/)
- 絶縁テープ (or ビニールテープ)

####Arduino について
よく比較される Raspberry Pi と違い OSや無線通信はありませんが、安価で手に入り、簡単なものを作るのに適しています。
また、Arduino IDE により、短時間でコーディング〜テスト〜コンパイル〜ボードへの書き込みまで出来ます。
今回 Arduino Micro を使用している理由は私の好みです。他の Arduino でも出来ると思います。(UNO は動作確認済み)

Arduino IDE はこちらからダウンロード、インストールしておいてください。
https://www.arduino.cc/en/main/software

####FPM10A について
指紋認証モジュールも色々出ており、価格もピンからキリでしたが、とにかくやってみたかったので比較的安めの物を選びました。
[公式ドキュメント](https://uamper.com/products/datasheet/FPM10A.pdf)が分かりやすいので、見ながらすすめていくと良いかと思います。

---
それでは準備完了ということで、配線からやっていきます。

##配線
まず、FPM10A に付属のケーブルはそのままでは Arduino に繋ぐことができないので、ニッパーかハサミで切って、ジャンパワイヤとはんだ付けをしてください。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316903/850f3278-544d-a40e-01bf-8965b838e517.jpeg" width=80%>

次に、ブレッドボードに Arduino を差し込み、FPM10A を[公式ドキュメント](https://uamper.com/products/datasheet/FPM10A.pdf)に記載のとおりに繋ぎます。
6本ありますが、2本は "Don't connect" です。

| FPM10A | Arduino Micro |
|:--|:--|
| VCC | 5V(3.3Vでも可) |
| GND | GND |
| TX | RX |
| RX | TX |

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316903/816f10ca-bed3-1b1e-cc5b-40001f5a2a83.jpeg" width=80%>

最後に、Arduino と PC を USBケーブルで接続してください。
センサーのバックライトが緑に光っていれば、少なくとも VCC の通電はしています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316903/44e17708-a043-e40d-d165-e242ed8cc0fb.jpeg" width=80%>
これで配線は完了です。

##Fingerprint Sensor library をインストール
こちらから Adafruit Fingerprint Sensor library をダウンロードしてください。
https://github.com/adafruit/Adafruit-Fingerprint-Sensor-Library/archive/master.zip

ダウンロードした Adafruit-Fingerprint-Sensor-Library-master.zip を解凍し、Adafruit-Fingerprint-Sensor-Library-master フォルダを "Adafruit_Fingerprint_Sensor_Library" にリネームして Arduino のライブラリ用ディレクトリにコピー、または移動してください。

Arduino のライブラリ用ディレクトリの場所は、Mac の場合 `書類>Arduino>libraries`、Windows の場合 `ドキュメント>Arduino>libraries` です。

##指紋を登録
####指紋登録処理を書き込み
Arduino IDE を起動し、`ファイル>スケッチの例>Adafruit_Fingerprint_Sensor_Library>enroll`を選択してください。
"enroll" という名前のスケッチのエディタが起動します。

今回 Arduino Micro を使うので、ハードウェアシリアルを使うため、コメントに記載のとおりにコードを調整してください。

```c++:enroll
// On Leonardo/Micro or others with hardware serial, use those! #0 is green wire, #1 is white
// uncomment this line:
#define mySerial Serial1

// 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)
// comment these two lines if using hardware serial
// SoftwareSerial mySerial(2, 3);
```

`ツール>ボード>Arduino/Genuino Micro`を選択し、`ツール>シリアルポート>/dev/cu.usbmodem14401 (Arduino/Genuino Micro)` を選択し、`ツール>シリアルモニタ`を開いておいてください。
このときシリアルモニタのボーレートは "9600bps" にしておいてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316903/204cb7ec-f247-8154-9efd-e3acb31c5b36.png)

"マイコンボードに書き込み" ボタンを押してください。
エディタのメッセージに "ボードへの書き込みが完了しました。" と表示されれば成功です。

失敗する場合は TX と RX のピンだけブレッドボードから抜いて、もう一度書き込みしてみてください。うまくいくはずです。

####指紋登録処理を実行
シリアルモニタを見てください。
マイコンボードへの書き込み処理を行ったあと、 `setup()`が実行されており、指紋登録の待受状態です。

```
Adafruit Fingerprint sensor enrollment
Found fingerprint sensor!
Ready to enroll a fingerprint!
Please type in the ID # (from 1 to 127) you want to save this finger as...
```

シリアルモニタの入力欄に 1 〜 127 の ID を入力し、"送信" ボタンを押してください。
1 を入力し、"送信" ボタンを押しました。

```
Enrolling ID #1
Waiting for valid finger to enroll as #1
```

と表示され、画面がスクロールされたら指をFPM10Aに 1秒程度置いてください。

```
Image taken
Image converted
Remove finger
ID 1
Place same finger again
```

もう一度。

```
Image taken
Image converted
Creating model for #1
Prints matched!
ID 1
Stored!
Waiting for valid finger to enroll as #1
```
これで指紋の登録が完了しました。

##指紋センサーのテスト
####テストを書き込み
FPM10Aで読み取った指紋を登録した指紋から探すテストをします。

`ファイル>スケッチの例>Adafruit_Fingerprint_Sensor_Library>fingerprint`を選択してください。
"fingerprint" という名前のスケッチのエディタが起動します。

enroll と同様に、ハードウェアシリアルを使うため、コメントに記載のとおりにコードを調整してください。

```c++:fingerprint
// On Leonardo/Micro or others with hardware serial, use those! #0 is green wire, #1 is white
// uncomment this line:
#define mySerial Serial1

// 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)
// comment these two lines if using hardware serial
// SoftwareSerial mySerial(2, 3);
```

"マイコンボードに書き込み" ボタンを押してください。
エディタのメッセージに "ボードへの書き込みが完了しました。" と表示されれば成功です。

####テストを実行
シリアルモニタを見てください。
マイコンボードへの書き込み処理を行ったあと、 `setup()`が実行されており、テストの待受状態です。

```
Adafruit finger detect test
Found fingerprint sensor!
Sensor contains 1 templates
Waiting for valid finger...
```

と表示されたら、指をFPM10Aに 1秒程度置いてください。

```
Found ID #1 with confidence of 136
```

FPM10Aで読み取った指紋と類似する指紋が登録されていれば、IDと信頼性が表示されます。

これでテストは完了です。

##本番処理
####本番処理を書き込み
いよいよ本番で使うプログラムを書き込みます。
今回は、FPM10Aで読み取った指紋が ID が 1 で登録した指紋であれば、Arduino の Keyboard ライブラリで定型文を画面に出力します。

`ファイル>新規ファイル`からエディタを開き、下記コードをまるごと貼り付けてください。

```
#include <Adafruit_Fingerprint.h>
#include <Keyboard.h>

#define mySerial Serial1

Adafruit_Fingerprint finger =  Adafruit_Fingerprint(&mySerial);
int fingerprintID = 0;

void setup() {
  Keyboard.begin();
  Serial.begin(9600);
  finger.begin(57600);
  if (finger.verifyPassword()) {
    Serial.println("指紋が見つかりました。");
  }
  else {
    Serial.println("指を乗せてください。");
    delayMicroseconds(10);
  }
}

void loop() {
  fingerprintID = getFingerprintID();
  delayMicroseconds(10);
  if (fingerprintID == 1) {
      Keyboard.print("hogehoge");
  }
}

int getFingerprintID() {
  uint8_t p = finger.getImage();
  if (p != FINGERPRINT_OK)  return -1;

  p = finger.image2Tz();
  if (p != FINGERPRINT_OK)  return -1;

  p = finger.fingerFastSearch();
  if (p != FINGERPRINT_OK)  return -1;

  return finger.fingerID;
}
```

"マイコンボードに書き込み" ボタンを押してください。
エディタのメッセージに "ボードへの書き込みが完了しました。" と表示されれば成功です。

####本番処理の動作確認
メモ帳を起動し、センサーに指を置いてください。
"hogehoge" が 出力されれば成功です。

##おわりに
マイコンプログラムには興味がありつつ、まだ着手していなかったので、個人的に作りたいものが作れてよかったです。

配線に関しては、あとできれいにやり直し、ケースに入れる予定です。
はんだスリーブというものもあるのを後から知り、はんだこてを買う前に知りたかったところです。

やったことがなく、興味がある方は是非挑戦してみてください。
Raspberry Pi を使って Python で IoT をするのも興味が湧いてたのでやってみたいと思います。

あと、このセンサーのバックライト眩しすぎますね。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316903/9ab84ce8-0d32-eb00-7769-780e02c641cf.jpeg" width=80%>