Windowsの「Subsystem for Linux (WSL) 」にESP開発環境を構築

WSLは、64bit版のWindows10(またはWindows Server)上でLinuxの実行ファイルをネイティブ実行できる環境です。 Windows8以前または32bit版Windows10ではWSLを利用できないため、MSYS2をお使いください。

WSLにESP-IDFをインストールすることでLinux上のESP開発環境と同等の環境を構築できます。 ファームウェアのビルド速度がMSYS2より大幅に速いため(というよりもMSYS2がかなり遅いのです)、これから新たに環境構築する方はWSL環境の構築を先に試してみてください。

USBドライバについて

今回のワークショップで使用するESP32開発キット ESP32-DevKitC には、「CP2102N」というシリアル-USB変換チップが使用されており、このドライバをWindowsにインストールする必要があります。 もしも以下で説明するPololu社のドライバを有効にできない場合は、WSLを諦めてMSYS2環境を選択してください。

また、お使いのOSが64bit版のWindows10以外でしたらいずれにせよMSYS2の環境を構築することになるので、USBドライバはどちらでも構いません。

2019年3月時点で、Silicon Labs社が提供するドライバではWSLとESP32が期待するように通信できません。少なくとも筆者の環境では動きませんでした。MSYS2ならば問題ありません。

【ご注意ください】下記ページからダウンロードしたドライバとWSLの組み合わせでは期待どおりには動かないと思われます。

(これはNGです)https://jp.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers

代わりに、Pololu社のページからダウンロードできるドライバをインストールしてください。

https://www.pololu.com/docs/0J7/all#2

(ドライバファイルへの直リンク:https://www.pololu.com/file/0J14/pololu-cp2102-windows-121204.zip )

ZIPファイルを解凍し、「pololu-cp2102-setup-x64.exe」をダブルクリックしてインストールしてください。

Silicon Labs社のドライバがインストール済みだとどうなるのか

インストール済みのドライバを「完全に」削除する必要があります。

「デバイスのアンインストール」の操作だけではドライバファイルが削除されず、Windowsが(プラグ・アンド・プレイ機能によって)自動的に日付の新しいものを割り当ててしまいます。 Silicon Labs社のドライバの日付のほうがPololu社より新しいため、Windowsが自動的にSilicon Labs社のものを選択してしまい、ユーザの任意によってPololu社のドライバを有効にはできないのです。

インストールされているドライバを調べる

Windows PowershellまたはCommand Prompt(CMD)を起動し、下記のコマンドを入力してください。

pnputil -e

非常に多くの行が出力されますが、すべてテキストエディタにコピー&ペーストするなどして、ドライバの情報を探します。 両方のドライバをインストールした筆者の環境では、このように表示されました。 oem9.inf がSilicon Labs社のシステム定義ファイル、 oem158.inf がPololu社のシステム定義ファイルです。 Driver date and version の値の違いに注目してください。

Published name :            oem9.inf
Driver package provider :   Silicon Laboratories Inc.
Class :                     Ports (COM & LPT)
Driver date and version :   11/26/2018 10.1.4.2290
Signer name :               Microsoft Windows Hardware Compatibility Publisher

Published name :            oem158.inf
Driver package provider :   Silicon Laboratories
Class :                     Ports (COM & LPT)
Driver date and version :   10/05/2012 6.6.0.0
Signer name :               Microsoft Windows Hardware Compatibility Publisher

この状態では、より新しいSilicon Labs社のドライバが使用されてしまうため、これを削除しなければなりません。

デバイスドライバを完全に削除する

【ご注意ください】この手順によりWindowsが正常に動作しなくなる危険があります。自己責任において実施してください。

最初にデバイスマネージャーを使用してドライバをアンインストールしてください。

uninstall_device

つぎにWindows PowershellまたはCommand Prompt(CMD)を administratorとして起動 し、下記のコマンドでシステム定義を削除します。 ファイル名 oem9.inf環境によって異なります のでご注意ください。

pnputil -d oem9.inf

Driver package deleted successfully. と表示されれば削除成功です。

何らかの理由で削除できない場合や、すでにインストールされているドライバがなんであるかよくわからない場合などは、WSLではなくMSYS2の環境構築をお選びください。あるいは両方を構築しておいて、ワークショップ当日に使える方を使う、というのもよいと思います。

環境構築

Windows Update

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

WSL (Ubuntu) のインストール

「設定」→「アプリと機能」→「プログラムと機能」をクリックします。 wsl-01-ja

「Windowsの機能の有効化または無効化」をクリックし、「Windowsの機能」ダイアログ内の「Windows Subsystem for Linux」にチェックを入れ、「OK」をクリックします。 wsl-02-ja

再起動を促されるので「今すぐ再起動」をクリックします。 wsl-03-ja

再起動後、「Microsoft Store」アプリで「Ubuntu」を検索、クリックしてインストールします。 wsl-04

「Ubuntu」アプリ(これがWSLのUbuntu版です)を起動します。 wsl-05

初回の起動時にはUnixユーザ名とパスワードの設定が必要です。

このユーザ名は、Windowsのログインアカウントと同じものにしてください。そうしないと、WindowsとWSL間の共有ディレクトリが見つからなくなります。

wsl-06

Ubuntu上での環境構築

関連パッケージをインストールします。

sudo apt update
sudo apt install tree gcc git wget make libncurses-dev flex bison \
  gperf python python-pip python-setuptools python-serial \
  python-cryptography python-future python-pyparsing

Espressif社が提供しているツール群をダウンロードし、解凍、配置します。

mkdir $HOME/esp
cd $HOME/esp
wget https://dl.espressif.com/dl/xtensa-esp32-elf-linux64-1.22.0-80-g6c4433a-5.2.0.tar.gz
tar -xzf xtensa-esp32-elf-linux64-1.22.0-80-g6c4433a-5.2.0.tar.gz
rm xtensa-esp32-elf-linux64-1.22.0-80-g6c4433a-5.2.0.tar.gz

.profileファイルに環境変数を設定し、有効化します。

echo 'export PATH="$HOME/esp/xtensa-esp32-elf/bin:$PATH"' >> $HOME/.profile
echo 'export IDF_PATH="$HOME/esp/esp-idf"' >> $HOME/.profile
source $HOME/.profile

ESP-IDFを配置します。

cd $HOME/esp
git clone --recursive https://github.com/espressif/esp-idf.git

python製の関連ツールをインストールします。

python -m pip install --user -r $IDF_PATH/requirements.txt

シリアルポートの権限が必要なので、自ユーザをdialoutグループに追加します。

sudo usermod -a -G dialout $USER

プログラム作成ディレクトリについて

Ubuntu上のVimなどではなく、Windows上に別途起動するエディタでプログラムを書くつもりでしたら、WindowsとWSLのディレクトリ共有について確認しておくとよいでしょう。

WSL上の /mnt/c/Users/[usename]/esp がWindows上の c:¥Users¥[Windows account name]/esp に一致します。 先述のとおり、 [usename][Windows account name] は同じ文字列でなければなりませんので、最初にWSL(Ubuntu)を起動したときに作成するusernameをWindowsアカウント名と同じものにするよう注意してください。

Rubyについて

mrubyのビルドにはCRuby(最も一般的なRuby実装)が必要です。

Rubyのインストールには複数の方法がありますが、複数のRubyをシステム内に共存させるためのツール「rbenv」を使用することを推奨します。

ワークショップの後半に時間があれば筆者作のmruby/c用便利ツール mrubyc-utils を使う予定があり、rbenvの環境のほうがスムーズに使用できます。

Rubyをインストール

rbenvをインストールします。

cd $HOME
git clone https://github.com/rbenv/rbenv.git $HOME/.rbenv

パスを通すなどします。

echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> $HOME/.profile
echo 'eval "$(rbenv init -)"' >> $HOME/.profile
source .profile

ruby-buildをインストールします。

mkdir -p "$(rbenv root)"/plugins
git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build

WSLにはシステムデフォルトのRubyがありません。mrubyのビルドにはCRubyが必要なので、まずはCRubyをインストールします。 非常に時間がかかりますので気長に実行してください。

sudo apt-get install -y libssl-dev libreadline-dev zlib1g-dev
rbenv install 2.6.2

たったいまインストールしたCRubyをグローバルデフォルトに設定します。

rbenv global 2.6.2
ruby --version

上のコマンドで、 ruby 2.6.2pXX (2019-XX-XX revision XXXXXX) [x86_64-linux] のように出力されればOKです。

mrubyをインストールします。現状、mruby-2.xはmruby/cには使えないので、1.4.1をインストールしてください。

rbenv install mruby-1.4.1