RaspberryPi4 の時計をGPSで合わせる

2020年5月20日水曜日

RaspberryPi4の赤道儀制御システム(INDIサーバー)の構築が終わりまして、運用もおそらく問題ない完成度になりました。
Ubuntu 20.04 の arm64環境で動かしています。
Raspbianでもいいのですが、いかんせん、Debianベースカーネルやシステムが一世代前なので、新しい物好きとしては、最新の環境でゴリゴリ動かしたいと思うわけです。
Ubuntu も RaspberryPi4を正式サポートしたし。

で、メモリ問題が解決されたRasPi4であっても、相変わらずリアルタイムクロック(RTC)を載せないポリシーのおかげで、起動時の時刻合わせに困るわけです。
ネットワーク接続があるものとして考えるならntpでいいのですが、赤道儀制御という組み込み系に近いものはスタンドアロン動作が基本なわけで、起動都度、時刻合わせも面倒くさいと思うわけです。
で、GPSから時刻を頂いて、自動で合わせちゃいましょう。

■GPSレシーバーの準備


USB接続のもので、メジャーなチップを使用しているもの(U-blox, MediaTekなど)であれば使用できると思います。

RaspberryPi4に刺して、

$ cat /dev/gps0

で、NMEAメッセージが出力されればレシーバーは認識しています。
もし、デバイスファイル gps? が無ければ、他の名前で生成されている可能性があるので、探してください。
ちなみに、gps0 は実体デバイスファイルへのシンボリックリンクです。
実体は例えば、/dev/ttyACM0 のような名前で生成されます。

$ dmesg

とかで見るとイイかも。
しかしながら、tty???nでは他のデバイスを接続したときに番号がずれる可能性があるので、できる限り、gps? の方を使用します。


■GPSDのインストール


GPSDはGPSからの情報をシステムで扱うための標準的なサービスです。
INDIでもGPSDから位置情報を取得できるので、位置情報も自動で設定できます。
GPSDをインストールします。

$ sudo apt install gpsd gpsd-clients

ブート時に自動的にgpsdサービスが開始されます。
設定ファイルを修正しておきます。

$ sudo vi /etc/default/gpsd

/etc/default/gpsd
-------------------------------------------------------------------------
DEVICES="/dev/gps0"
GPSD_OPTIONS="-n"
-------------------------------------------------------------------------

再起動します。

$ sudo systemctl restart gpsd.service

GPSDが動き出したので、衛星が良く見える場所に置いて側位させます。
測位状態の様子は cgpsコマンドで確認できます。


■GPSDから時刻合わせを行う


GPSDは位置情報と同時に時刻も取得します。ただ、そのままではシステムでは利用できません。
Linuxシステムにおいて時刻情報はハードウェアクロックをそのシステムの唯一の時刻として扱いますので、何らかの方法でGPSの時刻をシステムへ反映できればOKです。
普通、時刻合わせはntpdが自動的にタイムサーバーで合わせますが、この参照先をGPSDにすればいいわけです。

で、デフォルトでインストールされている ntpd はブート時にGPSDからもらった時刻で強制的にハードウェアクロックを初期化できないので、、、アッサリ捨てます(^^)/
代わりに、chrony を使用するのでインストールします。
chrony は ntpd の代わりを完璧にこなすので心配無用です。

$ sudo apt-get install chrony

インストールすると競合する ntpd は自動的にアンインストールされます。
設定ファイルを修正します。

/etc/chrony/chrony.conf
---------------------------------------------------------------------------
 :
#pool 2.debian.pool.ntp.org offline iburst  ※pool行はとりあえずコメントアウト
 :
server ntp.nict.jp iburst

makestep 10 -1
refclock SHM 0 poll 3 refid GPS1
---------------------------------------------------------------------------

server ntp.nict.jp でネット接続があるなら、nictサーバーを見に行きます。
makestep で 10秒以上のエラーなら強制時刻合わせを試行します。
つまり、ブート時は、GPSが時刻を取得したら即、強制的に時間が合わされます。
refclock はメモリ共有機能を使って、GPSDから時間を参照します。
以上でネット環境が無くても、GPSDから時間を取得できるはずです。

お好みで、allow, deny ディレクティブを使って接続クライアントを制御するのもいいでしょう。

サービス再起動。

$ sudo systemctl restart chrony

当然ながら、gpsdが動いていないと時刻合わせはできません。
時刻同期状態の確認は、

$ chronyc sources

で、表示されます。
ブート時はGPSが側位してしばらくすると時間が合います。


以上、GPSレシーバーを使って時間合わせ&位置情報取得する方法でした。

この方法でずっと運用してきましたが、困ったことはありません。
起動するたびにネットワークにつないだり、手動で時間を合わせたりする必要がなく、完全スタンドアロンで、時間と正確な位置が取得できるのはとても便利です(^^)/


オリジナル 基板頒布

オープンソースの架台制御ソフト、OnStepのハードウェア実装基板などの話題です。


頒布状況 2024/10/3
○ OnStep基板 Rev2.1
× OnStep基板 Rev3.0
○ GBC-SHC 基板 Rev1.0
頒布ご希望の方はこちら、基板頒布のお知らせ をご覧ください。

このブログを検索

Blog Archive

QooQ