PlatformIOを使ってArduino IDEの補助輪を外す

こんにちは！筆者はクリスマスの季節になると、家族が恋しくなりミシガンの故郷が恋しくなるのですが、今年もやはりそうです。LabBase@Qiitaのアドベントカレンダーでポカポカ暖かく盛り上げていきましょう:santa:

# 概要

PlatformIOという組み込みソフト開発用のツールを使ってArduino系の基盤用のソフトを作りフラッシュする方法を紹介します。

# なぜArduino IDEが物足りないのか

Arduino IDEは素人向けであることはいうまでもないでしょう。ただ、筆者はそれを侮辱的な意味合いで言っているわけではなく、事実として述べているつもりです。Arduinoは、組み込み開発どころか、プログラミングにも経験がない人向けに考えられたプラットフォームです。それゆえに良くも悪くもシンプルです。

![Screenshot 2024-11-18 at 9.28.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/aadc7bad-1de5-b0ff-c038-8b55263be03b.png)
_引用：[Arduino IDE](https://www.arduino.cc/en/software)_

デバッグ用のモニターといい、基盤の選択といい、ライブラリー管理といい、全てが簡単にできるようになっており、環境構築関連の問題が極限に起きないように設計されていると感じます。実際にはとても使いやすくて申し分ないのです。

ただ、筆者と同じく、プログラミングの経験がある人なら物足りなさを禁じ得ないことでしょう。最も辛いのは、自動補完機能がないことです。

![Screenshot 2024-11-18 at 9.31.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/656e9221-d823-bb13-80c7-12445d2fa491.png)

これは痛いほどもどかしいのです。:joy:
これだけでもVS Codeが恋しくなります。

さらに、上級者にはArduino IDEが隠していることが気になるかと思います。初心者にわかりやすいのですが、実はArduino IDEはArduinoのライブラリーの`include`を隠しているのです。

![Screenshot 2024-11-18 at 9.47.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/24b10fd6-1d23-79ae-1088-308c8a0fe8a2.png)

こういった補助機能が中級者の足枷になったりするので、Arduino用のC++より実際のC++に触れた方が成長する上で必要な一歩だと感じます。

また大きめのプロジェクトでファイルを分けたり、C++のライブラリー機能が使えないのは重大な整理問題に発展するのは間違いないでしょう。

最後に、Arduino IDEはESP、STMも使えるようにしてくれる拡張がありますが、筆者は円滑とは言い難い経験をしています。やはり、Arduino IDEはArduinoの基盤に特化しているので、ESPをArduino IDEでプログラミングするくらい上達しているなら、より本格なIDEが必要でしょう。

自動補完がないこと、C++の機能が隠されていること、基盤メーカーの切り替えが難しいこと、成長している組み込み開発者には欲求不満の苦い味を残すArduino IDEです。


# PlatformIOとは？

PlatformIOは、多くの基盤メーカーのプラットフォームとソフトウェアフレームワークに対応した組み込みソフト開発ツールです。PlatformIOの最も優れているところは、深く知らずに多くの基盤向けのソフトを簡単に開発し、フラッシュすることができることです。多くの場合、同じソースコードをSTMにもESPにも、Arduinoにも使い回して大きくエラーが発生しないようにできています。

https://docs.platformio.org/en/latest/what-is-platformio.html

組み込み開発の最も難易度が高い問題の一つは、別々のメーカーのデバイスへのフラッシを管理することだと筆者は思います。Arduino IDEと同じように、PlatformIOはそのフラッシュする問題を解決してくれるのですが、Arduino IDEと違うのは、Arduino以外の基盤への互換性が非常に高いのです。

また、Arduino IDEと違って、ソフトのフレームワークも選べます。ESPのフレームワークも、STMCubeもさまざまなフレームワークを選んでプロジェクトを始めることができます。

![Screenshot 2024-11-18 at 10.08.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/01c6224c-45c5-2fa5-032e-787210ed9adb.png)

これらも、それぞれの独自のIDEではなく、すべて同じVS Codeで開発できるようになるので、違うツールを学習する手間を省くことができて、コードを書くことに集中できるのです。

Arduinoフレームワークを使うにしても、裏で動いていることを隠したりすることはないのです。バニラC++で開発ができるので、勉強している方にはありがたいのです。

![Screenshot 2024-11-18 at 10.12.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/1a75b237-6ac6-27d8-6d33-d7156856972c.png)

また、PlatformIOのプロジェクト管理でC++の大変なライブラリー管理ができるのです。例えば、DHTセンサーのライブラリーをプロジェクトに追加することは非常に簡単にできますし、バージョン管理までもPlatformIOがハンドルを握ってくれるのです。

![Screenshot 2024-11-18 at 10.15.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/30470899-05fa-9b6e-5ec3-05b89dbeef9d.png)

全ての機能をVS Codeの拡張子で獲得しているわけですから、VS Codeの利点は言うまでもなく全て活用できます。

# PlatformIOをインストールする

PlatformIOが中級者にいいことがわかったのでインストールしていきましょう。筆者はMacOSですが、基本的にVS CodeがインストールされていればPlatformIOの拡張プラグインを追加するだけでインストールできます。

https://marketplace.visualstudio.com/items?itemName=platformio.platformio-ide

ただ、筆者はなぜか上記の拡張プラグインでインストールのエラーが発生したので、PlatformIO CLIをインストールしてから再度VS Code拡張プラグインをインストールする必要がありました。

PlatformIO CLIをインストールするのに二つのやり方があります。一つはPlatform IOのインストールスクリプトを実行することです。

```
curl -fsSL -o get-platformio.py https://raw.githubusercontent.com/platformio/platformio-core-installer/master/get-platformio.py
python3 get-platformio.py
```

_引用：[Installer Script](https://docs.platformio.org/en/latest/core/installation/methods/installer-script.html)_

なお、上記のスクリプトを実行する前に、Pythonがインストールされていることをご確認ください。

それとは別に、homebrewにもPlatformIO CLIが入っているので、そこでバージョン管理がしたければ以下でインストールできます。筆者はこちらを使っています。

```
brew install platformio
```
無事にインストールすることができたら以下のようにCLIから実行できるようになります。

![Screenshot 2024-11-18 at 10.31.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/5e3425d8-f906-92b9-fab4-5a03b35c155e.png)


# Arduinoのプロジェクトを作り、フラッシュする

さて、インストールすることができたので、試しに新しいプロジェクトを作りましょう。VS Codeの拡張プラグインのインストールも無事に済めば、新規ウィンドウを開いてツールバーにホームアイコンが表示されます。

ツールバーに表示されなければ、`Cmd + Shift + P`でコマンドパレットを開いて`PlatformIO`で検索したらショートカットが表示されます。
![Screenshot 2024-11-18 at 10.34.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/a8dd4f5b-8cb3-cccb-10eb-64005a564778.png)

`View: Show PlatformIO`を選択すると、PlatformIOが起動してホームアイコンがツールバーに表示されます。
筆者は最初、ここら辺でつまずいていました。

![Screenshot 2024-11-18 at 10.37.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/b59183cd-8359-8b22-ce49-2c75413a3988.png)

それから、New Projectを選択します。

![Screenshot 2024-11-18 at 10.38.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/57824095-4ede-1a1f-930d-f7e878eb44c7.png)

そして、基盤を選択するところから始めますが、Arduino Unoと検索しましょう。

![Screenshot 2024-11-18 at 10.42.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/8e3623d4-cfbf-57fa-6ffa-1ff0bac86217.png)

FrameworkはそのままにしてFinishをクリックすると、しばらくそのままモーダルを閉じずに待てば、必要なパッケージをダウンロードしてプロジェクトを作成してくれます。ここで注意ですが、モーダルを間違えて閉じたらキャンセルされるので間違えて外側をクリックしないように。

うまくいけば新規プロジェクトのところが表示され、そこから`src/main.cpp`を開くことができます。

![Screenshot 2024-11-18 at 10.48.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/e1bec6cf-1865-c7a6-aee4-ef448089b01c.png)

ここで試しにシンプルなコードをフラッシュしてみましょう。

```src/main.cpp
#include <Arduino.h>

void setup()
{
  // put your setup code here, to run once:
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop()
{
  // put your main code here, to run repeatedly:
  digitalWrite(LED_BUILTIN, HIGH);
  delay(1000);
  digitalWrite(LED_BUILTIN, LOW);
  delay(1000);
}
```

ここでVS Codeの自動補完がフルで効いてくれていることに気づいていただけるかと思いますが、気持ちがいいですね。

上記のコードを書いてからアップロードしてみましょう。ツールバーの右矢印をクリックすると、デフォルトで検知したArduinoのシリアルデバイスに書き込んでくれます。

![Screenshot 2024-11-18 at 10.52.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/181cc45d-0ac5-14c9-c259-b6a46b75cb63.png)

これでフラッシュが成功したことがわかります。また、裏で`avrdude`を使っていることも判明します。

https://github.com/avrdudes/avrdude

PlatformIOは別のMCUでもこうして該当するツールチェーンを裏で使ってくれるのでありがたいです。実際、PlatformIOで解決できないような問題が出た時に、その裏で使っているツールを使って深掘りすればいいので、使っていて損することはないのです。

Arduinoを見てみると期待通り、1秒おきにピカピカしてくれています。

# まとめ

これで読者もPlatformIOを使って何らかのプロジェクトを試してくれたかと思いますが、いかがでしたでしょうか？

筆者はArduino IDEから早くも卒業してPlatform IOを使っているのですが、STM32を始める時にもPlatformIOを使っていたおかげであまりつまずかずに切り替えられました。Arduinoは始めるのにとてもいいのですが、Arduino IDEのみならず、さまざまな補助輪が付いているのは成長を阻むと感じます。

ArduinoにあってSTM32になくてとても困るのは、USB書き込み機能だけでなく、UARTのモデムです。ArduinoにUSBのUARTモデムが内蔵化されていることは非常にありがたいことだなと気づきました。ただ、実際にプロダクションでマイコンを作ることになったらUARTのUSBモデムがずっとそこにあることが無駄なので、自分でデバッグのことを考えるのもいい刺激材だと思いました。この辺の話は正直、PlatformIOというより完全にSTM32を始める話に脱線しているのですが、もしかして別の記事でそれに触れた方がいいのかもしれません。独自のUARTモデムでデバッグするのも楽しいチャレンジでした。

ともかく、PlatformIOでArduinoのプロジェクトを作ることに慣れれば、今後のArduinoじゃない開発をすることにも展開できるので、読者にもぜひArduino IDEから離脱することをお勧めします！