新しいものづくりがわかるメディア

RSS


「土日で完成! 趣味のラズパイ」

土日で完成! 趣味のラズパイ GPSを導入して正確な時刻を刻む

今回はGPSを導入して、その時刻情報をNTPサーバーに反映するまでの設定を行います。導入するGPSは、秋月電子通商で販売している「GNSS(GPS・GLONASS・QZSS)受信機キット 1PPS出力 みちびき2機対応 アンテナ外付タイプ」です。これには別途外部アンテナ「GPS/GLONASS アクティブアンテナ LNA内蔵 DC2.2V~5V対応」と、アンテナ端子変換ケーブル「SMA-J⇔IPEX(IPX/U.FL)変換ケーブル(120mm)テフロン同軸ケーブル」が必要になります。

ラズパイとGPSユニットの接続

GPSユニットとラズパイですが、以下のように接続します。

GPS   ラズパイ
VDD5V - 2番ピン(5V)
GND - 6番ピン(GND)
TXD - 10番ピン(GPIO15)
RXD - 8番ピン(GPIO14)
1PPS - 12番ピン(GPIO18)

ラズパイ側ですが、GPIO14がシリアル接続のTXD、GPIO15がシリアル接続のRXDに対応しています。シリアル接続では、TXDとRXDをそれぞれ接続しますので、接続側と被接続側では対応する端子が逆になります。

GPSとアンテナ、変換ケーブルをセットしたところ。 GPSとアンテナ、変換ケーブルをセットしたところ。

GPSはシリアル接続で利用しますので、ラズパイでシリアル接続が利用できるように設定する必要があります。コンソールから設定する場合は以下のようにします。まずはraspi-configを起動します。

$ sudo raspi-config

「3 Interface Options」から「I6 Serial Port」を選んだら、最初の画面では「いいえ」、次の画面では「はい」を選んで設定は終了です。

「3 Interface Options」を選ぶ。 「3 Interface Options」を選ぶ。
「I6 Serial Port」を選ぶ。 「I6 Serial Port」を選ぶ。
この画面で「いいえ」を選ぶ。 この画面で「いいえ」を選ぶ。
この画面で「はい」を選ぶ。 この画面で「はい」を選ぶ。
これで設定は終了。 これで設定は終了。

続いて「/boot/config.txt」に以下の内容を追記します。

$ sudo nano /boot/config.txt

として内容を表示させたら、最後の行に以下の内容を追記しましょう。

dtoverlay=pps-gpio,gpiopin=18,assert_falling_edge=true

追記が終わったらCtrl-X、Enterで保存します。

続いて「/etc/modules」に以下の内容を追記します。こちらも同様に

$ sudo nano /etc/modules

として内容を表示させたら、最後の行に以下の内容を追記します。

pps-gpio

gpsdのインストール

ここまでの作業が終わったら、GPSを動作させるためのgpsdをインストールします。

$ sudo apt install gpsd gpsd-clients pps-tools

gpsdのインストールが終わったら、gpsdの設定をします。

$ sudo nano /etc/default/gpsd

としてgpsdの設定内容を表示させたら、以下のように修正してください。現在表示されている「DEVICES="」と「GPSD_OPTIONS="」の先頭にコメントアウトを入れて、以下の内容を追記すればOKです。

START_DAEMON="true"
DEVICES="/dev/ttyS0 /dev/pps0"
GPSD_OPTIONS="-n"

追記すると以下のようになります。

# Devices gpsd should collect to at boot time.
# They need to be read/writeable, either by user gpsd or the group dialout.
#DEVICES=""

# Other options you want to pass to gpsd
#GPSD_OPTIONS=""

# Automatically hot add/remove USB GPS devices via gpsdctl
USBAUTO="true"
START_DAEMON="true"
DEVICES="/dev/ttyS0 /dev/pps0"
GPSD_OPTIONS="-n"

設定ファイルの記述が終わったら、gpsdを有効化します。有効化が終わったら再起動しましょう。

$ sudo systemctl enable gpsd

gpsdの起動テスト

ここまで設定が終了したら、ラズパイ側とGPSユニットが通信をしているか調べてみましょう。以下のコマンドを入力します。

$ sudo ppstest /dev/pps0

以下のような反応が返ってくれば、GPSユニットからの信号をラズパイが受けていることになります。

trying PPS source "/dev/pps0"
found PPS source "/dev/pps0"
ok, found 1 source(s), now start fetching data...
source 0 - assert 1689579770.000521899, sequence: 641 - clear  0.000000000, sequence: 0
source 0 - assert 1689579771.000523025, sequence: 642 - clear  0.000000000, sequence: 0
source 0 - assert 1689579772.000523928, sequence: 643 - clear  0.000000000, sequence: 0
source 0 - assert 1689579773.000526202, sequence: 644 - clear  0.000000000, sequence: 0
source 0 - assert 1689579774.000527197, sequence: 645 - clear  0.000000000, sequence: 0
source 0 - assert 1689579775.000528434, sequence: 646 - clear  0.000000000, sequence: 0
source 0 - assert 1689579776.000528708, sequence: 647 - clear  0.000000000, sequence: 0
source 0 - assert 1689579777.000529222, sequence: 648 - clear  0.000000000, sequence: 0
……

gpsdの状況を以下のコマンドで調べてみます。

$ sudo systemctl status gpsd.socket

● gpsd.socket - GPS (Global Positioning System) Daemon Sockets
     Loaded: loaded (/lib/systemd/system/gpsd.socket; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2023-07-17 16:31:58 JST; 14min ago
   Triggers: ● gpsd.service
     Listen: /run/gpsd.sock (Stream)
             [::1]:2947 (Stream)
             127.0.0.1:2947 (Stream)
      Tasks: 0 (limit: 3933)
        CPU: 5ms
     CGroup: /system.slice/gpsd.socket

 7月 17 16:31:58 raspberrypi systemd[1]: Listening on GPS (Global Positioning System) Daemon Socket>

緑の文字で「active」と表示されればOKです。

GPSツールの起動

では、実際にどのように電波を受信しているのか調べてみましょう。以下のコマンドを入力します。

$ cgps -s

すると以下のような表示が現れるはずです。

cgpsの結果。 cgpsの結果。

「Time」に現在の時刻、「Latitude」に緯度、「Longtitude」に経度が表示され、右側の欄に「GP 5」などのように受信できているGPS衛星の番号が表示されます。「Alt」には現在のおおよその高度が表示されます。

なお、GPSユニットを接続してすぐには衛星の電波を受信しません。通常だと20分くらい、長い場合は1時間程度かかることもあるようです。受信している場合はGPSユニットの赤いLEDが1秒間隔で点滅しますので、それを目安にしてください。点滅しているのに表示されない場合は、gpsdがうまく働いていないことが考えられます。手順を戻って検証してみてください。

GPSの信号をChronyに連携させる

最後にGPSユニットの信号をChronyに連携させ、GPSによる時計合わせの設定をしていきます。まずは「chrony.conf」の設定を変更します。

$ sudo nano /etc/chrony/chrony.conf

でchrony.confの内容を表示させ、以下の項目の先頭に「#」を入れてコメントアウトします。

#server ntp.nict.jp iburst
#sourcedir /run/chrony-dhcp

続いて以下の内容を追記します。

refclock PPS /dev/pps0 lock NMEA refid GPS
leapsecmode slew
maxslewrate 1000
smoothtime 400 0.001 leaponly

この内容ですが、以下のような設定となっています。

  • refclock PPS /dev/pps0 lock NMEA refid GPS:GPSユニットからの信号の受け方
  • leapsecmode slew:うるう秒を徐々に調整するslewモードで調整する
  • maxslewrate 1000:1秒のズレを17時間34分かけて同期する
  • smoothtime 400 0.001 leaponly:うるう秒のときでもスムーズに時刻同期する
 

設定が終了したら以下のコマンドでChronyを再起動します。

& sudo systemctl restart chrony

最後にChronyの状態を以下のコマンドでチェックします。

& chronyc sources -v

すると以下のように表示されます。

  .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
 / .- Source state '*' = current best, '+' = combined, '-' = not combined,
| /             'x' = may be in error, '~' = too variable, '?' = unusable.
||                                                 .- xxxx [ yyyy ] +/- zzzz
||      Reachability register (octal) -.           |  xxxx = adjusted offset,
||      Log2(Polling interval) --.      |          |  yyyy = measured offset,
||                                ¥     |          |  zzzz = estimated error.
||                                 |    |           ¥
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
#? GPS                           0   4     0     -     +0ns[   +0ns] +/-    0ns

GPSのみが表示されますが、当初は「?」となっていて、認識していません。しかししばらく時間がたつと、以下のように「?」が「*」となって認識されるようになります。これで設定は終了です。

  .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
 / .- Source state '*' = current best, '+' = combined, '-' = not combined,
| /             'x' = may be in error, '~' = too variable, '?' = unusable.
||                                                 .- xxxx [ yyyy ] +/- zzzz
||      Reachability register (octal) -.           |  xxxx = adjusted offset,
||      Log2(Polling interval) --.      |          |  yyyy = measured offset,
||                                ¥     |          |  zzzz = estimated error.
||                                 |    |           ¥
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
#* GPS                           0   4   377    11    -89ns[ -103ns] +/-  408ns

今回はGPSユニットからの信号をNTPサーバーに連動させるための設定を解説しました。インターネットに接続できない環境でNTPサーバーを利用したい場合には便利ですので活用してみてください。

ニュース

編集部のおすすめ

連載・シリーズ

注目のキーワード

もっと見る