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
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,
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.
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.
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