Makato-kan が 2025年08月07日00時41分49秒 に編集
コンパイルエラー追記,写真入替
メイン画像の変更
本文の変更
>#### はじめに [ワイヤレスタイムラプスカメラをXIAO ESP32-S3で作った(SDカード無し)](https://elchika.com/article/d1d0f356-3783-4daf-88dd-d8f7be35bd5b/)で作ったカメラの画角を確認するのが結構面倒だったので、以前elchika様よりいただいたM5Stackをモニターにする事にしました。 >#### 仕様 やっている事はラズベリーパイからMQTT-pubで送られた画像データを M5StackはMQTT-subでデータを受け取り画面表示しています。  概念図 >#### ポイント ArduinoIDEで使うPubSubcluentの128バイト制限をclient.setBufferSize()を使い20kバイトに増やしています。 ラズベリーパイにMQTTをセットアップする方法は[ラズベリーパイにMQTTブローカーの設定して pub/subを試してみる。](https://elchika.com/article/ea67de45-ab62-4515-8a63-e9f83f056eed/)に書いてみましたのでそちらを参考にしてくださると助かります。 convertという画像変換コマンドをラズベリーパイで使うのでaptを使ってインストールします。 ```convertのインストール $ sudo apt update $ sudo apt upgrade $ sudo apt install imagemagick ``` M5stackでラズパイのブローカーが稼働しているホストを指定するにはIPアドレスが必要ですラズパイでifconfigを実行すればわかります。 >#### 環境依存部分の設定 M5Stack側 WifiのSSID =” ” パスワード =” ” MQTTブローカーを運用するラズベリーパイのIPアドレス =”192.168.*.*"とホスト名” .local” MQTTのユーザー名 =” ” パスワード =” ” トピック名 =”jpeg/raw” ラズベリーパイ側 [ワイヤレスタイムラプスカメラをXIAO ESP32-S3で作った(SDカード無し)](https://elchika.com/article/d1d0f356-3783-4daf-88dd-d8f7be35bd5b/) で使ったシェルスクリプトを変更しますのでフォルダ等の名前は同じにしてください >#### M5Stackのプログラム
M5Stackのボードマネージャーとライブラリは最新版(2025−7−28時点)を使うとコンパイルエラー出たので低いバージョンにして使っています。
M5Stackのボードマネージャーは最新版(2025−7−28時点)を使うとコンパイルエラー出たので低いバージョンにして使っています。
ArduinoIDEは2.3.6(最新版)です
M5Stackのボードマネージャーは2.1.4を使っています。 M5Stackのライブラリマネージャーは0.2.9を使っています。
M5Stackのボードマネージャーは**2.1.4**を使っています。 M5Stackのライブラリマネージャーは0.4.6(最新版)を使っています。
pubsubclientのライブラリマネージャーは2.8(最新版)です ```arduino:M5stack-moniter.ino #include <WiFi.h> #include <PubSubClient.h> #include <M5Stack.h> // WiFi 設定 const char* ssid = "指定してね"; const char* password = "指定してね"; //WiFi設定 //MQTT設定 const char* mqttServer = "192.168.指定してね";//名前解決できないのでこれを使う const int mqtt_port = 1883; const char mqttUserName[] = "指定してね"; // name→設定した名前に書き換える const char mqttPass[] = "指定してね"; // pass→設定されたmqttパスに書き換える const char clientID[] = "M5StickC-1"; WiFiClient espClient; PubSubClient client(espClient); //"/var/log/mosquitto/mosquitto.log"で確認できる //MQTT設定 void callback(char* topic, byte* payload, unsigned int length) { if (String(topic) == "jpeg/raw") { M5.Lcd.fillScreen(BLACK); M5.Lcd.setCursor(0, 0); M5.Lcd.drawJpg(payload, length);//JPEG画像を表示する関数があった } } void setup() { M5.begin(); M5.Lcd.fillScreen(BLACK); M5.Lcd.setRotation(1); M5.Lcd.setTextSize(2); M5.Lcd.setCursor(10, 10); M5.Lcd.print("Run!\n"); delay(100); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) delay(500); client.setBufferSize(20240); // JPEGのサイズに合わせて拡張しています client.setServer(mqttServer, 1883); client.setCallback(callback); while (!client.connected()) { client.connect(clientID,mqttUserName,mqttPass); } client.subscribe("jpeg/raw"); } void loop() { client.loop(); } ``` >#### ラズベリーパイのプログラム(シェルスクリプト) mosquiito-MQTTでブローカーとパブリッシャーの機能を使います。 imagemagickに含まれるconvertを使って画像サイズ変換しています。 シェルスクリプトは以下の通りです ```arduino:check-photo.sh #!/bin/bash WATCH_DIR="/home/test-cam" FILENAME="directfb.jpg" inotifywait -m -e close_write --format "%f" "$WATCH_DIR" |while read FILE do if [ "$FILE" = "$FILENAME" ]; then TIMESTAMP=$(date +"%Y-%m-%d-%H-%M") NEW_NAME="cam$TIMESTAMP.jpg" mv "$WATCH_DIR/$FILENAME" "$WATCH_DIR/$NEW_NAME" echo "Renamed $FILENAME to $NEW_NAME" convert -geometry 320x240 "$NEW_NAME" M5photo.jpg mosquitto_pub -h "ブローカーのホスト名は xxxx.localで記入可能です" -u "指定してね" -P "指定してね" -t jpeg/raw -f M5photo.jpg fi done ``` シェルスクリプトなのでchmod 755等をしてコマンドラインで実行すれば動作します。 自動起動するなら/etc/rc.local等に記述するのが良いと思います。 >#### ご注意 エラー処理はしていないのです、たとえば受信失敗しても再送信リクエストしていません。 chatgptに聞いたり、ネットから集めたプログラムで作成したのでライセンスは未指定です。 client.setBufferSize()はむやみに大きくしない方が良いとchatgptが言っておりました
M5Stackの進捗状況はルーターのログでwifi接続 ブローカーのログでMQTTの接続状況がわかるのでそれを手掛かりにするとよかったです
M5Stackの進捗状況はルーターのログでwifi接続 ブローカーのログでMQTTの接続状況がわかるのでそれを手掛かりにするとよかったです >#### コンパイルエラーについて(2025-8-7追記) ボードマネージャーを3.x.xにするとエラーが発生します。 [rom/miniz.h error still occurs when compiling for Core with board def 3.2.x](https://community.m5stack.com/topic/7622/rom-miniz-h-error-still-occurs-when-compiling-for-core-with-board-def-3-2-x/2)を読むと理由が書かれていました。