M5Stack Core2 上で動作するエコラン競技車両向けロガー兼リアルタイム表示システムです。以下を統合しています:
- ECU からの走行データ取得 (Serial1)
- GNSS 位置・時刻取得 (Serial2, TinyGPS++)
- BLE 経由のエンジン温度受信 (SoftwareSerial or HardwareSerial)
- SD カードへの CSV ロギング (SdFat)
- Wi-Fi (任意) + MQTT (AWS IoT Core) / Ambient 送信
- LCD (M5Unified + LovyanGFX) への複数モード表示
| 機能 | 内容 |
|---|---|
| 周回/距離管理 | 位置範囲からサーキット判定 (鈴鹿/茂木/その他) と周回数・走行時間計算 |
| 表示モード切替 | Aボタン=モード 0 回転数/噴射時間/進角(セッティング向け)Bボタン= モード 1 速度/残周回/走行時間(デフォルト)Cボタン= モード 2 速度/回転数/燃費(燃費確認用) |
| ログ保存 | /LOG/LOGxxxx.CSV (UTF-8 BOM付き, ヘッダ日本語) |
| MQTT 送信 | JSON ペイロードを mqtt_topic へ (証明書による TLS) |
| Ambient 送信 | 10 フィールド + 位置情報文字列 |
| セーフ処理 | GNSS 異常値除外 BLEタイムアウト時温度リセット ECU無信号時フェールセーフ |
- 基板: M5Stack Core2 (ESP32, PSRAM 使用)
- SD: SPI (GPIO4 / SHARED_SPI 設定)
- ECU: Serial1 115200 bps (RX=27, TX=19) ※コード参照
- GNSS: Serial2 115200 bps (標準ピン, モジュール仕様に合わせて接続)
- BLE 温度センサ: RX=32, TX=33 (SoftwareSerial 既定,
USE_HARDWARE_BLE=1で UART2 を利用可) - ボタン: A/B/C でモード選択 + 起動時設定
- TinyGPSPlus
- Ambient ESP32 ESP8266 lib
- M5Unified
- TimeLib
- PubSubClient
- ArduinoJson v7
- EspSoftwareSerial
- SdFat
- WiFiManager (同梱ライブラリ
lib/WiFiManager)
- VS Code + PlatformIO をインストール
- 本リポジトリを開く
- board:
m5stack-core2を指定 (既にplatformio.ini設定済み) - Upload (書き込み) / Monitor (115200bps) で動作確認
- 初回起動時 SD カードが挿入されていることを確認
- シリアル出力: CSV形式
lat,lon,loc,Spd_GPS,rpm,Spd_PULSE,distance,gasml,dispergas,worktime,Temp - 例外デコード:
monitor_filters = esp32_exception_decoder
| 操作 | 説明 |
|---|---|
| A ボタン | Wi-Fi 設定ポータル (AP モード, QR コードで簡易接続) |
| C ボタン | Wi-Fi 無効 (Ambient / MQTT も無効) |
| 無操作 (5秒) | 自動接続 (保存済 SSID) / 失敗時は接続先SSIDを設定するWebUIへのQRコードを表示 |
- モード 0: 速度, 残り周回 (最後は G/FINISH), 走行時間進行バー
- モード 1: 回転数, 噴射時間, 進角角度バー
- モード 2: 速度, 回転数, 燃費 (距離/燃料) バー
ヘッダ: 記録日時,速度(km/h),ラップ数,走行時間,回転数,走行距離,積算燃料,燃費,lat,lon,温度
- 記録日時: GNSS + JST補正 (
YYYY/M/D hh:mm:ss.cc) - 走行時間: ECU送信の積算秒
- 燃費: コード中
dispergas(km/L 指定の閾値 2000 スケールバー) - タイムスタンプは
logFile.timestamp()によりファイル更新時にも設定
-
接続先:
セキュリティ対応のため接続先設定はsecrets.hに記載し、secrets.hはGitのトラッキングの対象外とする- AWS IoT Core (TLS)
mqtt_server(ATS endpoint) - port
mqtt_port - クライアント証明書 + 秘密鍵 + Amazon Root CA 1
- AWS IoT Core (TLS)
-
QoS: 0(接続先での欠損を許容する)
-
ペイロード例:
{
"timestamp": "2025/11/09 12:34:56.12",
"Spd_PULSE": 42,
"Lapcount": 3,
"worktime": 375,
"tachoRpm": 5200,
"distance": 1234,
"gasml": 57.8,
"dispergas": 21.3,
"lat": 34.1234567,
"lon": 136.1234567,
"loc": "su",
"temp": 92.5
}- バッファサイズ:
MQTT_BUFFER_SIZE(既定 512) → 変更時はPubSubClientの制約に注意 - 送信間隔: 走行前
10s, 走行中1s
フィールド番号: 1=速度, 2=温度, 3=ラップ, 4=走行時間, 5=回転数, 6=距離, 7=積算燃料, 8=燃費, 9=lat文字列, 10=lon文字列
userKeyとdevKey(MAC アドレスから生成) を利用してchannelId/writeKeyを動的に取得
(secrets.h に記載しての固定はしない)- 送信タイムアウト 1000 ms
認証情報は Git に含めないでください。
.gitignore には既に secrets.h が登録されています。
以下の変数を src/secrets.h に定義します (実際の値は環境に合わせて置換):
const char* mqtt_server; // AWS IoT Core エンドポイント (xxxxxxxxx-ats.iot.<region>.amazonaws.com)
const int mqtt_port; // 8883 推奨 (TLS)
const char* mqtt_topic; // 例: "Furoshiki/M5Logger"
const char* mqtt_deviceID; // Thing Name / クライアントID
const char* userKey; // Ambient ユーザーキー
static const char AWS_CERT_CA[] PROGMEM; // Amazon Root CA 1
static const char AWS_CERT_CRT[] PROGMEM; // デバイス証明書 (-----BEGIN CERTIFICATE-----)
static const char AWS_CERT_PRIVATE[] PROGMEM; // デバイス秘密鍵 (-----BEGIN RSA PRIVATE KEY-----)src/secrets.example.h を参考に src/secrets.h を作成し、実値を記入してください。secrets.example.h は 公開可、secrets.h は 非公開。
- AWS IoT Core で Thing 作成
- 証明書 (CRT + Private Key + Amazon Root CA 1) を取得
- ポリシーを証明書にアタッチ (iot:Connect / iot:Publish / iot:Subscribe / iot:Receive)
- エンドポイントを
mqtt_serverに設定 - Topic 名をコード/運用で統一 (
mqtt_topic)
- 秘密鍵は絶対にコミットしない
- 公開環境ではデバッグ出力に秘密情報を含めない
- 証明書ローテーション時は再ビルド必須
| 症状 | 対処 |
|---|---|
| SD init failed | FAT/exFAT フォーマット SPI 接続確認, 遅延を長くする検討 |
| MQTT connect失敗 | 証明書有効性/時刻同期 (GNSSで JST 変換) ポリシー権限確認 |
| Ambient failure | Wi-Fi RSSI / userKey / devKey/channelId 取得失敗再試行 |
| 温度 0.0 固定 | BLE センサ未送信 or タイムアウト (>10s でリセット) |
- SD カード初期化: 挿入済でも最大 3 秒待機しているため、
sd.begin()成功時に即時ブレークし後続処理へ進むよう最適化する - BLE 温度欠損: SoftwareSerial 経由で温度値の欠損が発生。対策として FreeRTOS タスク分離 / HardwareSerial への移行 / リングバッファ導入を検討
- GNSS 高度 (altitude) の取得と JSON / SD ログへの追加
- 速度(
Spd_PULSE)を 0.1 km/h 単位で記録・送信 (必要ならスケール変更) - GNSS 日付処理の簡素化 (標準ライブラリ活用)
- 証明書有効期限チェック機能
MIT License (LICENSE 参照)
追加の仕様変更があれば Issue に追記しREADME を随時更新する。