はじめに
以前ここの記事で書いたraspberry piのStratum1 NTPサーバ(chrony)が大分古くになったため、2026年3月時点での最新OSで再構築しました。
使用機材
- Raspberry pi3
- ブレッドボード
- ジャンパーワイヤー(オス-メス型)
- GNSS受信キットAE-GNSS-EXTANT+ANT_SET
利用環境
Raspberry Pi ImagerでイメージをSDカードに焼いたものを利用してます。
今回の環境では、事前にapt updateとapt upgradeは実行しています。
root@chrony-server:~# uname -a
Linux chrony-server 6.12.62+rpt-rpi-v8 #1 SMP PREEMPT Debian 1:6.12.62-1+rpt1 (2025-12-18) aarch64 GNU/Linux
配線
GYSFFMANC と Raspberry Pi 3 の GPIO ピンを以下のように接続。
- VCC: 3.3V (Pin 1)
- GND: GND (Pin 6 など)
- TXD (GYSFFMANC): RXD (Pin 10 / GPIO 15)
- RXD (GYSFFMANC): TXD (Pin 8 / GPIO 14)。今回は
14へ接続
環境構築
シリアルコンソールを無効化
-
sudo raspi-configを入力し実行 -
3 Interface Options>I6 Serial Portを選択 - "Would you like a login shell to be accessible over serial?" → No (いいえ)
- "Would you like the serial port hardware to be enabled?" → Yes (はい)
- 設定後、Raspberry Pi を再起動
パッケージのインストールと設定
-
管理者権限のアカウント(例えば
root)に切り替え
sudo su - -
必要パッケージをインストール
apt-get install chrony gpsd gpsd-clients -
vi /boot/firmware/config.txtで下記の通りに修正- 最後の行に
dtoverlay=pps-gpio,gpiopin=18を追記
/boot/firmware/config.txt(省略) [all] enable_uart=1 dtoverlay=pps-gpio,gpiopin=18 - 最後の行に
-
vi /etc/default/gpsdで下記の通りに修正-
DEVICESにGPSモジュールを指定し、シリアル接続および1PPS信号の読み取りを行う -
GPSD_OPTIONSは-nを指定することで、NTPクライアントが一人もアクティブでない状態でも更新するように動作させられる(ここの「Running GPSD」の項目で確認可能)
/etc/default/gpsd# Devices gpsd should collect to at boot time. # They need to be read/writeable, either by user gpsd or the group dialout. DEVICES="/dev/ttyS0 /dev/pps0" # Other options you want to pass to gpsd GPSD_OPTIONS="-n" # Automatically hot add/remove USB GPS devices via gpsdctl USBAUTO="false" START_DAEMON="true" -
-
vi /etc/chrony/chrony.confで下記の通りに修正
chronyがGPSモジュールで受信した信号をもとに時刻提供するように設定する。設定ファイルの上の方に同期先設定がまとまって記載されているので、そのあたりに記載するといいでしょう。
今回は他の時刻同期先をすべてコメントアウトで切ってます。/etc/chrony/chrony.conf# Use NTP sources found in /etc/chrony/sources.d. # sourcedir /etc/chrony/sources.d # setting for GPS refclock SHM 0 offset 0.125 delay 0.2 refid NMEA refclock PPS /dev/pps0 lock NMEA refid PPS -
rebootで再起動
動作確認
各サービスの起動
gpsdとchronyのサービスが、それぞれactive (running) であれば正常。
root@chrony-server:~# systemctl status gpsd
● gpsd.service - GPS (Global Positioning System) Daemon
Loaded: loaded (/usr/lib/systemd/system/gpsd.service; disabled; preset: enabled)
Active: active (running) since Mon 2026-03-09 18:27:33 JST; 1h 59min ago
root@chrony-server:~# systemctl status chrony
● chrony.service - chrony, an NTP client/server
Loaded: loaded (/usr/lib/systemd/system/chrony.service; enabled; preset: enabled)
Active: active (running) since Mon 2026-03-09 18:29:51 JST; 1h 57min ago
GPS信号の受信
gpsmonで確認可能。
画面中央付近の「Latitude」や「Longitude」といった緯度経度の値が表示されていること、画面下側に(99) $GNRXX,9999.999,A,9999.9999,N,9999.9999,E...のような表示が沢山流れてれば正常となる。
異常があれば、cat /dev/serial0で文字が大量に流れてくるか確認すること。
もし流れていない場合は、「GPS信号を受信できていない」か「GPS信号の情報がうまくRaspberry piに伝えられていない」場合が多く、後者の場合は、stty -F /dev/serial0 9600などのコマンドでGPSモジュールのボーレートと合わせること。
PPSの認識
lsmod | grep ppsを実行し、pps_gpioが出力されることを確認する。
root@chrony-server:~# lsmod | grep pps
pps_ldisc 12288 1
pps_gpio 12288 0
同期状況の確認
PPS の行に * (同期中) または # (良好な同期元) が付けばよい。
同期しない場合はapt install pps-toolsでPPSツールをインストールし、ppstest /dev/pps0で1秒おきにsource 0 - assert 172xxxxxxx.xxxxxxxxxのようなログが流れるか確認してください。流れなければGPS信号を受信できてないか、PPSの配線が誤ってる可能性があります。
root@chrony-server:~# chronyc sources
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
#- NMEA 0 4 377 9 +107ms[ +107ms] +/- 103ms
#* PPS 0 4 377 9 -63ns[ -25ns] +/- 177ns
あとがき
Raspberry Piを再起動し、GPSモジュールが信号を受信して5~10分くらいしてから、chronyで正常に時刻同期できるようになります。
今回はGeminiに質問しながら構築してみましたが、余分な手順があまりなく良い感じに構築できました。
ここ2、3年でだいぶ便利になりましたね。
Gemini投げた質問
- 受信モジュールGYSFFMANCをraspberry pi3 model Bにて、「6.12.47+rpt-rpi-v8 #1 SMP PREEMPT Debian 1:6.12.47-1+rpt1 (2025-09-16) aarch64 GNU/Linux」のOS上でGPSモジュールとして認識させたい
- 1PPS 信号 を使った高精度な計測を行い、かつChronyにもこの GPS 情報を使用したい