1

I have a Raspberry Pi 3 B+ with Adafruit Ultimate GPS HAT (https://www.adafruit.com/product/2324) with external antenna. I configured the device to act as NTP server but the NTP server won't work (No client can sync to it and I get an error) unless I have additional internet time server such as

pool 0.debian.pool.ntp.org iburst

my ntp.conf setting for the GPS and PPS is as follow:

server 127.127.20.0 iburst true prefer 
fudge 127.127.20.0 flag1 1 refid GPSD
server 127.127.22.0 iburst true prefer 
fudge 127.127.22.0 flag1 1 refid KPPS

/etc/default/gpsd file is as follow:

# Default settings for the gpsd init script and the hotplug wrapper.

# Start the gpsd daemon automatically at boot time
START_DAEMON="true"

# Use USB hotplugging to add new USB devices automatically to the daemon
USBAUTO="true"

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

# Other options you want to pass to gpsd
# -n    don't wait for client to connect; poll GPS immediately
GPSD_OPTIONS="-n"

/boot/config.txt I added the following lines:

force_turbo=1
dtoverlay=pps-gpio,gpiopin=4
init_uart_baud=9600
arm_freq=800

/boot/cmdline.txt was modified to look like this:

dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p7 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait splash plymouth.ignore-serial-consoles

/etc/modules was modified to like like this:

# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.

i2c-dev
pps-gpio

/etc/rc.local has been modified to look like this:

  GNU nano 2.7.4                                                             File: /etc/rc.local

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

ln -s /dev/serial0 /dev/gps0
service gpsd stop
service ntp restart

exit 0

when I query ntpq -pn, the result is:

pi@raspberrypi:~ $ ntpq -pn
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 127.127.20.0    .GPSD.           0 l    -   64    0    0.000    0.000   0.000
x127.127.22.0    .KPPS.           0 l  156   64   54    0.000  -30.909   6.705
 0.debian.pool.n .POOL.          16 p    -   64    0    0.000    0.000   0.001
+212.26.18.43    209.51.161.238   2 u   24   64  377   63.087   -3.832  11.598
+212.26.18.41    209.51.161.238   2 u   55   64  377   62.326   -2.398  38.556
*212.138.170.134 .PPS.            1 u   56   64  377   93.082    0.377  39.534

When I test PPS, I get the following data:

pi@raspberrypi:~ $ sudo ppstest /dev/pps0
trying PPS source "/dev/pps0"
found PPS source "/dev/pps0"
ok, found 1 source(s), now start fetching data...
source 0 - assert 1556386700.020399338, sequence: 182 - clear  0.000000000, sequence: 0
source 0 - assert 1556386701.020371974, sequence: 183 - clear  0.000000000, sequence: 0
source 0 - assert 1556386702.020344473, sequence: 184 - clear  0.000000000, sequence: 0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.