この記事は次の環境を想定して書かれています
RaspberryPi WH
RaspberryPi4
RaspberryPiOSpython3GNSS/GPSアンテナモジュール シリアルポート接続
GU-902MGG-USB USB-UARTブリッジ(Prolific PL2303SA /秋月電子通商)ZED-F9P USB接続
液晶LCD1602モジュールと組み合わせた電波時計の作例はこちら
GPSとGNSS
RaspberryPiにはRTCが無い!
さてさて、GNSSロガーを作って、実際に山登りしながらロギングしていると、ログファイルのタイムスタンプがずれているではないですか。いつも時刻があっていて、てっきりRaspberryPiには時計が内蔵されているものだと思っていたので、当日のタイムスタンプのファイルが無くGNSSログが取れていないかのかと頭が真っ白になりました。でも前日のタイムスタンプのファイルがログファイルだった(汗)
確かにパソコンに入っているCR2032みたいなボタン電池は入っていないし、当然RTC(リアルタイムクロック:内蔵時計)は無い。
自宅で使っている分にはネットワーク環境があるのでNTPで時間がピッタリあっている。でも、出先で携帯の電波も入らないようなところだと、当然テザリングでの時刻合わせもできない。かといって、携帯電波の入るところでRaspberryPiを起動して自動的に時刻合わせをした上で現地向かうとして、到着後登山リュックにGPSアンテナ配線したりRaspberryPiを仕込んでバッテリー配線したりしているときに、電源の配線抜けでリセットかかってしまうと完全にお手上げ状態になる。
となると、内蔵時計を合わせる方法は…
(a)RTCを搭載する
(b)GNSS信号から時刻を取得する
『登山』が大前提にあり、現在RaspberryPi/WHをメインに使用しているので、回路は簡単にしたい。揺れるし、雑に扱うし。ということで方式(b)GNSSで時刻を合わせることとしました。
GNSSで時刻合わせをするには date -sできないけど
えーーー!?ntpサービスで同期していないの?
もうちょっと調べたら、RaspberryPiOSというかLinuxではtimedatectl を使うとのこと。
これでやっと(笑)時刻のセットができるようになりました。
ちなみに書式は
GNSSのメッセージから時刻を取り出す ~python3を使って
以下、GNSSアンテナからシリアルで送信されたメッセージから時間を取り出して時刻設定するプログラムです。
使用環境:
RaspberryPi WHRaspberryPiOSpython3GU-902MGG-USB GNSSアンテナモジュール(秋月電子)
ZED-F9P USB接続
今回作成したプログラムです
[gnssdate.py]