昔のおもちゃ
これは2年前に買った小さなボード。ESP32は十分安いし、Wi-Fi機能も手軽だし、このモデルには CAN トランシーバー まで搭載されているので、購入した。ESPではCANインターフェースのことを TWAI と呼んでいて、公式コードライブラリ(初期はCANという名前だったが、今は変更された)や資料のどこを探しても、CAN関連の表記が見つからない。おそらく著作権料を払っていないだけで、機能はまったく同じだ。
2年前に Arduino IDE でネットワークブリッジとかの簡単な機能をちょっとだけ作った。その後、Arduino IDE や ESP-IDF が簡単すぎる、あるいは複雑すぎるという理由で心が折れた。もちろん、実際の需要もなかったので、研究を続けるのが面倒になったというのもある。
以前、200元払って人にいくつか質問したとき、PlatformIO を全面的に使うよう強く勧められたが、もちろんまったく気にしていなかった。今回このおもちゃを久しぶりにいじり直してみると、PlatformIO 環境は自分の開発美学には合わないけれど、確かに独自の良さがあるとわかった。十分簡単で、十分実用的だ。コンパイルの過程や各種環境がすべて隠されていて見えないが、知識としての開発経験をすべて脇に置き、あるアプリケーションの実装だけに集中するなら、こいつは最高だ。
以下がこの2週間で遊んだ成果だ。
[ 録画するのが面倒なので、また今度 ]
全体像
PlatformIO は、コンパイルチェーン、Python環境、パッケージマネージャー(独自のもの)、書き込みアルゴリズム、デバッガーなど、開発に必要なものをすべて統合したプラットフォームだ。
何から何まで揃っているがゆえに、PlatformIO ベースの開発プロジェクトは比較的閉鎖的だ。すべてのコマンドや操作は PlatformIO CLI の中で行うべきで、vscode のアリの頭こと PlatformIO アイコンから、QUICK ACCESS->Misellaneous-> PlatformIO Core CLI を開くと PlatformIO CLI ターミナルが起動する。そこで pio --help や which python などのコマンドを打つのが、統合環境内のツールを呼び出す正しい方法だ。
ここでダウンロードした Libraries についても、ライブラリを改造しようと考えてはいけない。パッケージの Examples の通りに使うのがいい。そうしないと、プラットフォーム更新時に自分の変更が自動的に元に戻されて、コードが失われる恐れがある。どうしても機能を追加・変更したいパッケージは、プロジェクトの lib フォルダに自分で入れておくこと。プラットフォームが自動的に検出して、コンパイル命令に追加してくれる。
それに、こんなプラットフォームを使っている時点で、JTAG のシングルステップデバッグは諦めたほうがいい。私もいろいろ試して、この分野で大量の時間を費やしたが、いつも何かしら問題が出た。さらに、このチップはピンリソースが足りず、デバッグ用に追加の4本のピンを確保することは到底できない。
基礎入門
環境設定
PlatformIO を使うには、まず vscode が必要だ。vscode の左下の歯車から、新しい空の設定ファイルを作成する。最初は完全に空にするのがおすすめで、テーマプラグインすら入れないほうがいい。
プラグインマーケットで PlatformIO IDE を探してダウンロードすればいい。
インストールが完了すると、左側にアリの頭が現れる。これが PlatformIO IDE 環境のすべてだ。
アリの頭をクリックすると、QUICK ACCESS->PIO Home->Platforms に、サポートされているすべてのボードプラットフォームが表示される。

よく使うのは Espressif32 と Espressif8266 だ。他のチップはキーワードで検索できるのに、esp32 と esp8266 のこの2つだけは検索しても出てこない。もちろん、全体の数も多くないので、手動で一通り見て回ればいい。使いたいプラットフォームをクリックして、Install すればいい。
ある Platform を初めてダウンロードするとき、依存する小さなツールを多数ダウンロードするよう促されるが、心配しなくていい。これらはすべてPlatformIO自身のフォルダにまとめてダウンロードされ、自分のファイル構造には影響しない。もしダウンロードが遅すぎたり失敗したりしたら(順調なら1分以内に終わる)、VPNを繋ぐ必要がある。
プロジェクトの作成
アリの頭をクリックすると、QUICK ACCESS->PIO Home->Project & Configuration に、このプラットフォーム上のすべてのプロジェクトが表示される。新しい環境には何もない。Create New Project をクリックして新規作成する。
Name は適当でいい。Board は、開発ボードやチップ名の最初の数文字で検索すれば、大半は見つかる。Framework は arduino を選んでおくのがおすすめだ。
未ダウンロードの Platform は自動的にダウンロードされる。

作成すると、だいたいこんな構造になる。
name
├── .pio
├── .vscode
├── include
├── lib
└── src
└── main.cpp
└── test
└── platformio.ini
実際の main.cpp ファイルは src フォルダの中にあるが、今は気にしなくていい。
lib フォルダは、プラットフォーム管理外のライブラリを自分で入れておく場所だ。ライブラリのソースコードを変更したいなら、そのライブラリを lib フォルダに入れておく。プラットフォームがソースコードとヘッダーファイルのパスを自動的に処理してくれる。
platformio.ini を開いて、少し調整する。
[env:pico32]
platform = espressif32
board = pico32
framework = arduino
; 增加以下两句
build_flags = -I src
build_type = release
build_flags は追加のコンパイルフラグだ。ここでは src フォルダも include path に追加している。src フォルダ内でもヘッダーファイルを作れるようにするためだ。
build_type は説明不要だろう。リリース版にしておけば、いくらかリソースを節約して使える。arduino は生まれつき多くのリソースを浪費するからね。
その後の開発
まずプロジェクトを整理しよう。src/main.cpp を開いて、次のようにきれいにする。基本的な setup 関数と loop 関数だけを残す。arduino では setup 関数が最初に一度だけ実行され、その後は loop 関数が延々と