Node-RED MCU Editionでrpi-neopixelノードがサポートされたので試してみた。(※2023年2月5日更新)

# はじめに

Node-RED MCU Editionでrpi-neopixelノードがサポートされたので試してみました。

https://github.com/phoddie/node-red-mcu/discussions/50

https://flows.nodered.org/node/node-red-node-pi-neopixel

※ 2023年2月5日更新

ラズパイ用のrpi-neopixelノードからNode-RED MCU用のneopixelノードへ変更されました。
Sensorノードを導入する手順でneopixelノードも追加されます。

https://qiita.com/kitazaki/items/54fdc88816cac70e81aa

# Node-REDフローのマイコンデバイスへの書き込み

以下を参考にflows.jsonを変換、ビルド、マイコンデバイスへの書き込みを行います。
mcconfigコマンドを使用して手動で行う、または、node-red-mcu-pluginを使用してフローエディタから行うことができます。

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

## 環境準備

NeoPixelを使用するためにnode-red-node-pi-neopixelノードをインストールします。

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

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

### 1-2. node-red-node-pi-neopixelノードをインストールする

```bash
$ npm install node-red-node-pi-neopixel
```

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

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

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

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

### 1-4. Node-REDを起動する

```bash
$ node node_modules/node-red/red.js -u ./
```

# サンプルフロー

サンプルフローは以下のとおりです。
<details><summary>flows.json</summary><div>

```json
[
    {
        "id": "8471ec6d0c159c31",
        "type": "tab",
        "label": "neopixel demo",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "745e35dcb1b1886b",
        "type": "inject",
        "z": "8471ec6d0c159c31",
        "name": "",
        "props": [
            {
                "p": "payload"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": true,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "red,green,blue,white,cyan,yellow,purple,orange",
        "payloadType": "str",
        "x": 150,
        "y": 180,
        "wires": [
            [
                "5d799e649b54a1a3"
            ]
        ]
    },
    {
        "id": "eb234d064a2a6930",
        "type": "rpi-neopixels",
        "z": "8471ec6d0c159c31",
        "name": "",
        "gpio": 18,
        "pixels": "12",
        "bgnd": "",
        "fgnd": "",
        "wipe": "40",
        "mode": "pcent",
        "rgb": "grb",
        "brightness": "100",
        "gamma": false,
        "x": 550,
        "y": 180,
        "wires": []
    },
    {
        "id": "2420e7cde0ed735b",
        "type": "debug",
        "z": "8471ec6d0c159c31",
        "name": "",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 550,
        "y": 260,
        "wires": []
    },
    {
        "id": "0d1014c10414c0e3",
        "type": "complete",
        "z": "8471ec6d0c159c31",
        "name": "",
        "scope": [
            "eb234d064a2a6930"
        ],
        "uncaught": false,
        "x": 130,
        "y": 260,
        "wires": [
            [
                "5d799e649b54a1a3"
            ]
        ]
    },
    {
        "id": "5d799e649b54a1a3",
        "type": "function",
        "z": "8471ec6d0c159c31",
        "name": "random color",
        "func": "const colors = context.get(\"colors\")\n\ndo {\n    msg.payload = colors[Math.trunc(Math.random() * colors.length)];\n} while (context.get(\"previous\") === msg.payload);\n\ncontext.set(\"previous\", msg.payload);\n\nreturn msg;\n",
        "outputs": 1,
        "noerr": 0,
        "initialize": "const colors = [\"red\",\"green\",\"blue\",\"white\",\"cyan\",\"yellow\",\"purple\",\"orange\",\"black\",\"pink\"]\n\ncontext.set(\"colors\", colors);\n",
        "finalize": "",
        "libs": [],
        "x": 340,
        "y": 220,
        "wires": [
            [
                "eb234d064a2a6930",
                "2420e7cde0ed735b"
            ]
        ]
    }
]
```
</div></details>

## M5Atom Matrixの場合

![205492745-ef6eabb7-5e04-4799-a2ff-9039315d66ae.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/199ee3ae-7b19-125f-4953-69040464d8de.jpeg)

## M5Stack Fireの場合

![205532070-58463084-c65e-40d2-af05-ee5651f3be7e.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/0705745e-9cb2-cd39-7122-80ca44b4a138.jpeg)

## サンプルフローの変更について

※ 2023年1月22日追記

M5Atom Lite/Matrix/U、M5Stack Fireなど、デバイスのmanifestファイルでNeoPixelが定義されている場合、flows.jsonのgpioとpixelsの値を変更しても設定が反映されません。(デバイスのmanifestファイルの定義が優先されます)

M5Stick CPlus、M5Stack Core2など、NeoPixelが定義されていない場合、flows.jsonのgpioとpixelsの値が反映されます。

例. GroveポートへNeoPixelを接続

```json
"gpio": 18 -> 33
"pixels": "12" -> "8"
```

![IMG_3499.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/4124df4e-b269-4624-412d-dde9f559c36e.jpeg)

![IMG_3500.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/f749df8f-7820-e17f-631b-e799c9dc03c2.jpeg)