【保存版】なぜTinyGPSPlusでは測位できず、SparkFunライブラリで成功したのか?

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_GNSSTinyGPSPlus
データ出力形式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」でソルフェジオ周波数音源を配信。
“音の文化を未来へ”届ける活動を展開中。