feat(lib/EVA-2020-02-2):Add absolute humidity mode
[EVA-2020-02.git] / doc / time / README.org
1 #+TITLE: Ninfacyzga-1 Time Tracking
2 #+AUTHOR: Steven Baltakatei Sandoval
3 #+EMAIL: baltakatei@gmail.com
4 * Time Tracking
5 ** About
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~
9
10 ** Narrative
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.
21
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:
24 2010-04-29
25
26 ** Description
27 *** Hardware
28 Ozzmaker BerryGPS-IMU, Version 3 (see [[https://ozzmaker.com/berrygps-berrygps-imu-quick-start-guide/][ref]]).
29 *** Software
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~.
32
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
37
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~.
44
45 ** Operating Procedures
46 *** Initial Startup
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.
52
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]]
56
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").
62
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.
65
66 **** Install Software for time tracking
67 The time tracking function can be performed by two programs: ~gpsd~
68 and ~chrony~.
69
70 Basically, two things need to happen:
71
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).
75
76 2. ~chrony~ needs to be pointed towards the correct local IP addresses
77 where ~gpsd~ provides GPS data and the PPS signal.
78
79 ~gpsd~ then will provide GPS and PPS data to ~chrony~ via a "shared
80 memory driver".
81
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
85
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]]:
91
92 : # Enable PPS on GPIO 18
93 : dtoverlay=pps-gpio,gpiopin=18
94
95 The ~/boot/config.txt~ file can be modified via:
96
97 : $ sudo nano /boot/config.txt
98
99 PPS data can be confirmed by running:
100
101 #+BEGIN_EXAMPLE
102 $ sudo su -
103 # ppstest /dev/pps0
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
111 #+END_EXAMPLE
112
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]]).
115
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~.
123
124 ***** Setup ~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:
129
130 : DEVICES="/dev/ttyAMA0 /dev/pps0"
131
132 ~/dev/ttyAMA0~ is where ~gpsd~ can get NMEA data from the GPS unit.
133
134 ~/dev/pps0~ is where ~gpsd~ can get a PPS signal.
135
136 As an example, the following lines will be present in
137 ~/etc/default/gpsd~ if both location and time tracking are set up:
138
139 #+BEGIN_EXAMPLE
140 START_DAEMON="true"
141 USBAUTO="false"
142 DEVICES="/dev/ttyAMA0 /dev/pps0"
143 GPSD_OPTIONS="-n"
144 #+END_EXAMPLE
145
146 Make sure to enable ~gpsd~ to automatically start as a system service.
147
148 : $ sudo systemctl enable gpsd
149 : $ sudo systemctl start gpsd
150
151 ***** Setup ~chrony~
152 Modify the configuration file for ~chrony~ at ~/etc/chrony/chrony.conf~.
153
154 : $ sudo nano /etc/chrony/chrony.conf
155
156 Add the following lines:
157
158 #+BEGIN_EXAMPLE
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
164 #+END_EXAMPLE
165
166 Where
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
169 ~serial0~.
170
171 - ~YYYY~ : the basename of the PPS device's serial port. In this guide
172 it should be ~pps0~.
173
174 Note: The ~refclock SOCK~ lines are left as comments in case ~gpsd~
175 incorrectly maps the GPS and PPS data.
176
177 The following commands may be useful for testing ~gpsd~ and ~chrony~
178 configurations.
179 - ~chronyc sources -v~ : Shows time sources and associated accuracy
180 information.
181
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.
185
186 - ~sudo chronyc makestep~ : Force ~chrony~ to set the system clock to
187 match the reference clock immediately.
188
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).
193
194 - ~sudo systemctl stop chrony~ : Stop ~chrony~.
195
196 - ~sudo systemctl restart chrony~ : Restart ~chrony~.
197
198 - ~systemctl status chrony~ : Check status of ~chrony~ service.
199
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]])
202
203 - ~sudo ipcs -m~ : Show live segments of the shared memory. ([[https://gpsd.gitlab.io/gpsd/gpsd-time-service-howto.html][ref]])
204
205 - ~sudo date -s '2020-07-07T00:00+0000'~ : Manually sets time to a
206 string.
207
208 An example output of ~sudo chronyc sources -v~ will show something
209 similar to this:
210
211 #+BEGIN_EXAMPLE
212 pi@ninfacyzga-1-x:~ $ sudo chronyc sources -v
213 210 Number of sources = 6
214
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.
222 || | | \
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
231 #+END_EXAMPLE
232
233 General references for the ~chrony.conf~ file are:
234
235 - The ~chrony~ ~4.0~ documentation. ([[https://chrony.tuxfamily.org/doc/4.0/chrony.conf.html][ref]])
236
237 - The ~gpsd~ documentation for communicating with ~chrony~. ([[https://gpsd.gitlab.io/gpsd/gpsd-time-service-howto.html#_feeding_chrony_from_gpsd][ref]])
238
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]])
240
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.
244
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:
250
251 : /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
252
253 The file should consist of one line. Change
254
255 : ondemand
256
257 to
258
259 : performance
260
261 .
262
263 This change can be performed via the ~nano~ text editor by running the
264 following commands:
265
266 : $ sudo su -
267 : # nano /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
268
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:
272
273 : $ sudo systemctl disable raspi-config
274
275 ****** Configure ~/boot/config.txt~
276 Modify ~/boot/config.txt~ so that it contains these lines in order to
277 disable power saving functions:
278
279 #+BEGIN_EXAMPLE
280 # Disable power saving
281 nohz=off
282 #+END_EXAMPLE
283
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;
285
286 *** Normal Startup
287 *** Normal Operation
288 *** Normal Shutdown
289 *** Unscheduled Shutdown
290 ** Appendix A
291 *** Example ~chrony.conf~ for ~chrony~
292 For Raspberry Pi OS, the configuration file should be installed at
293 ~/etc/chrony/chrony.conf~.
294
295 #+BEGIN_EXAMPLE
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
299
300 # This directive specify the location of the file containing ID/key pairs for
301 # NTP authentication.
302 keyfile /etc/chrony/chrony.keys
303
304 # This directive specify the file into which chronyd will store the rate
305 # information.
306 driftfile /var/lib/chrony/chrony.drift
307
308 # Uncomment the following line to turn logging on.
309 #log tracking measurements statistics
310
311 # Log files location.
312 logdir /var/log/chrony
313
314 # Stop bad estimates upsetting machine clock.
315 maxupdateskew 100.0
316
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.
319 rtcsync
320
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.
323 makestep 1 3
324
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
330 #+END_EXAMPLE
331