Raspberry Pi[61] /dev/ttyACM0 で gpsd が動かなかった記録メモ

📍背景
使用GPS:u-blox 製モジュール(USB接続)
デバイス名:/dev/ttyACM0(CDC-ACMとして認識)
出力形式:NMEAセンテンスのみ(UBXは未使用)
ラズパイで gpsd を使用し位置情報取得を目指す

🔧 試したこと(失敗含む)
1. 通常起動・ログ確認
sudo gpsd -n -b /dev/ttyACM0
cgps → 時刻のみ表示(lat/lon 出ず)
gpspipe -r → 正常にNMEAセンテンスが出力されている(毎秒)
gpspipe -w → TPVのlat/lonがnullのまま

2. デバイスの読み取り確認
cat /dev/ttyACM0
毎秒NMEA出力あり → GPSは正常動作
gpsd 側の問題と判断

3. gpsd の起動ログ詳細確認
sudo gpsd -n -D 5 /dev/ttyACM0
gpsd:PROG: control socket ... のみ表示される
gpsd/dev/ttyACM0open() すらしていない
lsof | grep ttyACM0gpsd プロセスが開いていないことを確認

4. 対策試行(すべて失敗)
方法
結果
stty -F /dev/ttyACM0 115200 でボーレート指定
✅ だが効果なし
-F オプションなしの起動
❌ 開かれない
/dev/gps0 シンボリックリンクで名前偽装
❌ 無視される
-S オプションでポート指定
❌ 効果なし
gpsd 最新版(3.26.1)にビルドし直し
❌ 状況変わらず


💡 技術的結論
gpsd は /dev/ttyACM0 をデフォルトで「GPSデバイスとして受け入れない」、デバイス名・種別・udev情報がマッチしないと無視される可能性あり。
CDC-ACMデバイス(ttyACM)はモデムや医療機器でも使われるため、gpsdは慎重に扱う設計
NMEAを出していても、gpsd内部でスキップされるのかも
対処にはソースコードの gpsd_is_device() 相当を改変する必要あり(要C修正)

✅ 現実的な解決策
方法
内容
/dev/ttyUSB0 タイプに変更(USBシリアル)
gpsd で即認識され安定動作
⛳ u-bloxモジュールを UART接続 + USBシリアル変換
完全対応、柔軟性高い
🛠️ gpsd ソース改変(driver認識部分)
本質解決だが手間大


✅ 現在の選択
/dev/ttyUSB0 経由で運用に切り替え

もともと、NMEAの解析が面倒なのと、時刻同期をするのにGPS受信機を共用するのが目的だったので、gpsd を使わない選択肢はないことから、結局USBで認識されるGPS受信機を使用することにしました。
gpsd/usr/local/sbin/gpsd -n /dev/ttyUSB0 にて安定起動確認

普段は gpsfake でデバッグをして、さぁー、現地試験と行ったのですが、なぜか、緯度経度が更新されないという不可解な現象に悩まされ、試験は失敗に終わりました。受信確認だけはしておいたのに、ちゃんと一回は緯度経度を受信するので騙された。まさか、その後位置更新しないなんて。

トホホです。