はじめての電気とIoT (9) SPI経由でアナログ電圧測定 その2 node-RED

入力電圧に応じて出力を可変

 前回、ラズパイにA-DコンバータのMCP3008をつなげ、実験のためにチャネル0のCH0を3.3VにCH1をGNDに接続して動作を確認しました。

 入力電圧を可変できるようにして、実験を続けます。

ボリュームを使って電圧を変化させる

 電子部品にボリューム(可変抵抗)があります。端子は3本あり、軸を回すと真ん中の端子の抵抗値が変化します。

◆基板用半固定抵抗

◆パネル取り付け用半固定抵抗

 実験では半固定抵抗がよく使われます。トリマとも呼ばれます。市販の製品の中でも使われていますが、基板取り付け用の寿命は200回ほどで短命です。1回転(300度)のが普通で、精密に値を設定できる多回転(20回ぐらい)もあり、計測回路などではよく使われています。回路図では、VRx、RVxという名称です。VはVariableの頭文字と思われます。

MCP3008との接続

 チャネル0=CH0へ可変電圧を入れるようにします。

 今回のテスト回路では、ボリュームの値は適当でかまいません。5k~50kΩのどれを使ってもよいです。

node-REDで変化する電圧を表示

 画面左のノード・パレットからMCP3008のノード「A/D converter」を中央のワーク・スペースへドラッグ&ドロップします。このノードをダブルクリックして設定画面を開きます。

 可変するアナログ電圧はCH0につないでいるので、input pin の「A0」はデフォルトのままです。チップ・セレクト信号も前回と同様、デフォルトのCE0のままです。Doneをクリックして終了します。

 injectノードをドラッグ&ドロップし、ダブルクリックで設定画面を出します。Payloadは「timestamp」を選び、Repeatは「interval」を選び、デフォルトの1秒のままでDoneを押して終了します。

 inject(表示はtimestamp)とA/D converter(表示はADC 0)のノードを結びます。これで、1秒ごとにA-Dコンバータのデータを読みに行きます。

 debugノードを追加します。「A/D converter(表示はADC 0)」ノードの出力につなぎます。

 これで、A-D変換された入力電圧がdebugノードに渡たされたので、画面右のdebugエリアに変換データが表示されます。

 画面右肩のDeployをクリックし、画面右のdebugタブをクリックします。「474」というA-D変換したデータが表示されています。

 10ビットA-Dコンバータは0~1023のデータを出力します。したがって、

  3.3V * 474/1024 = 1.5275V

の電圧が入力されていることがわかります。ボリュームを回すと、この値も変わってきます。

 この計算式をfunctionノードを追加して書き加えます。functionアイコンをダブル・クリックすると、return msg; が書かれているだけです。node-REDでは各ノード間をメッセージが流れていきます。functionの前から入ってきたA-Dコンバータのメッセージをそのままfunctionの後ろから垂れ流すという動作になります。

 ここに、

msg.payload = ("電圧="+(msg.payload*3.3/1024)+"V");

を追加します。msg.payloadは、流れてきたメッセージのうち「payload=データ本体」という変数で、型は何も指定していませんが、今は数値です。

 筆者の環境だけの問題かもしれませんが、エディットが正常にできません。テキスト・エディタで打ち込んだ文字をコピーして貼り込んでいます。Doneを押して完了です。

 

 「A/D converter(表示はADC 0)」とdebugノードを結んでいる線の上にfunctionノードを持っていくと、線をつなぎなおしてくれます。

 このままではfunctionが何をしているのかがわからないので、設定画面のNameに「変換式」と入れました。Deployボタンを押します。debugエリアの表示が変わりました。

 しかし、無駄に桁数が多いですね。適当なところで四捨五入します。

msg.payload = ("電圧="+Math.round(msg.payload*3.3*10000/1024)/10000+"V");

 Math.roundは小数点以下を四捨五入します。一度1万倍して、四捨五入して1万で割ることで、小数点以下5桁以下を四捨五入しました。


 メッセージのうちpayloadを見ていますが、ヘッダなど、JSON形式全体の出力を見たいときは、debugノードを変更します。動作が変な時には役立つ情報が出力されます。

MQTTブローカに測定データを投げる

 MQTTを使うと、injectで1秒ごとにA-Dコンバータのデータを取得するように設定しているので、常に新しいデータがサーバーに送られます。温度を表示するのにhttpノードを使う場合、Webブラウザを人かプログラムで更新をしないと、新しいデータが表示されません。ここからは、インターネット上で、常に新しい測定データを表示できるようにします。

 outputにあるmqttノード(Publisher)をドラッグ&ドロップします。

 アイコンをダブルクリックして設定画面をだします。Server、Topic、QoSを変更します。Topicに「温度」という文字を入れましたが、「アナログ電圧CH0」というのでもよいでしょう。

 functionノードからmqttノードをつなぎます。右肩のDeployをクリックすると、mqttノードの下にconnectと表示が出ます。これで、測定データを含むメッセージがMQTTブローカに届いています。

MQTTブローカからデータを受け取る

 MQTTブローカに届いているメッセージを受け取るSubscriberを設定します。今、同じラズパイで作業をしていますが、このデータを受け取るのは、このラズパイでなくてもよいはずです。

 画面左にあるノード・パレットのinputにあるmqttノードをドラッグ&ドロップします。

 debugノードもドラッグ&ドロップします。

 mqttノード(購読側。Subscriber)の設定は、Publisherと内容を合わせます。

 debugノードはデフォルトのままです。mqttノードとdebugノードをつないで、Deployをクリックします。

 このままでは、二つのdebugノードからメッセージが右のdebugエリアに出てしまいます。データ形式が同じなので、どちらからの出力なのか判別できません。debugノードのアイコンの右にあるベロのようなところをクリックすると、少し引っ込んで色が薄くなります。これで、debug出力を抑制できます。

 MQTTブローカからSubscribeしたデータだけを、右のdebugエリアに表示するようにしました。

IoTデータ可視化サービスを利用

 dweet.ioというWebでは、いろいろな形式のデータを受け取ってグラフ化してくれます。

 node-REDにこのサイトと通信するノードを追加します。

 画面右肩の設定メニューのManage paletteから、installタブの検索欄に「dweet」をいれるとnode-red-node-dweetioが出てくるので、installボタンを押します。

 ノード・パレットのoutputからdweetioノードをドラッグ&ドロップします。


 ノード・アイコンをダブル・クリックして設定画面を出します。Thingの欄に「ondo」と入れます。



 mqttノードの出力をdweetioノードにつなぎます。Delpoyを押すと、成功したと表示が出ます。

 反映されているかどうかを確認するために、下記のURLをアクセスします。

https://dweet.io/follow/ondo

 ほぼ1秒ごとに電圧が更新されています。

 このページに「Create a Custom Dashboard for this thing with freeboard」というリンクがあります。クリックしてそのまま飛んでいくとDATASOUCESが設定されています。

 freeboardは複数の計測結果を表示できるサイトです。一度登録をしているので、すぐに表示ができましたが、初めてのときは登録作業を求められるかもしれません。

 「電圧=2...」を表示しているpayloadのスパナの形をしたWIDGETの編集アイコンの下付近にマウスを載せると、同じスパナが出てくるのでクリックします。文字の大きさSIZEを変更します。

 データをどこから持ってくるかはVALUEの欄に記入します。最初は「datasoureces["」の文字があります。欄の右のDATASOURCEをクリックすると、「Dweet」が出ます。クリックすると取り込まれ、「datasoureces["Dweet"]」に欄の内容が変わり、次の選択肢として「payload」がでるので、クリックすると、欄は、datasources["Dweet"]["payload"]と、完全な形になります。そのまま、右下のSAVEをクリックします。

 最終的には、Dweet.ioと同じ表示です。電圧が1秒ごとに更新されてます。こちらのfreeboardはいろいろな図を利用できるのが特徴です。データを蓄積して折れ線グラフを書くときなどは便利でしょう。