スマートフォンでモーターをコントロール【電子工作始めますか?】

タイトル

スマートフォンから無線でモーターとサーボをコントロールしてみます。Node-REDでMQTTプロトコルを使い、スマホでアプリを動かせば簡単にIoTができます。

前回まででNode-REDの環境が整ってきました。Node-REDの本領を発揮させるため、ネットワーク関連のノードを使ってリモートでモータやサーボを動かしましょう。

HTTPで動かす

Node-REDのhttp inノードを使うとHTTPリクエストに応答できます。
http inノードを置いて応答するメソッドとURLを設定します。メソッドは"GET"、URLは"/test"と設定します。
http inノード

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でPWMフロー

あとは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 broker
Eclipse 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を追加..."を選ぶとブローカーのアドレスを設定できます。
mqtt brokerの設定

今回は同じラズパイで動かすので"localhost"です。IPアドレスでも当然良いです。

あとはトピックを設定すればmsg.payloadのオブジェクトで送受信できます。
数値であればそのままGPIOノードへフローをつなげばモーターを動かせます。

スマートフォンのMQTTアプリ

MQTTを使うスマートフォン用アプリがたくさんあります。そんなアプリを使うとMQTTのメッセージを簡単に送受信できます。
基本的にどのアプリでも設定は同じです。まずはブローカーの設定をして、トピック毎にメッセージを送るか受けるかを設定します。
スマホアプリなのでグラフィカルなインターフェースでメッセージを送受信できます。数値を表示したりスライダーで数値を送ったり、ボタンで真理値を送ったりできます。

ここではPWMでサーボモータを動かすのでスライダーを使ってみました。スライダーの値の範囲をアプリで設定できます。GPIOのPWMでは0~100の値を使うので、それに合わせて設定します。

ビデオで使ったアプリは IoT MQTT Panel というものです。他のでもかまいません。

ビデオ



コメント

最近のコメント

Threaded Recent Comments will be here.