M5StackをVSCODEとPlatformIOで開発する場合にはまったこと(メモ)

M5SATACKの開発をVSCODE + PlatformIOで開発するときにいくつかはまった（いまも抜け出せないもの多数）あるので備忘録として作成。
とくにPlatformIOの売りであるライブラリの依存性管理機能LDF(Library Dependency Finder)の使い方を調べて書きたいのだけど、長くなってしまうのでそれは[次の記事](https://qiita.com/watarukato/items/455c74c625e178de385d)で書くことにする。


## モチベーション
今までローカルのArduinoIDEや、オンラインのArduino Web EditorをつかってArduinoで、Lチカなど簡単な電子工作を楽しんできた。
けど、色々作ったり試したりするうちに2つの問題点が出てきた。

1. プログラミング初心者なので、入力候補など適宜アシストしてくれる高機能なIDE欲しい。
2. 家の環境はwindows or Windows Subsystem for Linux、職場の環境はmacなので、OSを気にせずつかえるEditorが欲しい
3. 色々なライブラリをダウンロードして利用するうちに、ライブラリ間のファイル名の競合とか、その手直しとか出てきて、ごちゃごちゃしてきて辛い。

こんな悩みを解決するのに良さそうだと思ったのが、Visual Studio Code + PlatformIOの組み合わせだった。
VSCodeとそのArduino拡張機能だけでも1.2の課題だけなら充分かもだけど、3のライブラリの競合を避けたいのでPlatformIOの活用を選んだ次第。
こいつが、今回のはまりポイントの悩みの種でもある。

## VS CODE + PlatformIOの導入(windows)

[導入の参考](https://qiita.com/lutecia16v/items/1c560bdd7eac7ebeaff7)
ここらへんを参考にさくっと。

使い方の流れは、PlatformIOで使いたいライブラリ（例えばM5StackとかM5Stack-Avatorとか）をインストールして、新規Projectを利用するboardに合わせて作成して、構成ファイルのplatformio.iniを適宜変更して、srcフォルダ内のmain.cppにプログラムを書いて、Buildして、M5stackにuploadする。

公式にも紹介されているこの[Tutorial動画](https://www.youtube.com/watch?v=0poh_2rBq7E)がわかりやすい。

ArudinoIDE使うより、多少複雑にはなるけど、まあ大丈夫だろと気軽な気持ちで始めてみた。

## はまりポイント
はまったポイントは大小あるけれど今の所4つくらい。とくに4つ目のライブラリの管理のところがPlatformIOの売りでもあるから、早くここを自由に使いこなせるように理解したい。

1. ArduinoIDEでは不要だったArduinoIDE環境を使う宣言と関数のプロトタイプ宣言が必要
2. platformio.iniの編集可能項目の全貌がつかめない。Serial Monitorの通信速度どうやっていじろう。
3. Projectのリネームができない。
4. ライブラリの依存性管理機能LDF(Library Dependency Finder)の使い方に慣れない。

1~4を順に記載していこう

###  ArduinoIDEでは不要だったArduinoIDE環境を使う宣言と関数のプロトタイプ宣言が必要

#### Frameworkの標準SDKの利用にインクルードで明示する

まず、PlatformIOでは、Frameworkの標準ライブラリ(SDK？)を利用するために、インクルードしてあげる必要がある。

```main.cpp
#include <Arduino.h>
```
ただし、ライブラリのM5Stackを利用して
```#include <M5Stack.h> ```
を書く場合は、M5Stack.hでArduino.hを読んでくれるので不要。

####　自作関数のプロトタイプ宣言をしておく

また、ArduinoIDEだと自作関数の記述は、void set(){}とvoid loop(){}の後に記述・定義しても、ArduinoIDEがうまいこと処理してBuildしてくれたけど、VSCODE + PlatformIOでは自作関数が利用される前に記述しないとBuildが失敗する。
こいつは非常に困った。

（本音） ~~このままだとネットに落ちてるsketchコピペして動かない~~
（建前）メイン処理の前に、だらだらと関数定義を書くとコードの見通しが非常に悪くなる

#### 解決方法

コードの頭の方でプロトタイプ宣言しておく

```
void DAC_Create();
void DAC_Release();
int DAC_Write(int hoge, int16_t *huga);
void Play(const char *hugo);

```
こんな感じで型　関数名　引数をダミーでつくってあげて、後から定義してあげればよい。

### platformio.iniの編集可能項目の全貌がつかめない。Serial Monitorの通信速度どうやっていじろう

Serial MonitorをみるこはVSCODEのPlatformIOの画面で、下のツールバー(？)に出てくるコンセントマーク(PlatformIO: Serial Monitor)をクリックすればよいのだけど、この通信速度をどうやって変更するのかわからず半時くらい消化した。

#### 解決方法
platformio.ini (Project Configuration File)に追記する

おそらく、PlatformIOの一つの長所がこのProject Configuration FileをいいようにいじるとProject毎の設定がしやすいし、新しいProjectでも再利用しやすいし、CLIからも変更できるのでプログラミング強者には非常に便利なのだろう。
でも、私のようにプログラミング弱者だと、UIからポチポチ変更できる気軽さがないのでちょい辛い。

これがPlatformIOのProjectを
+ Board: M5Stack Core ESP32
+ FrameWork: Arduino
で作成したときのDefalutの設定ファイル

```platformio.ini
 ...
[env:m5stack-core-esp32]
platform = espressif32
board = m5stack-core-esp32
framework = arduino
```

この[env]セクション以下にこんな感じで追記するとSerial Monitorの通信速度を変更できる。

``` platformio.ini
...
[env:m5stack-core-esp32]
platform = espressif32
board = m5stack-core-esp32
framework = arduino
monitor_speed = 115200 
```

[platformio.iniの公式ドキュメントはこちら](https://docs.platformio.org/en/latest/projectconf.html)


### ProjectのDeleteとリネームできない

正しくは、ProjectのDeleteとリネームがPlatformIO単独ではできないという表現が正確かな。
PlatformIOのUIでProject Folderを右クリックすれば、Remove Folder From Workspaceという選択はあるけど、これはあくまでVSCodeのWorkspaceから外すだけ。

#### 解決方法
Deleteしたい場合は、VSCodeでRemove Folder操作後にPlatformIOのProjectが存在する場所から該当のProject Folderを消せばOK

例えば、私の環境なら、quita testというProjectを消すなら、この階層のquita testというフォルダを消してあげればよい。
``` "C:\Users\xxxxx\Documents\PlatformIO\Projects\quita test" ```

リネームしたい場合は、VSCodeでRemove Folder操作後に、変更したいProject folderの名前を直接変更してあげて、PlatformIOのホーム画面で、Open Projectで変更したフォルダを開けばOK。

### ライブラリの依存性管理機能LDF(Library Dependency Finder)の使い方に慣れない。

ここが今回の記事で書きたかったポイントなんだけど、ずいぶん長くなっちゃったので、[次の記事](https://qiita.com/watarukato/items/455c74c625e178de385d)にしよう。