M5StickCPlusの開発環境構築メモ
選択肢が色々あってむずい。変にWSLとか使おうとするとなおさらめんどい。
理想と現実の間の妥協点を探りつつ、あんまり変じゃないかたちで開発できる状態を目指す。
色々試したがちょっと覚えてない。
vscode + PlatformIOはWSLでやったからかまともに動かなかった。
デバイス書き込みなのにWSLはしんどいかなと思い、windowsネイティブに方針切り替えした。
でまず正攻法のArduino IDEは公式手順で実にあっさりできた。M5StickCPlusのライブラリもいれるのがポイントか(最初Coreしか入れてなかった)。
Arduino IDEで真面目に戦おうかと思ったが、Gemini 1.5 Proに「Arduino IDEの作法がわからんのやが」と言うと「Microsoftのvscodeのarduino拡張あるで」とのこと。
ハイテンションで飛びついたが、調べるとMicrosoft公式のはなくなっており、コミュニティ版のforkが継続しているもよう。
で、コミュニティ版のそれはもともとは内部でArduino IDEを使っていたらしいが、ある時点以降はCLIしかサポートしなくなったらしい。
というわけで、windows側にArduino CLIを入れた。
vscodeに雑に拡張入れたがコマンドを認識しておらず何かと思ったが、CLIを使う場合は拡張の設定で明示的に「CLIを使う」をセットする必要があるとりどみに記載があった。IDEがデフォの時代との互換性とのこと。
ちなみに該当拡張のIDは vscode-arduino.vscode-arduino-community
だった
vscodeからboard managerとlibrary managerは起動した。examplesはだめだけど。
数日後おもむろにexamplesしたら動いた。再起動すらしてないけど時間おいたら直った。
適当なexampleをクリックしたらいきなりnew windowで開いた(開こうとした)
ところで知らん間にwindows user homeのDocumentsにサンプル生えてた。
サンプルには2ファイル。
{
"sketch": "Button.ino",
"port": "COM1"
}
とButton.inoだけだった。(Arduinoの構成ファイル全然知らなかった)
なおinoファイルのincludeはvscode上では解決できなかった(赤線)。ここは後で見る(で焼けるのか?)。
vscodeからverifyしてみてもなんの反応もないので、一旦CLIでやってみる。
powershellでプロジェクトディレクトリに入り、
arduino-cli.exe compile -b m5stack:esp32:m5stack_stickc_plus .
で、なんか成功っぽい出力が出た。
なお、compileでhelpすると -b オプションが必要らしかったので、 arduino-cli.exe board search
で調べた。
で成功っぽい出力にはなったが、成果物ファイルとかは見当たらない。そもそもcompileって何するんだ?(先に見ろ
--verbose付きで実行すると、なにやらAppData/Localとかそのへんにファイルが吐き出されているようだった。--output-dir オプションを指定するとそれっぽいものが出てきた。
arduino-cli upload -b m5stack:esp32:m5stack_stickc_plus --port COM3 .
てな感じで書き込みもできた。ちなみに、compileしたものを使うとかではなく、都度コンパイルするようだ
気を取り直してvscodeを起動してみると、何やらターミナルに気になる文言が。
[Warning] Output path is not specified. Unable to reuse previously compiled files. Build will be slower. See README
でよく思い返すと、upload時にビルドしてるわけではなく、AppData/Localのを使ってるだけな気がしてきた(compileしたものを使うとかではなく、というのはpwdの成果物を消していた。output-dir指定してないからそこは関係なかった)
で、開いたvscodeでinoファイルを開くと、includeは解決されているようだし関数にホバーで説明も出るようになってた。
なんでや。なんで日を改めたら改善しとるんや。
vscodeのコマンドパレットからupload的なやつを実行したら、普通に書き込みできた。
なおvscode画面下のステータスバー的なところのポートはデフォルトが変だったので直しはした。
ここまでで、一応vscodeでの環境構築のhello worldはできたということかな?
気付いたけど.vscodeディレクトリの中身が変わっていた。
arduino.jsonが
{
"sketch": "Button.ino",
"port": "COM3",
"configuration": "PartitionScheme=huge_app,CPUFreq=240,FlashMode=qio,FlashFreq=80,FlashSize=4M,UploadSpeed=1500000,LoopCore=1,EventsCore=1,DebugLevel=none,EraseFlash=none",
"board": "m5stack:esp32:m5stack_stickc_plus"
}
になっていて、更に c_cpp_properties.json
というファイルが生えていた。
中身はめっちゃincludepathとかあるから、なんかそれっぽい。
ここまで来るとやっぱりWSLでチャレンジしたくなるのでやってみる。
↑で作られたButton exampleディレクトリをwsl側から code .
で開く。
でc_cpp_properties.json
はいつ生えたのかわからん(≒勝手に生えるであろう)のとwin側のファイルパスが満載なので一旦消した。
WSL側に例の拡張を入れてなかったのでいれる。
でファイル消したのもあってincludeとか読めてない。ウィンドウ右下を見ると <Select Board>
みたいになってたので、押してみる。
するとボードマネージャのウィンドウが開いて「ボードないよ」とのことだったので、Additional URLのところに例のURLを拾ってきて貼る & installで色々インストールが始まった。
完了すると、ボードが自動で選択されてた。arduino.jsonあるからかな。
Reload Windowしたけど例のjsonは生えてこないな。ちょっと調べてみよう
雑にググるとなんか有用そうな記事が。
ところでwsl版でライブラリインストールをしてないのを思い出したので、コマンドパレットからArduino: Library Managerを開いてstickcplusのをインストール
ライブラリインストール完了後、verifyしたら例のjsonが生えてきた。ヨシ!
ずっとbuild pathが云々とwarnが出てるので、aruduino.jsonに "output": "./build"
を足しておいた
でverifyはできるがuploadはできない。
Arduino: CLI Upload
だと --build-path がunknown flagになり、 Arduino: Upload
だとexit status 2といって落ちる。
後者は雰囲気的にはなんかの処理は走ってそうな時間がかかっていたが。
...というかなんでuploadが2つあるのか。
CLIの方だとコマンドパスが見えて、vscode-extensionのインストールされた中にCLIの本体があるので、普通にターミナルで実行できるな、ということで実行してみた。
ちょっとコマンドパスは長いので適当にsymlinkして前に試したuploadを試すと、exit status 2で落ちた。しかしCOM3が開けないと情報量が出てきた。WSLなので納得感はある。
WSLからCOMポート触るのは環境構築がちょっとアレだな。。。そっち方向はやめよう
extensionの設定でarduino-cliのpathをwindows側にインストール(してwsl側にsymlink)したものを指定してuploadを試みたが、windows側のコマンドだからか C:\path\to\wsl\path
でビルドしようとして失敗してしまう。
C:\path\
はなんか違うやつを見てたっぽい。
フルパスにするから困る、みたいなパターンはdockerで見た。ということでコマンドのラッパーを使ってコマンド引数を確認。でフルパスを相対にしたら動きそうだ。
こう...動きはしそう(symlink云々で一旦敗北)だが、これ多分そこを無理せずにuploadだけ別コマンドでやるのが良い気がする。
ゴニョると、upload以外のいろんなコマンドも(それらは何もせずとも動くのに)ラッパーを介することになっていらぬ地雷になりそうだし。
arduino.jsonをパースしつつうまいことwin版のarduino-cliにわたすやつを作ったら良さそう。
jqでいけるかな、ということでcopilot先生に以下で聞いてみた。
このファイルから、下記のような出力をするjqコマンドを書いてください
-b ${.board}:${configuration} upload --port ${.port} --build-path ${.output} ${sketch}
で、
jq -r '"-b \(.board):\(.configuration) upload --port \(.port) --build-path \(.output) \(.sketch)"' /path/to/.vscode/arduino.json
こんなのが出てきた(path toは実ファイルのフルパス)。
入力はあくまでstdinなんだけど、というツッコミはあるが、 cat .vscode/arduino.json | jq {↑のやつ}
とやったらきれいに求めたものが出てきたし、そのまま | xargs arduino-cli
とやったらいい感じに通ってしまった。
copilot先生ありがてえ。
プロンプト、よく見たら変数指示のドットの有無がめっちゃ揺れとるやんけ。
これでbuild.shみたいな感じで配置したら終わりやな。makeでもいいけど。
いい感じになってきたので、WSL + vscodeのextension + generate exampleではなくフルスクラッチでプロジェクトを生やしてビルドするところまでやってみる
- 適当なディレクトリを掘る
- その中に、
${ディレクトリ名}.ino
ファイルでスケッチを置く- arduinoの世界の掟で、エントリポイントはディレクトリ名.inoでないといけないらしい
- そのディレクトリで
code .
とかでvscode開く - arudinoの拡張が動いてる状態で、右下のselect boardとかでそれっぽいのを選ぶ
- ここで.vscode/arduino.jsonが生えてくる。boardとconfigurationがいるはず
- arduino.jsonにsketch, port, output属性を足す
- portは右下から選んでもいいかもだが、WSLからだからか出てこなかった
- ここらへんでvscodeをreload windowしとくとverifyが走ってcpp.json的なやつが生えてくるはず
- upload.shを足してchmod +xしとく
#!/bin/bash
set -eu
cd $(dirname $0)
cat .vscode/arduino.json | jq -r \
'"-b \(.board):\(.configuration) upload --port \(.port) --build-path \(.output) \(.sketch)"' | \
xargs arduino-cli
- verify (vscode) もupload (shell) もできるはず(できた)
開発していくに当たり、printデバッグがしたい。
でシリアル通信で吐くのが良さそうだが、モニタをwin側にいれるのがなぁ、と思い調べたところ、ブラウザで動くやつがあった。