「土日で完成! 趣味のラズパイ」
土日で完成! 趣味のラズパイ GPSを導入して正確な時刻を刻む
今回はGPSを導入して、その時刻情報をNTPサーバーに反映するまでの設定を行います。導入するGPSは、秋月電子通商で販売している「GNSS(GPS・GLONASS・QZSS)受信機キット 1PPS出力 みちびき2機対応 アンテナ外付タイプ」です。これには別途外部アンテナ「GPS/GLONASS アクティブアンテナ LNA内蔵 DC2.2V~5V対応」と、アンテナ端子変換ケーブル「SMA-J⇔IPEX(IPX/U.FL)変換ケーブル(120mm)テフロン同軸ケーブル」が必要になります。
土日で完成! 趣味のラズパイ
第16回 ラズパイとChatGPTで遊ぼう——圧電ブザーで音を鳴らす
第15回 ラズパイとChatGPTで遊ぼう——気温/湿度/気圧を測定する
第14回 ChatGPTで遊ぼう——ラズパイで作ったデジタル時計に天気情報も表示させる
第13回 ラズパイとChatGPTで遊ぼう——液晶時計を作る
第12回 ラズパイとChatGPTで遊ぶ——その1:Lチカさせてみる
第11回 ラズパイをブリッジモードで使って、Wi-Fi接続する
第10回 ラズパイをWi-Fiルーターにする
特別編 【実機レビュー】よりパワフルになったRaspberry Pi 5を検証!
第9回 VolumioでラズパイからSpotifyやradikoを楽しむ
第8回 ラズパイで音楽プレーヤー「Volumio」を楽しむ
第7回 GPSを導入して正確な時刻を刻む
第6回 ラズパイをNTPサーバーにする
第5回 ラズパイを使ってデジタル時計を作る
第4回 Raspberry Pi Camera Module 3を使って見守りカメラを作る
第3回 BME680の測定データを小型ディスプレイに表示させる
第2回 空気質センサー「BME680」で空気汚染度を測る
第1回 ラズパイ工作の基本! 気温と湿度、気圧を計測する
一覧ページへ
ラズパイと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はシリアル接続で利用しますので、ラズパイでシリアル接続が利用できるように設定する必要があります。コンソールから設定する場合は以下のようにします。まずはraspi-configを起動します。
$ sudo raspi-config
「3 Interface Options」から「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
すると以下のような表示が現れるはずです。
「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サーバーを利用したい場合には便利ですので活用してみてください。