27 de abril de 2013

Cómo conectar un Globalsat DG-100 a una Raspberry Pi

publicado por Oscar Fafián a las 22:07
ADVERTENCIA: en este blog casi siempre hablo de ciclismo, de todas maneras, alguna que otra vez toco otros temas, sobre todo si tiene algo que ver con esquí. Desde hace un tiempo tengo una (bueno, tres) raspberry pi. Una raspberry pi es un ordenador muy pequeñito, de bajo consumo, bajo coste y bastantes prestaciones, con el que se pueden hacer cosas bastante chulas, entre las que se encuentra conectarle cacharrada electrónica hecha por tí mismo. Algunos de mis compañeros de rutas me han preguntado si voy a llevar mi raspberry pi en la bici y, de momento, he dicho que no. Pero nunca se sabe.

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.

DG-100 conectado a mi raspberry pi

Mouse mode

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?

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

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;
          }
     }



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.......

blog comments powered by Disqus
Related Posts with Thumbnails

han comentado

Powered by Disqus

archivo del blog

(cc) 2008-2015 miorbea.com

Creative Commons License
Todo lo aquí publicado, salvo notificación expresa pertenece a miorbea.com y se licencia como Creative Commons Reconocimiento-Compartir bajo la misma licencia 2.5 España License.

Thumbnails powered by Thumbshots

El avatar de los comentarios de Disqus es de Bruno Maia, IconTexto - http://www.icontexto.com publicado con licencia creative commons para uso no comercial.