M5シリーズのESP-IDF開発環境をWSL2&Dockerで作る
この記事は、M5Stack Advent Calendar 2024 に参加してます。
久しぶりのM5、ESP32
いろいろと作ってみたいものはありつつも、なかなか手がつかない日々でしたが、試したいことができたので久しぶりにM5シリーズのデバイスを買ってみました。
買ってみたのは、ESP32 PSRAM Timer Cameraです。こちらを使って、HTTPSでクラウドのサービスにつないでみるのが目的です。
で、今後また色々ビルドしたり、ESP32の機能を使うためにESP-IDF上で開発をしたいと思い準備しました。
ESP-IDFの環境はバージョンによってしばしば互換性が失われるので、昔のコードが最新Verでビルドできないのはしょっちゅうあるかと思います。そのときESP-IDFバージョンを上げ下げするのも大変です。
なので、試行錯誤するにはDockerで環境を作れると何かと便利です。その内容を共有したいと思います。環境はWSL2です。
準備
基本的には、公式の手順を読めばわかる内容ではありますが、すこし躓いた点もあったのでそのあたり説明したいと思います。
ビルドのコマンド例
例えば以下のようになります。
$ docker run --rm \
-e MY_ENV_VAR="$MY_ENV_VAR" \
-v $PWD/$TARGET_PROJECT:/project -w /project -u $(id -u $USER):$(id -g $USER) -e HOME=/tmp espressif/idf:$IDF_VER idf.py build
$PWD/$TARGET_PROJECT:/project
の部分でホスト側のプロジェクトをコンテナから参照できるようにしてます。
$(id -u $USER):$(id -g $USER)
ホスト側のユーザIDでコンテナ内で作業するようにします。
$IDF_VER
の変数で、使用するIDFのバージョンを調整します。
Flash時のコマンド
通常は"idf.py -p (PORT) flash"
でよいはずですが、なぜそれだとエラーが起きてしまったので、build時に表示されるesptoolを使ったコマンドを利用してます。
作業用のスクリプト
長いDockerコマンドを毎回打つのも面倒なので、簡単なシェルスクリプトにまとめました。menuconfigやイメージの書き込みなどもコンテナで実行できます。
実際のスクリプトはgithubで公開してます。(リンクは下の方に)
WSL2でESP32とシリアル通信
usbipdを使って、Windowsのホスト側のUSBデバイスをIP通信を介して、WSL2上でUSBデバイスとして認識させます。usbipdインストールについて検索すると色々情報が出てきますが、少し古くて、今だと不要な手順が書いてあったりするようです。
今(2024/12)は以下の公式の手順で準備するのがよいと思います。うまくいくと/dev/ttyUSB0
として認識されました。
Cameraのサンプルコードについて
ESP32 PSRAM Timer Cameraのサンプルはいくつか存在しているのですが、それぞれ依存しているESP-IDFのバージョンが異なっているようで、最新のIDFだとビルドできなかったりして、サンプルを動かすことが難しかったです。
こちらはアーカイブになってました。
今はこちらを使うのが良さそうでした。対応してるESP-IDFのバージョンがReadmeに書いてないのですが、v5系はダメなようなので、v4.4.8で動かしました。
Docker開発環境の例
githubで開発環境用のサンプルスクリプトを公開してます。
.envをいじったり、src以下にプロジェクトを配置したりして、使用できるかと思います。
さいごに
Dockerを使うと簡単に環境を差し替えたり、持ち運びできるので楽ですね。またmrubyビルドしたりして、面白いものを少しずつでも作っていきたいです。
会社のサービスに繋いでみた話は、会社の技術ブログで後ほど公開予定です。