Open35

M5StickCPlusの開発環境構築メモ

inomotoinomoto

選択肢が色々あってむずい。変にWSLとか使おうとするとなおさらめんどい。

理想と現実の間の妥協点を探りつつ、あんまり変じゃないかたちで開発できる状態を目指す。

inomotoinomoto

色々試したがちょっと覚えてない。
vscode + PlatformIOはWSLでやったからかまともに動かなかった。

デバイス書き込みなのにWSLはしんどいかなと思い、windowsネイティブに方針切り替えした。
でまず正攻法のArduino IDEは公式手順で実にあっさりできた。M5StickCPlusのライブラリもいれるのがポイントか(最初Coreしか入れてなかった)。

inomotoinomoto

Arduino IDEで真面目に戦おうかと思ったが、Gemini 1.5 Proに「Arduino IDEの作法がわからんのやが」と言うと「Microsoftのvscodeのarduino拡張あるで」とのこと。
ハイテンションで飛びついたが、調べるとMicrosoft公式のはなくなっており、コミュニティ版のforkが継続しているもよう。

で、コミュニティ版のそれはもともとは内部でArduino IDEを使っていたらしいが、ある時点以降はCLIしかサポートしなくなったらしい。
というわけで、windows側にArduino CLIを入れた。

inomotoinomoto

vscodeに雑に拡張入れたがコマンドを認識しておらず何かと思ったが、CLIを使う場合は拡張の設定で明示的に「CLIを使う」をセットする必要があるとりどみに記載があった。IDEがデフォの時代との互換性とのこと。

inomotoinomoto

ちなみに該当拡張のIDは vscode-arduino.vscode-arduino-community だった

inomotoinomoto

vscodeからboard managerとlibrary managerは起動した。examplesはだめだけど。

inomotoinomoto

数日後おもむろにexamplesしたら動いた。再起動すらしてないけど時間おいたら直った。

inomotoinomoto

適当なexampleをクリックしたらいきなりnew windowで開いた(開こうとした)
ところで知らん間にwindows user homeのDocumentsにサンプル生えてた。

inomotoinomoto

サンプルには2ファイル。

{
    "sketch": "Button.ino",
    "port": "COM1"
}

とButton.inoだけだった。(Arduinoの構成ファイル全然知らなかった)

なおinoファイルのincludeはvscode上では解決できなかった(赤線)。ここは後で見る(で焼けるのか?)。

inomotoinomoto

vscodeからverifyしてみてもなんの反応もないので、一旦CLIでやってみる。
powershellでプロジェクトディレクトリに入り、

arduino-cli.exe compile -b m5stack:esp32:m5stack_stickc_plus .

で、なんか成功っぽい出力が出た。

なお、compileでhelpすると -b オプションが必要らしかったので、 arduino-cli.exe board search で調べた。

で成功っぽい出力にはなったが、成果物ファイルとかは見当たらない。そもそもcompileって何するんだ?(先に見ろ

inomotoinomoto

--verbose付きで実行すると、なにやらAppData/Localとかそのへんにファイルが吐き出されているようだった。--output-dir オプションを指定するとそれっぽいものが出てきた。

inomotoinomoto
arduino-cli upload -b m5stack:esp32:m5stack_stickc_plus --port COM3 .

てな感じで書き込みもできた。ちなみに、compileしたものを使うとかではなく、都度コンパイルするようだ

inomotoinomoto

気を取り直して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指定してないからそこは関係なかった)

inomotoinomoto

で、開いたvscodeでinoファイルを開くと、includeは解決されているようだし関数にホバーで説明も出るようになってた。

なんでや。なんで日を改めたら改善しとるんや。

inomotoinomoto

vscodeのコマンドパレットからupload的なやつを実行したら、普通に書き込みできた。
なおvscode画面下のステータスバー的なところのポートはデフォルトが変だったので直しはした。

ここまでで、一応vscodeでの環境構築のhello worldはできたということかな?

inomotoinomoto

気付いたけど.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とかあるから、なんかそれっぽい。

inomotoinomoto

ここまで来るとやっぱりWSLでチャレンジしたくなるのでやってみる。

↑で作られたButton exampleディレクトリをwsl側から code . で開く。
c_cpp_properties.jsonはいつ生えたのかわからん(≒勝手に生えるであろう)のとwin側のファイルパスが満載なので一旦消した。

inomotoinomoto

WSL側に例の拡張を入れてなかったのでいれる。

でファイル消したのもあってincludeとか読めてない。ウィンドウ右下を見ると <Select Board> みたいになってたので、押してみる。
するとボードマネージャのウィンドウが開いて「ボードないよ」とのことだったので、Additional URLのところに例のURLを拾ってきて貼る & installで色々インストールが始まった。

完了すると、ボードが自動で選択されてた。arduino.jsonあるからかな。

inomotoinomoto

Reload Windowしたけど例のjsonは生えてこないな。ちょっと調べてみよう

inomotoinomoto

ところでwsl版でライブラリインストールをしてないのを思い出したので、コマンドパレットからArduino: Library Managerを開いてstickcplusのをインストール

inomotoinomoto

ライブラリインストール完了後、verifyしたら例のjsonが生えてきた。ヨシ!

inomotoinomoto

ずっとbuild pathが云々とwarnが出てるので、aruduino.jsonに "output": "./build" を足しておいた

inomotoinomoto

でverifyはできるがuploadはできない。
Arduino: CLI Upload だと --build-path がunknown flagになり、 Arduino: Upload だとexit status 2といって落ちる。
後者は雰囲気的にはなんかの処理は走ってそうな時間がかかっていたが。

...というかなんでuploadが2つあるのか。

inomotoinomoto

CLIの方だとコマンドパスが見えて、vscode-extensionのインストールされた中にCLIの本体があるので、普通にターミナルで実行できるな、ということで実行してみた。

ちょっとコマンドパスは長いので適当にsymlinkして前に試したuploadを試すと、exit status 2で落ちた。しかしCOM3が開けないと情報量が出てきた。WSLなので納得感はある。

inomotoinomoto

WSLからCOMポート触るのは環境構築がちょっとアレだな。。。そっち方向はやめよう

inomotoinomoto

extensionの設定でarduino-cliのpathをwindows側にインストール(してwsl側にsymlink)したものを指定してuploadを試みたが、windows側のコマンドだからか C:\path\to\wsl\path でビルドしようとして失敗してしまう。

inomotoinomoto

C:\path\ はなんか違うやつを見てたっぽい。
フルパスにするから困る、みたいなパターンはdockerで見た。ということでコマンドのラッパーを使ってコマンド引数を確認。でフルパスを相対にしたら動きそうだ。

inomotoinomoto

こう...動きはしそう(symlink云々で一旦敗北)だが、これ多分そこを無理せずにuploadだけ別コマンドでやるのが良い気がする。
ゴニョると、upload以外のいろんなコマンドも(それらは何もせずとも動くのに)ラッパーを介することになっていらぬ地雷になりそうだし。

arduino.jsonをパースしつつうまいことwin版のarduino-cliにわたすやつを作ったら良さそう。

inomotoinomoto

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先生ありがてえ。

inomotoinomoto

プロンプト、よく見たら変数指示のドットの有無がめっちゃ揺れとるやんけ。

inomotoinomoto

これでbuild.shみたいな感じで配置したら終わりやな。makeでもいいけど。

inomotoinomoto

いい感じになってきたので、WSL + vscodeのextension + generate exampleではなくフルスクラッチでプロジェクトを生やしてビルドするところまでやってみる

inomotoinomoto
  • 適当なディレクトリを掘る
  • その中に、${ディレクトリ名}.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) もできるはず(できた)