🤝

ラズパイとM5Core2でMQTT

2022/09/19に公開

はじめに

M5Core2とPCをWiFiで接続し、MQTTでデータをやりとりしたい。
訳あってWiFiルーターを使いたくないので、ラズパイをアクセスポイント化し、M5Core2と接続する環境を作ってみる。

手順

  1. ラズパイにRaspAPをセットアップ
  2. M5Core2とラズパイをWiFi接続
  3. MQTTテスト

用意するもの

Raspberry Pi 4

環境はこちら

$ lsb_release -a
No LSB modules are available.
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 11 (bullseye)
Release:	11
Codename:	bullseye

M5Core2

スイッチサイエンスで購入したものを使用
https://www.switch-science.com/catalog/6530/

スケッチ書き込みPC

Macを使用(OS: Monterey)

❯ sw_vers
ProductName:	macOS
ProductVersion:	12.6
BuildVersion:	21G115

また、スケッチ書き込みにはArduino IDEを使う。

RaspAPのセットアップ

こちらを使うと簡単にセットアップできる。
https://github.com/RaspAP/raspap-webgui

curl -sL https://install.raspap.com | bash

いくつかY/nを入力するとインストールできる。
SSIDやパスワードの変更方法は別スクラップにまとめているので、よければこちらを参照していただきたい。
https://zenn.dev/link/comments/e5ec41bd8f45a4

M5Core2とラズパイを接続

簡単なスケッチを作成
接続できたら緑背景に白文字で"Connected"と表示させる

M5Core2WiFiSample.ino
#include <M5Core2.h>
#include <WiFi.h>

const char* ssid = "<接続先のSSID>";
const char* password = "<接続先のパスワード>";

void connect_wifi() {
  M5.Lcd.setTextSize(2);
  M5.Lcd.fillScreen(WHITE);
  M5.Lcd.setTextColor(GREEN);
  M5.Lcd.print("WiFi Connecting to ");
  M5.lcd.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
  M5.Lcd.fillScreen(GREEN);
  M5.Lcd.setTextColor(WHITE);
  M5.Lcd.println("Connected");
  M5.Lcd.printf("IPv4: %s", WiFi.localIP().toString().c_str());
  M5.Lcd.println("");
}

void setup() {
  M5.begin();
  
  connect_wifi();
}

void loop() {
}

https://twitter.com/ijiwarunahello_/status/1571527492850319360?s=46&t=g3PR41bgyHXBTN82a67n9w
接続できた!

MQTTブローカーの設定(ラズパイ側)

ラズパイをMQTTのブローカーにするので、mosquittoをインストールする。

sudo apt install mosquitto

これでラズパイ側は準備OK

Pub/Subテスト

Arduino IDEから使えるMQTTのサンプルスケッチを使う。
https://github.com/m5stack/M5Core2/blob/master/examples/Advanced/MQTT/MQTT.ino

WiFi、MQTTの設定に関するところを適宜各々の環境で書き換える。

21~23行目
+ const char* ssid = "<WiFiのSSID名>";
+ const char* password = "<WiFiのパスワード>";
+ const char* mqtt_server = "ラズパイのIPアドレス";

スケッチを書き込み、ラズパイ側でPub/Subを起動

Subscriber
$ mosquitto_sub -t M5Stack
hello world #1
hello world #2
hello world #3
hello world #4
...

https://twitter.com/ijiwarunahello_/status/1571553190558179328?conversation=none

Publisher
$ mosquitto_pub -t M5Stack -h localhost -m "We are Perfume"

https://twitter.com/ijiwarunahello_/status/1571553483555491840?conversation=none

いい感じ👍🏻

おまけ: paho-mqtttでPythonクライアント作成

PythonでPub/Subができるスクリプトを作成する。
まずはライブラリをインストール

python -m pip install paho-mqtt

https://pypi.org/project/paho-mqtt/
公式のGetting Startedを参考に、サブスクライバを作成

sub.py
import paho.mqtt.client as mqtt

# ラズパイ上でブローカーが起動しているので"localhost"としている
HOST = "localhost"
PORT = 1883
TOPIC = "M5Stack"


def on_connect(client, userdata, flags, rc):
    print(f"Connected with result code {rc}")
    client.subscribe(TOPIC)

def on_message(client, userdata, msg):
    print(f"{msg.topic}: {msg.payload}")


client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

client.connect(HOST, PORT, 60)
client.loop_forever()

https://twitter.com/ijiwarunahello_/status/1571556345136156673?conversation=none

いいね😊

最後に

ラズパイをアクセスポイント化することでルーター兼サーバーとなるので、なんらかイベントでローカルネットワークでのシステムを構築するときに覚えておくと使う機器の数を減らせそう。

たまにはAWSに頼らないIoTもいいですね。

参考サイト

https://dev.classmethod.jp/articles/m5stack-core2-for-aws-arduino-mqtt/
http://independence-sys.net/main/?p=4054

Discussion