Convertir una Raspberry Pi en Servidor NTP Stratum 1

Raspberry Pi Stratum 1

Continuando con mi proyecto de convertir mi Raspberry Pi B ) en un servidor de hora NTP, decidí dar un paso más allá buscando un mayor nivel de exactitud

model-b

Raspberry Pi 1 B

sin además tener que depender de internet. La forma de hacerlo obteniendo la información directamente vía satélite, lo que me permitiría ser Stratum 1.

Para ello compré una tarjeta de GPS compatible con mi modelo de Raspberry, concretamente una Adafruit Breakout V3,

746-08

Adafruit Breakout V3

y un kit (lo podéis comprar en Amazon) USB – Uart que no es otra cosa que un convertidor usb – puerto serie, compuesto por un enchufe usb unido a una tarjeta que en realidad es un puerto serie, acaba en unas patillas, y viene acompañado de varios cables (hembra – hembra) con los que poder conectarse a otro dispositivo.

41qddg-rb9l-_sx90_

Cable USB-Uart

Os recomiendo comprar también una antena activa y un convertidor sma para poder conectarla a la placa del gps adafruit. Se puede comprar todo en Adafruit.

960-01

Antena GPS activa para Raspberry Stratum 1

Con esta configuración hardware tenemos dos opciones, en la primera (A) conectando la tarjeta GPS al puerto USB de nuestra Raspberry , y en la segunda (B) conectando la tarjeta directamente al puerto de comunicaciones de la Raspberry.

En ambos casos el primer paso es conectar, sirviéndonos del soldador, un cable a cada uno de los siguientes contactos de la tarjeta GPS:

PPS: pulse per second
VIN: que es PWR en 5V
GND: masa como su nombre indica
RX: recepción de datos
TX: emisión de datos

A los menos expertos les recuerdo que para hacer una soldadura de calidad no se ha de calentar directamente el estaño sino la parte a soldar, y que de ello depende que la conexión eléctrica sea de calidad.

OPCION A

Con los cuatro cables conectados a la tarjeta, conectar su otro extremo a las patillas del dispositivo Usb-Uart:
VIN-VIN (puede aparecer como PWR o 5V)
GND-GND
RX-TX
TX-RX

(en este uso usando el USB quedará el conector PPS suelto, es normal)

Conectar USB a nuestra RPI.

Iniciar sesión en raspbian (puede ser otra distribución), recomiendo hacerlo con ssh.

Actualizar versión y paquetes

sudo apt-get update
sudo apt-get dist-upgrade
sudo rpi-update

Seguidamente se reiniciará el sistema

Una vez reiniciado, ejecutaremos

raspi-config

Iremos a la opción de Advanced Options-> A8 Serial
y desactivaremos el acceso a la consola a través del puerto serie marcando ‘NO‘ y saldremos de la aplicación indicando que SI queremos reiniciar el sistema.

sudo apt-get install pps-tools
sudo apt-get install libcap-dev

Después editaremos el fichero config.txt:

sudo nano /boot/config.txt

Y al final del fichero añadiremos:

dtoverlay=pps-gpio,gpiopin=18

Para guardar y salir pulsaremos ctrl + x , pulsaremos Y y enter

Seguidamente editaremos el fichero /etc/modules:

sudo nano /etc/modules

y añadiremos la siguiente línea

pps-gpio

Para guardar y salir pulsaremos ctrl + x , pulsaremos Y y enter

Forzaremos el reinicio del sistema:

sudo reboot

Dado que el NTP que viene instalado con Raspbian no soporta PPS (pulse per second) y para este proyecto es especialmente importante dado que el PPS nos aportará un mayor grado de precisión en el cálculo del tiempo, instalaremos la última versión (el proceso lleva unos 30 minutos):

wget http://www.eecis.udel.edu/~ntp/ntp_spool/ntp4/ntp-4.2/ntp-4.2.8p8.tar.gz
tar zxvf ntp-4.2.8p8.tar.gz
cd ntp-4.2.8p8/
./configure -enable-linuxcaps

En Raspberry 1 ejecutaremos:
make

En Raspberry 2 y superiores ejecutaremos:
make -j5

Tanto para una como para otra continuaremos con:

sudo make install
sudo service ntp stop
sudo cp /usr/local/bin/ntp* /usr/bin/
sudo cp /usr/local/sbin/ntp* /usr/sbin/
sudo  /etc/init.d/ntp start
sudo aptitude install pps-tools

A continuación haremos lo necesario para asegurarnos de tener instalado el paquete de la aplicación gpsd:

sudo apt-get install gpsd gpsd-clients python-gps

Editaremos su fichero de configuración:

sudo nano /etc/default/gpsd

Al abrirlo aparecen los paremetros de configuración que al margen de los comentarios han de quedar así:

START_DAEMON=»true»
GPSD_OPTIONS=»-n»
DEVICES=»/dev/ttyUSB0″
USBAUTO=»true»
GPSD_SOCKET=»/var/run/gpsd.sock»

Una mez modificado, grabaremos como de costumbre, ctrl +x , Y, y Enter.

Reiniciaremos el sistema con

sudo reboot

A continuación teclearemos

sudo gpsd /dev/ttyUSB0 -F /var/run/gpsd-sock

Y, dando por hecho que el gps tiene cobertura, probaremos que el gps funciona y recibe señal:

Para ver que el gps envia información al puerto USB0:

sudo cat /dev/USB0

saldrán ristras de caracteres en las que se puede leer fechas, horas, coordenadas…

Interrumpiremos la ejecución de la prueba con ctrl + c

Seguido comprobaremos los datos que llegan a la aplicación gpsd con:

cgps -s

deberemos ver un cuadro en el que figurarán, fecha, hora, latitud, longitud…

Con el gps funcionando y la aplicación recogiendo la información, lo siguiente es configurar la aplicación NTP para que use como servidor de hora a nuestra propia Rpi.

Editaremos el fichero de configuración del servidor ntp:

sudo nano /etc/ntp.conf

Por delante del primer servidor que tengamos instalado añadiremos lo siguiente:

#configuración servidor gps adafruit
server 127.127.28.0 minpoll 4 maxpoll 4 prefer
fudge 127.127.28.0 time1 0.000 refid GPS
server 127.127.22.0 minpoll 4 maxpoll 4
fudge 127.127.22.0  flag3 1  refid PPS

Si queremos que nuestro servidor ntp sea accesible desde internet (sea público), a continuación de la línea ‘#by default, exchange time with everybody’ nos aseguraremos de que haya dos líneas como las siguientes:

restrict default kod nomodify notrap nopeer noquery
restrict -6 default kod nomodify notrap nopeer noquery

Una vez hecho esto, saldremos con ctrl + x , Y, y enter.

Y forzaremos el reinicio del sistema.

Pasados un par de minutos podremos comprobar que funciona con:

sudo ntpq -p

     remote           refid      st t when poll reach   delay   offset  jitter
====================================================================
*SHM(0)          .GPS.            0   l    2   16  177    0.000    5.864  19.514
oPPS(0)          .PPS.            0      l   14   16  377    0.000    0.002   0.004
x10.0.0.47       .GPSD.         1     u   28   64    3    0.572  685.339   8.058
+hora.roa.es     .GPS.           1    u   29   64    3   43.879  442.457  22.957

Una vez hecho esto tan solo queda un último ajuste:

timedatectl status

Nos mostrará algo similar a esto:

Local time: Sat 2016-10-22 06:33:39 CEST
Universal time: Sat 2016-10-22 04:33:39 UTC
RTC time: n/a
Time zone: Europe/Madrid (CEST, +0200)
NTP enabled: no
NTP synchronized: yes
RTC in local TZ: no
DST active: yes
Last DST change: DST began at
Sun 2016-03-27 01:59:59 CET
Sun 2016-03-27 03:00:00 CEST
Next DST change: DST ends (the clock jumps one hour backwards) at
Sun 2016-10-30 02:59:59 CEST
Sun 2016-10-30 02:00:00 CET

En caso de que ‘NTP enabled’ sea ‘no’, editaremos el fichero timesyncd.conf

sudo nano /etc/systemd/timesyncd.conf

e informaremos nuestros servidores de hora, que en nuestro caso serían:

servers=0.127.127.22.0 1.127.127.28.0 2.150.214.94.5

Una vez hecho esto saldremos guardando los datos con CTRL + X y pulsando a continuación Y ó S para confirmar, y activaremos el servicio con:

timedatectl set-ntp true

Finalmente comprobaremos que los cambios han surtido efecto con:

timedatectl status

Lo que mostrará algo similar a esto:

Local time: Sat 2016-10-22 06:37:41 CEST
Universal time: Sat 2016-10-22 04:37:41 UTC
RTC time: n/a
Time zone: Europe/Madrid (CEST, +0200)
NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: no
DST active: yes
Last DST change: DST began at
Sun 2016-03-27 01:59:59 CET
Sun 2016-03-27 03:00:00 CEST
Next DST change: DST ends (the clock jumps one hour backwards) at
Sun 2016-10-30 02:59:59 CEST
Sun 2016-10-30 02:00:00 CET

OPCION B

Para los más avanzados, si finalmente preferís eliminar la conexión usb-serie y realizar la conexión directamente a la Raspberry a través del puerto GPIO,  esta es la correspondencia de Pines:

2 – 5v (vin)
6 – GND
8 – TX  (conecta con RX en GPS)
10 – RX
16 – PPS (en RPI es GPIO23 y recibe PPS del GPS)

El dispositivo pasa de ser USB0 a ser AMA0, por lo que tendremos que sustituir ttyUSB0 por ttyAMA0 en la configuración indicada anteriormente.

Si usáis esta opción es importante ir a raspi-config, y en Advanced Options-> A8 Serial
y activaremos el acceso a la consola a través del puerto serie marcando ‘SI‘ y saldremos de la aplicación indicando que SI queremos reiniciar el sistema.

Espero que os haya servido de ayuda y disfrutéis de la experiencia.

En unos días explicaré como hice lo mismo con una tarjeta / hat de HAB supplies en una Raspberry 2, un procedimiento sin soldaduras, mucho más fácil y directo aunque también menos divertido.

Mi servidor de NTP Raspberry Pi Stratum 1

La dirección pública de mi servidor de Stratum 1 es

alteageek.homelinux.org