Creando un servidor NTP usando GPS/PPS

NTP server

Puedes montar tu propio servidor Network Time Protocol (NTP) usando GPS y PPS en tu ODROID. Este sistema te proporciona la hora exacta que puede serte muy útil para casos específicos. Los relojes atómicos de los satélites GPS son monitorizados y comparados con los “relojes maestros” por la Sección de Control Operativo del GPS; esta hora del GPS está controlada dentro de un microsegundo de la hora Universal. Nuestro receptor GPS proporciona 1 Pulso por Segundo, o PPS, enviando la señal aunque necesitas realizar algo de soldadura para poner a la vista este pin. Este pulso tiene un edge de elevación alineado con el segundo GPS, y se usa para sancionar los relojes locales para mantener la sincronización con el Tiempo Universal (UT). Como resultado, nuestro servidor local puede tener una hora muy precisa con menos de 10 microsegundos de tolerancia. Antes de empezar, necesitas poner a la vista la señal PPS del receptor GPS.

Poner a la vista la señal PPS

En primer lugar, desmonta el módulo GPS quitando los 4 tornillos de la parte posterior del módulo GPS. Éstos están cubiertos por una pegatina fijada en la parte posterior del receptor. Puedes averiguar dónde están pasando los dedos por la pegatina hasta detectar los huecos. Debes haber 2 huecos en el extremo superior y otros 2 en el inferior de la pegatina. Tras encontrar los agujeros, corta la pegatina y separe la parte cortada para poder desenroscar los 4 tornillos.

Figura 1 - Herramientas que necesitarás

Figura 2 - Pegatina despegable para acceder a los tornillos

Figure 3 - Peel off sticker to access screws
Figura 3 – Pegatina retirada para poder acceder a los tornillos

Figura 4 - Todos los tornillos retirados

Abre el módulo para que se muestre la placa PCB, que es la que tienes que soldar para presentar el PPS.

Figura 5 - Tapa retirada

Esta es una parte muy importante de la guía, ya que tiene que soldar un cable puente a un pin específico del chip. La ubicación del pin PPS que necesitamos se muestra en la Figura 6. Ten mucho cuidado de no crear un cortocircuito.

Figure 6 – Pin PPS en la PCB principal

Si lo ha hecho bien, puede pelar el cable tal y como se muestra en la Figura 7.

Figura 7 - Cable conectado

A continuación, tenemos que montar y conectar todo nuevamente. Coloca la PCB de nuevo dentro de carcasa como estaba antes y vuelve a atornillar la carcasa.

Figura 8 - Colocada la PCB nuevamente dentro de la carcasa

Figura 9 – Tapa trasera atornillada de nuevo

Conecta el cable puente al pin GPIO 18 del shifter shield XU4. Ten en cuenta que este es el shifter shield que garantiza que los niveles de voltaje del pin PPS coinciden con lo esperado.

Figura 10 - Pin PPS conectado al XU4

Conecta el cable USB al ODROID-XU4, conecte el cable LAN y el cable de alimentación también.

Figura 11 - Pin y USB conectados al XU4

Nuestro kernel principal no es totalmente compatible con PPS desde GPIO. Es necesario realizar algunas configuraciones de software compilando tu propio kernel en tu ODROID-XU4. Para empezar, prepara el código fuente del kernel Linux desde Github, e instala las herramientas necesarias para compilar un kernel nuevo:

$ sudo apt update && sudo apt install git gcc g++ build-essential libncurses5-dev bc
Hazte con el código fuente del kernel de Linux desde nuestro repositorio oficial de Github en https://github.com/hardkernel/linux:
$ git clone --depth 1 https://github.  com/hardkernel/linux.git -b odroidxu4-4.14.y odroidxu4-4.14.y
$ cd odroidxu4-4.14.y
Añade soporte PPS editando el archivo arch/arm/boot/dts/exynos5422-odroidxu4.dts con el fin de añadir un nuevo dispositivo que recibe PPS desde el GPIO # 18:
$ vi arch/arm/boot/dts/exynos5422-odroidxu4.dts
Agrega los siguientes contenidos al archivo:
dummy_codec : spdif-transmitter {};
 
/* add for pps-gpio */
pps {
  compatible = "pps-gpio";
  gpios = <&gpx1 2 GPIO_ACTIVE_HIGH>;
  status = "okay";
};
A continuación, crea un menuconfig personalizado:
$ make odroidxu4_defconfig
$ make menuconfig
Localiza la opción y activala con la tecla de espacio, tal y como se muestra en la Figura 12, luego guarda y salte.

Figura 12 - Habilitado el soporte PPS

Si tu configuración personalizada funciona bien, se crearían nuevos dispositivos en /dev. Vamos a verlos:

$ ls -al /dev/{ttyACM*,gps*,pps*}

crw------- 1 root root    248, 0 Jan 31 14:21 /dev/pps0
crw-rw---- 1 root dialout 166, 0 Jan 31 14:53 /dev/ttyACM0
lrwxrwxrwx 1 root root         7 Jan 31 14:21 /dev/ttyACM99 -> ttySAC0
Si alguno de los elementos del ejemplo anterior no aparece, es que has hecho algo mal, debes intentar configurar y compilar el kernel nuevamente. Si aparecen todos ellos, crea archivos de enlace lógico para usarlos más adelante:
$ sudo ln -sF /dev/ttyACM0 /dev/gps0
$ sudo ln -sF /dev/pps0 /dev/gpspps0
$ ls -al /dev/{ttyACM*,gps*,pps*}

lrwxrwxrwx 1 root root        12 Jan 31 15:50 /dev/gps0 -> ttyACM0
lrwxrwxrwx 1 root root         9 Jan 31 15:51 /dev/gpspps0 -> /dev/pps0
crw------- 1 root root    248, 0 Jan 31 15:50 /dev/pps0
crw-rw---- 1 root dialout 166, 0 Jan 31 15:50 /dev/ttyACM0
lrwxrwxrwx 1 root root         7 Jan 31 15:50 /dev/ttyACM99 -> ttySAC0
Asegúrate de que tu resultado es similar al ejemplo anterior, luego instala los paquetes relacionados con GPS y configúralos:
$ sudo apt install gpsd gpsd-clients
$ sudo dpkg-reconfigure gpsd
A continuación, necesitas probarlos:
$ sudo gpsmon /dev/gps0
En la Figura 13 se muestra una captura de pantalla de ejemplo con "gpsmon/dev/gps0". Has de esperar algo más de 5 minutos para obtener la información del GPS correctamente.

Figura 13 - Datos NMEA

A continuación, instala las herramientas PPS, luego prueba nuestro ppstest en /dev/gpspps0:

$ sudo apt install pps-tools
$ sudo ppstest /dev/gpspps0

trying PPS source "/dev/gpspps0"
found PPS source "/dev/gpspps0"
ok, found 1 source(s), now start fetching data...
source 0 - assert 1517363638.431673232, sequence: 130 - clear  0.000000000, sequence: 0
source 0 - assert 1517363639.431676649, sequence: 131 - clear  0.000000000, sequence: 0
Se añadirá una nueva fila que empieza con " source 0 – assert …” por cada segundo. Después, instala el servicio NTP:
$ sudo apt install ntp
Edita el archivo /etc/ntp.conf para usar GPS/PPS. Haz una copia de seguridad del archivo original y crea un nuevo archivo de configuración usando las siguientes opciones:
$ sudo mv /etc/ntp.conf /etc/ntp.conf.bak
$ sudo vi /etc/ntp.conf

# /etc/ntp.conf, configuration for ntpd; see ntp.conf(5) for help

# Drift file to remember clock rate across restarts
driftfile /var/lib/ntp/ntp.drift

# Server from generic NMEA GPS Receiver
# server: NMEA serial port (/dev/gps0), mode 16 = 9600 baud + 2 = $GPGGA
# fudge:  flag 1 for use PPS (/dev/gpspps0), time2 for calibration time offset
server 127.127.20.0 mode 18 minpoll 3 maxpoll 3 prefer
fudge 127.127.20.0 flag1 1 time2 0.000 refid gPPS
Ten en cuenta que el parámetro time2 (0.000) se utiliza para modificar la hora con el fin de calibrar el resultado final. Por último, reinicia el servicio NTP.
$ sudo service ntp restart
$ sudo service ntp status

● ntp.service - LSB: Start NTP daemon
   Loaded: loaded (/etc/init.d/ntp; bad; vendor preset: enabled)
   Active: active (running) since Wed 2018-01-31 17:44:58 KST; 3s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 744 ExecStop=/etc/init.d/ntp stop (code=exited, status=0/SUCCESS)
  Process: 754 ExecStart=/etc/init.d/ntp start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/ntp.service
           └─765 /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 111:115
 
Jan 31 17:44:58 odroid ntp[754]:    ...done.
Jan 31 17:44:58 odroid systemd[1]: Started LSB: Start NTP daemon.
Jan 31 17:44:58 odroid ntpd[765]: proto: precision = 1.375 usec (-19)
Jan 31 17:44:58 odroid ntpd[765]: Listen and drop on 0 v6wildcard [::]:123
Jan 31 17:44:58 odroid ntpd[765]: Listen and drop on 1 v4wildcard 0.0.0.0:123
Jan 31 17:44:58 odroid ntpd[765]: Listen normally on 2 lo 127.0.0.1:123
Jan 31 17:44:58 odroid ntpd[765]: Listen normally on 3 eth0 192.168.100.28:123
Jan 31 17:44:58 odroid ntpd[765]: Listen normally on 4 lo [::1]:123
Jan 31 17:44:58 odroid ntpd[765]: Listen normally on 5 eth0 [fe80::4db2:ce0b:48f3:26af%2]:123
Jan 31 17:44:58 odroid ntpd[765]: Listening on routing socket on fd #22 for interface updates
Espera aproximadamente unos minutos para que el GPS se estabilice, luego comprueba que se está obteniendo una hora precisa desde el GPS/PPS. El resultado solo se activa cuando recibe varias señales de satélite estables. Puede ver que los resultados son como los que aparecen a continuación, verifica que el carácter "o" aparece antes de la numeración IP y que el valor del alcance aumena hasta 377.
$ ntpq -p

     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
oGPS_NMEA(0)     .gPPS.      0 l    1    8  377    0.000    0.008   0.002
 
$ ntptime
Check that estimated error is just 1 us(Microsecond).
ntp_gettime() returns code 0 (OK)
  time de1bee1d.49adfb50  Wed, Jan 31 2018 16:26:21.287, (.287811636),
  maximum error 2000 us, estimated error 1 us, TAI offset 0
ntp_adjtime() returns code 0 (OK)
  modes 0x0 (),
  offset -3.606 us, frequency 1.000 ppm, interval 1 s,
  maximum error 2000 us, estimated error 1 us,
  status 0x2001 (PLL,NANO),
  time constant 3, precision 0.001 us, tolerance 500 ppm,
Para ver la publicación Wiki original, visita https://wiki.odroid.com/odroid-xu4/application_note/gpspps_ntp_server.

Be the first to comment

Leave a Reply