スマートフォンでモーターをコントロール【電子工作始めますか?】
前回まででNode-REDの環境が整ってきました。Node-REDの本領を発揮させるため、ネットワーク関連のノードを使ってリモートでモータやサーボを動かしましょう。
HTTPで動かす
Node-REDのhttp inノードを使うとHTTPリクエストに応答できます。
http inノードを置いて応答するメソッドとURLを設定します。メソッドは"GET"、URLは"/test"と設定します。
http inノードのフロー出力の最後はhttp resposeノードにつなぎます。http responseノードがブラウザのリクエストを返します。つながないとブラウザが応答を待ち続けます。
これでデプロイして動かすと、もうHTTPサービスが開始されます。
ブラウザで
http://<ラズパイのIPアドレス>:1880/test
を開くことができます。404が返ってきたらURLが間違っているでしょう。
何も表示されないのが正解です。よく見ると"[]"と表示されています。
http responseノードはNode-REDのmsg.payloadのオブジェクトを返します。msg.payloadに何も入っていないので空のオブジェクトが表示されます。
http inノードのGETメソッドではブラウザからのクエリーをmsg.payloadに入れて出力します。ブラウザでURLを次のようにしてみます。
http://<ラズパイのIPアドレス>:1880/test?a=1
すると"a"というキーに"1"が入ったオブジェクトが表示されるでしょう。
http://<ラズパイのIPアドレス>:1880/test?a=1&b=2
とすれば 2つのキーに値が入ります。
これでブラウザから数値を送る事ができました。あとはクエリーの数値をGPIOへ出力すればいいだけです。
クエリーのキーを例えば”pwm0”と"pwm1"として受け取ります。switchノードを使うと特定のキーを含むかどうかで出力先を分けられます。changeノードでmsg.payloadに数値だけを代入します。そしてGPIOへフローをつなげば完成です。
あとはhttp responseノードの前にコントロール用htmlをmsg.payloadに設定するようにすればモーター制御用Webページが出来上がります。
MQTTで動かす
HTTPで制御画面を作るのもいいですが、なんか今どきの方法な気がしません。
流行りのIoTでやってみましょう。IoTではMQTTプロトコルがよく使われます。
MQTTでは小さいメッセージをやりとりするのに便利です。
Node-REDでMQTTを使うのはHTTPと同じく簡単です。mqtt inノードとmqtt outノードを使うだけです。
MQTTのメッセージのしくみ
MQTTではブローカーというサーバーのような仲介者がメッセージのやり取りを引き受けます。クライアントではブローカーへメッセージを送るか、ブローカーからのメッセージを受け取るだけです。メッセージの送信先はTopicというもので決めます。Topicは話題です。同じ話題を設定したクライアント同士がメッセージをやり取りできます。
Topicを設定したメッセージをブローカーへ送ると、ブローカーはそのTopicに興味があるリスナーへメッセージを送ります。Topicはいくつも設定できます。
MQTTブローカーを動かす
ブローカーはインターネットのサービスでもありますが、LAN内の実験ならラズパイでブローカーが動きます。ブローカー用のプログラムを動かします。
ここではmosquittoというブローカーをインストールして動かします。
An open source MQTT brokerEclipse Mosquitto is an open source (EPL/EDL licensed) message broker that implements the MQTT protocol versions 5.0, 3.1.1 and 3.1. Mosquitto is lightweight and is suitable for use on all devices from low power single board computers to full servers.
インストールはレポジトリにあるので簡単です。
sudo apt install mosquitto
mosquittoを動かします。
sudo systemctl start mosquitto
これでブローカーが動きました。
MQTTでメッセージを送る
まずはmqttノードでブローカーの場所を設定します。
mqttノードで"新規にmqtt-brokerを追加..."を選ぶとブローカーのアドレスを設定できます。
あとはトピックを設定すればmsg.payloadのオブジェクトで送受信できます。
数値であればそのままGPIOノードへフローをつなげばモーターを動かせます。
スマートフォンのMQTTアプリ
MQTTを使うスマートフォン用アプリがたくさんあります。そんなアプリを使うとMQTTのメッセージを簡単に送受信できます。
基本的にどのアプリでも設定は同じです。まずはブローカーの設定をして、トピック毎にメッセージを送るか受けるかを設定します。
スマホアプリなのでグラフィカルなインターフェースでメッセージを送受信できます。数値を表示したりスライダーで数値を送ったり、ボタンで真理値を送ったりできます。
ここではPWMでサーボモータを動かすのでスライダーを使ってみました。スライダーの値の範囲をアプリで設定できます。GPIOのPWMでは0~100の値を使うので、それに合わせて設定します。
ビデオで使ったアプリは IoT MQTT Panel というものです。他のでもかまいません。
コメント
コメントを投稿