
SALZ mini MQTT 完成しました!- Node-RED-MCU のおかげです。-
はじめに
前回記事にて、Nore-RED-MCUにふれ、自動水やり装置SALZ mini MQTTとして実際にプログラムを行い、おおよそのプログラム(モックアップ)を作るまでをご紹介いたしました。
今回はモックアップから実機で動作するプログラムを作り込むまでの模様をお伝えいたします。
Node-RED-MCUを使っていていいなぁと思うのは、ターゲットとなるマイコンに書き込まなくても、8割方の処理は、Node-REDとして組めてしまう所です。
前回ご紹介しましたが、水分計から値を得るところは、analogノードとrandomノードを並列で並べて置き、つなぎ変えることで実現出来ます。

いよいよ、実際の装置を組んでみます

今までAtomMatrixをRaspberry PiのUSBポートに接続して、モックアップを作っていました。ターゲットマシンはAtomLiteなので、つなぎ変え、更にM5 WarteringUnitをGroveコネクタで接続しています。
M5Stack用 水分測定センサ付き給水ポンプユニット

この部分の作り方については
をご参照ください。
そして接続しました
MQTTのアドレスはlocal:1880では使えないので、Raspberry Piのアドレスに変更しました。
ん?思った通りにフローが流れていません。
何かがおかしいです。フローをよく見てみると。。。
MQTTのトピックWLのバッティングが発生していました
今まで、Bluetoothで行っていた通信内容をあまり吟味しないまま、コマンドを作成しました。その際、うっかり同じコマンド名を使っていました。

やってしまいました。
水やりレベルをWNからSLに変更しました。
ポート番号はどれだっけ?
次は、ポンプの制御の確認に取り掛かります。

この部分です。ポンプONのノードの動作確認をします。
まずはポート番号を調べるところからです。
以前作ったSALZminiSolo2のソースを見ることで、ポート番号はすぐにわかりました。
#define INPUT_PIN 32
#define PUMP_PIN 26
ポート番号は26です。
実はここからが大変でした
思った通りに動作しません。
SALZminiSolo2のソースでは
digitalWrite(PUMP_NO, 1);
delay(10000);
digitalWrite(PUMP_NO, 0);
でよかったのですが、モックアップでは

となっています。
何をどのように設定すればよいのか全く分かりません。
ノードのプロパティは
Mode:
Output
Output Open Drain
Initial State:
As-Is
Hight(1)
Low(0)
Invert:
True
False
となっており、すべての組み合わせを確かめるには、2*3*2=12通りを試す必要がありました。
12通りを試しましたが、まだ動きません
ひょっとして、msg.payloadが関係している?
と思い、ポンプONには1のメッセージを流し、ポンプOFFには0を流します。

そして、再び値を組み合わせ試してみることにしました。

結果、この設定にした時に、うまくいきました。
これがなぜかは全く理解できていないのですが、先に進むことにします。
今度はポンプOFFができません
相変わらずグダグダです。同じ方法でOFFにしているのにポンプが止まりません。

見ているだけでは何も問題ないように思われます。
あれこれいじっているうちに、ノードに触れたとき、その原因がわかりました。
配線が下を通っていました

なんと!配線ミス!これはわかりませんでした。
この問題を解決して、ポンプのON/OFFができるようになりました。
次は水分計の確認です
今まで、色々な装置作りをしてきてanalog入力にはあれこれ苦労した経験があり、少し不安でした。

ピン番号を32に変え、デプロイしてみました。
スクリーンショットを取り忘れましたが、analogノードの下に、入力値が表示されています。
0.615と表示されています
さすが、上級言語。ビット値をそのまま返してきません。
あっさりと、アナログ値の取得に成功しました。
実験します
テスト用のプログラムを組みことなく、そのままテストを行います。
まずは、そのままの状態の水分計の値を読みます。
次に水に浸してみました。
水に浸したとき:0.461
乾いているとき:0.625
という結果を得ることができました。
変換プログラムを書き直します。
//水に浸したとき:0.461
//乾いているとき:0.625
var wl = msg.payload;
var wetWl = 0.461;
var dryWl = 0.625;
msg.payload = Math.round((1.0 - ((wl - wetWl) / (dryWl - wetWl))) * 100.0);
return msg;
実際には、鉢が完全に乾いているときと、水やり直後のセンサー値を得る必要がありますが、まずはそこは飛ばして先に進むことにします。
確認作業は以上で終了
Raspberry Piから切り離して、テストします。
ここでまたトラブルに見舞われます
AtomLiteをACアダプタに繋いで、動作するかチェックしました。
何も反応しません。
何か問題があったのでしょうか?
Raspberry Piに接続しましたが、先ほどまでうまく流れていたフローが全く流れなくなりました。
AtomMatrixに繋ぎ変えて試します。OKです。
違いを探します。
コンパイル時にコンソールに表示される文字列を比較しました。
全く同じです。
AtomLite本体に何か問題があるのではないかと思い、リセットをかける方法を調べ試してみました。
・M5Bunnerで別のソフトをインストール
・ArduinoIDEで別のソフトをインストール
いずれの方法もNGでした
これはいよいよAtomLiteが壊れたと思い、宝物を取り出しました。
M5Stackコンテストの参加賞でもらった金色のAtomLiteです。

でもやっぱりNGです
AtomMatrixではうまく行って、AtomLiteではうまく行かない違いを探しました。
ほぼ迷宮入りなのですが、唯一の違いは、Build後に
Flows are ready.
が出る出ないの差であることがわかりました。
こちらも、今後の課題といたします。
結局、AtomMatrixで続けることにしました
Raspberry Piから切り離して、テストします。
今度もうまく出来ません。
ACアダプタに繋いで、LEDが光ればOKなのですが、暗いままです。
焦っているので、何度か接続し直しましたが、いずれもNG。
と思ったらOKになりました。
動作開始までに、20~40秒かかります
これは分かりませんでした。
ここまでの試行錯誤ですっかり疲れてしまい、この日は寝ることにしました。
いよいよ棚場に持ち込みます


装置をセットして、動作確認を始めます。
すると、どうでしょう。
昨晩まで見えていたRaspberry Piが行方不明になっています
Windows PCのコマンドラインに、最近覚えた魔法の呪文を流し込みます。
for /l %i in (0,1,255) do ping -w 1 -n 1 192.168.XXX.%i
arp -a
このコマンドで、ネットワーク上にある機器のMACアドレスが得られます。
こんなことをやっていると、なんだかハッカーになった気分です。
案の定IPアドレスが変わっていました。
Raspberry Piの情報を集めているときに、IPアドレスの固定方法がよく目に入っていました。
route -n
でデフォルトゲートウェイを確認し、エディタを用いて、IPアドレスを固定します。
今回は、昨晩まで使っていたIPアドレスが使いたかったので、pingでIPアドレスが空いていることを確認した後、アドレスの固定を行いました。
ようやく装置が動き出しました
事細かに、つまづきの様子を書き連ねてみましたが、今までの装置つくりと比較すると、ずいぶんと楽に感じます。
特に、プログラムに関しては、あまり深く考えず、おおよその処理を書いておき、実際に試しながら、詳細を詰めていく方法が使えます。Node-RED-MCUのデバッガのおかげで、実行しながら値のチェックができ、修正がはかどりました。
Raspberry Pi上でNode-REDが動き続けています。
スマホからアクセスするには、ブラウザから
を入れると、こんな感じで表示されます。

ショートカットをデスクトップに張り付けるとこんな感じになります。

家のWi-fi圏内であれば、いつでもスマホで確認、指令が出せるようになりました。
さいごに
駆け足で、自動水やり装置の移植を行いました。
前回記事で、システムの使い心地の表現として自転車に乗るまでの体験に似ていることをお話しました。
実際に、システムの書き換えを行う上で、Node-RED-MCUを用いた作業は、まるで電動自転車に乗っているような気分になります。
漕ぎ出しのアシストがとても力強く、コケそうになる所をしっかりサポートしてくれます。
あとは、システムの安定性がどれぐらいあるものなのか。
しばらく動かしながら試してみたいと思います。
構成図はこんな感じになります。

フローはこんな感じになります。
SALZ mini MQTT

BOWL-MQTT

ソースは
に置きました。
今回も最後までお読みいただき、誠にありがとうございました。
#RaspberryPi #NodeRED #NodeREDMCU #自動水やり装置 #WateringUnit #AtomMatrix #AtomLite #MQTT