WSL(Ubuntu)にArduino IDEを導入する
WSL でもArduino IDE を使う
そこで、
手順
大筋はこちらの記事を参考にしました。
ただし、この記事冒頭にあるような「環境破壊」~「初期セットアップスクリプト」の手順は行っていません。
0. アップデート・アップグレード
念のため、アップデートを確認します。場合によっては時間が掛かります。
~$ sudo apt update
~$ sudo apt full-upgrade
1. Arduino IDE をダウンロードする
本記事では、Arduino
というフォルダーを作ります。単に整理整頓のためです。
フォルダーの呼称
なぜか
~$ mkdir Arduino # フォルダーを作る
~$ cd Arduino/ # フォルダーに移動する
~/Arduino$ # 現在のフォルダー名に変わる
次にwget
コマンドがこの行為に相当します。
とは言え、調べなければ何も分からないので、普通にブラウザーで公式サイトを確認します。ブラウザーなら(変なものでなければ)何でも可。
ダウンロードページ(2025/05/14現在)
Linux ZIP file 64 bits (X86-64)
)を選んでいたので、本記事ではこれに遵いました。
両者の違いはこの通りです。
-
.zip
解凍する必要がある
権限を変更する必要はない -
.AppImage
解凍する必要はない
実行権限を与える必要がある
~/Arduino$ wget https://downloads.arduino.cc/arduino-ide/arduino-ide_2.3.6_Linux_64bit.zip
︙
~/Arduino$ ls
arduino-ide_2.3.6_Linux_64bit.zip
ls
コマンドで、arduino-ide_2.3.6_Linux_64bit.zip
がダウンロードできている(手許に存在する)ことを確認しました。
AppImageの場合
Linux AppImage 64 bits (X86-64)
の方も試しました。
ダウンロード
~/Arduino$ wget https://downloads.arduino.cc/arduino-ide/arduino-ide_2.3.6_Linux_64bit.AppImage
︙
~/Arduino$ ls
arduino-ide_2.3.6_Linux_64bit arduino-ide_2.3.6_Linux_64bit.AppImage arduino-ide_2.3.6_Linux_64bit.zip ⋯
このまま実行しようとすると、権限によって阻止されます。
~/Arduino$ ./arduino-ide_2.3.6_Linux_64bit.AppImage
-bash: ./arduino-ide_2.3.6_Linux_64bit.AppImage: Permission denied
実行権限を付える
これは、ファイルに関する権限の内、実行に関する権限が与えられていないためです。
- 権限確認
~/Arduino$ ls -l arduino-ide_2.3.6_Linux_64bit.AppImage
-rw-r--r-- 1 ⋯ ⋯ 200980456 Apr 9 20:45 arduino-ide_2.3.6_Linux_64bit.AppImage
ls -l
で、ファイルの権限を始め、基本的な情報を表示します。権限を表すのはこの部分です。
rw-r--r--
- 権限の種類と意味
これは次のように読解します。(基本の三つのみ記載)
表記 | 意味 |
---|---|
r |
読み取り( |
w |
書き込み( |
x |
実行( |
- |
対応する権限無し |
本来はrwxrwxrwx
の順に並んでおり、-
がある場合、その対応する箇所に該当する権限が無いことを示します。「r
」が無ければ、ファイルの内容を見ることができません。「w
」が無ければ、ファイルの内容を編集することができません。「x
」が無ければ、ファイルを実行することができません。
今回はx
が無いため、実行時にPermission denied
とエラーになったのです。
- 権限の対象者
rwx
が三つ並んでいるので、「三つの異なる対象者」についての権限をそれぞれ示します。
箇所 | 対象者 |
---|---|
rwx------ |
ファイルの所有者(個人) |
---rwx--- |
ファイルの所有グループ(複数人) |
------rwx |
よその人全て |
↓所有者
-rw-r--r-- 1 ⋯ ⋯ 200980456 Apr 9 20:45 arduino-ide_2.3.6_Linux_64bit.AppImage
↑所有グループ
今回は「自分がダウンロードしたファイル」ですから、「所有者は自分」になっているはずです。よって、今回注目するのは一つ目のrw-
になります。
(何かの間違いで自分でない場合は、chown
コマンドで所有者を変えるとよいでしょう)
権限を変更する際はchmod
コマンドを使うことが一般的です。chmod u+x
あるいはchmod 744
で実行権限を与えます。しかしここでは、せっかくなので異なる方法を紹介します。
Nautilus
~/Arduino$ sudo apt install nautilus
実行はやはりコマンドです。
~/Arduino$ nautilus
arduino-ide_2.3.6_Linux_64bit.AppImage
を「右」クリックします。エクスプローラー同様、メニューが出てきます。
Properties
を選ぶ
Permissions
を表示(一部加工済み)
チェックボックスに承認します。
この結果、先のls -l
の表示はこのように変化します。
~/Arduino$ ls -l arduino-ide_2.3.6_Linux_64bit.AppImage
-rwxr-xr-x 1 ⋯ ⋯ 200980456 Apr 9 20:45 arduino-ide_2.3.6_Linux_64bit.AppImage
コマンドを使わずに所有者、所有グループ、その他全員に実行権限が与えられました。所有者だけに限定したい場合は、chmod
コマンドを使ってください。
これで実行準備が整いました。AppImage
は圧縮ファイルではありませんから、次に示す解凍の手順を踏む必要はありません。但し、不足機能の追加は必要です。
また、
2. Zip 解凍
zip
コマンド(圧縮)もunzipコマンド
(解凍)もなかったため、せっかくなので両方導入しました。
~/Arduino$ sudo apt install zip unzip
解凍する術を得たので、解凍します。
~/Arduino$ unzip arduino-ide_2.3.6_Linux_64bit.zip
︙
~/Arduino$ ls
arduino-ide_2.3.6_Linux_64bit arduino-ide_2.3.6_Linux_64bit.zip
解凍され、arduino-ide_2.3.6_Linux_64bit
フォルダーが作られました。
3. 不足機能導入
参考元の記事にもある通り、不足するパッケージをインストールしなければ動きませんでした。
今回は、公式サイトの手順に倣います。
~/Arduino$ sudo add-apt-repository universe
Adding component(s) 'universe' to all repositories.
Press [ENTER] to continue or Ctrl-c to cancel. # エンターキーを押す
︙
~/Arduino$ sudo apt install libfuse2
しかし、これだけではまだ動きませんでした。
~/Arduino$ cd arduino-ide_2.3.6_Linux_64bit/
~/Arduino/arduino-ide_2.3.6_Linux_64bit$ ./arduino-ide
./arduino-ide: error while loading shared libraries: libnss3.so: cannot open shared object file: No such file or directory
libnss3
を直接指定してもよいそうですが、libnss3-dev
を指定しても動作しました。何が違うのかはよくわかりません。
~/Arduino/arduino-ide_2.3.6_Linux_64bit$ sudo apt install libnss3
~/Arduino/arduino-ide_2.3.6_Linux_64bit$ sudo apt install libnss3-dev
最後に、どう考えても日本語を使いたいので、日本語フォントをインストールします。こちらを参考にしました。
今回は、なんとなく
~/Arduino/arduino-ide_2.3.6_Linux_64bit$ sudo apt install fonts-ipafont
4. 実行
動かすにもコマンド上で行います。参考までに、arduino-ide_2.3.6_Linux_64bit
フォルダーの内容を見てみましょう。この中の「arduino-ide
」が、
arduino-ide_2.3.6_Linux_64bit
の中
~/Arduino/arduino-ide_2.3.6_Linux_64bit$ ./arduino-ide
背景は
初期の状態では英語表記ですが、設定から日本語に変更しています。なお、言語の変更など
5. WSL とUSB
ここで
ここからは、
~/⋯$ Linuxの操作
PS C:\⋯> Windowsの操作
デフォルト設定
wsl
コマンドを使います。このコマンドを使う上で、今使用している
インストールされている
PS C:\⋯> wsl --list --verbose
NAME STATE VERSION
* Ubuntu Running 2
docker-desktop Stopped 2
docker-desktop-data Stopped 2
ここで着目するべきは、*
がUbuntu
についているか否かです。嘗て私の環境では、docker-desktop-data
についていました。これを変更するには、次のようにします。
PS C:\⋯> wsl --set-default Ubuntu
この操作を正しく終了しました。
またVERSION
とあるのは、2
になっていることを確認しましょう。
USB デバイスを調べる
ここでは、usbipd
コマンドを使います。標準搭載しているものではないため、インストールする必要があります。
システムの種類によって適切な方を選択します。設定から、「システム」>「バージョン情報」で確認できます。
私の場合はこのようにx64
とあるので、usbipd-win_x.x.x_x64.msi
を選ぶと良いはずです。arm64
もありますが、x86
はありません。5.0.0
からarm64
版が追加されているようなので、x86
もそのうち対応されるかもしれませんし、されないかもしれません。
このファイルを実行すれば、usbipd
が使えるようになります。私が以前導入したものは3.0.0
でしたので、この機会に5.0.0
を導入し直しました。(その後5.1.0
が公開されていました。)
PS C:\⋯> usbipd.exe --version
5.0.0-10+Branch.master.Sha.⋯.⋯
usbipd
が有効になったら、このようにして
PS C:\⋯> usbipd list
Connected:
BUSID VID:PID DEVICE STATE
1-2 2886:002d USB シリアル デバイス (COM4), USB 大容量記憶装置, USB 入 ... Shared
1-3 ____:____ USB 入力デバイス Not shared
1-5 ____:____ Goodix fingerprint Not shared
1-6 ____:____ Integrated Webcam Not shared
1-10 ____:____ インテル(R) ワイヤレス Bluetooth(R) Not shared
Persisted:
GUID DEVICE
________-____-____-____-____________ USB Serial Converter
今回1-2
のものです。
WSL に認識させる
今回は既に1-2
がShared
となっていますが、Not shared
の場合は次のようにして共有します。
PS C:\⋯> usbipd bind --busid 1-2
usbipd: info: Device with busid '1-2' was already shared. # 共有済みの場合メッセージが出る
この操作のみ、管理者権限が必要でした。以降は必要ありません。今回は既に共有してあったので、そもそも必要ありませんでした。
愈愈、
PS C:\⋯> usbipd attach --wsl --busid 1-2
usbipd: info: Using WSL distribution 'Ubuntu' to attach; the device will be available in all WSL 2 distributions.
usbipd: info: Detected networking mode 'nat'.
usbipd: info: Using IP address xxx.xxx.xxx.xxx to reach the host.
WSL から確認する
~$ lsusb
Bus 002 Device 001: ID ____:____ Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 2886:002d Seeed Technology Co., Ltd. Wio Terminal
Bus 001 Device 001: ID ____:____ Linux Foundation 2.0 root hub
Seeed Technology Co., Ltd. Wio Terminal
が、今回接続した
補遺:異なる状態の存在するボード
Arduino UNO は単純
一般に「
Bootloader mode
しかし、広義に
例に、
引用:https://wiki.seeedstudio.com/Wio-Terminal-Getting-Started/
- 一つは、電源が入っておらず停止している状態。
- 一つは、電源が入って動作している状態。
- そして最後に、電源が入っているが動作しておらず、書き込みできる状態。
usbipd list
で
特に最後の状態を「
また同社の提供するRST
ピンがむき出しになっています。これを素早く短絡させることで、動作している状態から
引用:https://wiki.seeedstudio.com/Seeeduino-XIAO/
状態による区別
# Windows
PS C:\⋯> usbipd.exe list
Connected:
BUSID VID:PID DEVICE STATE
1-2 2886:802f USB シリアル デバイス (COM4) Attached
1-3 ____:____ USB 入力デバイス Not shared
︙
# WSL
~$ lsusb
Bus 002 Device 001: ID ____:____ Linux Foundation 3.0 root hub
Bus 001 Device 005: ID 2886:802f Seeed Technology Co., Ltd. Seeed XIAO M0
Bus 001 Device 001: ID ____:____ Linux Foundation 2.0 root hub
# Windows
PS C:\⋯> usbipd.exe list
Connected:
BUSID VID:PID DEVICE STATE
1-2 2886:002f USB シリアル デバイス (COM5), USB 大容量記憶装置, USB 入 ... Shared
1-3 ____:____ USB 入力デバイス Not shared
︙
# WSL
~$ lsusb
Bus 002 Device 001: ID ____:____ Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 2886:002f Seeed Technology Co., Ltd. Seeeduino XIAO
Bus 001 Device 001: ID ____:____ Linux Foundation 2.0 root hub
表示される名称も然り、COM4
かCOM5
か、802f
か002f
かというように、まるで異なるデバイスかのような扱いに感じます。実際、それぞれ別途usbipd bind
でShared
に設定しなければなりません。この現象は
一方、動く以外に状態のない
再接続の自動化
--auto-attach
オプションをつけることで、コマンドが終らなくなり、デバイスの再接続が自動で行われるようになります。
PS C:\⋯> usbipd attach --wsl --busid 1-2 --auto-attach
usbipd: info: Using WSL distribution 'Ubuntu' to attach; the device will be available in all WSL 2 distributions.
usbipd: info: Detected networking mode 'nat'.
usbipd: info: Using IP address xxx.xxx.xxx.xxx to reach the host.
usbipd: info: Starting endless attach loop; press Ctrl+C to quit.
WSL Attached
WSL Detached
WSL usbip: error: Attach Request for 1-2 failed - Device not found
WSL usbip: error: Attach Request for 1-2 failed - Device busy (exported)
usbipd: warning: The device appears to be used by Windows; stop the software using the device, or bind the device using the '--force' option.
WSL Attached
6. Linux とArduino
ここからは、
結論から言えば、chmod
コマンドを使って手作業で権限を付与している情報もありますが、ここでは「権限に関するルールを定める」方法を紹介します。
手順が煩雑ですから、流れを図示します。
USB 認識の確認
こちらは既に述べたlsusb
での確認です。
~$ lsusb
Bus 002 Device 001: ID ____:____ Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 2886:002d Seeed Technology Co., Ltd. Wio Terminal
Bus 001 Device 001: ID ____:____ Linux Foundation 2.0 root hub
先ほどは存在を確認するばかりでしたが、今回はデバイス名の左にある数値2886:002d
を記録します。2886
は「002d
は「
特に2886
は、
~$ lsusb
Bus 002 Device 001: ID ____:____ Linux Foundation 3.0 root hub
Bus 001 Device 006: ID 2886:002f Seeed Technology Co., Ltd. Seeeduino XIAO
Bus 001 Device 001: ID ____:____ Linux Foundation 2.0 root hub
2886
の共通していることが分かるでしょう。このように、それぞれのデバイスで異なる
従って、記録する値は2886
のみでも構いません。
USB 権限のルール設定
権限を定めるルールを.rules
ファイルとして作成し、/etc/udev/rules.d/
というフォルダーに配置します。作成する際のファイル名は自由でよいと思われますが、99_~~.rules
、98_~~.rules
というように、数字を
本記事でも、99-seeed-boards.rules
というファイル名で作成しました。
/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"
は先の
ENV{ID_MM_DEVICE_IGNORE}="1"
は
MODE="0666"
は権限です。chmod 666
と同様、読み取りと書き込みを全てのユーザーに許可しているようです。
ファイルを配置しただけでは意味が無いため、設定を適用します。
$ sudo udevadm control --reload-rules
グループへの追加
自分をdialout
グループに追加します。
$ cat /etc/group | grep dial
dialout:x:20:
dialout
グループに自分が属していなければ、このようなコマンドで追加します。グループにユーザーを追加するコマンドは複数あるため、お好きな方法で構いません。
$ sudo gpasswd -a 「自分のユーザー名」 dialout
ユーザ 「自分のユーザー名」 をグループ dialout に追加
これで/etc/group
の内容が更新されます。
$ cat /etc/group | grep dial
dialout:x:20:「自分のユーザー名」
一方、id
コマンドでは確認できない場合があります。
$ id
uid=1000(「自分のユーザー名」) gid=1000(「自分のグループ名」) groups=1000(「自分のグループ名」),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),125(lpadmin),137(sambashare)
$ id | grep dial # dial で検索すると何も該当しない
その際は再起動します。
しかしながら、
PS C:\⋯> wsl --shutdown
[プロセスはコード 1 (0x00000001) で終了しました]
このターミナルを Ctrl+D で閉じるか、Enter キーを押して再起動できます。
指示の通り再起動することができます。
7. Arduino IDE からArduino への書き込み
usbipd attach
で
最終的に、
Arduino IDE から書き込めないボードが存在する?
註にて触れたように、
当然乍ら、
また、
更に、同じcargo-hf2
)による書き込みは以前からできておりました。
ここまで条件が揃っていて、書き込みに必ず失敗します。
︙
No device found on ttyACM0
Set binary mode
Send auto-baud
Set binary mode
Failed uploading: uploading error: exit status 1
思いつく手段は幾つか試してみたものの、未だ書き込みに成功したことは一度とありません。にも拘わらず、
以上の事から、
Discussion