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