みちびきの災害・危機管理通報サービス受信装置の構成変更(UNO Q編)

下記の記事で、みちびき(準天頂衛星システム)の災害・危機管理通報サービスの情報を受ける機器をArduino UNO Q+GPSシールドに変更する案を検討したが、より具体的に変更要領を検討したので紹介する。Arduino UNO Qに変更することで、地名データをUNO Qに保存でき、緯度経度情報から地名表示を行わせることができる。今回は、ソフトウェアとハードウェアの基本構成を決めるところまで行った。

(注)本記事の内容は正確性を保証するものではない。

(2026年2月22日 追記)YouTube動画を追加しました。 https://youtu.be/QlPh7L0p3dE


今後、Claude Codeを用いて、Auduino UNO QのPythonコードとArduinoスケッチを作成する予定なので、まずは、Claude Codeに、現状構成に対応するリポジトリの内容を参照させ概略をまとめさせた。

目次

現状リポジトリ調査結果

Claude Codeの回答

概要

QZSS(準天頂衛星システム「みちびき」)から送信される防災・危機管理情報(DC / DCX メッセージ)を ESP32-C6 で受信・デコードし、Web ブラウザで表示するArduinoファームウェアプロジェクトです。2025年9月30日に初回アップロードされたリポジトリです。

リポジトリ構成

qzss-dcx-esp32c6/
├── README.md           (内容はタイトルのみ、まだ記述なし)
└── Projects/
    └── 250821-045652-esp32dev/   ← PlatformIOプロジェクト
        ├── platformio.ini
        ├── src/
        │   └── espr_dev_qzss_drc_drx_decode_20250818.ino   ← メインコード
        ├── include/              (ヘッダファイル用、現在は空)
        ├── lib/
        │   ├── QZQSM/                          ← DC(mt=43)デコードライブラリ
        │   ├── QZSSDCX/                        ← DCX(mt=44)デコードライブラリ
        │   └── SparkFun_u-blox_GNSS_Arduino_Library/  ← GNSSモジュール通信ライブラリ
        ├── boards/
        └── test/

開発環境・対象ボード

項目内容
フレームワークArduino(PlatformIO使用)
対象ボードesp32-c6-devkitc-1(Espressif ESP32-C6 DevKit)
プラットフォームpioarduino / platform-espressif32
GNSSモジュール接続UART(RX:GPIO15 / TX:GPIO21)、ボーレート9600(失敗時38400)

主な機能(ソースコードより)

1. QZSS L1S 信号の受信 u-blox GNSSモジュール(M8Q等)と UART で接続し、SparkFun ライブラリ経由で UBX-RXM-SFRBX メッセージを受信。QZSSの衛星データ(gnssId=5)のみを抽出して処理します。

2. DCメッセージ(mt=43)のデコード メッセージタイプ43(DC Report)をQZQSMライブラリでデコード。Jアラートなど国内防災情報を日本語テキストに変換します。

3. DCXメッセージ(mt=44)のデコード メッセージタイプ44(DCX = DC Report Extended)をQZSSDCXライブラリでデコード。L-Alert等の拡張防災情報に対応。重複・空メッセージはCRC32チェックでフィルタリングする工夫が実装されています。

4. NAV-PVT・NAV-SAT による衛星・時刻情報の取得

  • UTC→JST(+9時間)変換を実装
  • 総衛星数・QZSS衛星数を集計

5. Wi-Fi接続 & Webサーバー(ポート80) 固定IPアドレスで起動し、ブラウザから http://192.168.0.○/ でリアルタイムのGNSSステータスと受信した防災情報(DC/DCX 各最新10件)を確認できます。画面は10秒ごとに自動リフレッシュします。

Web画面の表示内容

  • 現在時刻(JST)
  • 総衛星数 / QZSS衛星数
  • 測位ステータス(測位中 / 待機中)
  • DCX メッセージ受信件数
  • DC レポート 最新10件(タイムスタンプ付き)
  • DCX メッセージ 最新10件(タイムスタンプ付き)

使用ライブラリ

ライブラリ役割
SparkFun_u-blox_GNSS_Arduino_Libraryu-blox GNSSモジュールとのUBXプロトコル通信
QZQSMQZSS DC Report(mt=43)デコード
QZSSDCXQZSS DCX(mt=44)デコード
WiFi / WebServerWi-Fi接続とHTTPサーバー(Arduino標準)

まとめ

「みちびき」衛星から配信される防災情報(Jアラート・L-Alertなど)をESP32-C6+u-bloxモジュールで直接受信し、ローカルネットワーク上のWebブラウザからリアルタイムで確認できる、実用的なIoT防災モニタリングデバイスのファームウェアです。READMEはまだ未記述で、コードのコメントも日本語で書かれており、個人の実験・開発プロジェクトとして公開されたものと見受けられます。

Arduino UNO Q用のリポジトリ及びハードウェア構成

Claude Codeを使って、元のリポジトリを複写して別のリポジトリを作成し、そのリポジトリをArduino UNO Q+ESPr® Developer用GPSシールド(SAM-M8Q搭載)用に作り直した。

ハードウェアは、下図(左)の現状構成から、下図(右)の検討構成に変える予定で検討を進めた。

現状構成
ESPr® Developer C6+ESPr® Developer用GPSシールド
(SAM-M8Q搭載)
検討構成
Arduino UNO Q+ESPr® Developer用GPSシールド
(SAM-M8Q搭載)

検討構成に関するClaude Codeの回答

UNO Q + ESPr GPS shield (rewired) で、MCU -> Linux へ Bridge(RPC) でGNSS情報を送る最小構成です。

配線(前提)

SJ1/SJ2は既定(GPS TX->IO4, GPS RX->IO5)のまま利用。

  • GPS shield 3V3 -> UNO Q 3.3V
  • GPS shield GND -> UNO Q GND
  • GPS shield 4 -> UNO Q D0 (USART1_RX)
  • GPS shield 5 -> UNO Q D1 (USART1_TX)
  • GPS shield T-PULSE -> UNO Q D2 (任意)

ファイル

  • MCUスケッチ: unoq_bridge/mcu/uno_q_qzss_bridge_minimal.ino
  • Linux受信: unoq_bridge/linux/qzss_bridge_receiver.py

MCU側の挙動

  • Serial1 (9600bps) でNMEA (GGA / RMC) を受信
  • 1秒ごとにJSON化して Linuxへ通知
  • Bridge.notify("qzss/report", "<json>")
  • Linuxからの取得用RPCも提供
  • qzss/get_latest

Linux側の挙動

  • Bridge.provide("qzss/report", on_qzss_report) で通知受信
  • 受信JSONを標準出力+ qzss_reports.ndjson に追記

実行例(UNO Q Linux側)

cd unoq_bridge/linux
python3 qzss_bridge_receiver.py

受信すると1行JSONが連続表示されます。

ESPr® Developer用GPSシールドの電源端子や送受信端子をAudiono UNO Qに接続すれば、検討構成で代替構成を実現できる可能性がある。

Arduino UNO Q用にリポジトリ内容を変更したことにより、MCUスケッチと、MPU側LinuxのPythonコードが作成された。


GPSレシーバー変更検討

現状構成のESPr® Developer用GPSシールド(SAM-M8Q搭載)を流用する予定だったが、下記のGNSS Receiver(SparkFun GNSS Receiver – SAM-M8Q (Qwiic))が使える可能性があり、Qwiic端子でArduino UNO Qに接続できるので、検討構成のリポジトリに別ブランチを作成して、Arduino UNO Q+このGNSS Receiver用の内容をそのブランチに保存した。

https://www.sparkfun.com/sparkfun-gnss-receiver-sam-m8q-qwiic.html
USB-C端子とQwiic端子を備えている

検討構成に関するClaude Codeの回答

QZSS(準天頂衛星システム)の DC(災害・危機管理通報サービス)および DCX(拡張)メッセージを受信・デコードするプロジェクトです。

ブランチ構成

ブランチハードウェア接続方式レポート出力
mainESPr Developer (ESP32C6) + GPSシールドUARTWi-Fi + Webサーバー
arduino-uno-qwiicArduino UNO Q + SparkFun SAM-M8Q (Qwiic)I2C / QwiicLinux Webサーバー
(RPC経由)

arduino-uno-qwiic ブランチ:Arduino UNO Q + Qwiic SAM-M8Q

ハードウェア構成

  • ボードArduino UNO Q
    • Linux側: Qualcomm QRB2210(quad-core Cortex-A53 @ 2.0GHz)+ Debian OS
    • Arduino側: STM32U585(Cortex-M33 @ 160MHz)+ Zephyr OS
  • GNSS モジュール: SparkFun GNSS Receiver SAM-M8Q (Qwiic) — I2C/Qwiic接続

システム構成図

SparkFun SAM-M8Q (Qwiic)
       │
       │ I2C / Qwiic
       ▼
STM32U585(Arduinoスケッチ)
  - SparkFun u-blox GNSS Library (I2C)
  - QZSS SFRBX コールバック
  - DC / DCX デコード(QZQSM / QZSSDCX)
  - JSON 整形 → RPC.println() で送信
       │
       │ RPC(内部バス)
       ▼
Qualcomm QRB2210(Debian Linux)
  - web_server.py
    - RPC デバイス(/dev/ttyRPC0)から JSON 受信
    - Flask Web サーバー(ポート 80)
       │
       │ HTTP
       ▼
  ブラウザ(DC / DCX レポート表示)

Qwiic 配線

SAM-M8Q (Qwiic)Arduino UNO Q
SDA (黄)SDA
SCL (青)SCL
3.3V (赤)3.3V
GND (黒)GND

Qwiic ケーブルを使用する場合、4ピンを差し込むだけで接続完了です。

プロジェクト構成

Projects/arduino-uno-qwiic/
├── platformio.ini                         # PlatformIO ビルド設定(STM32U585)
├── src/
│   └── arduino_uno_q_qzss_qwiic.ino      # Arduinoスケッチ(RPC送信)
└── linux/
    ├── web_server.py                      # Flask Webサーバー(RPC受信)
    └── requirements.txt                   # Python依存ライブラリ

必要なライブラリ

Arduino側(STM32U585)

ライブラリ入手先
RPCArduino UNO Q 付属
SparkFun u-blox GNSS Arduino Library v2Arduino Library Manager / GitHub
QZQSMプロジェクト内 lib/QZQSM/
QZSSDCXプロジェクト内 lib/QZSSDCX/

Linux側(Debian)

pip3 install -r Projects/arduino-uno-qwiic/linux/requirements.txt
パッケージ用途
flaskWeb サーバー
pyserialRPC デバイス(シリアル)読み取り

セットアップ手順

Arduino側

  1. PlatformIO または Arduino IDE でスケッチをビルド・書き込み
  2. Qwiic ケーブルで SAM-M8Q を接続

Linux側

# 依存ライブラリのインストール
pip3 install -r Projects/arduino-uno-qwiic/linux/requirements.txt

# Webサーバー起動(ポート80使用のためsudo必要)
sudo python3 Projects/arduino-uno-qwiic/linux/web_server.py

ブラウザで http://<Arduino UNO Q の IPアドレス>/ にアクセスすると DC/DCX レポートを確認できます。

Note: RPC デバイスパス(デフォルト: /dev/ttyRPC0)は ボードのドキュメントに従って web_server.py の RPC_DEVICE 定数を変更してください。

main ブランチとの主な差分

項目main (ESP32C6)arduino-uno-qwiic (UNO Q)
GNSS接続UART (Serial1)I2C / Qwiic (Wire)
GNSS初期化myGNSS.begin(Serial1)myGNSS.begin(Wire)
出力設定setUART1Output(COM_TYPE_UBX)setI2COutput(COM_TYPE_UBX)
Arduino→Linux通信— (単一チップ)RPC (RPC.println(JSON))
Web サーバーESP32内蔵 WebServerPython Flask(Debian上)
レポート出力Wi-Fi + WebServerLinux Webサーバー(HTTP:80)

Arduino UNO QのWebサーバー機能はBrickではなく、Flaskで実現された。

ただし、現状の検討構成は最小構成なので、基本的な動作が確認できたら、緯度経度からの地名変換機能などを追加する。

Arduino UNO Qが届いたが、箱の小ささに驚き、本体の小ささに驚いた。最近、ブログ記事やYouTube動画のスライドで、UNO Qの拡大図しか見ていなかったので余計に小さく感じたようだ。小さいから余計に緻密で綺麗に感じる。

目次