【Zorin OS / Ubuntu】Arduino IDE 2.3.6 on VirtualBox

に公開

仮想環境で心機一転

冒頭から私事で恐縮ですが、近頃LvGL(組込みシステム用GUIライブラリー)を試しています。しかし訳あって7.0.2という古いバージョンを使っています。因みに現在の最新は9.3です。

全く解決策が分からず素直に諦めていたところでしたが、その問題を突破せられた記事が投稿されているのを見つけました。どうして真似せずして居られましょうか。

然り而して、一つ都合の悪いことが顕露します。それは、同名の異なるライブラリーを扱う手順が面倒ということでした。一方を使いたければ、他方を使えない状態にしなければならない。更に迷惑なのは、他ならぬLvGLの、設定ファイルを作ってフォルダーに置いておかねばならぬという特徴でした。

LvGL以外にも、これまでに導入したライブラリーが幾つかあったため、この際新たな開発環境を拵えて了おうと思い立ったというのが事のあらましで御座います。

本題

註記した通り、VirtualBoxZorin OSは既に導入済みであることを前提に述べています。

VirtualBoxの設定

仮想環境を起動する前に、USBを扱うための設定が必要です。

VirtualBoxの「設定」から、「USB」を選びます。

USBの設定
+のアイコンでUSBデバイスを追加する

USBデバイスフィルターの横、上から二つ目のアイコンで、USBデバイスを追加します。なお、「電源スイッチがある機種」であれば、当然乍ら、電源オフの状態ではデバイスが見つかりません。電源は投入した状態にしましょう。更に、「書き込みを待機する状態がある機種」であれば、その状態を登録しなければ書き込めない可能性があります。

ここではWio Terminalを対象としています。二つあるのは上のように、書き込みを待つ状態(ブートローダーモード)と、単に動作している状態との二つを登録したためです。これが必要か否かはよくわかっておりませんが、念のため手間を掛けておきました。

また記事によっては、敢えてUSB 1.1を選んでいるものもあります。ここではUSB 2.0を選んでいますが、特に問題は見られませんでした。

この設定が済んだら、仮想環境を起動します。

Zorin OSの設定

Zorin OSDebian系に相当するため、Debian系であれば異なるOSであっても同手順が有効かもしれません。

https://docs.arduino.cc/software/ide-v2/tutorials/getting-started/ide-v2-downloading-and-installing/#linux

Arduino IDEをダウンロードする

ブラウザーからダウンロードします。ここではAppImageを選択しています。ZIP fileを選んだ場合は、unzipコマンドなどで展開します。

Arduino IDEダウンロードページ
Linux AppImage 64 bits (X86-64)を選ぶ
https://www.arduino.cc/en/software/

AppImageを実行するため、実行権限を付与します。GUIの場合はプロパティーから設定できます。

プロパティを選択する

プログラムとして実行可能
プログラムとして実行可能にチェックする

権限は与えましたが、この時点で未だArduino IDEは実行できません。

パッケージをインストールする

公式の情報に従い、パッケージをインストールします。Zorin OSではaptが使えるため、In Ubuntu (>= 22.04)とある方を実行しました。

In Ubuntu (>= 22.04)
sudo add-apt-repository universe
sudo apt install libfuse2
インストール中の様子

前者と後者に分けて実行します。前者を実行した際、「Enter」キーの入力を求められます。

$ sudo add-apt-repository universe
コンポーネント 'universe' をすべてのリポジトリに追加しています。
続けるには「Enter」キーを、中止するにはCtrl-cを押してください。
ヒット:1 https://packages.mozilla.org/apt mozilla InRelease
ヒット:2 https://packages.zorinos.com/stable jammy InRelease
ヒット:3 http://jp.archive.ubuntu.com/ubuntu jammy InRelease
ヒット:4 https://packages.zorinos.com/patches jammy InRelease
ヒット:5 https://packages.zorinos.com/apps jammy InRelease
ヒット:6 http://security.ubuntu.com/ubuntu jammy-security InRelease
ヒット:7 http://jp.archive.ubuntu.com/ubuntu jammy-updates InRelease
ヒット:8 https://packages.zorinos.com/drivers jammy InRelease
ヒット:9 http://jp.archive.ubuntu.com/ubuntu jammy-backports InRelease
ヒット:10 https://ppa.launchpadcontent.net/zorinos/apps/ubuntu jammy InRelease
ヒット:11 https://ppa.launchpadcontent.net/zorinos/drivers/ubuntu jammy InRelease
ヒット:12 https://ppa.launchpadcontent.net/zorinos/patches/ubuntu jammy InRelease
ヒット:13 https://ppa.launchpadcontent.net/zorinos/stable/ubuntu jammy InRelease
パッケージリストを読み込んでいます... 完了
$ sudo apt install libfuse2
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
libfuse2 はすでに最新バージョン (2.9.9-5ubuntu3) です。
libfuse2 は手動でインストールしたと設定されました。
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  lp-solve
これを削除するには 'sudo apt autoremove' を利用してください。
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 0 個。

以上で、Arduino IDEが起動するようになったはずです。Arduino IDEの設定は省略します。

USBを扱う権限の付与

この手順が最も煩雑です。流れを図示しておきます。

  1. USB認識の確認

lsusbコマンドで、認識しているUSBデバイスを確認することができます。

$ lsusb
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 2886:002d Seeed Technology Co., Ltd. Wio Terminal
Bus 001 Device 002: ID 80ee:0021 VirtualBox USB Tablet
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

Seeed Technology Co., Ltd. Wio Terminalとあり、正しく認識していることが分かりましたが、もう一つ見るべき箇所があります。

Bus 001 Device 003: ID 2886:002d Seeed Technology Co., Ltd. Wio Terminal
                       ^--- ^---

2886:002dとある内、2886は「vendor id」、002dは「product id」を示します。

特にvendor idである2886は、Seeed社のものであれば共通の値を取るようです。次は、Seeed製の別デバイスXIAOを見た様子です。

別環境にてXIAO
$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 006: ID 2886:002f Seeed Technology Co., Ltd. Seeeduino XIAO
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

product idは異なるものの、vendor idは一致しています。

よってvendor id2886を用いれば、「Seeed製のあらゆるデバイスに適用される汎用的な設定」ができるはずです。この値を次で用います。

  1. USB権限のルール設定

突然ですが、/etc/udev/rules.d/の中を確認します。

$ ls /etc/udev/rules.d/ -al
合計 8
drwxr-xr-x 2 root root 4096  48  2022 .
drwxr-xr-x 4 root root 4096  527 22:26 ..

何もありませんでした。ここに、USB権限に関するルール(を記述したファイル)を配置します。

今回はSeeed製デバイス全般のルールを記述するため、99_seeed_boards.rulesの名前でファイルを作りました。

現在地は/etc/udev/rules.dであることに注意
/etc/udev/rules.d$ cat 99_seeed_boards.rules 
ATTRS{idVendor}=="2886", ENV{ID_MM_DEVICE_IGNORE}="1"
SUBSYSTEM=="usb", ATTRS{idVendor}=="2886", MODE="0666"
SUBSYSTEM=="tty", ATTRS{idVendor}=="2886", MODE="0666"

ATTRS{idVendor}=="2886"は先のvendor idです。
ENV{ID_MM_DEVICE_IGNORE}="1"ModemManagerにデバイスを制御させないための記述だそうです
MODE="0666"は権限です。chmod 666と同様、読み取りと書き込みを全てのユーザーに許可しているようです。

記述参考元

こちらの書籍を参考にしております。
鵜呑みはいけないと色々調べた結果、結局この情報が最適解でした。

https://www.c-r.com/book/detail/1403

https://www.google.co.jp/books/edition/基礎から学ぶ組込みRust/R8xmzgEACAAJ?hl=ja

こうして定めた新たなルールを適用します。

$ sudo udevadm control --reload-rules

最後に、自分を或るグループに追加します。

  1. グループへの追加

自分をdialoutグループに追加します。当初は誰も属していませんでした。

$ cat /etc/group | grep dial
dialout:x:20:

グループへユーザーを追加します。幾つかある方法の内、本記事ではこの方法を紹介します。

$ sudo gpasswd -a 「自分のユーザー名」 dialout 
ユーザ 「自分のユーザー名」 をグループ dialout に追加

追加されたかどうか確認します。

idコマンドで確認できない
$ cat /etc/group | grep dial
dialout:x:20:「自分のユーザー名」
$ id
uid=1000(「自分のユーザー名」) gid=1000(「自分のグループ名」) groups=1000(「自分のグループ名」),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),125(lpadmin),137(sambashare)
$ id | grep dial

このようにidコマンドでdialout表示されないため、再起動します。

idコマンドで確認
$ id
uid=1000(「自分のユーザー名」) gid=1000(「自分のグループ名」) groups=1000(「自分のグループ名」),4(adm),20(dialout),24(cdrom),27(sudo),30(dip),46(plugdev),125(lpadmin),137(sambashare)

以上で、全ての設定が終了しました。

Arduino IDEの例からBlinkを書き込んでみたところ、正常に動作することを確認できました。今後はこちらを第二の開発環境として使えるようになりました。

前日譚

余談ですが、VirtualBoxの前にWSLを試していました。Arduino IDEの実行、デバイスの認識までは到達したものの、Wio TerminalXIAOも、No upload port found, using /dev/ttyACM0 as fallbackのエラーが解消できず、一度たりとも書き込むことができませんでした。Rust(cargo-hf2)での書き込みは全く問題なく行えることもあって、一体何が原因なのか分からず。こうして別の手段に遁走した次第であります。

Discussion