ESP-IDF 環境の構築 (Windows11 + WSL2)
はじめに
ESP32 マイコンの開発環境としてマイコンメーカ Espressif Systems が提供する ESP-IDF 環境を用いる. 以下では Windows11 + WSL で ESP-IDF 環境を構築する.
公式ドキュメント: <URL:https://docs.espressif.com/projects/esp-idf/en/latest/get-started/linux-setup.html>
WSL のインストールと基本設定
Windows Update
まず Windows11 を Microsoft が提供している最新の状態に更新する. 更新されていない Windows では,WSL の機能のうち我々の必要とするものを利用できない可能性がある.
WSL2 (Debian) のインストール
管理者権限で PowerShell を立ち上げてインストール
> wsl --install -d Debian
Debian のバージョンアップ
wsl でインストールされる Debian のバージョンは古い. 2022/04/15 現在,最新の安定板は Debian 11 (bullseye) であるが, wslでインストールされるのは Debian 9 (stretch) である.そこで,Debian の更新を行う.
現時点での最新版にする.
$ sudo apt-get update $ sudo apt-get upgrade
apt の参照先を stretch から bullseye に変更する.
$ sudo nano /etc/apt/sources.list deb http://www.gfd-dennou.org/debian bullseye main deb http://www.gfd-dennou.org/debian bullseye-updates main deb http://security.debian.org/debian-security/ bullseye-security main
以下のような順番でバージョンアップを行う. 途中でいくつか質問が来るが,そこはデフォルトから変更する必要はなく,そのままエンターを押せばよい.
$ sudo apt update $ sudo apt upgrade $ sudo apt dist-upgrade
Debian 上での環境構築 : X11 関連の設定
Debian X11 関連のパッケージやエディタ emacs をインストールしておく.
$ sudo apt-get update $ sudo apt-get upgrade $ sudo apt-get install x11-apps x11-utils x11-xserver-utils dbus-x11 emacs
テストとして,ターミナルから xeyes や gedit コマンドを実行してみる. うまくいけば以下の図のようにxeyesの目玉や emacs のウィンドウが立ち上がるはずである.
ESP-IDF 環境のセットアップ
公式ドキュメントに従ってセットアップを行う.
必要なパッケージをインストールする. 公式ドキュメントに書かれているパッケージや, ITOC の公開しているドキュメントに書かれているパッケージを全部インストールする. なお, python-libusb1 をインストールしておかないと OpenOcd が動かないので, それも追加している.
$ sudo apt-get install build-essential emacs lv pciutils net-tools $ sudo apt-get install git wget flex bison gperf python3 python3-pip python3-setuptools cmake ninja-build ccache libffi-dev libssl-dev dfu-util
python3 をデフォルトにする.
$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 10 && alias pip=pip3
作業用のディレクトリを作成する. ホームディレクトリ以下に esp ディレクトリを作る.
$ mkdir ~/esp $ cd ~/esp
ESP-IDF は GitHub で公開されている. それを git clone する. --recursive をつけることでサブモジュールも全てインストールする (--recursive をつけないと環境構築に失敗する). インストールされるサブモジュールは標準出力に表示される.
$ git clone --recursive -b v4.2.3 https://github.com/espressif/esp-idf.git ... (メッセージは略) ...
git clone することでカレントディレクトリ (~/esp) 以下に esp-idf ディレクトリが作成される. そのディレクトリ以下にセットアップツールが存在するので, それを実行する. メッセージを見ると, 最新の xtensa-esp32-elf のダウンロードと, そのインストールが実行されていることがわかる.
$ cd ~/esp/esp-idf/ $ ./install.sh Installing ESP-IDF tools Installing tools: xtensa-esp32-elf, xtensa-esp32s2-elf, esp32ulp-elf, openocd-esp32 Installing xtensa-esp32-elf@esp-2019r2-8.2.0 Downloading xtensa-esp32-elf-gcc8_2_0-esp-2019r2-linux-amd64.tar.gz to /home/sugiyama/.espressif/dist/xtensa-esp32-elf-gcc8_2_0-esp-2019r2-linux-amd64.tar.gz.tmp Done Extracting /home/sugiyama/.espressif/dist/xtensa-esp32-elf-gcc8_2_0-esp-2019r2-linux-amd64.tar.gz to /home/sugiyama/.espressif/tools/xtensa-esp32-elf/esp-2019r2-8.2.0 ...(中略)... All done! You can now run: . ./export.sh
環境設定を行う. 上記のメッセージのように, export.sh を実行すれば良い. 実行時メッセージにあるように環境変数が追加される.
$ . ./export.sh Adding ESP-IDF tools to PATH... Checking if Python packages are up to date... Python requirements from /home/sugiyama/esp/esp-idf/requirements.txt are satisfied. Added the following directories to PATH: /home/sugiyama/esp/esp-idf/components/esptool_py/esptool /home/sugiyama/esp/esp-idf/components/espcoredump /home/sugiyama/esp/esp-idf/components/partition_table/ /home/sugiyama/.espressif/tools/xtensa-esp32-elf/esp-2019r2-8.2.0/xtensa-esp32-elf/bin /home/sugiyama/.espressif/tools/xtensa-esp32s2-elf/esp-2019r2-8.2.0/xtensa-esp32s2-elf/bin /home/sugiyama/.espressif/tools/esp32ulp-elf/2.28.51.20170517/esp32ulp-elf-binutils/bin /home/sugiyama/.espressif/tools/openocd-esp32/v0.10.0-esp32-20190708/openocd-esp32/bin /home/sugiyama/.espressif/python_env/idf4.1_py2.7_env/bin /home/sugiyama/esp/esp-idf/tools Done! You can now compile ESP-IDF projects. Go to the project directory and run: idf.py build
export.sh によってどのように環境変数が変化したかは, 例えば env コマンドで確かめられる. PATH (コマンドサーチパス) に ESP-IDF 関連のディレクトリが多数追加され, 新たに IDF_TOOLS_EXPORT_CMD と IDF_TOOLS_INSTALL_CMD という 2 つの環境変数が新たに 2 つ設定されている.
$ env (中略) PATH=/home/sugiyama/esp/esp-idf/components/esptool_py/esptool:/home/sugiyama/esp/esp-idf/components/espcoredump:/home/sugiyama/esp/esp-idf/components/partition_table/:/home/sugiyama/.espressif/tools/xtensa-esp32-elf/esp-2019r2-8.2.0/xtensa-esp32-elf/bin:/home/sugiyama/.espressif/tools/xtensa-esp32s2-elf/esp-2019r2-8.2.0/xtensa-esp32s2-elf/bin:/home/sugiyama/.espressif/tools/esp32ulp-elf/2.28.51.20170517/esp32ulp-elf-binutils/bin:/home/sugiyama/.espressif/tools/openocd-esp32/v0.10.0-esp32-20190708/openocd-esp32/bin:/home/sugiyama/.espressif/python_env/idf4.1_py2.7_env/bin:/home/sugiyama/esp/esp-idf/tools:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games IDF_TOOLS_EXPORT_CMD=/home/sugiyama/esp/esp-idf/export.sh IDF_TOOLS_INSTALL_CMD=/home/sugiyama/esp/esp-idf/install.sh
毎回, ESP-IDF を使う前に export.sh を実行するのは面倒なので, ~/.bashrc に追加しておくとよい.
$ vi ~/.bashrc (末尾に追加) #ESP-IDF . $HOME/esp/esp-idf/export.sh
確認のために別のターミナルを立ちあげ, env コマンドを実行せよ. PATH や IDF_TOOLS_EXPORT_CMD, IDF_TOOLS_INSTALL_CMD が設定されていることが確かめられる.
USB-Serial の設定
USB ケーブルで ESP32 マイコンと PC を接続してみよ. 新たに追加した ESP32 マイコンは USB-Serial デバイスとして認識される. デバイス名は Windows のデバイスマネージャの「COM とLPT」から確認することができる. 以下の例では「USB Serial Port (COM3)」とあるように, Windows 側ではデバイス名は COM3 となっている. WSL 側では COM3 は /dev/ttyS3 として認識される (数字が同じになる).
以下では /dev/ttyS3 が ESP32 マイコンを表すデバイス名とする. デバイスのパーミッションを ls -l コマンドで確認すると, ユーザとグループのみに write パーミッションが出ている.
$ ls -l /dev/ttyS3 crw-rw---- 1 root dialout 188, 0 12月 14 15:46 /dev/ttyS3
上記の ls -l コマンドの実行結果より, dialout グループに自分のユーザを追加しないと, 作成したプログラムをマイコンに書き込むことができないことがわかる. dialout グループに自分のユーザを登録する場合は usermod コマンドを使うのが簡単である. なお, オプションの "-a" は追加, "-G <グループ名>" は追加するグループを意味する.
# usermod -a -G dialout <自分のユーザ名>
mruby/c 環境の作成
mruby のビルドには CRuby(最も一般的なRuby実装)が必要となる. Ruby のインストールには複数の方法があるが,ここでは複数の Ruby をシステム内に共存させるためのツール「rbenv」を使用する.
Rubyをインストール
rbenv をインストールする.
$ cd $HOME $ git clone https://github.com/rbenv/rbenv.git $HOME/.rbenv
パスを通す.
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> $HOME/.bashrc $ echo 'eval "$(rbenv init -)"' >> $HOME/.bashrc $ source .bashrc
ruby-build をインストール.
$ mkdir -p "$(rbenv root)"/plugins $ git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build
Ruby 本家のページで最新版の CRuby のバージョンを確認すると,2020/12/22 時点での最新版は 2.7.2 であったので, それをインストールする.
$ sudo apt-get install -y libssl-dev libreadline-dev zlib1g-dev $ rbenv install 2.7.2
たったいまインストールしたCRubyをグローバルデフォルトに設定する.
$ rbenv global 2.7.2 $ ruby --version
上のコマンドで、 ruby 2.6.2pXX (2019-XX-XX revision XXXXXX) [x86_64-linux] のように出力されれば OK.
mruby のインストール
mruby をインストールする.
$ rbenv install mruby-2.1.0
WSL2 で usb serial を使う
設定
ソフトウェアのインストール
# apt-get install hwdata usbip # apt-get install linux-perf-5.10
Windows PowerShell を管理者権限で実行して,usbipd.exe をインストール
> winget.exe install --id dorssel.usbipd-win
毎回の作業.
USB Serial を結びつける
> usbipd.exe wsl list BUSID DEVICE STATE 2-1 USB Serial Converter Not attached 2-2 ELECOM WDC-150SU2M Wireless Adapter Not attached 2-8 Front Camera, Front IR Camera Not attached 2-9 ELAN WBF Fingerprint Sensor Not attached 2-10 インテル(R) ワイヤレス Bluetooth(R) Not attached 3-1 Realtek USB GbE Family Controller Not attached 4-1 Logitech USB Input Device, USB 入力デバイス Not attached 4-3 USB 入力デバイス Not attached 4-4 USB 入力デバイス Not attached > usbipd wsl attach --busid 2-1 > usbipd.exe wsl list BUSID DEVICE STATE 2-1 USB Serial Converter Attached - Debian ...(以下略)...
デタッチ
> usbipd wsl detach --busid 2-1
参考文献
- https://docs.microsoft.com/ja-jp/windows/wsl/connect-usb
- https://devblogs.microsoft.com/commandline/connecting-usb-devices-to-wsl/
WSL2 で iotex-esp32-mrubyc の利用
デバイスのパーミッション変更
# chgrp dialout /dev/ttyUSB0 # chmod 660 /dev/ttyUSB0
実行
$ cd ~/esp $ git clone https://github.com/gfd-dennou-club/iotex-esp32-mrubyc.git $ cd iotex-esp32-mrubyc $ make menuconfig Serial Port : /dev/ttyUSB0 <-- ここはデフォルトのままで OK [*] USE ESP32 Firmware Flash $ make flash
make flash は動くが,make spiffs はタイムアウトしてしまう .... シリアル通信がいまいち安定していないような出力が出る.