ArduinoIDEをWSL上で動かしてESP32のコンパイルを高速化

# 1.はじめに
日頃Windows版Arduino IDEを使っているのですが、ESP32のコンパイルの遅さにうんざりしていたところ、Windows上でLinux版Arduino IDEを使えば超高速になるという記事を見て私もやってみたところ、本当に高速でした。

YouTubeで手順を解説されている方の動画やその他色々なサイトを参考にインストールしたのですが、現時点（2024年1月）で変わっているところが多くあり、動くようになるまで色々つまづいたので手順を記録しておきます。

CUIには慣れていないので極力GUIを使っています。

# 2. 前準備（Windowsの機能の有効化）
1. Windowsの「スタートボタン」→「Windowsシステムツール」→「コントロールパネル」→「プログラム」→「Windowsの機能の有効化または無効化」と進む。
2. 「Windowsの機能の有効化または無効化」（以下）が表示される。「Linux用Windowsサブシステム（WSL）」と「仮想マシン プラットフォーム」にチェックを入れ「OK」をクリックする。
![article01-01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680834/69bd8814-6327-be02-31da-e4efefcde97e.png)
3. 画面の指示に従って再起動する。

# 3. WSL(Windows Subsystem for Linux)のインストール
1. WindowsスタートメニューからMicrosoft Storeを起動
![article01-02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680834/0c54ac77-2d46-5a94-3a72-3274f914722b.png)
2. 検索窓にwslと入力して検索し、入手をクリックしてインストールする。
![article01-03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680834/1d8ccf0d-c37d-5b4d-b67a-cf222b1a7bb3.png)

# 4. Ubuntuのインストール
1. Microsoft Storeの検索窓にubuntuと入力して検索し、入手をクリックしてインストールする
![article01-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680834/804f8c1a-7332-fea3-a7ea-8c85df995aac.png)
2. windowsスタートメニューからUbuntuを起動
![article01-05.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680834/c7232bdf-b846-c58c-42c4-d2d523d8ce3c.png)
3. 初回はユーザー名、パスワードを設定します
任意のユーザー名を入力してENTER
※ユーザー名には、小文字（a-z）、数字（0-9）、ダッシュ（-）、アンダースコア（_）が使用でき、予約名は使用できず、最大長32文字に制限されます。
![article01-06.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680834/d8fd2ad4-90e5-357f-6136-8984ea97e804.png)
4. 続いてパスワードを入力
※パスワードには、小文字（a-z）、数字（0-9）と記号が使用できます
※パスワードは入力しても画面には何も表示されません
確認の為もう一度パスワードを入力
![article01-07.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680834/0c40aec3-1350-c00f-4bbe-a154faf59158.png)
5. インストールが完了
![article01-08.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680834/05445275-c3a1-d270-c68b-097de8748714.png)
6. パッケージ情報を更新しておきます
    ``` :Ubuntu
    sudo apt update
    sudo apt upgrade
    ```

# 5. ファイルマネージャーのインストール
~~~:Ubuntu
sudo apt install nautilus -y
~~~
インストールが完了したらUbuntuのターミナルから
~~~:Ubuntu
nautilus
~~~
又はWindowsスタートメニューからFiles（Ubuntu）をクリック
![article01-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680834/072c5a61-8848-eb65-2aaa-ed3f9995c17a.png)
ファイルマネージャーが開きます
![article01-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680834/c9733a38-fa7d-5af1-ab07-8ecbe44e513f.png)
※私のPCの場合初めてファイルマネージャーを開いた時に画面がひどく乱れて表示されました。
PCを再起動してもう一度開くと次からは上のように正常に表示されました。

# 6. Arduino IDEのインストール
1. Windowsのブラウザで https://www.arduino.cc/en/software を開く
2. Linux appImage 64bitをクリック
![article01-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680834/9bc825be-58e9-66ae-de05-2d8a4212f00a.png)
3. JUST DOWNLOADをクリック（寄付するときはCONTRIBUTE & DOWNLOADをクリック）
![article01-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680834/09f2366c-9711-4c67-4997-c8726363d063.png)
4. Newsletter不要の場合はJUST DOWNLOADをクリック
（Newsletter購読の場合はメールアドレスを入力してSUBSCRIBE & DOWNLOADをクリック）
![article01-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680834/c32084b4-1699-e9bb-b66e-8b212dadd7ee.png)
5. ダウンロード完了
![article01-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680834/db81e108-149b-784e-3d95-22fd1c5ed250.png)
6. WindowsのエクスプローラーからペンギンアイコンのLinuxを開き、Ubuntu→home→自分が設定したユーザー名フォルダの中に先程ダウンロードした arduino-ide_2.2.1_Linux_64bit.AppImage をコピーします。
コピーすると arduino-ide_2.2.1_Linux_64bit.AppImage・Zone.Identifier というファイルが自動的に作られるのですが、不要なので削除します。
![article01-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680834/443ee0c3-1af3-d955-da40-bb35699dde1d.png)
7. Ubuntuのファイルマネージャーを開き、arduino-ide_2.2.1_Linux_64bit.AppImageを右クリックしPropertiesをクリック
![article01-16.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680834/a4f47652-c1f1-ae79-8b25-1d4bde959487.png)
8. Permissionsタブをクリックし
OwnerのAccessを「Read and Write」
自分のGroupを「Read and Write」
Allow executing file as programにチェックを入れてPropertiesを閉じます。
![article01-17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680834/7aec9ff6-c8c2-7fdd-73fd-84b6d249abc7.png)
9. Ubuntuのターミナルで以下を順にインストール
    ~~~:Ubuntu
    sudo add-apt-repository universe
    sudo apt install libfuse2
    sudo apt install libgbm-dev
    sudo apt install libasound2
    sudo apt install nodejs
    sudo apt install npm
    ~~~
    ここで私は色々つまづきました。（つまづきポイントその1）
    https://docs.arduino.cc/software/ide-v2/tutorials/getting-started/ide-v2-downloading-and-installing/ のページを見ると
    >sudo add-apt-repository universe
    >sudo apt install libfuse2

    これだけで良いようでしたが、それだけだとまず
    >/tmp/.mount_arduinlyVvC1/arduino-ide: error while loading shared libraries: libgbm.so.1: cannot open shared object file: No such file or directory

    とエラーが出て、次にlibgbm-devをインストールすると
    >file: Error opening file /home/user001/.gtk-bookmarks: No such file or directory
/tmp/.mount_arduinZTK2CY/arduino-ide: error while loading shared libraries: libasound.so.2: cannot open shared object file: No such file or directory

    とエラーが出て、次にlibasound2をインストールすると
    >Checking for frontend application configuration customizations. Module path: /tmp/.mount_arduinKBQZr7/resources/app/lib/backend/electron-main.js, destination 'package.json': /tmp/.mount_arduinKBQZr7/resources/app/package.json

    とエラーが出て、次にnodejsとnpmをインストールしてようやく起動できるようになりました。

10. Ubuntuのファイルマネージャー画面で arduino-ide_2.2.1_Linux_64bit.AppImage をダブルクリック
![article01-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680834/567e222a-a99b-94fe-79b7-2aecb4a9dea7.png)

    またはUbuntuのターミナルで
    ~~~:Ubuntu
    ./arduino-ide_2.2.1_Linux_64bit.AppImage
    ~~~
    Arduino IDEが起動します
![article01-19.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680834/9da28d79-d8a3-58a4-7d43-5b589f43d61c.png)
11. 一旦Arduino IDEを閉じます

# 7. USBのインストール

1. USBIPD-WINをインストール
下記よりMSI形式のインストーラーをダウンロードしてインストール
https://github.com/dorssel/usbipd-win/releases
インストールが完了したら、一度Windowsを再起動。


2. UbuntuにUSBIP ツールとハードウェア データベースをインストール
    ~~~:Ubuntu
    sudo apt install linux-tools-generic hwdata
    sudo update-alternatives --install /usr/local/bin/usbip usbip /usr/lib/linux-tools/*-generic/usbip 20
    ~~~
3. arduinoをUSB接続
Windowsスタートアイコンを右クリック→デバイスマネージャーをクリック
ポートにデバイスが表れているか確認
![article01-20.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680834/0207b484-4836-34ed-2d8f-e633feeddfc5.png)
4. Windows PowerShellを管理者として実行
    arduinoボードの接続先BUSIDを確認し、その接続先をwindows以外のクライアントとシェアできるようにします。
    （"1-3" 部分は自分のBUSIDに置き換えてください）
    ~~~:PowerShell
    usbipd list
    usbipd bind --busid 1-3
    ~~~
    もう一度 usbipd list で確認すると状態が"Not shared"から"Shared"に変わっていることが分かります。
![article01-21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680834/685853ba-830a-311a-b1cb-b3b74111d3b5.png)
5.　UbuntuにUSBデバイスを接続
   ※ Ubuntuのターミナルが開いた状態で行ってください
    （"1-3" 部分は自分のBUSIDに置き換えてください）
~~~:PowerShell
usbipd attach --busid 1-3 --wsl --auto-attach
~~~

上手くいった場合はWSL Attachedと表示されます。
![article01-22.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680834/65c0a554-3e48-aa4f-5101-8057b1fb9a2d.png)
このようなメッセージが出る場合はセキュリティソフトのFirewall設定を見直す必要があります。（つまづきポイントその2）
>usbipd: warning: A third-party firewall may be blocking the connection; ensure TCP port 3240 is allowed.

![article01-23.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680834/e11ae54c-6e54-f73b-f3bf-379bd5a0e90f.png)
6. Ubuntu側で接続を確認
```:Ubuntu
lsusb
```
![article01-24.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680834/71733ec3-e8ac-44cd-0900-14bc7e93439c.png)
7. Arduino IDEを起動しボードを選択します
![article01-25.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680834/b8e30189-cc70-27aa-b74a-8655e5c7041f.png)
8. サンプルプログラムBlinkを開く
![article01-26.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680834/bbc37f1b-7498-4c8f-bc2e-111f0ea80abe.png)
9. ボードにアップロードする
![article01-27.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680834/24bb5fa9-fd54-e162-bfba-d74e148f1508.png)
10. 無事にアップロードできれば、まずはArduinoボードが使える状態です
    この時点で速さ実感できますよ！

# 8. 終了の手順
1. Arduino IDEウィンドウを閉じる
2. ファイルマネージャーから起動していた場合はファイルマネージャーウィンドウを閉じる
3. PowerShellウィンドウでCtrl+cでusbipdを終了する
4. Ubuntuウィンドウを`exit`(または`logout`)で終了
5. PowerShellウィンドウを`exit`で終了

# 9. インストール後の起動手順
1. AruduinoボードをUSB接続
2. Ubuntuを起動
3. PowerShellを起動しUbuntuにUSBデバイスを接続
（"1-3" 部分は自分のBUSIDに置き換えてください）
 `usbipd attach --busid 1-3 --wsl --auto-attach`
4. Ubuntuのファイルマネージャーを起動
5. Arduino IDEを起動

# 10. ESP32のインストール
1. ESPボードをUSB接続
2. PowerShellを管理者として実行
3. ESP32ボードの接続先BUSIDを確認し、その接続先をbind
    （"1-3" 部分は自分のBUSIDに置き換えてください）
    ※先のArduinoボードと同じUSBポートを使用する場合でももう一度bindしてください
    ```:PowerShell
    usbipd list
    usbipd bind --busid 1-3
    ```
4. Ubuntuを起動
5. UbuntuにESP32を接続
    （"1-3" 部分は自分のBUSIDに置き換えてください）
    ```:PowerShell
    usbipd attach --busid 1-3 --wsl --auto-attach
    ```
6. Ubuntu側で接続を確認
    ```:Ubuntu
    lsusb
    ```
    ![article01-28.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680834/4e9f2626-d608-0c96-127c-a8080ca9178e.png)
7. Arduino IDEを起動
8. BOARDS MANAGERアイコンをクリックし、検索窓にesp32と入力し、esp32 by Espressif Systemsをインストール
    ![article01-29.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680834/b6ab1a6a-35c2-3dc6-bfc1-6602e12cce16.png)
9. ESP32ボードとポートの選択
    ボードの検索窓から"Select other board and port"をクリックし、詳細設定画面に移り
    ![article01-30.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680834/aeafd450-928a-4dc6-9afe-a4fb7b9ef713.png)
    検索窓にESP32と入力し、ボードの種類を選択
    ポートも選択し、OKをクリック
    ![article01-31.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680834/a5a3cd42-4094-b733-7535-1b7cf03d8699.png)
10. これでOKと思いきや、試しにアップロードしてみると
    >ModuleNotFoundError: No module named 'serial'

    というエラーが出ました。ESP32は何やらpythonを利用しているらしく、"pyserial"が無いと言っているようです。（つまづきポイントその3）
    ![article01-32.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680834/5c7b145a-362b-96b4-52b6-1c156c75ac13.png)
    ここから先はエラーが出なければ関係ないですが...
    
11. ArduinoIDEを一旦閉じて、Ubuntuターミナルで"pyserial"をインストールするのですが、その前にpythonパッケージ管理ツール"pip"をインストール
```:Ubuntu
sudo apt install python3-pip
```
次に"pyserial"をインストール
```:Ubuntu
python3 -m pip install pyserial
```

![article01-33.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680834/fb8c7767-e6fc-d2e6-cbae-6ae3ecc0106d.png)
インストールはできたのですがパスが通ってないと言われます
>WARNING: The scripts pyserial-miniterm and pyserial-ports are installed in '/home/user001/.local/bin' which is not on PATH.

パスを通します
```:Ubuntu
nano ~/.bashrc
```
.bashrcの最終行に下記を追記
    (user001になっているところは自分のユーザー名に変更してください）
    `export PATH=$PATH:/home/user001/.local/bin`
![article01-35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680834/9976acff-56bc-f148-830d-9b1c54e73780.png)
    Ctrl+X を押し、その後 Y を押す
    File Name to Write: /home/user001/.bashrc
    と聞いてくるのでenterで終了
    以下のコマンドを実行して、変更を反映
```:Ubuntu
source ~/.bashrc
```

もう一度ArduinoIDEを起動してESP32に何かプログラムをアップロード
    ![article01-34.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680834/9543e22c-6797-4319-9784-1885c1b0cdcf.png)
    Windows版ArduinoIDEと比べ格段の速さで無事アップロードできました。

# 11. 最後に
Linuxに疎くおかしなことを書いているかもしれませんので、ご指摘いただけると幸いです。
まだ日本語が扱えないので、[次は](https://qiita.com/Ronstadt/items/e1503fc6f7f68ac423a6)日本語が使える状態にしたいと思っています。
長文にお付き合いいただきありがとうございました。

# 参考にしたサイト
* [YouTube - Run Linux Apps (GUI) on Windows 11 (Fast Arduino IDE) WSL](https://youtu.be/y4F1a66VOvs?si=qNYU4j591ZMM4RzE)
* [Downloading and installing the Arduino IDE 2](https://docs.arduino.cc/software/ide-v2/tutorials/getting-started/ide-v2-downloading-and-installing/)
* [Linux 用 Windows サブシステム で Linux GUI アプリを実行する](https://learn.microsoft.com/ja-jp/windows/wsl/tutorials/gui-apps)
* [WindowsでWSL2を使って「完全なLinux」環境を作ろう！](https://www.kagoya.jp/howto/it-glossary/develop/wsl2_linux/)
* [FUSE](https://github.com/AppImage/AppImageKit/wiki/FUSE)
* [How to run an AppImage](https://discourse.appimage.org/t/how-to-run-an-appimage/80)
* [USB デバイスを接続する](https://learn.microsoft.com/ja-jp/windows/wsl/connect-usb#attach-a-usb-device)