Raspberry Pi[61] /dev/ttyACM0 で gpsd が動かなかった記録メモ
📍背景
使用GPS:u-blox 製モジュール(USB接続)
デバイス名:/dev/ttyACM0(CDC-ACMとして認識)
出力形式:NMEAセンテンスのみ(UBXは未使用)
ラズパイで gpsd を使用し位置情報取得を目指す
🔧 試したこと(失敗含む)
1. 通常起動・ログ確認sudo gpsd -n -b /dev/ttyACM0cgps → 時刻のみ表示(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/ttyACM0gpsd:PROG: control socket ... のみ表示されるgpsd が /dev/ttyACM0 を open() すらしていないlsof | grep ttyACM0 → gpsd プロセスが開いていないことを確認
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 でデバッグをして、さぁー、現地試験と行ったのですが、なぜか、緯度経度が更新されないという不可解な現象に悩まされ、試験は失敗に終わりました。受信確認だけはしておいたのに、ちゃんと一回は緯度経度を受信するので騙された。まさか、その後位置更新しないなんて。
トホホです。

