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.
Abre el módulo para que se muestre la placa PCB, que es la que tienes que soldar para presentar el PPS.
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.
Si lo ha hecho bien, puede pelar el cable tal y como se muestra en la Figura 7.
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.
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.
Conecta el cable USB al ODROID-XU4, conecte el cable LAN y el cable de alimentación también.
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 bcHazte 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.yAñ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.dtsAgrega 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 menuconfigLocaliza la opción y activala con la tecla de espacio, tal y como se muestra en la Figura 12, luego guarda y salte.
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 -> ttySAC0Si 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 -> ttySAC0Asegú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 gpsdA continuación, necesitas probarlos:
$ sudo gpsmon /dev/gps0En 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.
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: 0Se añadirá una nueva fila que empieza con " source 0 – assert …” por cada segundo. Después, instala el servicio NTP:
$ sudo apt install ntpEdita 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 gPPSTen 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 updatesEspera 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