NodeRED MCUをWSL2で利用する

Node-RED MCU　を　WSL２で簡単に使用するメモです。
# はじめに
NodeRED MCUを使うとPCとMCU(マイコン)が、同じビジュアル言語で書けるので、簡単にIoTプログラミングできます。本書はWSL2環境で手っ取り早くNodeRED MCUを試したい人を対象に書きました。
# 試した環境（ハードウェア、ソフトウェア）
- Windows11 WSL2(Ubuntu-22.04LTS)
- NodeRED
- NodeRED MCU Plugin(NodeRED MCUも同時にインストールされます。)
- xs-dev(環境設定でModdableとESP-IDF等がインストールされます。）
- M5StackCore2、M5AtomS3
# Install方法
## Ubuntu22.04 LTS（WSL2)のインストール
PowerShell(管理者)で、次のコマンドを入力します。インストールが終わったら、Login名とパスワードの設定が促されるので、入力します。
```
> wsl --update
> wsl --install ubuntu-22.04 
```
インストールが終わったら $ exit でログアウトします。
## USBサポートのインストール
PowerShell(管理者)で次のコマンドを入力します。インストールが終わったらPCを再起動します。
```
> winget install usbipd
```
PCを再起動して、ターミナル（管理者)で次のコマンドを入力します。リストが表示されたら成功です。
```
> usbipd list
```
Ubuntuをスタートメニューから起動して、Ubuntuのプロンプトでインストール、設定をします。
```
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install linux-tools-generic hwdata
$ sudo update-alternatives --install /usr/local/bin/usbip usbip /usr/lib/linux-tools/*/usbip 20
```
## USBのパーミッションの変更
/dev/ttyACM0が使えるようにパーミッションの設定とudevの自動起動を設定します。
 /etc/udev/rules.d/40-dfuse.rules に 下の内容を書き込みます。ファイルがないときは新規で作成します。
```
SUBSYSTEMS=="usb", ATTRS{idVendor}=="303a", ATTRS{idProduct}=="00??", GROUP="plugdev", MODE="0666"
```
/etc/wsl.conf に 下の内容を書き込みます。[boot]セクションがすでに書かれている場合は、2行目だけ追加します。 ファイルが無い場合は新規に作成します。
```
[boot]
command="service udev start”
```
WSL2(Ubuntsu)を再起動します。
PowerShell(管理者)で ```> wsl --shutdown```を実行後、再度スタートメニューからUbuntuを起動します。
## Node-REDのインストール
Ubuntuで次のコマンドを入力してNodeRED、Node、npmをインストールします。オプションは以下の通り返答します。
Are you really sure you want to do this ? [y/N] ?は "y"
Would you like to install the Pi-specific nodes ? [y/N] ?は "n"
Would you like to customise the settings now (y/N) ?は “n”
```
$ bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)
```
Moddable、node-red mcu plugin、nodesのインストール
ここでは、xs-devを利用して簡単にインストールします。
入力するコマンドはすべて、Ubuntu（WSL）に入力します。
まず準備としてssh-askpassをインストールします。
```
$ sudo apt install ssh-askpass
```
ssh-askpassの設定をします。
~/.askpassファイルを作成します。"password”部分は自分のパスワードに置き換えてください。
```
#!/bin/bash
echo "password"
```
ファイルの属性と環境変数を設定します。
```
$ chmod +x ~/.askpass
$ export SUDO_ASKPASS=~/.askpass
```
次に開発環境をインストールしていきます。少し時間のかかる部分もあります。
※本来npmを利用してxs-devを入れるときにはsudoは不要なのですが、なぜかエラーが発生するので付加しています。
※Moddableは最新版をインストールするためにpublicブランチにしています。
```
$ sudo -A npm i -g xs-dev
$ xs-dev setup --target-branch public
$ xs-dev setup --device esp32
$ cd ~/.node-red
$ npm i @ralphwetzel/node-red-mcu-plugin
$ npm i @moddable-node-red/mcu
```
環境変数等を反映するために、WSLを再起動します。
# NodeREDの起動
NodeREDはUbuntu（WSL）で次のコマンドを入力します。
```
$ node-red
```
Windowsのブラウザで”localhost:1880”を開きます。
※WSL2はあくまでもWindowsの環境上で動いています。
左のパレットにMCUノード、右のサイドバー（隠れていたら右端の▼で表示）にNode-RED MCUサイドバーが表示されています。
# M5Stack Basicなどの利用方法
M5Stack BasicなどUSB-UART変換のデバイスが入っているデバイス
1. デバイス（M5Stackなど）をPCに接続します。
2. Windowsのターミナル（管理者）で次のコマンドを入力し、接続リストを表示し、BUSIDを調べます。
```
> usbipd wsl list 
```
3\. デバイスの接続先をWSLに変更します。
次のコマンドを実行します。オプションの -b でBUSIDを –a で自動再接続を指定しています。自動接続をやめる場合は、同じターミナルで[ Ctrl + C ]を押します。
```
> usbipd wsl attach -a -b 1-2
```
以上でデバイスがWSL2で使えるようになりました。

なお、Ubuntu(WSL)側でデバイスの接続を確認したい場合は、次のいずれかのコマンドでできます。
```
$ lsusb
$ ls -al /dev/ttyUSB*
```

# M5AtomS3などの利用方法
M5AtomS3などUSB-UART変換のデバイスが入っておらず、書き込みとdebugで異なる接続環境になる場合のデバイスです。ここではM5AtomS3を利用しています。
なお、書き込みはできますが、デバッグが失敗します。（まれに、成功することもあります。）
1. デバイス（M5Atom S3など）をPCに接続します。
2. デバイスを書き込み状態にします（AtomS3の場合は本体のResetボタンをランプが付くまで長押しします。）
3. Windowsのターミナル（管理者）で次のコマンドを入力し、BUSIDを確認します。
```
> usbipd wsl list 
```
4\. デバイスの接続先をWSLに変更します。
次のコマンドを実行します。オプションの -b でBUSID指定します。この時点では –a (自動再接続)を指定しないようにしましょう。
```
> usbipd wsl attach -b 1-1
```
※UbuntuはM5AtomS3を/dev/ttyACM* で接続されます。

5\. NodeREDでフローのビルドを行います。
"### Press RESET to restart device"という表示まで進みます。

6\. M5AtomS3のResetを押します。
　Resetするとデバイス(M5AtomS3)がUbuntuから切り離されます。

7\. 再度デバイスの接続先をWSLに変更します。
次のコマンドを実行します。オプションの -b でBUSID指定します。今回は –a (自動再接続)をつけて実行します。
※xsbugに接続した時点で再度切り離されるためです。
```
> usbipd wsl attach -a -b 1-1
```

※7は、失敗することが多いです。失敗するとデバッグはできませんが、デバイスは正常に動作します。（デバッグしないのであれば、MCUサイドバーのInstrumentationは何も選択しないのも手です。）
※何か良い方法を知っている人は教えてください。