1 #+TITLE: Ninfacyzga-1 Time Tracking
 
   2 #+AUTHOR: Steven Baltakatei Sandoval
 
   3 #+EMAIL: baltakatei@gmail.com
 
   6 This document was created by Steven Baltakatei Sandoval on
 
   7 ~2020-07-23T22:27Z~ under a [[https://creativecommons.org/licenses/by-sa/4.0/][Creative Commons BY-SA 4.0 license]]. It was
 
   8 updated by Steven Baltakatei Sandoval on ~2020-10-18T00:11Z~
 
  11 The ~ninfacyzga-01~ device is equipped with an Ozzmaker BerryGPS-IMU
 
  12 module which provides time and location data to ~gpsd~ and ~chrony~. The
 
  13 time is provided by GPS satellites which themselves are
 
  14 equipped [fn:nasa_20020408_atomicclock] with atomic clocks. This
 
  15 extremely accurate set of clocks are needed since a GPS receiver
 
  16 calculates its position in space using a General Relativity
 
  17 calculation that uses the small variations in the time stamps received
 
  18 from each satellite. This means that ~gpsd~ may be used to set the
 
  19 system clock without a need for an internet connection to a default
 
  20 Debian time server; ~ninfacyzga-01~ can be its own time server.
 
  22 [fn:nasa_20020408_atomicclock] Title:[[https://science.nasa.gov/science-news/science-at-nasa/2002/08apr_atomicclock/][Tick-Tock Atomic Clock]];
 
  23 Date:2002-04-08; Website:NASA.gov; [[https://web.archive.org/web/20100429141752/http://science.nasa.gov/science-news/science-at-nasa/2002/08apr_atomicclock/][Archive-link]]; Archive-date:
 
  28 Ozzmaker BerryGPS-IMU, Version 3 (see [[https://ozzmaker.com/berrygps-berrygps-imu-quick-start-guide/][ref]]).
 
  30 - [[https://www.raspberrypi.org/downloads/raspberry-pi-os/][Raspberry Pi OS]] : A GNU/Linux operating system derived from
 
  31   Debian 10. This procedure was developed with version ~August 2020~.
 
  33 - [[https://tracker.debian.org/pkg/gpsd][~gpsd~]] : A background daemon app capable of interfacing with the
 
  34   [[https://ozzmaker.com/berrygps-berrygps-imu-quick-start-guide/][Ozzmaker BerryGPS-IMU]]'s GPS submodule. Installed and initialized by
 
  35   ~apt~. Should be installed along with the ~gpsd-clients~
 
  36   package. This procedure was developed with ~gpsd~ version
 
  38 - [[https://chrony.tuxfamily.org/][~chrony~]] : A set of programs capable of continuously adjusting the
 
  39   system clock until it is synchronized with configurable time sources
 
  40   such as GPS and PPS data provided by ~gpsd~. ~chrony~ may be
 
  41   configured to act as an NTP time client or server. It uses the same
 
  42   protocol as ~ntp~ but is a GPLv2 implementation. This procedure was
 
  43   developed with ~chrony~ version ~3.4-4~.
 
  45 ** Operating Procedures
 
  47 **** Perform initial setup.
 
  48 See [[file:../setup/README.org][Main Setup]] procedure.
 
  49 **** Install Hardware for time tracking
 
  50 See [[https://ozzmaker.com/forums/topic/connecting-gps-pps-pin/][this]] Ozzmaker forum topic about connecting the BerryGPS-IMU
 
  51 ~T_PULSE~ pin to GPIO 18.
 
  53 #+CAPTION: An image showing how to connect the PPS signal from an Ozzmaker BerryGPS-IMU board to a Raspberry Pi Zero W.
 
  54 #+NAME: fig:PPS_BERRYGPS_RASPIZW
 
  55 [[../../img/Compact_Stratum_1_NTP_time_server_hardware,_October_2020.jpg]]
 
  57 Connect the ~T_PULSE~ connection on the BerryGPS-IMU-3 to GPIO pin 18
 
  58 (ex: with solder and wire) in order to provide the PPS data signal
 
  59 generated by the BerryGPS-IMU to the Raspberry Pi. Processing of this
 
  60 data signal is handled by adding a line to ~/boot/config.txt~ in the
 
  61 next section ("Install Software").
 
  63 Note: If it is desired to specify a custom GPIO pin besides the one
 
  64 recommended, see this [[https://raspberryautomation.com/connect-multiple-ds18b20-temperature-sensors-to-a-raspberry-pi/][Raspberry Autom]] article.
 
  66 **** Install Software for time tracking
 
  67 The time tracking function can be performed by two programs: ~gpsd~
 
  70 Basically, two things need to happen:
 
  72 1. ~gpsd~ needs to be pointed towards the correct device files for
 
  73    incoming GPS data (in NMEA format) and the PPS signal ("pulse per
 
  74    second"; a high precision time signal).
 
  76 2. ~chrony~ needs to be pointed towards the correct local IP addresses
 
  77    where ~gpsd~ provides GPS data and the PPS signal.
 
  79 ~gpsd~ then will provide GPS and PPS data to ~chrony~ via a "shared
 
  82 ***** Install packages via ~apt~
 
  83 Run the following command to install the required packages.
 
  84 : $ sudo apt install gpsd gpsd-clients python-gps pps-tools chrony
 
  86 ***** Enable PPS device
 
  87 Modify the ~/boot/config.txt~ file in order to tell the Raspberry Pi
 
  88 to expect PPS data on ~BCM 18~ (pin number 12; see [[https://pinout.xyz/][link]]). This is done
 
  89 by adding the following line to ~/boot/config.txt~ as described on
 
  90 [[https://ozzmaker.com/forums/topic/problems-with-pps-on-a-pi0w-running-raspian-and-attached-to-a-berrygps-imuv3/][this Ozzmaker page]]:
 
  92 : # Enable PPS on GPIO 18
 
  93 : dtoverlay=pps-gpio,gpiopin=18
 
  95 The ~/boot/config.txt~ file can be modified via:
 
  97 : $ sudo nano /boot/config.txt
 
  99 PPS data can be confirmed by running:
 
 104 trying PPS source "/dev/pps0"
 
 105 found PPS source "/dev/pps0"
 
 106 ok, found 1 source(s), now start fetching data...
 
 107 source 0 - assert 1595708074.003644641, sequence: 219 - clear  0.000000000, sequence: 0
 
 108 source 0 - assert 1595708075.003709620, sequence: 220 - clear  0.000000000, sequence: 0
 
 109 source 0 - assert 1595708076.003779580, sequence: 221 - clear  0.000000000, sequence: 0
 
 110 source 0 - assert 1595708077.003850580, sequence: 222 - clear  0.000000000, sequence: 0
 
 113 Note: For older Raspberry Pi models, it may be necessary to enable
 
 114 ~pps-gpio~ via modifications to ~/etc/modules~ (see [[https://www.raspberrypi.org/forums/viewtopic.php?p=757747#p757747][link]]).
 
 116 ***** Enable GPS device
 
 117 The Ozzmaker BerryGPS-IMU makes NMEA sentences available via the
 
 118 serial "UART" device ~/dev/ttyAMA0~. If bluetooth has not been
 
 119 disabled, the Raspberry Pi OS automatically creates a software "UART"
 
 120 device at ~/dev/serial0~. See the "[[file:../setup/README.org::*Disable%20Bluetooth][Disable Bluetooth]]" section in the
 
 121 [[file:../setup/README.org][Main Setup]] Initial Startup procedure for instructions on how to
 
 122 disable bluetooth to free up ~/dev/ttyAMA0~ for use by ~gpsd~.
 
 125 See the "[[file:../location/README.org::*Setup%20~gpsd~][Setup ~gpsd~]]" subsection within the "Initial Startup" section
 
 126 of the Location Logging [[file:../location/README.org][~README.org~]] file. There is one additional
 
 127 change that must be made which is to add a ~/dev/pps0~ item to the
 
 128 ~DEVICES=~ line in ~/etc/default/gpsd~ like so:
 
 130 : DEVICES="/dev/ttyAMA0 /dev/pps0"
 
 132 ~/dev/ttyAMA0~ is where ~gpsd~ can get NMEA data from the GPS unit.
 
 134 ~/dev/pps0~ is where ~gpsd~ can get a PPS signal.
 
 136 As an example, the following lines will be present in
 
 137 ~/etc/default/gpsd~ if both location and time tracking are set up:
 
 142 DEVICES="/dev/ttyAMA0 /dev/pps0"
 
 146 Make sure to enable ~gpsd~ to automatically start as a system service.
 
 148 : $ sudo systemctl enable gpsd
 
 149 : $ sudo systemctl start gpsd
 
 152 Modify the configuration file for ~chrony~ at ~/etc/chrony/chrony.conf~.
 
 154 : $ sudo nano /etc/chrony/chrony.conf
 
 156 Add the following lines:
 
 159 # Get time from GPS (/dev/XXXX) and PPS (/dev/YYYY)
 
 160 #refclock SOCK /run/chrony.XXXX.sock refid GPS precision 1e-1 offset 0.0000
 
 161 #refclock SOCK /run/chrony.YYYY.sock refid PP precision 1e-7
 
 162 refclock SHM 0 refid GPS precision 1e-1 offset 0.0000 delay 0.2 stratum 1
 
 163 refclock SHM 1 refid PPS precision 1e-7 stratum 1
 
 167 - ~XXXX~ : the basename of the GPS device's serial port. In this guide
 
 168   it should be ~ttyAMA0~; other setups may use ~ttyS0~, ~ttyACM0~, or
 
 171 - ~YYYY~ : the basename of the PPS device's serial port. In this guide
 
 174 Note: The ~refclock SOCK~ lines are left as comments in case ~gpsd~
 
 175 incorrectly maps the GPS and PPS data.
 
 177 The following commands may be useful for testing ~gpsd~ and ~chrony~
 
 179 - ~chronyc sources -v~ : Shows time sources and associated accuracy
 
 182 - ~chronyc tracking~ : Shows the current time difference between
 
 183   the reference clock and the system clock. Note: ~chrony~ gradually
 
 184   attempts to reduce the difference by changing the system clock.
 
 186 - ~sudo chronyc makestep~ : Force ~chrony~ to set the system clock to
 
 187   match the reference clock immediately.
 
 189 - ~sudo systemctl enable chrony~ : Enable automatic startup of
 
 190   ~chrony~ (Note: This command shouldn't be necessary since the act of
 
 191   installing ~chrony~ via ~sudo apt install chrony~ should
 
 192   automatically enable it).
 
 194 - ~sudo systemctl stop chrony~ : Stop ~chrony~.
 
 196 - ~sudo systemctl restart chrony~ : Restart ~chrony~.
 
 198 - ~systemctl status chrony~ : Check status of ~chrony~ service.
 
 200 - ~sudo ntpshmmon~ : Shows live output of data using the shared memory
 
 201   driver filled by ~gpsd~. ([[https://gpsd.gitlab.io/gpsd/gpsd-time-service-howto.html][ref]])
 
 203 - ~sudo ipcs -m~ : Show live segments of the shared memory. ([[https://gpsd.gitlab.io/gpsd/gpsd-time-service-howto.html][ref]])
 
 205 - ~sudo date -s '2020-07-07T00:00+0000'~ : Manually sets time to a
 
 208 An example output of ~sudo chronyc sources -v~ will show something
 
 212 pi@ninfacyzga-1-x:~ $ sudo chronyc sources -v
 
 213 210 Number of sources = 6
 
 215   .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
 
 216  / .- Source state '*' = current synced, '+' = combined , '-' = not combined,
 
 217 | /   '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
 
 218 ||                                                 .- xxxx [ yyyy ] +/- zzzz
 
 219 ||      Reachability register (octal) -.           |  xxxx = adjusted offset,
 
 220 ||      Log2(Polling interval) --.      |          |  yyyy = measured offset,
 
 221 ||                                \     |          |  zzzz = estimated error.
 
 223 MS Name/IP address         Stratum Poll Reach LastRx Last sample               
 
 224 ===============================================================================
 
 225 #- GPS                           1   4   377    21   +110ms[ +110ms] +/-  200ms
 
 226 #* PPS                           1   4   377    22  +2496ns[+3045ns] +/- 1000ns
 
 227 ^- vps-2d3ddab6.vps.ovh.ca       2   6   277    57  +1302us[+1304us] +/-  151ms
 
 228 ^? time.richiemcintosh.com       2   6     1    59  +2626us[+2628us] +/-   92ms
 
 229 ^- varuna.ga-group.nl            3   6   377    55  -3962us[-3960us] +/-  151ms
 
 230 ^- ntp3.junkemailfilter.com      2   6   377    58  -4561us[-4558us] +/-   80ms
 
 233 General references for the ~chrony.conf~ file are:
 
 235 - The ~chrony~ ~4.0~ documentation. ([[https://chrony.tuxfamily.org/doc/4.0/chrony.conf.html][ref]])
 
 237 - The ~gpsd~ documentation for communicating with ~chrony~. ([[https://gpsd.gitlab.io/gpsd/gpsd-time-service-howto.html#_feeding_chrony_from_gpsd][ref]])
 
 239 - Setup guide for a USB GPS with ~gpsd~ and ~chrony~. ([[https://photobyte.org/raspberry-pi-stretch-gps-dongle-as-a-time-source-with-chrony-timedatectl/][ref]])
 
 241 ***** Disable CPU power saving
 
 242 Power saving featurs of the Raspberry Pi Zero W may also be disabled
 
 243 in order to improve accuracy.
 
 245 ****** Configure CPU ~scaling_governor~
 
 246 If additional precision is required, the PPS signal may be made more
 
 247 reliable at the cost of increasing CPU power by configuring the CPU to
 
 248 always run at maximum frequency.[fn:se_20180320_raspicpugov] This
 
 249 change can be performed by modifying the following file as root:
 
 251 : /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
 
 253 The file should consist of one line. Change
 
 263 This change can be performed via the ~nano~ text editor by running the
 
 267 : # nano /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
 
 269 Additionally, in order to prevent the ~raspi-config~ init script from
 
 270 reverting this text file back to ~ondemand~ after a reboot, this
 
 271 script must be disabled via:
 
 273 : $ sudo systemctl disable raspi-config
 
 275 ****** Configure ~/boot/config.txt~
 
 276 Modify ~/boot/config.txt~ so that it contains these lines in order to
 
 277 disable power saving functions:
 
 280 # Disable power saving
 
 284 [fn:se_20180320_raspicpugov] Title:[[https://raspberrypi.stackexchange.com/questions/9034/how-to-change-the-default-governor]["How to change the default governor?"]]; Author:[[https://raspberrypi.stackexchange.com/users/5538/goldilocks][goldilocks]]; Date: 2018-03-20; Website:stackexchange.com;
 
 289 *** Unscheduled Shutdown
 
 291 *** Example ~chrony.conf~ for ~chrony~
 
 292 For Raspberry Pi OS, the configuration file should be installed at
 
 293 ~/etc/chrony/chrony.conf~.
 
 296 # Welcome to the chrony configuration file. See chrony.conf(5) for more
 
 297 # information about usuable directives.
 
 298 pool 2.debian.pool.ntp.org iburst
 
 300 # This directive specify the location of the file containing ID/key pairs for
 
 301 # NTP authentication.
 
 302 keyfile /etc/chrony/chrony.keys
 
 304 # This directive specify the file into which chronyd will store the rate
 
 306 driftfile /var/lib/chrony/chrony.drift
 
 308 # Uncomment the following line to turn logging on.
 
 309 #log tracking measurements statistics
 
 311 # Log files location.
 
 312 logdir /var/log/chrony
 
 314 # Stop bad estimates upsetting machine clock.
 
 317 # This directive enables kernel synchronisation (every 11 minutes) of the
 
 318 # real-time clock. Note that it can’t be used along with the 'rtcfile' directive.
 
 321 # Step the system clock instead of slewing it if the adjustment is larger than
 
 322 # one second, but only in the first three clock updates.
 
 325 # Get time from GPS (/dev/ttyAMA0) and PPS (/dev/pps0)
 
 326 #refclock SOCK /run/chrony.ttyAMA0.sock refid GPS precision 1e-1 offset 0.0000
 
 327 #refclock SOCK /run/chrony.pps0.sock refid PP precision 1e-7
 
 328 refclock SHM 0 refid GPS precision 1e-1 offset 0.0000 delay 0.2 stratum 1
 
 329 refclock SHM 1 refid PPS precision 1e-7 stratum 1