Node-RED MCU Editionを試してみた。(ラズパイ編)

# はじめに

Node-RED MCU Editionをラズパイで動かしてみます。
Raspberry Pi OSはDebianベースですので、Linux版の導入手順が参考になります。

### 参考

macOS版はこちらです。

https://qiita.com/kitazaki/items/15cba2f4622bf3682083

Linux版はこちらです。

https://qiita.com/mshioji/items/d5aa02ecea2f15cad382

Windows版はこちらです。

https://qiita.com/NWLab/items/d508ea572d46cda1f546

# Raspberry Pi Desktop (32-bit)

## 前提条件

- Raspberry Pi 4B (4GB)
- SDカード (32GB)
- Raspberry Pi Imager
- Raspberry Pi OS with desktop
  - 32bit 2022/9/22版

https://www.raspberrypi.com/software/

![rpi_000.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/0b2ad316-a4f2-d8be-97c2-f6f003ad265b.jpeg)

https://www.raspberrypi.com/software/operating-systems/

![rpi_001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/367ce74c-2bea-e6cb-2b1c-9f987cca6a74.jpeg)

SSHを有効化、piユーザのパスワード設定、Wi-Fiの設定、ロケール設定を行い、SDカードへイメージファイルを書き込みする。

![rpi_002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/f7f3fac5-60a2-6420-5484-144fca549c7d.jpeg)

![rpi_004.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/8bf0cec1-ef7e-65a7-29b1-b9e04c9d2264.jpeg)

ラズパイを起動する。

![2023-01-09-132158_3840x2160_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/513cc8a0-beff-8408-9fc4-c5db0a00f766.png)

# 環境構築 (Moddable SDK)

Moddable SDKの導入手順に従って環境構築する。

https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/Moddable%20SDK%20-%20Getting%20Started.md

## 1. 必要なパッケージをインストールする

piユーザでログインし、以下のコマンドを実行する。

```bash
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install gcc git wget make libncurses-dev flex bison gperf
$ sudo apt install libgtk-3-dev
```

## 2. Moddable SDKをインストールする

ホームディレクトリにダウンロード、インストールする前提で説明します。

```bash
$ git clone https://github.com/Moddable-OpenSource/moddable
```

## 3. 環境変数を設定する

以下の設定を追加します。

(bashの場合) ~/.bashrc

```bash
export MODDABLE="/home/pi/moddable"
export PATH="$MODDABLE/build/bin/lin/release:$PATH"
```

環境変数を有効にするため、以下のコマンドを実行します。

```bash
$ source .bashrc
```

または、ターミナルを閉じて新しく開きます。

## 4. Moddable SDKをビルドする

コマンドラインツール、シミュレータ、デバッガーをビルド、インストールします。

```bash
$ cd $MODDABLE/build/makefiles/lin
$ make
$ make install
```

## 5. xsbug デバッガーツールを開く

```bash
$ xsbug
```

![2023-01-09-141044_2560x1440_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/43493247-2922-6710-38e1-d3d288885248.png)

デバッガーが正常に起動されることを確認したら、閉じます。

## 6. サンプルプログラムを実行する

サンプルプログラム(helloworld)を実行するとシミュレータ(Moddable One)とデバッガーが起動します。

```
$ cd ${MODDABLE}/examples/helloworld
$ mcconfig -d -m -p lin
```

![2023-01-09-141942_2560x1440_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/83c8a847-28a2-af52-2770-1ed417dac1c4.png)

# 環境構築 (ESP-IDF)

実機 M5Stack(ESP32)で動作させるために、ESP32用のビルド環境を構築します。


## 1. 必要なパッケージをインストールする

```bash
$ sudo apt install git wget flex bison gperf python-is-python3 python3-pip python3-serial python-setuptools cmake ninja-build ccache libffi-dev libssl-dev dfu-util
```

## 2. ESP-IDFをインストールする

ホームディレクトリにダウンロード、インストールする前提で説明します。
ESP-IDFのリポジトリをダウンロードします。

```bash
$ mkdir esp32 && cd esp32
$ git clone --recursive https://github.com/espressif/esp-idf.git
$ cd esp-idf
$ git checkout v4.4.3
$ git submodule update --init --recursive
```

## 3. 環境変数を設定する

以下の設定を追加します。

(bashの場合) ~/.bashrc

```bash
export IDF_PATH=$HOME/esp32/esp-idf
```

環境変数を有効にするため、以下のコマンドを実行します。

```bash
$ source .bashrc
```

または、ターミナルを閉じて新しく開きます。

## 4. ESP-IDFをビルド、インストールする

```bash
$ cd $IDF_PATH
$ ./install.sh
```

## 5. ESP-IDFのビルド環境を設定する

```bash
$ source $IDF_PATH/export.sh
```

ターミナルを開く度に毎回実行するのが面倒な場合はシェルの初期化ファイル(~/.bashrc)に追加します。
環境変数(IDF_PATH)の後ろに追加します。

```bash
export IDF_PATH=$HOME/esp32/esp-idf
source $IDF_PATH/export.sh
```

## 6. M5Stackを接続し、シリアルポート番号を確認する

M5Stackを接続し、認識されたシリアルポート番号を確認します。

```bash
$ ls /dev/ttyUSB*
/dev/ttyUSB0
```

※ 2023年2月8日追記
ATOMS3はシリアルポート番号が異なります。(リセットボタンを長押し(約2秒)で書き込みモード時)

```bash
$ ls /dev/ttyACM*
/dev/ttyACM0
```

認識されたシリアルポート番号を環境変数(UPLOAD_PORT)に設定します。

```bash
$ export UPLOAD_PORT=/dev/ttyUSB0
```

mcconfigコマンドを実行する時に指定することもできます。

例.M5StickC Plusの場合

```bash
$ UPLOAD_PORT=/dev/ttyUSB0 mcconfig -d -m -p esp32/m5stick_cplus
```

## 7. サンプルプログラムを実行する

ボールのサンプルプログラムをM5Stack用にビルドし、実機へ書き込みます。

例.M5StickC Plusの場合

```bash
$ cd ${MODDABLE}/examples/piu/balls
$ UPLOAD_PORT=/dev/ttyUSB0 mcconfig -d -m -p esp32/m5stick_cplus
```

![2023-01-09-150540_2560x1440_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/0799afcd-acb7-104e-24d2-9464ceb098fc.png)

![IMG_3412.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/5331b708-af9a-30d8-5f40-ca5647829bea.jpeg)

# Node-REDフローをM5Stackで実行する

Node-RED MCU Editionは、Node-REDフローエディタからJSON形式でエクスポートされたフローを、Moddable SDKのXS JavaScriptエンジンで動作する形式へ変換します。
Node-REDフローエディタ上でMCU用にビルド、実機へ書き込めるツール(node-red-mcu-plugin)を利用する方が楽です。
Node-RED MCU Edition用の環境を作成する前提で手順を書きます。

(前提条件)

- Node.js (v16.14.0)

## 1. nodebrewをインストールする

```bash
$ curl -L git.io/nodebrew | perl - setup
```

## 2. 環境変数を設定する

以下の設定を追加します。

(bashの場合) ~/.bashrc

```bash
$ export PATH=$HOME/.nodebrew/current/bin:$PATH
```

環境変数を有効にするため、以下のコマンドを実行します。

```bash
$ source .bashrc
```

または、ターミナルを閉じて新しく開きます。

## 3. node.jsをインストールする

```bash
$ nodebrew install v16.14.0
$ nodebrew use v16.14.0
$ node -v
v16.14.0
$ npm -v
8.3.1
```

## 4. Node-REDをインストールする

```bash
$ mkdir node-red-mcu && cd node-red-mcu
$ npm init -y
$ npm install node-red
```

## 5. node-red-mcu-pluginをインストールする

```bash
$ npm install https://github.com/ralphwetzel/node-red-mcu-plugin
```

以下のコマンドでもインストールできるようになりました。

```bash
$ npm install @ralphwetzel/node-red-mcu-plugin
```

## 6. Node-REDを起動する

Node-RED起動時にnode-red-mcu-pluginがパッチを適用するutils.jsが存在しないためにエラーが出力されます。
node_modules/node-redディレクトリで必要なモジュールをインストールしてNode-REDを起動します。

```bash
$ cd node_modules/node-red
$ npm install
$ cd ../..
$ node node_modules/node-red/red.js -u ./
```

フローを作成して、MCUタブで対象のフローを選択し、ターゲットデバイスを指定してBuildボタンを押すと、ビルドとデバイスへインストールされます。

![2023-01-09-152748_2560x1440_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/1515d444-48c9-1f48-e345-c7bf5b28fd81.png)

![2023-01-09-153407_2560x1440_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/cb017974-dfcb-9ff0-cd78-3628b2da2531.png)

※ macOSではnode-red-mcu-pluginからデバッガー(xsbug)が起動されましたが、Linuxでは起動されなかったので、別のターミナルから手動で起動します。

![2023-01-14-164304_1920x1080_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/d3cdd233-c4ae-f8b4-f180-05030a853022.png)