ESP-WROOM-02搭載移動ロボット - MQTT制御編
はじめに
「ESP-WROOM-02搭載移動ロボットをMQTTで制御する - ハード編」の続きです。今回は前回作成したESP-WROOM-02搭載移動ロボットをMQTTを用いて制御します。
MQTTとは
MQTTはIBMとEurotechが1999年に開発し、標準化された通信プロトコルです。
IBMの「MQTT プロトコル」ではMQTTプロトコルを以下のように説明されています
IBM® MQ Telemetry Transport (MQTT) v3 プロトコルは、低帯域幅または高コスト接続を使用する小型デバイス間のメッセージ交換用に設計されており、メッセージを確実に送信することを目的としています。 TCP/IP を使用します。
主な特徴
- 通信データ量が小さい
- 消費電力や計算スペックが小さい
- Pub/Sub型通信
- QoS(到達保証)
MQTTの実用例
- IoTサービス
- 油田パイプラインの監視のための、衛星との通信
- ロボットの遠隔操作
- 自動車同士(V2V)、自動車とスマホアプリの通信
- 医療機器の通信
実装
Arduino IDEを用いて移動ロボットにプログラムを書き込みます。
Arduino Client for MQTT のインストール
Arduino IDEにMQTTのライブラリをインストールします。
はじめに以下のリンクからzipをダウンロードします。(7/17時点ではv2.8が最新)
ダウンロードが完了したら Arduino IDE を起動
スケッチ
>ライブラリをインクルード
>.ZIP形式のライブラリをインクルード
から先ほどダウンロードしたzipを選択
インストール完了
MQTTを用いた制御プログラム
以下のコードを参考にしました
Subscribeで受け取ったメッセージの値に従って、コールバック関数でモーターを制御するディジタルピンの出力を変化させています。
以下のコードでsubscribeするトピックは/rover/001
、メッセージと制御の対応関係は以下の表に従います。
メッセージ | 動作 |
---|---|
1 | 前進 |
2 | 右回転 |
3 | 左回転 |
4 | 後退 |
5 | 停止 |
以下のコードをESP-WROOM-02に書き込みます。
ssid
とpassword
は自分の環境にあったものを、mqtt_server
は後述するMQTT Brokerを起動させるサーバーのIPを記入してください。
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
// Update these with HIGHs suitable for your network.
const char* ssid = "***";
const char* password = "***";
const char* mqtt_server = "***";
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0;
#define MSG_BUFFER_SIZE (50)
char msg[MSG_BUFFER_SIZE];
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
randomSeed(micros());
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
if ((char)payload[0] == '1') {
// forward
digitalWrite(4,0);
digitalWrite(5,0);
digitalWrite(12, HIGH);
digitalWrite(13, HIGH);
} else if ((char)payload[0] == '2') {
// turn right
digitalWrite(4,0);
digitalWrite(5,HIGH);
digitalWrite(12,0);
digitalWrite(13,HIGH);
} else if ((char)payload[0] == '3') {
// turn left
digitalWrite(4,HIGH);
digitalWrite(5,0);
digitalWrite(12,HIGH);
digitalWrite(13,0);
} else if ((char)payload[0] == '4') {
// backward
digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
digitalWrite(12,0);
digitalWrite(13,0);
} else if ((char)payload[0] == '5') {
// stop
digitalWrite(4,0);
digitalWrite(5,0);
digitalWrite(12,0);
digitalWrite(13,0);
}
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Create a random client ID
String clientId = "ESP8266Client-";
clientId += String(random(0xffff), HEX);
// Attempt to connect
if (client.connect(clientId.c_str())) {
Serial.println("connected");
client.subscribe("/rover/001");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void setup() {
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
digitalWrite(4,0);
digitalWrite(5,0);
digitalWrite(12,0);
digitalWrite(13,0);
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
}
以上で移動ロボット側の準備は完了です。
動作確認
ここでは移動ロボットにMQTTでメッセージを送り、実際に制御します。
そのためにはMQTT Brokerとメッセージをpublishするクライアントを用意する必要があります。
環境
Windows 10 Home
Arduino IDE 1.8.14
Ubuntu 18.04 (WSL)
MQTT Brokerのインストール
MQTTのブローカーには様々な種類がありますが、今回は簡単に試せるmosquitto
を使用します。
sudo apt update
sudo apt install mosquitto
MQTT Client(コマンドラインツール)のインストール
sudo apt install mosquitto-clients
実行
MQTT Brokerを起動
mosquitto
/rover/001
のトピックにメッセージをpublish
前進させる場合、メッセージは'1'
mosquitto_pub -h <サーバーのIP> -t /rover/001 -m <メッセージ>
移動ロボットがメッセージの通りに動けば成功です。
まとめ
今回は「ESP-WROOM-02搭載移動ロボットをMQTTで制御する - ハード編」で作成した移動ロボットをMQTTを用いて制御しました。
Arduino用のMQTTライブラリや、MQTT BrokerやMQTT clientを試すためのツールが事前に用意されていたため、実装は非常に簡単でした。
参考
- https://www.ibm.com/docs/ja/ibm-mq/8.0?topic=ssfksj-8-0-0-com-ibm-mq-pro-doc-q002870--htm
- https://myenigma.hatenablog.com/entry/2019/10/27/194549
- https://hawksnowlog.blogspot.com/2017/03/mqtt-publish-with-wroom02.html
- https://github.com/knolleary/pubsubclient/blob/master/examples/mqtt_esp8266/mqtt_esp8266.ino
- https://qiita.com/hsgucci/items/be9665bafe6e449377c9#準備するもの
Discussion