Antes de que Papa Nöel me trajese un Garmin Edge 705 solía grabar mis rutas en bicicleta con un GPS datalogger Globalsat DG-100. Pero claro, al pasarme al Garmin el DG-100 quedó postergado a la cesta de cacharrada de la bici. Hasta que se me ocurrió desempolvarlo y conectarlo a mi raspberry pi.
La explicación de cómo conectar el DG-100 la haremos con una raspberry pi con raspbian (aunque también funciona con xbian o raspbmc). Esta explicación es para acceder a la info desde línea de comando, no hace falta entorno gráfico.
Lo primero que he de explicar es que el DG-100, como la mayoría de los GPS dataloggers, tiene un modo de funcionamiento que se conoce como modo ratón (mouse mode). En este modo, los dataloggers envían al ordenador por un interface serie (en los modernos es USB) la información de su estado en un formato estándar que se llama NMEA. De esa manera, con un programa estilo Ozi Explorer, puedes ver en la pantalla de tu ordenador, en un mapa y en tiempo real, la posición en la que te encuentras.
ejemplo de Ozi Explorer en un tablet - foto de Noelex
La única manera de poner el DG-100 en modo ratón es conectándolo a un ordenador y enviándole un comando de "cambia a modo ratón", ya que por defecto, al encenderse se pone en modo datalogger (es decir, se pone a grabar la posición de GPS en una archivo cada x segundos o x metros). Existen algunos programas para poder controlar en DG-100 desde Linux, la mayoría para entornos gráficos.
Buscando y rebuscando, encontré un par de programas que permitían controlar el DG-100 desde línea de comandos. Uno estaba desarrollado en java y preferí desecharlo como opción para la raspberry pi (anda que no tengo tirado líneas de código en java, pero ponérselo a la raspi me pareció incorrecto), otro en C, de un tal Jean-Christophe Duberga pero que no tenía la opción de poner el DG-100 en mouse mode. ¿O si?
Buscando y rebuscando, encontré un par de programas que permitían controlar el DG-100 desde línea de comandos. Uno estaba desarrollado en java y preferí desecharlo como opción para la raspberry pi (anda que no tengo tirado líneas de código en java, pero ponérselo a la raspi me pareció incorrecto), otro en C, de un tal Jean-Christophe Duberga pero que no tenía la opción de poner el DG-100 en mouse mode. ¿O si?
Opción uno: háztelo tú mismo
1. modificando el código
Lo primero que hay que hacer es descargar el código de Jean-Christophe.
pi@raspberrypi ~ $ wget http://duberga.net/dg100/dg100-0.1.tgz
1. modificando el código
Lo primero que hay que hacer es descargar el código de Jean-Christophe.
pi@raspberrypi ~ $ wget http://duberga.net/dg100/dg100-0.1.tgz
En cuanto haya terminado la descarga, descomprimimos el fichero
pi@raspberrypi ~ $ tar xzvf dg100-0.1.tgz
Entramos en el directorio donde está el código fuente del programa dg100/src
pi@raspberrypi ~ $ cd dg100/src/
Y resulta que dentro del fichero libdg100.c hay una línea muy sospechosa:
unsigned char dg100_msg_enter_gmouse_mode[] = { 0xBC, 0x01};
Vaya, parece que si que está la parte de entrar en modo mouse, pero el programa no la tiene implementada. Sin problema, la añadimos. Editamos el código fuente del programa principal que se llama dg100.c. Yo lo hago con vi, pero puedes usar el editor que más te guste (nano, por ejemplo)
pi@raspberrypi ~/dg100/src $ vi dg100.c
En la parte de arriba del fichero, buscamos la definición de las acciones y añadimos la línea que he marcado en rojo.
typedef enum
{
LIST_TRACKS = 0 ,
EXPORT_SINGLE_TRACK = 1,
EXPORT_ALL_TRACKS = 2,
DELETE_ALL_TRACKS = 3,
MOUSE_MODE = 4
} action_t;
typedef enum Action actions;
Ya dentro de la parte main del programa, buscamos lo siguiente y añadimos lo que he marcado en rojo.
fprintf( stderr, "commands are:\n") ;
fprintf( stderr, " list-tracks list all available tracks\n") ;
fprintf( stderr, " export-track <index> export a single track\n");
fprintf( stderr, " export-all-tracks export a single track\n");
fprintf( stderr, " delete-all-tracks free DG100 memory\n");
fprintf( stderr, " mouse-mode put DG100 in NMEA mouse mode\n");
exit( EXIT_SUCCESS) ;
}
Seguimos bajando en el fichero y cuando nos encontremos las siguientes sentencias añadimos lo que está en rojo. Ya falta poco.
else if ( strcmp( argv[a], "export-all-tracks") == 0 )
{
action = EXPORT_ALL_TRACKS;
}
else if ( strcmp( argv[a], "delete-all-tracks") == 0 )
{
action = DELETE_ALL_TRACKS;
}
else if ( strcmp( argv[a], "mouse-mode") == 0 )
{
action = MOUSE_MODE;
}
}
else if ( strcmp( argv[a], "export-all-tracks") == 0 )
{
action = EXPORT_ALL_TRACKS;
}
else if ( strcmp( argv[a], "delete-all-tracks") == 0 )
{
action = DELETE_ALL_TRACKS;
}
else if ( strcmp( argv[a], "mouse-mode") == 0 )
{
action = MOUSE_MODE;
}
}
En la parte final del fichero, dentro del switch, añadimos lo que está en rojo. Es lo último.
case EXPORT_ALL_TRACKS:
dg100_get_tracks_list( gps_logger);
while ( track = dg100_get_next_track( gps_logger) )
{
export_track_as_gpx( gps_logger, track->index);
}
break;
case MOUSE_MODE:
dg100_enter_gmouse_mode(gps_logger);
break;
}
exit (EXIT_SUCCESS);
}
Grabamos y listo.
2. compilando
Lo primero que hacemos es ir al directorio anterior
pi@raspberrypi ~/dg100/src $ cd ..
Luego preparamos la compilación
pi@raspberrypi ~/dg100 $ ./configure
Y compilamos el programa
pi@raspberrypi ~/dg100 $ make
Cuando termine estará compilado, sólo queda instalarlo.
pi@raspberrypi ~/dg100 $ sudo make install
Ya tenemos el programa instalado.
Opción dos: usar una versión ya modificada y compilada
Lo primero que hay que hacer es descargar el código modificado por mi y ya compilado.
pi@raspberrypi ~ $ wget http://files.miorbea.com/dg100/dg100-0.1.tgz
Y como ya está modificado y compilado, lo descomprimimos
pi@raspberrypi ~ $ tar xzvf dg100-0.1.tgz
Vamos al directorio dg100
pi@raspberrypi ~ $ cd dg100
Y ahora instalamos el programa
pi@raspberrypi ~/dg100 $ sudo make install
Acceder a los datos del GPS
Para acceder a los datos del GPS, una vez que hayamos instalado la aplicación dg100 se hace de la siguiente manera:
Lo primero es poner el GPS en modo mouse.
pi@raspberrypi ~ $ dg100 mouse-mode
Y después volcamos a pantalla la salida del GPS en formato NMEA.
pi@raspberrypi ~ $ cat /dev/ttyUSB0
$GPGGA,180202.999,,,,,0,00,,,M,0.0,M,,0000*56
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPRMC,180202.999,V,,,,,,,270413,,,N*4E
$GPGGA,180203.999,,,,,0,00,,,M,0.0,M,,0000*57
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPRMC,180203.999,V,,,,,,,270413,,,N*4F
$GPGGA,180204.999,,,,,0,00,,,M,0.0,M,,0000*50
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGSV,3,1,09,25,70,029,21,29,58,180,,14,49,237,,12,38,063,28*7C
$GPGSV,3,2,09,31,34,308,,02,20,065,19,24,16,126,,04,05,034,*76
$GPGSV,3,3,09,32,01,309,*4A
$GPRMC,180204.999,V,,,,,,,270413,,,N*48
$GPGGA,180205.999,,,,,0,00,,,M,0.0,M,,0000*51
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPRMC,180205.999,V,,,,,,,270413,,,N*49
$GPGGA,180206.999,,,,,0,00,,,M,0.0,M,,0000*52
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPRMC,180206.999,V,,,,,,,270413,,,N*4A
$GPGGA,180207.999,,,,,0,00,,,M,0.0,M,,0000*53
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPRMC,180207.999,V,,,,,,,270413,,,N*4B
Si no entiendes NMEA
Tienes dos opciones, echarle un vistazo a esta explicación o instalar gpsbabel y hacer que te traduzca la salida a un formato un poco más comprensible, GPX, por ejemplo.
Para instalar gpsbabel, usamos apt-get
pi@raspberrypi ~ $ sudo apt-get install gpsbabel
Y después le ponemos la opción de que traduzca lo que sale del GPS en tiempo real
pi@raspberrypi ~ $ gpsbabel -T -i NMEA -f /dev/ttyUSB0
Y ahora nos sacará la info en GPX.
Fácil, ¿no?
Continuara.......
case EXPORT_ALL_TRACKS:
dg100_get_tracks_list( gps_logger);
while ( track = dg100_get_next_track( gps_logger) )
{
export_track_as_gpx( gps_logger, track->index);
}
break;
case MOUSE_MODE:
dg100_enter_gmouse_mode(gps_logger);
break;
}
exit (EXIT_SUCCESS);
}
Grabamos y listo.
2. compilando
Lo primero que hacemos es ir al directorio anterior
pi@raspberrypi ~/dg100/src $ cd ..
Luego preparamos la compilación
pi@raspberrypi ~/dg100 $ ./configure
Y compilamos el programa
pi@raspberrypi ~/dg100 $ make
Cuando termine estará compilado, sólo queda instalarlo.
pi@raspberrypi ~/dg100 $ sudo make install
Ya tenemos el programa instalado.
Opción dos: usar una versión ya modificada y compilada
Lo primero que hay que hacer es descargar el código modificado por mi y ya compilado.
pi@raspberrypi ~ $ wget http://files.miorbea.com/dg100/dg100-0.1.tgz
Y como ya está modificado y compilado, lo descomprimimos
pi@raspberrypi ~ $ tar xzvf dg100-0.1.tgz
Vamos al directorio dg100
pi@raspberrypi ~ $ cd dg100
Y ahora instalamos el programa
pi@raspberrypi ~/dg100 $ sudo make install
Acceder a los datos del GPS
Para acceder a los datos del GPS, una vez que hayamos instalado la aplicación dg100 se hace de la siguiente manera:
Lo primero es poner el GPS en modo mouse.
pi@raspberrypi ~ $ dg100 mouse-mode
Y después volcamos a pantalla la salida del GPS en formato NMEA.
pi@raspberrypi ~ $ cat /dev/ttyUSB0
$GPGGA,180202.999,,,,,0,00,,,M,0.0,M,,0000*56
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPRMC,180202.999,V,,,,,,,270413,,,N*4E
$GPGGA,180203.999,,,,,0,00,,,M,0.0,M,,0000*57
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPRMC,180203.999,V,,,,,,,270413,,,N*4F
$GPGGA,180204.999,,,,,0,00,,,M,0.0,M,,0000*50
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGSV,3,1,09,25,70,029,21,29,58,180,,14,49,237,,12,38,063,28*7C
$GPGSV,3,2,09,31,34,308,,02,20,065,19,24,16,126,,04,05,034,*76
$GPGSV,3,3,09,32,01,309,*4A
$GPRMC,180204.999,V,,,,,,,270413,,,N*48
$GPGGA,180205.999,,,,,0,00,,,M,0.0,M,,0000*51
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPRMC,180205.999,V,,,,,,,270413,,,N*49
$GPGGA,180206.999,,,,,0,00,,,M,0.0,M,,0000*52
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPRMC,180206.999,V,,,,,,,270413,,,N*4A
$GPGGA,180207.999,,,,,0,00,,,M,0.0,M,,0000*53
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPRMC,180207.999,V,,,,,,,270413,,,N*4B
Si no entiendes NMEA
Tienes dos opciones, echarle un vistazo a esta explicación o instalar gpsbabel y hacer que te traduzca la salida a un formato un poco más comprensible, GPX, por ejemplo.
Para instalar gpsbabel, usamos apt-get
pi@raspberrypi ~ $ sudo apt-get install gpsbabel
Y después le ponemos la opción de que traduzca lo que sale del GPS en tiempo real
pi@raspberrypi ~ $ gpsbabel -T -i NMEA -f /dev/ttyUSB0
Y ahora nos sacará la info en GPX.
Fácil, ¿no?
Continuara.......