Adafruit Ultimate GPS Breakout v3 en la Raspberry Pi

Conectar un módulo de GPS a la Raspberry Pi abre un mundo de posibilidades, y no es demasiado complicado. Voy a explicar a continuación cómo conectar el módulo Adafruit Ultimate GPS Breakout v3. Como todos los productos de Adafruit, está muy bien documentado, y en la propia página de Adafruit tenemos muchos ejemplos de código y de conexiones. Aunque es algo carillo, unos 40-50€ (por ejemplo, aquí)…

Además, es uno de los pocos GPS que tienen correctamente implementadas las restricciones (ya obsoletas) COCOM, por las que un GPS comercial deja de funcionar si se supera la velocidad de 1000 nudos (unos 1900 km/h) y una altitud de 60.000 pies (unos 18 km). Que no vayamos a construir un misil, vamos. El problema es que la mayoría de los GPS se venden programados para que dejen de funcionar si una de las dos restricciones se alcanza (la velocidad o la altitud), y no las dos al mismo tiempo.

Como este GPS lo quiero emplear, entre otros poryectos, en una sonda estratosférica, que superará (espero) los 18 km de altitud, necesito un GPS que siga funcionando por encima de esa altitud, ya que la velocidad que llevará el globo será en torno a 5 m/s (18 km/h) bien lejos de los, ya quisiera yo, 1900 km/h.

Tenemos dos formas de conectar el GPS de Adafruit a la Raspberry Pi. La fácil, por USB, y la algo más complicada, por UART. Cuento primero la forma de hacerlo por USB, para lo cual necesitaremos un adaptador.

Conexión con adaptador USB-TTL

Podemos conectar el GPS a un puerto USB de la Raspberry Pi por medio de un adaptador USB a serie TTL PL2303. Yo compré este por menos de 3€.

FullSizeRender

Adaptador USB a serie TTL PL2303. Vista frontal

FullSizeRender2

Adaptador USB a serie TTL PL2303. Vista trasera

Conectamos el adaptador al GPS de la siguiente forma:

FullSizeRender

Conexión del módulo GPS al adaptardor USB-TTL

PL2303HX      GPS

3V3 --------- (No lo conecto)
TXD --------- RX
RXD --------- TX
GND --------- GND
+5V --------- VIN

Y enchufo el módulo USB a la RaspberrY Pi. Ejecuto:

ls /dev/ttyUSB*

Aparece el dispositivo /dev/ttyUSB0.

Si hago sudo lsusb, me aparece, entre otros dispositivos:

Bus 001 Device 006: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port

Así que ahí está mi Prolific PL2303, ok.

Miro a ver si el dispositivo está mandando alguna información (coordenadas GPS…), de forma un poco rupestre:

sudo cat /dev/ttyUSB0

Sale una ristra de lo que podría ser información geográfica, así que pinta bien.

$GPVTG,72.99,T,,M,0.01,N,0.01,K,A*08

$GPGGA,180130.000,4027.3560,N,00350.2876,W,1,6,1.29,694.6,M,51.7,M,,*4D

$GPGSA,A,3,12,25,29,24,14,31,,,,,,,2.52,1.29,2.16*06

$GPRMC,180130.000,A,4027.3560,N,00350.2876,W,0.03,72.99,280315,,,A*46

$GPVTG,72.99,T,,M,0.03,N,0.05,K,A*0E

$GPGGA,180130.000,4027.3560,N,00350.2876,W,1,6,1.29,694.6,M,51.7,M,,*4D
$GPGSA,A,3,12,25,29,24,14,31,,,,,,,2.52,1.29,2.16*06
94.6,M,51.7,M,,*4D
$GPRMC,180130.000,A,4027.3560,N,00350.2876,W,0.03,72.99,280315,,,A*46
D
$GPVTG,72.99,T,,M,0.03,N,0.05,K,A*0E
.2876,W,0.03,72.99,280315,,,A*46
D
$GPGGA,180130.000,4027.3560,N,00350.2876,W,1,6,1.29,694.6,M,51.7,M,,*4D
$GPGSA,A,3,12,25,29,24,14,31,,,,,,,2.52,1.29,2.16*06
94.6,M,51.7,M,,*4D
$GPRMC,180130.000,A,4027.3560,N,00350.2876,W,0.03,72.99,280315,,,A*46

Esto parecen datos de GPS, así que asumo que mi GPS está conectado al puerto /dev/ttyUSB0.

Instalo el demonio GPS (gpsd), y otras utilidades Python para poder leer datos del GPS:

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

Asigno ahora en gpsd el puerto del GPS:

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

Y compruebo a ver si funciona con el siguiente programita:

cgps -s

¡Bingo! Me sale una pantalla como esta:

┌───────────────────────────────────────────┐┌─────────────────────────────────┐
│    Time:       2015-03-28T18:08:55.000Z   ││PRN:   Elev:  Azim:  SNR:  Used: │
│    Latitude:    40.xxxxxx N               ││  25    70    001    34      Y   │
│    Longitude:    3.xxxxxx W               ││  29    67    185    32      Y   │
│    Altitude:   691.7 m                    ││  14    47    254    46      Y   │
│    Speed:      2.7 kph                    ││  12    41    060    37      Y   │
│    Heading:    271.1 deg (true)           ││  31    29    311    44      Y   │
│    Climb:      0.0 m/min                  ││  24    26    130    18      N   │
│    Status:     3D FIX (29 secs)           ││   2    25    071    00      N   │
│    Longitude Err:   +/- 15 m              ││   6    05    033    00      N   │
│    Latitude Err:    +/- 24 m              ││  34    00    000    00      N   │
│    Altitude Err:    +/- 22 m              ││                                 │
│    Course Err:      n/a                   ││                                 │
│    Speed Err:       +/- 174 kph           ││                                 │
│    Time offset:     0.625                 ││                                 │
│    Grid Square:     IN80dk                ││                                 │
└───────────────────────────────────────────┘└─────────────────────────────────┘

(he puesto .xxxxxxx en las coordenadas)

Si pasa deja de funcionar o pasa algo raro, habrá que parar el servicio y reiniciarlo:

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

Además, esto hay que hacerlo cada vez que reiniciemos la Raspberry Pi, así que podemos colocarlos en /etc/rc.local

Conexión UART

En el post del GPS GY-NEO6MV2 explico cómo conectar el GPS por UART. Se hace de la misma forma.

Lectura de posición en Python

Tengo hechos varios scripts que consultan la posición GPS, velocidad, etc. por Python. Pero está algo desordenado y ahora mismo no lo voy a poner en limpio. Si alguien lo necesita, que por favor me lo pida.

Fijar la hora de la Raspberry Pi a través del GPS

Si queremos que la hora de la Raspberry Pi se fije a través de la hora obtenida por GPS, tenemos que instalar el servicio ntp, si es que no lo tenemos instalado:

sudo apt-get install ntp

Y después, editar el fichero /etc/ntp.conf, añadiendo lo siguiente al final del fichero:

# gps ntp
server 127.127.28.0 minpoll 4
fudge  127.127.28.0 time1 0.183 refid NMEA
server 127.127.28.1 minpoll 4 prefer
fudge  127.127.28.1 refid PPS

Y reiniciamos el servicio:

sudo service ntp restart

Comprobamos, ejecutando:

ntpq -p

Y obtenemos:

     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*ns1.indaloweb.n 193.190.230.65   2 u   17   64    3   22.815   -1.711   2.731
 static-21.herco 14.234.237.209   2 u   16   64    3   19.209   -4.084   3.189
 SHM(0)          .NMEA.           0 l    -   16    0    0.000    0.000   0.000
 SHM(1)          .PPS.            0 l    -   16    0    0.000    0.000   0.000

Esas dos últimas líneas son el GPS. A veces no se conecta bien, entonces hacemos:

sudo killall gpsd
sudo gpsd /dev/ttyUSB0 -F /var/run/gpsd.sock
sudo service ntp restart

Interferencias con la cámara

Tengo que advertir que hacer funcionar un GPS al mismo tiempo que la cámara de la Raspberry Pi puede suponer un verdadero problema. El cable plano o la propia cámara no están bien apantallados e interfieren con la recepción de la señal del GPS, llegando a impedir siquiera que funcione. Si acercas el GPS de tu móvil a la cámara, también deja de funcionar…

Para solucionarlo, o al menos mitigarlo, tenemos que alejar lo más posible la cámara del GPS. Para esto podemos comprar un cable plano más largo, como este o este. Mucho cuidado, pues uno de estos cables, creo que el chino, no es exactamente el de la Raspberry Pi, que requiere que las conexiones del cable (la zona “pelada”) estén en caras contrarias en ambos extremos, sino que viene con el cable con conexiones por un mismo lado. Si conectamos el cable así directamente, se sobrecaliente la cámara y se rompe. Reconozco que quemé dos cámaras así hasta que descubrí el motivo…

[foto cables largos y extremos pelados]

Otra estrategia puede ser apantallar el cable plano. He probado con papel de aluminio, que conecto luego a un pin tierra de la Raspberry Pi, y mejora algo, pero no totalmente.

[foto apantallando cable]

Pero lo que mejor me ha funcionado ha sido colocar un núcleo de ferrita en el cable, como este, que me costó mucho encontrar.

[foto núcleo de ferrita]

Al final, lo mejor es alejar la cámara del GPS lo más posible, y además apantallarlo, es decir, combinar las tres estrategias.

[Foto de la cámara y el GPS alejado]

 

Referencias

  •  http://blog.retep.org/2012/06/18/getting-gps-to-work-on-a-raspberry-pi/
  • http://open.konspyre.org/blog/2012/10/18/raspberry-flavored-time-a-ntp-server-on-your-pi-tethered-to-a-gps-unit/
  • http://www.danmandle.com/blog/getting-gpsd-to-work-with-python/

2 pensamientos en “Adafruit Ultimate GPS Breakout v3 en la Raspberry Pi

  1. Hola,

    Lanzo el comando sudo cat /dev/ttyUSB0 pero no me devuelve nada.

    Los comandos previos funcionan bien, la chapa que viene para soldar no la tengo soldada al Adafruit Ultimate GPS Breakout v3 ¿Es necesario tener dicha chapita soldada al gps?

    Espero tu respuesta.

    Un saludo

    • No sé a qué chapa te refieres, pero me imagino que sí. Si sudo cat /dev/ttyUSB0 no te devuelve nada es que no está conectado a ese puerto o no está funcionando

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *