ESP-IDF 環境の構築 (Windows10 + WSL)

はじめに

ESP32 マイコンの開発環境としてマイコンメーカ Espressif Systems が提供する ESP-IDF 環境を用いる. 以下では Windows10 + WSL で ESP-IDF 環境を構築する.

公式ドキュメント: <URL:https://docs.espressif.com/projects/esp-idf/en/latest/get-started/linux-setup.html>

WSL のインストールと基本設定

Windows Update

まず Windows10 を Microsoft が提供している最新の状態に更新する. 更新されていない Windows では,WSL の機能のうち我々の必要とするものを利用できない可能性がある.

WSL (Debian) のインストール

「設定」 => 「アプリ」 => 「アプリと機能」 => 「プログラムと機能」を順に選択する. 左カラムの「Windows の機能の有効化または無効化」をクリックし, 「Linux用 Windows サブシス テム」と「仮想マシンプラットホーム」にチェックを入れて OK を押す. 再起動するよう求められるので, OK を押して再起動する.

再起動後に「Microsoftストア」アプリで「Debian」を検索し, それをインストールする.

インストール後に「起動」をクリックして Debian を起動する. 最初に起動した時にユーザ名を設定するが,それは Windows のログインアカウントと同じにする. そうしないと Windows と WSL 間の共有ディレクトリが見つからなくなる場合があるらしい.

X11 のインストール

X11 (X Window System) を Windows10 にインストールする. Windows で動作する X Window System はいくつか存在するが, 今回はフリーソフトウェアとして公開されている VcXsrv を用いることにする. VcXsrv は sourceforge.net からダウンロードし,インストールすることができる.

インストールが終わるとデスクトップ上に「XLaunch」というアイコンができる. それをダブルクリックしてX Window Systemを起動させる.設定項目はデフォルトのままで良い. VcXsrvを最初に立ち上げたときに,Windows Defender ファイアウォールでブロックされるので, とりあえずプライベートにチェックを入れてアクセスを許可しておく.

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

Windows の X Window System を使うためには環境変数を設定する必要がある. これを行わないとターミナルからコマンドを実行して新しいウィンドウを立ち上げることができない.

$ nano ~/.bashrc
  [以下の2行を書く]
  export DISPLAY=localhost:0.0
  export LIBGL_ALWAYS_INDIRECT=1

$ source ~/.bashrc

テストとして,ターミナルから xeyes や gedit コマンドを実行してみる. うまくいけば以下の図のようにxeyesの目玉や emacs のウィンドウが立ち上がるはずである.

Debian 上での環境構築 : ターミナルの設定

WSL 標準のターミナルは機能面で物足りない面がある. そのため wsltty のインストールする. インストールが終わると, 「Debian terminal」がメニューに表示される. なお,% が末尾につくメニュー項目は, Windows 側のユーザフォルダが開始フォルダとなっている.

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 ~/eps

$ cd ~/esp

ESP-IDF は GitHub で公開されている. それを git clone する. --recursive をつけることでサブモジュールも全てインストールする (--recursive をつけないと環境構築に失敗する). インストールされるサブモジュールは標準出力に表示される.

$ git clone --recursive 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