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レシーバーを使って時間合わせ&位置情報取得する方法でした。
この方法でずっと運用してきましたが、困ったことはありません。
起動するたびにネットワークにつないだり、手動で時間を合わせたりする必要がなく、完全スタンドアロンで、時間と正確な位置が取得できるのはとても便利です(^^)/
初めまして。星のオッサンと申します。突然のコメントで申し訳ございません。
返信削除実は、自宅のパソコンにubunuを入れて、Kstarsを入れているのですが、GPSとの同期が上手く行かないようです。KstarsのプロファイルでGPSDを設定すると、起動させた時にGPS fix obtaind.というメッセージが現れて、次に[WARNING]Failed to update system time: unknown error -1というエラーが出てきます。
cgpsでは測位は出来ているようです。
ご面倒なお願いなのですが、chrony.confの全文を参考にしたいので公開していただくことは可能でしょうか?
検索しても素人ゆえ中々情報がわからず、不躾なお願いをしてしまいました。
失礼だとは思いましたが、何とか解決してみたいと思い、コメントさせていただきました。
よろしくお願い申し上げます。