GNSS測位やRTKをM5StackとZED-F9Pモジュールで実現しようとしたとき、ある落とし穴に気づく人は少ないかもしれません。
実は、ライブラリの選択と通信方式(I²CかUARTか)が、測位の成否を大きく左右します。
今回は、私自身が実際に遭遇した「クラス測位は成功するのに、他のコードでは一切データが出ない」という現象をもとに、ZED-F9PとM5StackでRTK測位に挑戦する人へなぜSparkFunライブラリを選ぶべきかを徹底解説します。
✔ 結論:SparkFunライブラリ+I²Cが最も安定して動作する
私が検証の中で得たもっとも重要な知見は次のとおりです:
ZED-F9Pは、UARTよりもI²C経由でSparkFunライブラリを使うと、格段に安定して測位データを取得できる。
これがすべてです。
🔍 背景:2つのライブラリと通信方式
以下は、私が実際に使用したコードの種類と結果の比較です。
比較項目 | 成功したコード | 失敗したコード |
---|---|---|
通信方式 | I²C(Wire) | UART(Serial2) |
使用ライブラリ | SparkFun_u-blox_GNSS | TinyGPSPlus |
データ出力形式 | UBXプロトコル | NMEAセンテンス |
測位結果 | ✅ Fix取得成功 | ❌ 何も受信できず |
🧠 なぜTinyGPSPlusではうまくいかないのか?
✅ 理由1:ZED-F9Pのデフォルト設定ではNMEA出力が無効
ZED-F9Pは出荷時点でUBXプロトコル(バイナリ形式)をI²C経由で出力する設定になっており、UARTにNMEAセンテンスは出力されていません。
TinyGPSPlusはNMEA(ASCII)のみ解析できるため、UARTで受信しても何も処理できない=表示されないのです。
✅ 理由2:TinyGPSPlusはZED-F9Pの制御ができない
TinyGPSPlusは受信専門であり、ZED-F9Pに「1Hzにしてね」や「Fix状態を教えて」などの命令を送ることはできません。
一方で、SparkFunライブラリでは以下のような制御が可能です:
gnss.setNavigationFrequency(1);
gnss.setAutoPVT(true);
これにより、測位情報(NAV-PVT)を定期的に自動取得できるようになります。
✅ 成功したコードの例(抜粋)
if (!gnss.begin(Wire)) {
Serial.println("GNSS not found.");
return;
}
gnss.setAutoPVT(true);
gnss.setNavigationFrequency(1); // 1Hz更新
これだけで、ZED-F9PはI²Cを通じて安定した測位データを自動的に送ってくれるようになります。
💡 なぜSparkFunライブラリが優れているのか?
機能 | SparkFun GNSSライブラリ |
---|---|
ZED-F9Pの初期化・制御 | ✅ 可能 |
測位更新の制御(周波数・形式) | ✅ 対応 |
Fix取得の可視化 | ✅ getFixType() で確認可能 |
RTCMやRTK対応 | ✅ 高度な操作可能(今後展開) |
🧪 実験結果からの学び
☑ ZED-F9Pを使うなら…
SparkFun_u-blox_GNSS_Arduino_Library
を使う- I²C通信(
Wire
)を使う gnss.begin(Wire)
を必ず呼ぶgetFixType()
でFIX状態を確認する
📌 まとめ
ZED-F9Pを使った測位開発では、デフォルト設定の理解と、正しいライブラリ・通信方式の選択が極めて重要です。
TinyGPSPlusは確かに有名で扱いやすいライブラリですが、ZED-F9Pとは相性が悪く、データが全く出てこないという罠にはまりやすいです。
今後RTKやNTRIPといったさらに高度な測位へステップアップする際にも、SparkFunライブラリを基礎にすることで、柔軟に拡張できるでしょう。

音楽家:朝比奈幸太郎
神戸生まれ。2025 年、40 年近く住んだ神戸を離れ北海道・十勝へ移住。
録音エンジニア五島昭彦氏より金田式バランス電流伝送 DC 録音技術を承継し、
ヴィンテージ機材で高品位録音を実践。
ヒーリング音響ブランド「Curanz Sounds」でソルフェジオ周波数音源を配信。
“音の文化を未来へ”届ける活動を展開中。