Raspberry Pi起動時にGPSで現在時刻を設定(1PPS対応)

先日、Raspberry Piとスマートフォンを直接接続して、Piカメラ映像を見ながら、動画やタイムラプスを撮影できるようにしました。

屋外で撮影したい場合、こちらは大変便利なのですが、問題が1つあります。

インターネットが使えない場所でRaspberry Piを使用すると、時計がずれてしまい、正確な撮影時刻がわからなくなる問題です。

Wi-Fiか有線LANでインターネットに接続すれば正確な時刻がセットされますが、屋外で使いたいということで、インターネット環境が無い事を想定しなければなりません。

というわけで。インターネット回線が無くても、Raspberry Piに正確な現在時刻を設定できるように工夫してみたいと思います。


どこから時刻情報を得るか

日常的に使用できる時刻情報は、次の3種類かと思います・・・そういえば117は有料ですよね?

  1. インターネットの時刻同期(NTP)サーバー
  2. 電波時計
  3. GPS

インターネットが無い環境では、2番か3番が選択肢になります。「空が見えるところなら受信できる」手軽さから、GPSから時刻を得ようと思います。GPSモジュールの費用は、接続用のケーブルと合わせて3,000円程度でした。


Raspberry Pi起動時にGPSから現在時刻を得る設定

GPSモジュールの接続

準天頂衛星システム「みびちき」に対応したGPSモジュールを接続してみました。こちらの記事になります。

こちらのGPSモジュールから日時を取得し、Raspberry Piのシステム時刻をセットする流れになります。

GPSから現在時刻を取得する方法

現在時刻をどう得るかですが。海外の情報サイトをざっと拝見したところ、gpspipeを使って日時の文字列を得る方法が常套手段のようです。

GPSDATE="`/usr/bin/gpspipe -w | /usr/bin/head -10 | /bin/grep TPV | /bin/sed -r 's/.*"time":"([^"]*)".*/\1/' | /usr/bin/head -1`"
echo $GPSDATE
/bin/date -s "$GPSDATE"

こちらを利用させて頂き、まずはRaspberry Piの起動時にざっくりと時刻設定しようと思います。

日付設定スクリプト

次のようなスクリプトを作成しました。GPSから日時情報を得て、Raspberry Piのシステム時刻を設定する内容です。

Raspberry Pi起動時に実行しようと思います。起動後、GPSの受信まで1分間待ってからシステム時刻をセット、さらに1分間待ってからもう一度セット・・・屋内では1分で失敗する場合があったための工夫ですが・・・改良の余地があるかと思います。

nano ~/setdatefromgps.sh
#!/bin/sh
echo start at `/bin/date`
for i in 1m 1m; do
  echo sleep $i
  /bin/sleep $i
  GPSDATE="`/usr/bin/gpspipe -w | /usr/bin/head -10 | /bin/grep TPV | /bin/sed -r 's/.*"time":"([^"]*)".*/\1/' | /usr/bin/head -1`"
  echo $GPSDATE
  /bin/date -s "$GPSDATE"
done
echo end at `/bin/date`

cronで起動時にスクリプトを実行

cronで起動時に日付設定スクリプトを実行するように設定します。

sudo crontab -e

次の1行を追加します。

@reboot /home/pi/setdatefromgps.sh > /home/pi/setdatefromgps.log 2>&1

再起動後、スクリプトが正しく実行されていれば、ログファイルが作成されます。

こちらのログを見ると、1回目はGPSから日時が取れておらずに位置情報になっています(3行目)。2回目は正しく日時が取得できて(8行目)現在時刻をセットできています。GPS情報の取得に数秒かかっているようですので、システム時刻は数秒~十数秒の遅れが発生していると思います。

時刻の遅れは、次に設定するNTPで補正するかたちになります。


NTPでシステム時刻をGPSと同期

NTPをインストールしてGPSの時刻と同期するように設定すれば、Raspberry Piの電源を入れている限り、正確な時刻が永続的に設定されます。

試してみたところ、GPIO18に接続した1PPS信号を使うことで、Raspberry Piを起動してから数分でGPSと時刻が同期し、正確な時刻を得られるようです・・・素晴らしい!

さらに、gpsdでPPSを有効にしたほうが、位置情報の誤差も小さくなったように感じたのですが・・・気の所為のような?

gpsdのPPS受信設定

  1. /etc/default/gpsdを編集し、DEVICESに/dev/pps0を追加します。
    sudo nano /etc/default/gpsd
    DEVICES="/dev/ttyS0 /dev/pps0"

  2. gpsdを再起動します。
    sudo systemctl restart gpsd.socket
  3. gpsmonを起動して、PPS信号が受信できているか確認します。
    gpsmon

    画面の下の方、PPS欄に情報が表示されれば、受信できています。

NTPのGPS同期設定(1PPS対応)

NTPの設定は、Raspberry Pi公式フォーラムのこちらの情報を参照させて頂きました。

  1. ntpをインストールします。
    sudo apt-get install ntp

  2. /etc/ntp.confを編集します。
    sudo nano /etc/ntp.conf

    クロックデバイス127.127.28.2は共有メモリーで、gpsdが提供するPPS付きの時刻情報になります。

    driftfile /var/lib/ntp/ntp.drift
    logfile /var/log/ntp.log
    restrict default kod nomodify notrap nopeer noquery
    restrict -6 default kod nomodify notrap nopeer noquery
    restrict 127.0.0.1 mask 255.255.255.0
    restrict -6 ::1
    server 127.127.28.2 minpoll 3 maxpoll 3 true
    fudge 127.127.28.2 refid SHM2 stratum 1
    disable monitor
  3. ntpをいちど停止し、起動します。再起動では変わらないのですよね・・・。
    sudo systemctl stop ntp
    sudo systemctl start ntp

  4. ntpqで正しく時刻が同期しているか確認します。
    ntpq -p

    delay、offset、jitterに値が入っており、同期中のマーク(*やo)が付いていれば問題ないかと思います。

  5. 再起動して正しく時刻が同期するか確認します。ntpは既定で自動起動するように設定されていると思います。

※他のPCの時刻を合わせるような、NTPサーバーとしてご利用になる場合は、ntp.confを変更する必要があります。


以上で設定完了となります。

NTPでGPSと時刻を合わせる場合、最初、同期に時間がずいぶんかかるものと思っていました。

実際に試したところ、1PPS信号を使った場合は数分で同期することがわかりました。

NTPとgpsdを併用できるかたちで設定したため、NTPで時刻同期しながらgpsdから位置情報を得ることもできます。次回は位置情報を使ってみたいと思います。

それではまた!

スポンサーリンク

フォローする

スポンサーリンク

コメント

  1. はなだ より:

    一昔前、ポータブルカーナビなど向けにリンク先のような五センチ角くらいのGPSアンテナをよく見かけましたが、こちらの記事でご使用のGPSモジュールにもそういったアンテナを取り付けることはできるのでしょうか?もしくは、取り付けても意味がないのか、取り付けられないのか、、、

    https://www.monotaro.com/p/7516/4083/

    • hide より:

      はなだ さん
      はじめまして。コメント頂きまして誠にありがとうございます。

      GPS受信機キット
      http://akizukidenshi.com/catalog/g/gK-09991/
      上部の茶色の四角形の部品がアンテナのようです。
      ずいぶん小型になりましたね。

      さらにメイン基板の上の基板が
      GPSモジュールのようです。
      http://akizukidenshi.com/catalog/g/gM-09990/
      アンテナや他の部品が一体になっているようです。
      別のアンテナを取り付けるのは難しいかもしれません?

  2. ooi より:

    時計精度を高めるためには、こちらもおすすめ。
    https://nyanchew.com/jp/gps%E3%81%AEpps%E4%BF%A1%E5%8F%B7%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F-stratum-1-ntp%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9

    また、測位位置の正確性を高める目的の場合は、(プロの測量士が使う機材と比べると)安価な機材で、RTKLIBを使うと1cm級の精度を出せます。色々準備が大変ですが・・。

    • hide より:

      ooi さん
      はじめまして。コメント頂きまして誠にありがとうございます。

      Raspberry PiとGPSモジュールの組み合わせで。
      時計、測位位置ともに、ご紹介頂いた方法で精度の改善が可能なのですね・・・ふむふむふむ。

      準備の大変さ、予備知識も必要な感じですが、安価な機材で高精度が得られるのは大きな魅力かと思います。
      ふむふむふむ。