はじめに
Node-RED MCU Edition独自のSensorノードを試してみました。
Sensorノードは以下のECMA-419 Sensor Class Patternに準拠したセンサークラスをサポートしています。
- Accelerometer
- Ambient light
- Atmospheric pressure
- Humidity
- Proximity
- Temperature
- Touch
ECMA-419とは
ECMAとは、情報通信技術の標準を策定している欧州電子計算機工業会です。
ECMAScriptとは、ECMAによって標準化されたJavaScriptなどの元の規格となった言語です。
ECMAScriptに関する規格は以下のとおりです。
- ECMA-262 ・・language specification
- ECMA-402 ・・internationalization API specification
- ECMA-414 ・・specification suite
- ECMA-419 ・・embedded systems API specification
前提条件
ビルド・インストール環境
- Intel MacBook Pro (2017)
- macOS Big Sur (バージョン 11.7)
マイコンデバイス
- M5Stick-C (MPU6886) (傾き・加速度 6軸センサー)
- M5Stack Basic
- M5Stack Gray (MPU9250) (傾き・加速度・磁気 9軸センサー)
- M5Stack Core2 (MPU6886) (傾き・加速度 6軸センサー)
センサーデバイス
- M5 ENV Ⅲ Unit (SHT30/QMP6988) (温度・湿度/気圧センサー)
- M5 ENV Ⅱ Unit (SHT30/BMP280) (温度・湿度/気圧センサー)
- M5 ENV Unit (DHT12/BMP280) (温度・湿度/気圧センサー)
- M5 ENV Hat Ⅲ (SHT30/QMP6988) (温度・湿度/気圧センサー)
- M5 ENV Hat Ⅱ (SHT30/BMP280/BMM150) (温度・湿度/気圧/磁気センサー)
- M5 ENV Hat (DHT12/BMP280/BMM150) (温度・湿度/気圧/磁気センサー)
- MLX90614 (非接触温度センサー)
- LM75B (温度センサー)
クラウド上のNode-RED環境
- HTTPサーバ、ダッシュボード (Node-RED, Dashboard)
- MQTTサーバ (Aedes MQTT broker)
環境構築と動作確認については以下を参照してください。
GPIOの動作確認については以下を参照してください。
ネットワーク接続(HTTP, MQTT)については以下を参照してください。
組み合わせと連動(IoT)については以下を参照してください。
動作確認状況
センサーデバイス | M5StickC / Plus | M5Stack Basic | M5Stack Gray | M5Stack Core2 | メモ |
---|---|---|---|---|---|
MPU6886 | ◯ | - | - | ◯ | OK (I/OでSMBus、Busでinternalを指定) |
MPU9250 | - | - | ◯ | - | OK (I/OでSMBus、Busでdefaultを指定) |
SHT30 | ◯ | ◯ | ◯ | ◯ | OK (I/OでI2C、Busでdefaultまたはhatを指定) |
BMP280 | ◯ | ◯ | ◯ | ◯ | OK (I/OでI2C、Busでdefaultまたはhat、configurationで{"mode": 3,"temperatureSampling": 2,"pressureSampling": 5,"filter": 4,"standbyDuration": 4}を指定) |
LM75B | ◯ | ◯ | ◯ | ◯ | OK (I/OでSMBus、Busでdefaultを指定) |
MLX90614 | ◯ | ◯ | ◯ | ◯ | OK (I/OでSMBus、Busでdefaultを指定) |
※ M5 ENV HatはI2CにGPIOポート(SDA:G0、SCL:G26)を使用しているためBusの指定ができずNG
※ M5Stack BasicのBusのdefaultはGroveポートでGPIO(SDA:G21、SCL:G22)を使用
※ M5Stack GrayのBusのdefault(Groveポート)とinternalは共通でGPIO(SDA:G21、SCL:G22)を使用
※ M5Stick-C、M5Stack Core2のBusのdefaultはGroveポートでGPIO(SDA:G32、SCL:G33)を使用
※ M5Stick-C、M5Stack Core2のBusのinternalはGPIOポート(SDA:G21、SCL:G22)を使用
手順
1-1. Node-REDをインストールする
$ mkdir node-red-mcu && cd node-red-mcu
$ npm init -y
$ npm install node-red
1-2. node-red-mcu-pluginをインストールする
$ npm install https://github.com/ralphwetzel/node-red-mcu-plugin
1-3. Sensorノードをインストールする
node-red-mcu-pluginをインストールすると、node-red-mcuもダウンロードされるため、それを使用してSensorノードをインストールする。
$ npm install node_modules/\@ralphwetzel/node-red-mcu-plugin/node-red-mcu/nodes/sensor
1-4. node-red-mcu/manifest_runtime.jsonにセンサードライバーを追加する
GitHubのREADMEにはnode-red-mcu/manifest.jsonにセンサードライバーを追加すると記載されているが、node-red-mcu/manifest.jsonはnode-red-mcu/manifest_runtime.jsonを読み込んでいるため、node-red-mcu/manifest_runtime.jsonにセンサードライバーを追加する。
$ vi node_modules/\@ralphwetzel/node-red-mcu-plugin/node-red-mcu/manifest_runtime.json
(追加する内容)
- "$(MODDABLE)/modules/drivers/sensors/sht3x/manifest.json"
- "$(MODDABLE)/modules/drivers/sensors/lm75/manifest.json"
- "$(MODDABLE)/modules/drivers/sensors/mpu6886/manifest.json"
- "$(MODDABLE)/modules/drivers/sensors/mpu9250/manifest.json"
- "$(MODDABLE)/modules/drivers/sensors/bmp280/manifest.json"
- "$(MODDABLE)/modules/drivers/sensors/mlx90614/manifest.json"
{
"include": [
"$(MODDABLE)/examples/manifest_base.json",
"$(MODDABLE)/modules/base/deepEqual/manifest.json",
"$(MODDABLE)/modules/base/structuredClone/manifest.json",
"$(MODDABLE)/modules/base/modules/manifest.json",
"$(MODDABLE)/modules/data/base64/manifest.json",
"$(MODDABLE)/modules/data/hex/manifest.json",
"$(MODDABLE)/examples/io/tcp/mqttclient/manifest_mqttclient.json",
"$(MODDABLE)/modules/io/manifest.json",
"./nodes/rpi-ds18b20/manifest.json",
"./nodes/httpserver/manifest.json",
"./nodes/httprequest/manifest.json",
"./nodes/websocketnodes/manifest.json",
"./nodes/lower-case/manifest.json",
"./nodes/csv/manifest.json",
"./nodes/delay/manifest.json",
"./nodes/join/manifest.json",
"./nodes/batch/manifest.json",
"./nodes/sort/manifest.json",
"./nodes/trigger/manifest.json",
"./nodes/sensor/manifest.json",
"./nodes/file/manifest.json",
"./nodes/template/manifest.json",
"./nodes/udp/manifest.json",
"$(MODDABLE)/modules/drivers/sensors/tmp102/manifest.json",
"$(MODDABLE)/modules/drivers/sensors/sht3x/manifest.json",
"$(MODDABLE)/modules/drivers/sensors/lm75/manifest.json",
"$(MODDABLE)/modules/drivers/sensors/bmp280/manifest.json",
"$(MODDABLE)/modules/drivers/sensors/mpu6886/manifest.json",
"$(MODDABLE)/modules/drivers/sensors/mpu9250/manifest.json",
"$(MODDABLE)/modules/drivers/sensors/mlx90614/manifest.json",
"./nodes/openweathermap/manifest.json"
],
"modules": {
"*": [
"./nodered"
]
},
"preload": [
"nodered"
],
"defines": {
"xs": {
"xsbug_hooks": 1
}
},
"platforms": {
"win": {
"error": "Node-RED MCU does not currently run on Windows "
},
"lin": {
"error": "Node-RED MCU does not currently run on Linux "
}
}
}
1-5. Node-REDを起動する
Node-RED起動時のエラー(node-red-mcu-pluginがパッチを適用するutils.jsが存在しない)を回避するため、node_modules/node-redディレクトリで必要なモジュールをインストールします。
$ cd node_modules/node-red
$ npm install
$ cd ../..
Node-REDを起動します。
$ node node_modules/node-red/red.js -u ./
Node-REDフローを作成する
フローエディタの左側のパレットに「MCU」カテゴリと「Sensor」ノードが表示されます。
「inject」ノードと「Sensor」ノードと「debug」ノードを使用し、以下のように接続します。
(正常に動作したSHT30を例に説明します)
(サンプルフロー)
[{"id":"90b0adb349eca3b8","type":"tab","label":"フロー 7","disabled":false,"info":"","env":[],"_mcu":{"mcu":false}},{"id":"0aa93b017b18277a","type":"sensor","z":"90b0adb349eca3b8","name":"SHT3x","io":"I2C","bus":"default","module":"embedded:sensor/Humidity-Temperature/SHT3x","configuration":"{}","_mcu":{"mcu":false},"x":370,"y":160,"wires":[["9499bd663d296a7c"]]},{"id":"69c45bd08ca2cd3a","type":"inject","z":"90b0adb349eca3b8","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"5","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","_mcu":{"mcu":false},"x":170,"y":80,"wires":[["0aa93b017b18277a"]]},{"id":"9499bd663d296a7c","type":"debug","z":"90b0adb349eca3b8","name":"debug 8","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","_mcu":{"mcu":false},"x":540,"y":160,"wires":[]}]
M5Stick-CとM5 ENV Ⅲ UnitをGroveケーブルで接続します。
「Sensor」ノード
- Module → センサー毎に指定します (M5 ENV Ⅲ UnitはSHT30を使用しているためSHT3xを指定)
- embedded:sensor/Accelerometer-Gyroscope/MPU6886
- embedded:sensor/Accelerometer-Gyroscope/MPU9250
- embedded:sensor/Humidity-Temperature/SHT3x
- embedded:sensor/Barometer-Temperature/BMP280
- embedded:sensor/Temperature/LM75
- embedded:sensor/Temperature/MLX90614
- I/O → プルダウンメニューからI2C、または、SMBusを選択します (M5 ENV Ⅲ UnitはI2Cを選択します)
- Bus → default、または、internalを指定します (M5 ENV Ⅲ Unitはdefaultを指定します)
- Configure → センサーのパラメータを指定します (M5 ENV Ⅲ Unitは指定しません)
M5Stick-Cへインストールする
以下のページの手順とおりです。
- M5Stick-Cへインストールする
- node-red-mcu-pluginを使用する場合
- Node-RED MCU Editionを使用する場合
クラウド上のNode-REDと連携する
センサーノードの出力を「mqtt out」ノードと接続します。
クラウド上のNode-REDの「debug」ノードにセンサーデータが出力されることを確認します。
センサーデータの出力をダッシュボードの「chart」ノードで表示します。
参考
(2022年10月21日 追記)
M5 ENV Hatの使用方法がわかりました。
$MODDABLE/build/devices/esp32/targets/m5stick_c/host/provider.jsにHatで使用するI2C (GPIO G0, G26)の定義を追加する必要があります。
const device = {
I2C: {
default: {
io: I2C,
data: 32,
clock: 33
},
internal: {
io: I2C,
data: 21,
clock: 22
},
hat: {
io: I2C,
data: 0,
clock: 26
}
},
SensorノードのBusで「hat」を指定すれば使用可能です。
Moddable本家へプルリクエストを送ったので、マージされればprovider.jsの修正は不要になります。
Moddable本家へプルリクエストを送り、2022年10月22日にマージされましたので、provider.jsの修正は不要です。
参考
(2022年10月20日 追記)
以下のセンサーについては毎回同じデータが表示され、正常に動作しませんでした。
BMP280 (Busはdefault、I/OはI2Cを指定)
Moddable SDKのサンプルコード($MODDABLE/examples/drivers/sensors/bmp280/main.js)を参照し、configurationを指定する必要があることがわかりました。
sensor.configure({
mode: 3, // NORMAL
temperatureSampling: 2, // X2
pressureSampling: 5, // X16
filter: 4, // X16
standbyDuration: 4 // MS_500
});
(2022年10月19日 追記)
以下のセンサーについては「no function!」と表示され、正常に動作しませんでした。
MPU6886 (Busはinternal、I/OはI2Cを指定)MPU9250 (Busはdefault、I/OはI2Cを指定)LM75B (Busはdefault、I/OはI2Cを指定)
ししかわ ( https://twitter.com/meganetaaan )さんからアドバイスをいただき、I/OでSMBusを指定したらデータを取得できるようになりました。
参考 (サンプルコードの動作確認)
(MPU6886)
$ cd $MODDABLE/examples/drivers/m5stickc-imu
$ UPLOAD_PORT=/dev/cu.usbserial-C152AAC745 mcconfig -d -m -p esp32/m5stick_c
(MPU9250)
$ cd $MODDABLE/examples/drivers/sensors/mpu9250/bounce
manifest.jsonの"platforms"に
"esp32/*": {},
を追加する。
$ vi manifest.json
{
"include": [
"$(MODDABLE)/examples/manifest_base.json",
"$(MODDABLE)/examples/manifest_commodetto.json",
"$(MODDABLE)/modules/drivers/ili9341/manifest.json",
"$(MODDABLE)/modules/drivers/sensors/mpu9250/manifest.json",
"$(MODDABLE)/modules/io/manifest.json"
],
"modules": {
"*": [
"./main"
]
},
"config": {
"orientation": "180"
},
"preload": [
"pins/*"
],
"resources": {
"*": "./ball",
"*-mask": "$(MODDABLE)/examples/assets/fonts/OpenSans-Semibold-18"
},
"platforms": {
"esp/moddable_one": {
},
"esp32/moddable_two": {
},
"esp32/*": {
},
"...": {
"error": "Untested on this platform"
}
}
}
$ UPLOAD_PORT=/dev/cu.usbserial-015F99BB mcconfig -d -m -p esp32/m5stack
(LM75B)
$ cd $MODDABLE/examples/drivers/sensors/lm75
$ UPLOAD_PORT=/dev/cu.usbserial-C152AAC745 mcconfig -d -m -p esp32/m5stick_c
(SHT30)
$ cd $MODDABLE/examples/drivers/sensors/sht3x
$ UPLOAD_PORT=/dev/cu.usbserial-C152AAC745 mcconfig -d -m -p esp32/m5stick_c
(BMP280)
$ cd $MODDABLE/examples/drivers/sensors/bmp280
$ UPLOAD_PORT=/dev/cu.usbserial-C152AAC745 mcconfig -d -m -p esp32/m5stick_c
(MLX90614)
$ cd $MODDABLE/examples/drivers/sensors/mlx90614
$ UPLOAD_PORT=/dev/cu.usbserial-C152AAC745 mcconfig -d -m -p esp32/m5stick_c