【IoTプログラミング入門】M5Stackで取得した加速度センサ値を、ラズパイに、Wi-Fi(MQTT)を使い、JSON形式で送信する

M5Stack

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)を使い、ラズパイへ送信する方法を紹介しました。

広告

参考

みんなのAI講座 ゼロからPythonで学ぶ人工知能と機械学習

コメント

タイトルとURLをコピーしました