Please use the updated version instead.
Hardware:
- Raspberry Pi 3: Adafruit or Uputronics
- Power Supply: Adafruit
- SD Card (8+ GiB, Class 10 highly recommended): 32 GiB from Amazon or 8 GiB from Adafruit
- Mini Heatsink (optional): Adafruit
- GPS Antenna: Adafruit or Uputronics
- Uputronics GPS Expansion Board: AirSpy.us, Uputronics, or ModMyPi
- ModMyPi Pi GPS Case: Uputronics (Black) or ModMyPi (Black) or ModMyPi (Clear)
I’m in the U.S., so I ordered only the GPS board and case from Uputronics to save on shipping.
Other GPS HATs (and cases) can be used. Consult the Stratum-1-Microserver HOWTO for GPIO pin changes in step 12.
1. From Ubuntu Pi Flavour Maker, download the Ubuntu Server Minimal 16.04 image. Note that this is only available using BitTorrent (for bandwidth reasons).
2. Write the image to a Micro SD card.
3. Insert the SD card into the Raspberry Pi. Stick the heatsink to the processor. Assemble the case with the Raspberry Pi in it as you go. Connect the GPS antenna and place it near a window. Connect a keyboard, mouse, and monitor. Power up the Raspberry Pi.
4. Login with “ubuntu” as the username and “ubuntu” as the password. Set your own password:
passwd
5. Become root:
sudo -s
6. Generate the missing locale:
locale-gen en_US.UTF-8
7. Disable a broken service:
systemctl disable ureadahead
8. Resize the partition to fill your Micro SD card:
fdisk /dev/mmcblk0
“Delete the second partition (d, 2), then recreate it using the defaults (n, p, 2, enter, enter), then write and exit (w).” — Ubuntu Pi Flavour Maker FAQ
9. Set your time zone:
dpkg-reconfigure tzdata
10. Set your hostname:
vi /etc/hosts
vi /etc/hostname
11. Actually, I think we want to leave this alone. I can’t reproduce any problem, and keeping fake-hwclock, as designed, makes the clock far less wrong on initial boot (before ntpd steps the clock). Disable fake-hwclock, which otherwise breaks PPS in NTP at boot:
systemctl disable fake-hwclock
12. Disable Bluetooth, as we need the UART for GPS:
echo dtoverlay=pi3-disable-bt >> /boot/config.txt
echo enable_uart=1 >> /boot/config.txt
echo dtoverlay=pps-gpio,gpiopin=18 >> /boot/config.txt
systemctl disable hciuart
apt -y purge bluez bluez-firmware
13. Set maximum performance for consistent timing:
sed -i "s|$| nohz=off|" /boot/cmdline.txt
systemctl disable ondemand
echo 'GOVERNOR="performance"' > /etc/default/cpufrequtils
14. Install software:
apt update
apt -y dist-upgrade
apt -y install cpufrequtils gpsd gpsd-clients ntp pps-tools
15. Configure gpsd:
sed -i 's|DEVICES="|\0/dev/ttyAMA0 /dev/pps0|' \
/etc/default/gpsd
sed -i 's|GPSD_OPTIONS="|\0-n|' /etc/default/gpsd
mkdir -p /etc/systemd/system/ntp.service.d
cat >/etc/systemd/system/ntp.service.d/gpsd.conf <<EOF
[Unit]
After=gpsd.service
Wants=gpsd.service
EOF
mkdir -p /etc/systemd/system/gpsd.service.d
cat >/etc/systemd/system/gpsd.service.d/stationary.conf <<EOF
[Service]
ExecStartPre=/usr/bin/gpsctl -t 'u-blox' -b -x '\\\\x06\\\\x24\\\\xFF\\\\xFF\\\\x02\\\\x03\\\\x00\\\\x00\\\\x00\\\\x00\\\\x10\\\\x27\\\\x00\\\\x00\\\\x05\\\\x00\\\\xFA\\\\x00\\\\xFA\\\\x00\\\\x64\\\\x00\\\\x2C\\\\x01\\\\x00\\\\x3C\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00' \$DEVICES
EOF
16. Configure ntp
cat >/etc/ntp.conf <<EOF
# /etc/ntp.conf, configuration for ntpd; see ntp.conf(5) for help
driftfile /var/lib/ntp/ntp.drift
leapfile /usr/share/zoneinfo/leap-seconds.list
statsdir /var/log/ntpstats/
statistics loopstats peerstats clockstats
filegen loopstats file loopstats type day enable
filegen peerstats file peerstats type day enable
filegen clockstats file clockstats type day enable
# Specify one or more NTP servers.
# Stratum 0 (GPS)
server 127.127.28.2 minpoll 1 maxpoll 1 prefer
fudge 127.127.28.2 refid PPS
# Use servers from the NTP Pool Project. Approved by Ubuntu Technical Board
# on 2011-02-08 (LP: #104525). See http://www.pool.ntp.org/join.html for
# more information.
pool 0.ubuntu.pool.ntp.org iburst preempt
pool 1.ubuntu.pool.ntp.org iburst preempt
pool 2.ubuntu.pool.ntp.org iburst preempt
pool 3.ubuntu.pool.ntp.org iburst preempt
# Use Ubuntu's ntp server as a fallback.
pool ntp.ubuntu.com preempt
server 127.127.28.0 noselect
fudge 127.127.28.0 time1 0 refid GPS
# Access control configuration; see /usr/share/doc/ntp-doc/html/accopt.html
# for details. This page might also be helpful:
# http://support.ntp.org/bin/view/Support/AccessRestrictions
#
# Note that "restrict" applies to both servers and clients, so a configuration
# that might be intended to block requests from certain clients could also end
# up blocking replies from your own upstream servers.
# By default, exchange time with everybody, but don't allow configuration.
restrict -4 default kod notrap nomodify nopeer noquery limited
restrict -6 default kod notrap nomodify nopeer noquery limited
# Local users may interrogate the ntp server more closely.
restrict 127.0.0.1
restrict ::1
# Needed for adding pool entries
restrict source notrap nomodify noquery
EOF
17. Reboot:
reboot
18. Resize the filesystem:
sudo resize2fs /dev/mmcblk0p2
19. Check that things look right:
ntpq -p
20. Wait ~24 hours for everything to stabilize. You want to allow for the drift to be calculated. Once the PPS offset is tiny (e.g. 0.010 or so), you know things are good.
21. At this point, wait for midnight to roll around so the stats are rotated. Then wait at least another 4 hours.
22. Calculate the correct offset for the GPS serial data:
awk '/(SHM\(0\)|127\.127\.28\.0/ { sum -= $5 ; cnt++; } END { print sum / cnt; }' /var/log/ntpstats/peerstats
23. Add that value from the GPS’s time1
in /etc/ntp.conf
. If this is the first time you’re doing it, the existing value is zero, so just use it directly.
24. Restart ntp:
sudo systemctl ntp restart
25. The offset on the GPS line should now be less than 3 or so. You can repeat steps 21 through 24 if want to try to get closer.
26. Remove noselect
from the GPS line in /etc/ntp.conf
:
sudo vi /etc/ntp.conf
27. Restart ntp:
sudo systemctl ntp restart
Sources: