ArduinoをVSCodeで書ける……だけじゃない！！PlatformIOのすゝめ👽️

# この記事を読むと…
- PlatformIOの強みが分かる
- PlatformIOで開発する上での注意点、ArduinoIDEとの違いが分かる

# 要約
- PlatformIOは **VSCode** が使えるのが何より良すぎる
- LSPがちゃんと動くのもソースファイルを分割できるのもdependenciesが明確なのもちゃんとしたC++を使えるのも良すぎる
- でも初学者には扱いにくいかも

# はじめに
みなさん、Arduino開発をするとき、何のツールを使っていますか？？
やはり最もポピュラーで初心者にも優しい Arduino IDEを使っている人が多いのではないでしょうか。

今回紹介するのは、 **PlatformIO** と呼ばれる、ArduinoIDEと並行して存在するマイコンボード開発ツールです。

この記事ではPlatformIOの強みと特徴を紹介します。
(環境構築や導入方法についてはまた別の記事を書く予定です。)

:::note
VSCodeでArduino開発をする方法を調べている方は、PlatformIOではなくVSCode-Arduinoという拡張機能も見かけているかもしれません。

両者の違いは下の記事で解説しているので、参考にしてください。
:::

https://qiita.com/kotek/items/4fcf519a5d080c6fe626

↓ 公式サイト

https://platformio.org/

↓ 開発画面 (上の公式サイトより引用)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1777479/af3d7a1d-8303-4606-8151-c5cc5476b67c.png)

# PlatformIOの紹介
- マイコンボード開発をするための開発環境
- VSCodeの拡張機能
- ArduinoIDEよりも高機能
- 自動補完、エラー表示などが使える！
- ボードへの書き込みやシリアルモニタなどArduinoIDEと同等の機能も使用可能！
- ArduinoIDEとの互換性は無し

# Arduino IDEとの違い
### プロジェクトの構造
#### ArduinoIDE
```
MyProject/
├── MyProject.ino
└── MyFunctions.ino  # ファイル分割する場合
```
#### PlatformIO IDE
```
MyProject/
├── .pio/
│   └── # 依存環境のソースなど
├── src/
│   └── main.cpp
└── platformio.ini  # 設定ファイル (依存環境などもここに記述)
```

### 文法
| 項目 | ArduinoIDE | PlatformIO |
|:-:|:-:|:-:|
| #include \<Arduino.h\> | 不要 | 必要 |
| プロトタイプ宣言 | 不要 | 必要 |
| ヘッダファイル | 不要 | 必要 |
| 拡張子 | .ino | .cpp, .hpp, .c, .h, ... |
| エントリポイント | <プロジェクト名>.ino | main.cpp |
| std::vectorなどSTL機能 | ほぼ ✕ | ◯ |
| 例外処理 (try-catch) | ✕ | ◯ |

### ライブラリのソースの場所
#### ArduinoIDE
バラバラ (Arduino IDEと一緒) です。
(Windowsだったら、 `..\Documents\Arduino\libraries\` や `..\AppData\Local\Arduino15\` など)

#### PlatformIO
プロジェクト内の、 `.pio\libdeps\` にまとまってる。
しかも依存環境の情報も設定ファイル (`platformio.ini`) に書き込まれる…！！

# PlatformIOの強み
### VSCodeが使える
やはりPlatformIOの一番の嬉しみは、ArduinoIDEではなくVSCodeで開発ができることです。ArduinoIDEを卒業したくてこの記事にたどり着いた人も多いのではないでしょうか。

VSCodeを使ったことがない人向けに紹介すると、VSCodeとは **世界で一番使われているプログラミング用エディタ** です。ArduinoIDEと比較しても圧倒的に多機能・高性能で、他のプログラミング言語やテキストも書けるのでオススメです。

:::note
実は、ArduinoIDEはv2.0.0のリリースから内部にVSCodeを含んでいます。v2.0.0からはこのおかげでエディタのUI・UXがずっと向上し、ついに補完機能も使えるようになりました。
(それでも開発体験はVSCode & PlatformIOには勝てませんが…)
:::

VSCodeの強みとして挙げられるのはやはり **豊富な拡張機能** ではないでしょうか。自分は[VSCode-Neovim](https://github.com/vscode-neovim/vscode-neovim)という拡張機能を使ってVimで普段プログラムを書いてるので、正直ArduinoIDEじゃまともに書けないです…🫠

### 自動コード補完、エラーの静的解析などが使える
PlatformIOでは、変数名などの **予測候補や構文エラーの波線** がしっかり表示されます。
(予測候補の表示は「自動コード補完」や「Intellisense」、構文エラーの波線表示は「静的コード解析」などと呼ばれます。)

その他にも、F2で変数名などの一括リネームができたり、F12で関数やクラスの実装に移動できたりと、 **挙げればきりが無いほどの入力支援機能** を使うことができます。

↓ 自動補完の様子

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1777479/8d4d6cd9-3819-40e4-af76-77c174255bd0.png)

↓ エラー表示の様子

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1777479/512fbb9a-c0b6-472a-a89b-73705f8ec889.png)


### ソースファイルを分割できる
**コードを複数のファイルに分割できる** のもPlatformIOの強みの1つです。コードを機能ごとに分割することによって、可読性・保守性が向上して制作物の質を高めることができます。

一応ArduinoIDEでもファイル分割をすることができますが、こちらはフォルダによるファイル整理には対応していません。

さらに、ArduinoIDEのファイル分割は全ファイルの内容を単純にくっつけるだけなのに対して、PlatformIOでは一般的なC/C++のリンクが使われているため、includeやその他のマクロによってコードの順番やスコープ範囲をコントロールすることもできます。

↓ ファイル分割の例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1777479/47a74f28-a925-441d-b100-d6ef1a021df7.png)

### 依存環境が明確
PlatformIOではプロジェクト内のplatformio.iniというファイルにプロジェクトの設定を記述します。ここには使用しているフレームワークやライブラリなどの依存環境の情報が記載されます。
そのため、以下のようなたくさんのメリットがあります。

- 既存のプロジェクトをPlatformIOで開くだけで自動的に必要なフレームワークやライブラリがインストールされる
- プロジェクトにライブラリのバージョンも記述されるため、勝手にライブラリが更新されて動かなくなる・他人のパソコンでは動かないなどのトラブルは発生しない
- ライブラリのソースファイルもプロジェクト内の `.pio/libdeps/` に保存されるので、依存がプロジェクト内で完結していてシンプル
- platformio.iniに行を追記するだけで簡単にライブラリを追加できる
- 一目で依存環境を把握できる

### ピュアなC/C++が使える
ArduinoIDEではArduino言語で開発をするのに対し、 **PlatformIOでは一般的なC/C++を使って開発をします** 。

Arduino言語はC/C++を拡張した言語で、初心者でも扱いやすいようにC/C++の複雑な部分を隠すように作られています。
例えば、

- プロトタイプ宣言は不要
- 複数のファイルに分割するとinclude無しで結合してくれる
- Stringクラスなどの提供によってメモリ管理を意識する必要を無くしてくれる

等が挙げられます。

しかし、ある程度以上の規模のコードを書こうとすると、細かい挙動についてこうしたArduino言語独自の仕様によって皺寄せをくらうことがあります。
一応 [Arduino言語についての公式ドキュメント](https://docs.arduino.cc/language-reference/) は存在しますが、細かい仕様については、世界中で使われているC/C++の方がずっと情報も多い上に、安定もしています。

PlatformIOでは言語の仕様はC/C++に準拠しており、 **C/C++のコードは完全に動きます** 。その上、Serial.print()やStringクラスなどのArduinoライブラリの機能もサポートされており、無駄なボイラープレートが増えることもありません。
(ArduinoIDEのコードもほとんどそのまま動きます。)

# 初心者の方は注意
基本的にはArduinoIDEよりも高機能なPlatformIOですが、最大のハードルは **自分で使い方を調べなければいけない** ということです。インターネット上の記事は、どれもArduinoIDEを前提として書かれています。ArdiunoIDEの操作をPlatformIOの操作に変換したり、PlatformIO固有の問題に当たったときに自分で調べるのが難しい初心者の方は、まずはArduinoIDEで開発に慣れることをオススメします。

ArduinoIDEほどではないにしろ、PlatformIOについての情報もある程度はネット上で記事が書かれている他、[公式ドキュメント](https://platformio.org/)が充実しているので困ったときには読んでみるといいと思います。

# まとめ
PlatformIOはArduinoIDEよりも高機能・安定なマイコンボード開発ツールです！サークルやチームで中規模以上の開発や複数人での開発をするなら、ほぼ必須だと思います。

PlatformIOを導入して、快適なArduinoライフを！！