IoTでは、MQTTという通信プロトコルが良く使われています。
ラズパイとM5Stack間を、MQTTを使って、実際にデータ通信させてみましょう
M5Stackで取得したセンサ値(加速度センサ等)を、ラズパイに、Wi-Fi(MQTT)を使い、JSON形式で送る方法を紹介します。
前提
・M5Stack
・Raspberry Pi4
M5StackとRaspberry Piは、同じWi-Fiを使います。
リンク
リンク
M5Stackで取得した加速度センサ値を、ラズパイに、Wi-Fi(MQTT)を使い、JSON形式で送信する方法
構成
サンプルコード(M5Stack)
ArduinoIDEを起動して、以下のサンプルコードをコピーしてください。
#define M5STACK_MPU6886
#include <WiFi.h>
#include <PubSubClient.h>
#include <M5Stack.h>
#include <ArduinoJson.h>
////////////////////////////////////////////////////////////////////////////////
// Wi-FiのSSID
char *ssid = "*********";
// Wi-Fiのパスワード
char *password = "*********";
// MQTTの接続先(ラズパイ)のIP
const char *endpoint = "***.***.***.***";
// MQTTのポート
const int port = 1883;
// デバイスID デバイスIDは機器ごとにユニークにします
char *deviceID = "M5Stack";
// メッセージを知らせるトピック
char *pubTopic = "/pub/M5Stack";
// メッセージを待つトピック
char *subTopic = "/sub/M5Stack";
////////////////////////////////////////////////////////////////////////////////
WiFiClient httpsClient;
PubSubClient mqttClient(httpsClient);
// シリアル通信ブロックの初期化
void setup_serial(){
Serial.begin(115200);
while (!Serial) continue;
}
// Wi-Fiブロックの初期化と開始
void setup_wifi(){
Serial.println("Connecting to ");
Serial.print(ssid);
// WiFi接続性改善のため、いったん切断
WiFi.disconnect( true, true ); //WiFi OFF, eraseAP=true
delay(500);
// WiFi開始
WiFi.begin(ssid, password);
// Wi-Fi接続待ち
while (WiFi.status() != WL_CONNECTED) {
delay(100);
M5.Lcd.print(".");
}
// WiFi接続成功メッセージの表示
Serial.println("\nWiFi Connected.");
M5.Lcd.setCursor(10, 40);
M5.Lcd.setTextSize(2);
M5.Lcd.println("WiFi Connected.");
// M5StackのIPアドレスを表示
M5.Lcd.print("IP address: ");
M5.Lcd.println(WiFi.localIP());
}
// M5Stackの初期化
void setup(){
// M5Stack objectの初期化
M5.begin();
M5.Power.begin();
M5.IMU.Init();
setup_serial();
// 画面初期設定
M5.Lcd.fillScreen(TFT_DARKGREEN);
M5.Lcd.setCursor(10, 10);
M5.Lcd.setTextSize(2);
M5.Lcd.printf("START");
// Wi-Fi処理の開始
setup_wifi();
// MQTTクライアントの初期化
mqttClient.setServer(endpoint, port);
// MQTT接続開始
connectMQTT();
}
// MQTT接続処理
void connectMQTT(){
// MQTT接続待ち
while (!mqttClient.connected()) {
if (mqttClient.connect(deviceID)) {
// 所定のデバイスと接続した
Serial.println("Connected.");
int qos = 0;
mqttClient.subscribe(subTopic, qos);
Serial.println("Subscribed.");
} else {
// 所定のデバイスと接続失敗 ⇒ 再トライする
Serial.print("Failed. Error state=");
Serial.print(mqttClient.state());
// Wait 5 seconds before retrying
delay(5000);
}
}
}
// MQTT接続管理
void mqttLoop(){
// MQTT接続状態を監視し、切断されていたら、再接続を試みる
if (!mqttClient.connected()) {
connectMQTT();
}
// MQTTクライアント側の定期処理の実行
mqttClient.loop();
}
// M5Stackの定期処理
void loop(){
float accX, accY, accZ;
char pubMessage[128];
// センサ値の取得
M5.IMU.getAccelData(&accX,&accY,&accZ);
// 取得データの表示
M5.Lcd.fillScreen(TFT_DARKGREEN);
M5.Lcd.setTextSize(2);
M5.Lcd.setCursor(10, 10);
M5.Lcd.printf("acc=(%5.1f, %5.1f, %5.1f)", accX, accY, accZ);
Serial.printf("acc=(%5.1f, %5.1f, %5.1f)", accX, accY, accZ);
Serial.println();
// MQTT接続監視
mqttLoop();
// メッセージの作成
sprintf(pubMessage, "{\"accX\": %5.1f,\"accY\": %5.1f,\"accZ\": %5.1f}", accX, accY, accZ);
// メッセージの画面表示
Serial.print("Publishing message to topic ");
Serial.println(pubTopic);
Serial.println(pubMessage);
// メッセージのPublish
mqttClient.publish(pubTopic, pubMessage);
Serial.println("Published.");
delay(500);
}
M5Stackへの書き込みが完了し起動をすると、M5StackはMQTTブローカーへ向けてメッセージを送信し続けます。
ラズパイに、MQTTブローカをインストールする
MQTTブローカーのオープンソースである、「mosquitto」を使います。
sudo apt-get install mosquitto
MQTTブローカーの起動や停止はserviceから実行できる。
service mosquitto start
ラズパイに、MQTTクライアントをインストールする
ラズパイで、MQTTブローカーとしての役割とM5Stackからのメッセージ受信もおこなうので、mosquitto-clientsをインストールする。
mosquitto-clientsをインストールすることで、メッセージの送信と受信ができる。
sudo apt-get install mosquitto-clients
ラズパイ側のmosquittoを起動する
mosquitto_sub -d -t /pub/M5Stack
ラズパイのコンソール上に、M5Stackからのメッセージを表示されます。
まとめ
今回は、M5Stackで取得したセンサ値を、JSON形式で、Wi-FI(MQTT)を使い、ラズパイへ送信する方法を紹介しました。
リンク
参考
リンク
コメント