Cómo añadir la función de hora y ubicación GPS a una Raspberry Pi
Al añadir un receptor GPS a una Raspberry Pi se puede conocer la ubicación y la hora con una precisión excepcional. Se trata de una decisión totalmente acertada para determinar la ubicación de equipos móviles y de sistemas que precisan una sincronización temporal.
Adafruit Ultimate GPS HAT permite añadir con facilidad la funcionalidad GPS a la Raspberry Pi. Además, también integra un reloj de tiempo real con respaldo de batería, junto con un área de prototipado.
En este ejemplo, usamos una Raspberry Pi 3 Model B (896-8660) y un kit Adafruit Ultimate GPS HAT (124-5481) en una carcasa de carril DIN de Phoenix Contact (122-4298), aunque bien podríamos usar cualquiera de las innumerables carcasas del tamaño adecuado para alojar el kit.
Ensamblaje
La única tarea de montaje que tenemos que hacer es soldar el kit GPS Hat al conector de orificio pasante y enchufar el HAT al conector P1 de la Pi.
Los componentes de la carcasa se pueden ver arriba.
En la parte inferior se ha taladrado un orificio en la esquina superior izquierda para instalar un cable SMA hembra a U.FL macho de montaje en panel (794-2897). El módulo GPS no tiene una antena integrada, por lo que es esencial instalar una antena externa si no se tiene una vista directa del cielo o si el receptor se va a alojar en una carcasa metálica.
Conector U.FL conectado al HAT y carcasa montada.
En las pruebas se instaló una antena GPS de RF Solutions (704-3464) en la ventana.
Configuración del sistema operativo
No es necesario instalar la distribución Linux de escritorio completa; la variante más sencilla Raspbian Jessie será más que suficiente. El ejemplo siguiente ilustra la configuración de una tarjeta Micro SD (121-3897):
$ sudo dd if=2017-01-11-raspbian-jessie-lite.img of=/dev/mmcblk0 bs=4M
Debe tenerse en cuenta que el parámetro if (nombre de archivo de entrada) será diferente dependiendo de la versión de la imagen de Raspbian Lite. Del mismo modo, el parámetro of (archivo de salida) será diferente dependiendo de la distribución de Linux y de la tarjeta SD que se utilice. Y los usuarios de Windows pueden usar las funciones habituales para configurar una imagen del SO en la tarjeta micro SD.
Personalmente prefiero trabajar en proyectos de Raspberry Pi a través de SDD si no es absolutamente necesario instalar una pantalla. Como esta opción está deshabilitada por defecto, se puede habilitar creando un archivo ssh vacío en la partición de arranque de la tarjeta. Para ello basta con insertar la tarjeta en otra máquina (como la que se ha utilizado para la configuración) o bien, insertarla en la Pi que se está usando. Arranque normalmente con un teclado y un monitor conectados, e introduzca el siguiente código en el símbolo del sistema:
$ sudo touch /boot/ssh
Después de reiniciar podrá iniciar sesión mediante SSH, ya que la Pi buscará el archivo ssh al arrancar, y cuando lo encuentre, activará ssh.
En Raspberry Pi 3 el puerto UART (puerto serie) está reservado por defecto para Bluetooth, mientras que el puerto serie de software de menor rendimiento o mini-UART se reserva para aplicaciones de uso general. Como no necesitamos el Bluetooth, podemos invertir esta configuración, pero antes hay que ejecutar la aplicación de configuración de Raspberry y desactivar el puerto serie.
$ sudo raspi-config
P5 Opciones de interfaz → P6 Serie (desactivar).
El objetivo es detener el envío de mensajes al puerto serie y el servicio de inicio de sesión en este mismo puerto.
A continuación activamos UART y cambiamos el ajuste de mini-UART para reservarlo a Bluetooth. Para ello hay que editar /boot/config.txt y añadir las siguientes líneas:
enable_uart=1
dtoverlay=pi3-miniuart-bt
Después de reiniciar podremos comprobar que /dev/serial0 señala a UART de hardware (AMA0) y serial1 al UART de software (S0) con:
pi@ntpi:~ $ ls -l /dev/ser*
Prueba inicial
En las pruebas hemos seguido la guía de Adafruit, pero nos dimos cuenta que podríamos tener problemas de depuración con el puerto serie si no ejecutábamos antes stty para configurarlo. Por contra, estos problemas no aparecían si configurábamos las opciones especificadas. En resumen, para comprobar que obteníamos los datos del módulo GPS bastaba con usar:
$ cat /dev/ttyAMA0
Y si todo va bien, deberíamos obtener un resultado parecido al de la captura de pantalla anterior. Sin embargo, si nos aparecen muchas comas con campos vacíos, indica que tenemos que configurar el GPS.
También debe tenerse en cuenta que en el momento de la redacción de este artículo, la guía de Adafruit indicaba que Ultimate GPS Hat era incompatible con Raspberry Pi 3, si bien esto se ha solucionado con la configuración UART descrita anteriormente.
En este punto, una aplicación puede usar directamente los datos que genera el receptor GPS, que no es sino texto con formato de frases NMEA estándar. Incluso hay bibliotecas disponibles que simplifican esta interpretación, como pynmea de Python.
gpsd
gpsd se describe como: "un servicio que controla uno o más receptores GPS o AIS conectados a los puertos serie o USB de un ordenador host, y que hace que todos los datos de ubicación/rumbo/velocidad de los sensores estén disponibles para ser consultados en el puerto 2947 TCP del equipo host".
Con gpsd, varias aplicaciones cliente que necesitan datos de ubicación pueden compartir accesos a los sensores sin entrar en conflicto ni perder datos. Además, gpsd responde a las consultas con un formato sustancialmente más fácil de analizar que el NMEA 0183 que emiten la mayoría de dispositivos GPS."
gpsd se puede utilizar para garantizar que los datos GPS estén disponibles para las aplicaciones, y proporciona una sencilla abstracción del hardware subyacente. Además, lo utilizan una amplia variedad de aplicaciones, desde navegación GPS a detección y mapeado de redes inalámbricas.
gpsd se puede instalar:
$ sudo apt-get update
$ sudo apt-get install gpsd gpsd-clients python-gps
Para configurarlo, editamos /etc/default/gpsd y modificamos las líneas USBAUTO, DEVICES y GPSD_OPTIONS:
USBAUTO="false"
DEVICES="/dev/ttyAMA0"
GPSD_OPTIONS="-n"
Para configurar su activación con el arranque es necesario introducir una ligera modificación con Raspbian Jessie:
$ sudo ln -s /lib/systemd/system/gpsd.service /etc/systemd/system/multi-user.target.wants/
Podemos iniciarlo con:
$ sudo service gpsd start
Y probarlo con:
$ gpsmon
Todo esto debería concluir con una aplicación de arranque basada en terminal que ofrece un resultado similar al que se muestra en la imagen anterior.
Llegados a este punto podríamos utilizar el receptor GPS con una aplicación existente compatible con gpsd. O incluso podríamos desarrollar una que utilice su sencilla interfaz.
pps
Pero una de las mejores cosas de este HAT es que no solo proporciona datos NMEA, sino también una señal PPS (pulsos por segundo) del GPS. ¿Y por qué es útil si es posible obtener la hora de las frases NMEA? Pues porque el texto ASCII no es ni mucho menos el método más eficiente de transmitir información. En este caso concreto, se enviará por un puerto serie relativamente lento, y el sistema operativo también le añadiría algo más de latencia.
Para nuestra comodidad, la señal PPS que genera el módulo GPS se puede muestrear por Raspberry Pi GPIO, y el kernel de Linux facilita acceso mediante /dev/pps0. Esto significa que las aplicaciones pueden utilizar los datos NMEA junto con la señal PPS para aumentar en gran medida la precisión de los datos horarios, si se tiene en cuenta el coste del equipo que se utiliza.
Para acceder a PPS necesitamos instalar el software pps-tools con:
$ sudo apt-get install pps-tools
Añada otra línea a /boot/config.txt para configurar el kernel de Linux de forma adecuada:
dtoverlay=pps-gpio,gpiopin=4
Después de reiniciar podemos hacer una prueba:
$ sudo ppstest /dev/pps0
Debería dar un resultado similar al que se muestra en la imagen anterior.
Servidor NTP
NTP ha sido desarrollado por Network Time Foundation.
Por último, uno de los usos de mayor utilidad de una Raspberry Pi con GPS es crear un servidor que distribuya la hora a los clientes LAN mediante el protocolo Network Time Protocol (NTP). El software ntpd empleado es increíblemente flexible y puede obtener los datos horarios de otros servidores NTP "iguales" en Internet, siempre que haya una conexión disponible, si bien también puede obtener la hora de GPS mediante NMEA o PPS, entre otras fuentes, empleando para ello algoritmos inteligentes y personalizables para seleccionar la mejor fuente de todas las disponibles.
NTP es un tema de gran complejidad en sí mismo, y su configuración depende de cada uso concreto. No obstante, hay disponible mucha información de gran utilidad en el sitio web de David Taylor.
Aspectos a tener en cuenta en caso de profundizar en la materia:
• Es necesario sustituir el software NTP suministrado por Raspbian por otra aplicación (esta operación es muy sencilla)
• ntpd puede obtener información temporal directamente desde el módulo GPS (a través de /dev/ttyAMA0) o se puede configurar para obtener datos a través de gpsd
• Se necesita algo de tiempo para ajustar la configuración de NTP si se quiere obtener un rendimiento óptimo
Conclusiones
Ultimate GPS Hat es una solución rápida y sencilla de integrar la funcionalidad para determinar la ubicación y la hora exacta de proyectos basados en Raspberry Pi, sin limitar el hecho de que esta información se puede emplear en otras aplicaciones y, por lo tanto, en otros dispositivos de la red.
Notas sobre el formato
Las líneas resaltadas en amarillo deben tener formato de código. Si esta función está disponible en el editor y se puede seleccionar un idioma, seleccione "shell script", "shell", "sh" o una opción similar. Si esta funcionalidad no está disponible, el texto resaltado se puede limitar con etiquetas <code> y </code> manualmente si se edita el HTML.
Piezas RS utilizadas
/web/p/kits-de-desarrollo-de-procesador-y-microcontrolador/8968660
/web/p/tarjetas-sd/1213897
/web/p/kits-de-desarrollo-de-radio-frecuencia/1245481
/web/p/latiguillos-coaxiales/7942897
/web/p/cajas-para-carril-din/1224298
/web/p/antenas-gps/7043464