はじめに
Node-RED MCU Editionでrpi-neopixelノードがサポートされたので試してみました。
※ 2023年2月5日更新
ラズパイ用のrpi-neopixelノードからNode-RED MCU用のneopixelノードへ変更されました。
Sensorノードを導入する手順でneopixelノードも追加されます。
Node-REDフローのマイコンデバイスへの書き込み
以下を参考にflows.jsonを変換、ビルド、マイコンデバイスへの書き込みを行います。
mcconfigコマンドを使用して手動で行う、または、node-red-mcu-pluginを使用してフローエディタから行うことができます。
環境準備
NeoPixelを使用するためにnode-red-node-pi-neopixelノードをインストールします。
1-1. Node-REDをインストールする
$ mkdir node-red-mcu && cd node-red-mcu
$ npm init -y
$ npm install node-red
1-2. node-red-node-pi-neopixelノードをインストールする
$ npm install node-red-node-pi-neopixel
1-3. node-red-mcu-pluginをインストールする
$ npm install https://github.com/ralphwetzel/node-red-mcu-plugin
Node-RED起動時のエラー(node-red-mcu-pluginがパッチを適用するutils.jsが存在しない)を回避するため、node_modules/node-redディレクトリで必要なモジュールをインストールします。
$ cd node_modules/node-red
$ npm install
$ cd ../..
1-4. Node-REDを起動する
$ node node_modules/node-red/red.js -u ./
サンプルフロー
サンプルフローは以下のとおりです。
flows.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"
]
]
}
]
M5Atom Matrixの場合
M5Stack Fireの場合
サンプルフローの変更について
※ 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を接続
"gpio": 18 -> 33
"pixels": "12" -> "8"