IoT何をいまさら(72) micro:bit発ラズパイ経由Node-REDダッシュボード

Joseph Halfmoon

前回PythonスクリプトのクライアントからNode-REDのダッシュボードに向けて”Hello World”いたしました。また、こちらではMicroPython制御のmicro:bitにサーミスタを接続し、その読み取り値をもう一台のmicro:bitに送信、ラズパイで読み取っておりました。2つガチャンコでmicro:bit測定値をNode-REDダッシュボードに表示できる筈。

さて前回のHello Worldのフローからは大分複雑となりました。とはいえ追加したのはたかだか4つのノードです。また、前回は成り行きでお名前をつけていたのを「後々のことを考えて」ちょっと変更。

追加したのは以下のノードです。

  • MQTT-inノード、micro:bitに接続してあるサーミスタの測定値を受け取るつもりのサブスクライバ
  • Functionノード、数値文字列で生の値を受け取るつもりなのでそれをダッシュボードでの表示用に加工するフィルタ
  • dash-boardのgaugeノード、最新の値(サーミスタ端子の電圧[V])を表示
  • dash-boardのchartノード、サーミスタ端子の電圧[V]の時間グラフを表示

そして前回、Hello World表示につかったtextノードは、ステータス表示用に改めました。micro:bitとのインタフェースが生きていれば Running、停止中は STOPと表示させるつもりであります。

フローはこんな感じ。

micro:bit GREEN Node-RED Flow

前回成り行きのお名前であったダッシュボードについては、お名前を変更し、実体にあわせました。なお、

電池駆動(リモート)の緑色のmicro:bit にサーミスタが接続

しているので、micro:bit Green つづめてMBGreenであります。もう一台の基地局というかアンテナ替わり(物理層はBLEだが上位層はそれと互換性のないmicro:bitのMicroPython独自?プロトコル)のmicro:bitは赤色なのでMBRedと呼んでおりまする。今回もこいつは無線からRaspberry Piへの橋渡しで動作していますが、表立っての登場はなし。

MB green UI namesサーミスタ用のフローを左から確かめていきます。まず、MBGreen/Thermistorノード。設定は以下のようです。サーバーは前回設定済のRaspberry Pi上のmosquittoブローカに向けます。トピック入力して「完了」。

MBgreenThermistorMQTTIN次に到着した生データを加工するフィルタです。MBGreenは、Arduino互換のアナログ読み取り関数analogRead()でサーミスタ端子の電圧(回路図についてはこちら参照)を読み取っています。ざっくり0が0V、1023が3.3Vの整数値。しかし、伝送時に文字列として送ってくるので、MQTTでパブリッシュされてくるのは数値文字列です。これを電圧のグラフにしたいので、浮動小数の数値に変換しないとなりません。Functionノードでフィルタできるのは理解したのですが、だいたい関数の入力や出力は何なの?Node-REDのユーザ会様のサイトを拝見すれば直ぐに分かりました。

Functionノードの書き方

一番大事だと思うところを引用させていただくと、

メッセージは msg と呼ばれる一つのオブジェクトとして渡されます。 このオブジェクトは慣例により、メッセージ本体を含む msg.payload プロパティを持っています。

であります。javaScriptは滅多に書かないので、冗長な書き方で処理。

MBgreenThermistorFunction前から使いたかったスピードメーター風のゲージの設定はこちら。ラベルやUnitに文字列設定している程度で後は大体デフォルト。

MBgreenUIgaugeSetting忘れてはいけない無線受信機と化しているMBRedが送信してくるデータを処理しているPythonスクリプトにも手をいれなければなりませぬ。短いので全文を掲げると以下のような感じ。今回追加したのはパブリッシュするための数行のみ。

なお、micro:bit側のスクリプトには前のまま。一切変更なしです。

#! /usr/bin/python3
import serial
import paho.mqtt.publish as publish

recMax = 500
rec = 0
ser = serial.Serial('/dev/ttyACM0', '115200', timeout=0.5)
publish.single("MBGreen/Status", "Running", hostname="127.0.0.1")
        
while (rec < recMax):
    mes = ser.readline().decode('utf-8').strip()
    dat = mes.split(":")
    if len(dat) == 3:
        recSend = dat[0]
        thermistorV = dat[1]
        chipTemp = dat[2]
        print( \
            "REC={0} Thermistor={1} ChipTemp={2}".format(recSend, thermistorV, chipTemp))
        publish.single("MBGreen/Thermistor", thermistorV, hostname="127.0.0.1")
    rec += 1
ser.close()
publish.single("MBGreen/Status", "STOP", hostname="127.0.0.1")

動作中(Running)の様子は最上部のアイキャッチ画像に掲げました。以下は「予定数終了」してSTOP後のダッシュボードの様子。

MBgreenTVoltSTOP大したことはまったくやっていない(全てPython, Mosquitto, Node-Redのお陰)ですが、ゲージとかグラフがブラウザに表示されるだけで

モダンなIoT

の雰囲気が出てくる。。。お手軽。

IoT何をいまさら(71) MQTTでダッシュボードにHello World! へ戻る

IoT何をいまさら(73) Node-Redからmicro:bitを鳴かせる へ進む