概要
Arduino IDE+ESP32の2系ボードライブラリで開発をしていると、大きめのプロジェクトをコンパイルすると非常に時間がかかりますよね。なのでWindowsを使いつつ、VirtualBox上にUbuntu Desktopを動かして、コンパイルが早い開発環境を作ってみました。
VirtualBoxとは?
Oracleが公開している無料で使える仮想マシンの環境です。WindowsだとHyper-Vという仮想環境があるのですが、USBデバイスをかんたんに利用することができないのでVirtualBoxを使っています。
ただし、、、VirtualBoxとWindowsの相性は最悪です。とくにWSLを使っている環境ですと仮想環境はHyper-Vに専有されているのでWindows Updateとかで動かなくなることがあります。
そしてVirtualBox自体も新し目のバージョンはバグが入っていることが多いです。たとえば現在最新版の6.1.32はおかしいです。実験のため複数のパソコンで動かしてみたりするのですが、最新版を入れたほうだとUbuntuの起動に10分以上かかります。とにかく遅くて使い物になりませんでした。
6.1.30にバージョンを落としたらなんとかうまく動きました。
Ubuntuとは?
Debian系のLinuxで、WindowsだとWSLとかで標準に採用されているものになります。個人的にはRedhat系を使ってきたのですが、CentOS Streamが安定バージョンでなくなったので今後はUbuntuが増えていくのかなと思っています。
今回はArduino IDEを利用するのでServerではなくてDesktopを選択しました。またUbuntuは2年毎に大きなバージョンアップを行っています。一番使われているのが「20.04 LTS」と2020年4月に公開されたバージョンです。LTSはロングタイムサポートで、長期サポートされるバージョンになります。「21.10」は去年の10月に公開されたバージョンで、LTSではないですが最新のものを使いたい場合の選択肢となります。
さて、2年に一度なので「22.04」がもうすぐリリースされる予定です。今回は「20.04 LTS」と「22.04 Beta」で検証してみました。
VirtualBoxのセットアップ
基本的に悩むことはないはずです。ただし、バージョンによって動かないので動きがおかしい場合には検索するか、バージョンを少し古いものに落とすことがおすすめです。
Extension Packもインストールするようにしてください。ただし、VirtualBoxと同じバージョンを使う必要がありますので、ダウングレードした場合には同じバージョンに入れ直す必要があるのを忘れないでください。
Ubuntuのセットアップ
こちらはちょっとコツがあります。

まず普通にセットアップをすると、日本語選択した時点で画面からはみ出してボタンが見えなくなります。「Alt+F7」を押すことでウインドウを移動することができます。

上記のように少しウインドウをずらして、右下にボタンが見える状態にしましょう。

VMの設定ですが、クリップボードは双方向で共有しています。

メモリはとりあえず2G。

プロセッサは4コア。

ビデオメモリは最大の128MBに変更しています。CPUとメモリは適当でいいと思いますが、ビデオメモリは少し増やしたほうがいいかな?
ネットワークは標準はNATになっているので、ブリッジにすることでWindowsと同じネットワークになります。今回の使い方だとNATでも通常は問題がないかなと思っています。IDE以外はWindows上から操作しているので。。。
あとはapt update、upgradeをしてから、VirtualBoxのGuest Additionsをインストールします。再起動すれば仮想環境のウインドウを広げると中身もその大きさに反映されるようになるはずです。
Arduino IDE環境構築
Arduino IDEをダウンロードして、sudoでinstallを実行するだけになります。ここは検索すればいくらでも出てくると思うので、詳しくは書きません。これが辛いようであればWindows環境で開発したほうが楽だと思います。
コンパイルエラー
ESP32のボードマネージャーのURLを追加して、ESP32を開発できるようになったところでコンパイルするとエラーになると思います。
exec: "python": executable file not found in $PATH
ボードM5Stick-Cに対するコンパイル時にエラーが発生しました。
Ubuntu 20.04以降ではpythonコマンドがデフォルトでは入っていません。
mt@mt-VirtualBox:~$ python --version
コマンド 'python' が見つかりません。もしかして:
command 'python3' from deb python3
command 'python' from deb python-is-python3
実行しようとしてみると上記のエラーがでます。必要なのはpython-is-python3になります。これは実際にはPython3がpythonコマンドとしてインストールされます。python2をいまさら入れるよりはこちらのほうがいいと思います。
sudo apt install python-is-python3
上記で追加しました。
mt@mt-VirtualBox:~$ python --version
Python 3.8.10
pythonコマンドが使えるようになりました。ただこのままだとシリアル通信ができないのでpyserialを入れる必要があります。
mt@mt-VirtualBox:~$ pip
コマンド 'pip' が見つかりません。次の方法でインストールできます:
sudo apt install python3-pip
pipをみるとpython3-pipを入れろとあります。
mt@mt-VirtualBox:~$ pip --version
pip 20.0.2 from /usr/lib/python3/dist-packages/pip (python 3.8)
入りました。
$ sudo pip3 install pyserial
Collecting pyserial
Downloading pyserial-3.5-py2.py3-none-any.whl (90 kB)
|████████████████████████████████| 90 kB 5.9 MB/s
Installing collected packages: pyserial
Successfully installed pyserial-3.5
pyserialも入りました。これでコンパイルが成功するはずです。
USBの設定

VirtualBoxではUSBを仮想環境で使うことができます。仮想環境に使わせるUSBを選択することでWindowsからは使えなくなりますが、仮想環境からは使えるようになります。

はい。選択できるようになりました。
serial.serialutil.SerialException: [Errno 13] could not open port /dev/ttyUSB0: [Errno 13] Permission denied: '/dev/ttyUSB0'
シリアルポート「serial.serialutil.SerialException: [Errno 13] could not open port /dev/ttyUSB0: [Errno 13] Permission denied: '/dev/ttyUSB0'
」が選択されていますが、そのポートは存在しないか、ボードが接続されていません。
実際に使おうとすると権限がないので使えないと言われます。Ubuntuはデフォルトではシリアルに接続できない設定になっています。

オレンジ色アイコンのUbuntuソフトウエアからUsers and Groupをインストールします。このUbuntuソフトウエアはどうも動きが重いです。20.04は特に重くて、なかなかインストールすることができません。ちなみにグループを追加するだけなので、コマンドラインから追加したほうが多分楽です。

がんばってインストールをすると、グループをアプリから管理できるようになります。「グループの管理」ボタンからdialoutグループを選択し、グループのメンバに使っているユーザーを追加します。
同様に「vboxsf」グループにも追加したほうがあとあと便利です。
この状態で一度再起動します。サインアウトからログインしなおせばたぶん大丈夫ですが、なるべく再起動がいいと思います。

はい。書き込みを行うことができるようになりました。
ファイル共有

VirtualBoxではWindowsと仮想環境とでファイル共有が可能です。私はWindows環境のDropbox上にフォルダを作成し、そのフォルダと仮想環境で共有しました。変更しないといけないのが自動マウントして、設定を保存する永続化するチェックを入れておきます。マウントポイントは/media/fs_??がデフォルトなのですが/mnt/??などが良い場合には変更することもできます。

Arduino IDEのスケッチブックの保存場所を共有したフォルダを指定しておくと便利です。
※ただし、スケッチブックの保存場所を変更してしまうとライブラリのインストール先も変更されてしまいます。複数台で共有する場合には競合するので同じフォルダを共有しないでください。また、今回の場合ライブラリもDropboxに保存されてしまいます。
まとめ
Ubuntu 18.04と20.04はpythonまわりが異なるのですが、20.04と22.04はほぼ同じ操作で使うことができました。
ちなみにWindowsと仮想環境のUbuntuを比べるとコンパイル速度が倍以上違います。ほんとうは仮想環境ではないネイティブのUnuntuの方が快適だとは思うのですが仮想環境でかなり快適になります。
ESP-IDFなどでバージョンを使い分けるときなども仮想環境単位で分離したほうが良さそうでした。ただし、Ubuntuが20Gぐらい容量を使いますのでそこはちょっと気をつける必要があります。
コメント