〇はじめに
当初MicropythonによるESP32を扱っていたいましたが, やや機能不足であるため, ESP-IDFに乗り換えようとしました。
しかし, WindowsのESP-IDFのビルドがやたらと遅い(最低限のプログラムをコンパイルするにも5分以上はかかる)。MacやLinuxだとこんなことにはならないみたいですが...
したがって今回は, WSL2のUbuntu環境でESP-IDFの環境構築を行っていきます。
ちなみに, 今回はWSL2での環境構築を行いましたが, ビルド時にコア数を多く振り分け素早くビルドするやり方もあるみたいです。参考までに
〇環境
・Windows
・WSL2
・Ubuntu20.04 LTS
・ESP32
〇手順
まず, ESP-IDFを実行するためだけの新しいディストリビューションを作成した方が良いかと思います。10GB程度の容量を持ってかれると思います。
- 新しいディストリビューションの作成
- ESP-IDF on WSL2 の実行環境の構築
- USBIPによるWSLへのポートの対応づけ
- udevの適用による一般ユーザでのデバイスの使用
1. 新しいディストリビューションの作成
・ディストリビューションの作成
wsl --install -d <Distribution Name>
・一般ユーザの作成
ユーザを作成し, パスワードを設定し, sudoグループに追加してください
・既定ディストリビューションを指定&起動時のログインユーザを設定
wsl -s <作成したディストリビューション名> -u <作成したユーザ名>
2. ESP-IDF on WSL2 の実行環境の構築
ここを参照してください
ページ内のここまでは実行できると思います。
・Build
idf.py build
その後, flashで接続先の機器にファームウェアを書き込むときに, エラーが出ます
Could not open COM ~
PCに接続されている機器がWSL2では認識されていないのが原因です。
したがって続く作業を行ってください
idf.pyコマンドを実行するためには, ~/.profileが実行されている必要があります
. ~/.profile || true
いちいち実行するのは面倒なため, ~/.bash_profileに以下の処理を書き込む必要があります
# wsl起動時に実行される処理を記述
if [ -f ~/.profile ]; then
. ~/.profile || true
fi
3. USBIPによるWSLへのポートの対応づけ
USBIPDをダウンロードする前にESP-IDFを実行するディストリビューションを既定ディストリビューションに設定しておいてください。
wsl -s <ディストリビューション名>
以下のサイトの
"USBIPD-WIN プロジェクトをインストールする"に従ってダウンロードしてください
続いて, "Linux に USBIP ツールとハードウェア データベースをインストールする"に従ってください。
実行できない場合は, sudo apt update & apt upgradeやresolv.confでの設定でインターネットに接続されているかを確認してください。
以上が, 完了したらコマンドで, Windows に接続されたすべての USB デバイスの一覧を表示します。
usbipd wsl list
次に, WSL2に認識させたいデバイスをアタッチします
アタッチするにはWSLが起動している必要があるので一旦起動させてください
usbipd wsl attach --busid <busid>
ちなみに, デタッチしたい場合は
usbipd wsl detach --busid <busid>
WSL2にアタッチするとWindowsの方では認識されなくなりますが, wslがシャットダウンすると自動的にデタッチされます
4. udevの適用による一般ユーザでのデバイスの使用
一般ユーザが, デバイスを使用するために権限の設定が行われている必要があります。したがってudevを有効化する必要があります
WSLではsystemdが動いていないので
→ udevだけ動かす
・udevのインストール
sudo apt-get install udev
・udevの起動
sudo service udev start
udevの起動には意図的に1分のスリープが設けられています。その間に実行をキャンセルできる猶予を与えてくれていますが, 待ちたくない人は/etc/init.d/udevを編集してください
以下の"sleep"部分をいじってください。自己責任でお願いします
・/etc/wsl.confに以下を書き込み, 起動時に実行されるようにする
[boot]
command = "service udev start"
次にデバイスが接続されているかを確認
dmesg | grep tty
・該当するデバイスを探す(ここではttyUSB0)
ls -l /dev
・権限と所有グループが表示されていれば大丈夫です
・一般ユーザを該当するグループに追加(ここではdialout)
gpasswd -a <USER名> <GROUP名>
これで整いました!
ESPに書き込む
先ほど作ったhello-worldのディレクトリに移動し, 以下のコマンドを実行
idf.py flash -p /dev/ttyUSB0
次に, 実行します
idf.py monitor -p /dev/ttyUSB0
実行されたら完了です!お疲れ様でした。
参考にさせていただいた記事