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€.
Adaptador USB a serie TTL PL2303. Vista frontal
Adaptador USB a serie TTL PL2303. Vista trasera
Conectamos el adaptador al GPS de la siguiente forma:
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/