指紋スキャナーモジュールGT-521F52のArduino用ライブラリをVSCodeのPlatformIOで扱えるようにする

#M5Stackの開発に統合開発環境を導入する
さて前回 [指紋スキャナーモジュール　GT-521F52をM5stackで動くようにしてみる　デモ編](https://qiita.com/puraban/items/376f185f7502bfcaa93f)でM5stackにコードを移植していくと書いたのですが、その前にやっておくことがあります。それは**統合開発環境の導入**です。
Arduino系標準のArduinoIDEってちょっとしたコードを書くのにはシンプルでいいんですが、ライブラリをばらしたりするようになると力不足です。
例えば補完機能は便利ですし、ライブラリを解読するときに変数や関数の定義にキー入力で飛べるようになると効率が格段に上がります。
そこで、マイコン開発用の統合開発環境を導入してみます。
VisualStudioCodeに**PlatformIO**というプラグインがあるので導入してみます。
参考にしたのはこちらの記事[M5Stackの開発環境を整える - PlatformIO IDE編](https://qiita.com/lutecia16v/items/1c560bdd7eac7ebeaff7)です。
この記事でM5Stackサンプルプログラムを書き込めるようになりました。
まずはここまでです。
![DSC_0340.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216739/6326a4a9-f749-c830-1887-ae89090f43f8.jpeg)

#PlatformIOでGT-521F52のライブラリを取り扱うにはどうするか
さて、問題はここからです。PlatformIOでプロジェクトを作って、[公式のガイド](https://learn.sparkfun.com/tutorials/fingerprint-scanner-gt-521fxx-hookup-guide?_ga=2.214585874.40579103.1521421384-1937571979.1501724101)にある[GitHubのArduino用のライブラリ](https://github.com/sparkfun/Fingerprint_Scanner-TTL)を、どうすればPlatformIOで取り扱い、コンパイルし、書き込めるようになるのかということについて少し手間取りました。まあわかってしまえば簡単なのですが。

##必要なファイル
GT-521F52をM5stackで動作させるために必要なファイルは３つです。
###サンプルプログラム1つ
サンプルファイル[examples](https://github.com/sparkfun/Fingerprint_Scanner-TTL/tree/master/examples)には
**FPS_Blink**（動作チェック用のLチカプログラム）
**FPS_Enroll**（読み取った指紋をセンサに登録する）
**FPS_IDFinger**（読み取った指紋が過去に登録されたものかチェックする）
の3つのサンプルファイルがあります。
動作が複雑になると追いきれなくなるかもしれないのでとりあえずは[FPS_Blink](https://github.com/sparkfun/Fingerprint_Scanner-TTL/tree/master/examples/FPS_Blink)でいいでしょう。
拡張子inoはArduinoIDEのものなので、一般的な拡張子cppに変更しました。
###ライブラリのファイル2つ
[src](https://github.com/sparkfun/Fingerprint_Scanner-TTL/tree/master/src)においてある
**FPS_GT511C3.cpp**
**FPS_GT511C3.h**
の2つがライブラリを構成しています。
拡張子hがヘッダファイルでライブラリのオブジェクトや変数、関数の定義が書き込まれています。
拡張子cppはライブラリの本体で、オブジェクトの処理が書いてあります。
こちらはファイル名を変える必要はとくにありません。

##ファイルの置き場
これらのファイルをPlatformIOでM5Stackのプロジェクトを作成して、フォルダに配置します。
そしてファイルの置き場所についてですが、PlatformIOで作ったプロジェクトフォルダの**lib**フォルダにある**README**を読めば解決します。
以下google翻訳です
>このディレクトリは、プロジェクト固有の（プライベート）ライブラリを対象としています。
>PlatformIOはそれらを静的ライブラリにコンパイルし、実行可能ファイルにリンクします。

>各ライブラリのソースコードは、独自の個別のディレクトリに配置する必要があります
（ "lib / your_library_name / [ソースファイルはこちら]"）。

>たとえば、次の2つのライブラリ `Foo`と` Bar`： `Bar`の構造を参照してください。

>|--lib
>|　|
>|　|--Bar
>|　|　　|--docs
>|　|　　|--examples
>|　|　　|--src
>|　|　　　　|- Bar.c
>|　|　　　　|- Bar.h
>|　|　　|- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html
>|　|
わ>|　|--Foo
>|　|　　|- Foo.c
>|　|　　|- Foo.h
>|　|
>|　|- README --> THIS FILE
>|
>|- platformio.ini
>|--src
>　　|- main.c

これを要約すると
**プログラム本体はプロジェクトフォルダのsrcフォルダに入れてください(main.c)**
**ライブラリは、ライブラリ用のフォルダを作って、そこに入れてください(Foo.h,Foo.c)**
となります。
**libフォルダに直接ライブラリのファイル(Foo.h,Foo.c)を入れても動きません。**
大事なところです。
私は**やらかしました**。
まだREADMEは続きます
>そして、 `src / main.c`の内容：


```
#include <Foo.h>
#include <Bar.h>

int main (void)
{
  ...
}
```
>PlatformIO Library Dependency Finderは自動的に依存関係を見つけます
>プロジェクトソースファイルをスキャンするライブラリ。

>PlatformIO Library Dependency Finderの詳細
>-https://docs.platformio.org/page/librarymanager/ldf.html

READMEファイルはここまでです
つまりライブラリごとのフォルダを作って、そこにライブラリのファイルを入れておけば、

```
#include <Foo.h>
#include <Bar.h>
```

という一般的なヘッダファイルのインクルードをすることで、PlatformIOがlibフォルダの中を探してくれるということです。
なのでファイルの配置はこうなります。
![フォルダ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216739/8db7e185-2aee-dda9-d202-65b8c1397f42.png)
**srcフォルダ**にはサンプルプログラムファイル**main.cpp**(名前は変更しています)
**libフォルダ**には**FPS_lib**というフォルダを作って、その中にライブラリを構成する**FPS_GT511C3.cpp**と**FPS_GT511C3.h**を入れます。
これで開発環境の準備は完了です。

当然ですがこのままビルドしてもエラーが出て動きません。
しかし、統合開発環境での取り扱いができるようになりますので、ここから読み解いていきましょう。