Módulo GPS GPS6MV2

Tutorial Arduino: Modulo GPS GPS6MV2

Hola amigos tecnólogos; En nuestra entrada de hoy estudiaremos el módulo GPS GPS6MV2.

Aprendiendo el manejo de este dispositivo se nos abrirá las puertas de muchos e interesantes proyectos donde la localización, altura, velocidad o dirección de nuestro proyecto sea algo crucial para el funcionamiento del mismo.

Materiales necesarios

Arduino uno leantecArduino UNO R3
Modulo GPS6MV2Modulo GPS6MV2
Cables protoboard leantecCables

Conozcamos un poco más el módulo GPS6MV2

Este módulo GPS ideal para controlarlo con Arduino o con cualquier otro microcontrolador esta basado en el chip receptor NEO 6M de la marca UBLOX.

El GPSMV2 incluye una antena Cerámica lista para ser instalada directamente en la PCB. 

La PCB viene provista de conectores para la alimentación y la trasnmisión de datos (Vcc, Tx, Rx y Gnd).

Características técnicas

Receptor Ublox NEO 6M
Voltaje de alimentación 3V a 5V
Interfaz UART, comunicación asíncrona
Modelo GY-GPSMV2

Esquema de conexión

En el siguiente esquema se representa la forma de conectar nuestro GPS a Arduino.

La conexión la hacemos en los pines 3 y 4, ya que estos son los pines que usaremos para la comunicación serie en lugar de los que Arduino tiene por defecto que son el pin 0 y 1.

Esto lo hacemos para evitar tener que desconectar el módulo GPS de Arduino cada vez que necesitamos programar Arduino.

Para usar otros pines como puerto serie tenemos usar la librería software serial. Esta librería esta instalada por defecto en el IDE de Arduino.

Esquema de conexion GS6MV2

Código

En esta ocasión tenemos dos formas de recoger los datos que el GPS genera.

Código para la obtención datos puros

Con este código podemos leer constantemente el módulo GPS6MV2 y representar estos datos por el monitor serial.

Hay que tener en cuenta que la comunicación con el GPS se hace a 9600 baudios, pero la de Arduino con el monitor serial se hace a 115200 baudios, por lo que tenemos que cuando abramos el monitor serial tenemos que cambiar de 9600 a 115200 baudios.

#include <SoftwareSerial.h>
SoftwareSerial gps(4,3);

char dato=' ';

void setup()
{
 Serial.begin(115200);            
 gps.begin(9600); 
}

void loop()
{
  if(gps.available())
  {
    dato=gps.read();
    Serial.print(dato);
    delay (50);
  }
}

Con el código de más arriba se reciben los datos »puros» es decir datos que siguen el protocolo NMEA (National Marine electronics Asociation). Este es un protocolo standar para la recepción de datos GPS.

Datos GPS RAW
En la siguiente imagen podemos ver los datos del GPS.

Nosotros nos quedaremos con la linea marcada de rojo en la imagen de más arriba, la que empieza por GPRMC y descifraremos los datos que en ella aparecen de la siguiente forma:

120121.00: Nos indica la hora GMT ()
A: Nos indica que el dato de posición es correcto. (Si aparece una V es que no es correcto)
3718.51170: Nos indica la longitud ()
N: Nos indica al Norte.
00614.55235: Nos indica la latitud ()
W: Nos indica al Oeste
1.114: Nos indica la velocidad en nudos.
210416: Nos indica la fecha ()

Código para la obtención de datos con librería

Con este código obtenemos los datos con más orden. Para poder hacer esto necesitamos tener instalada la librería TinyGPS.

#include <SoftwareSerial.h>//incluimos SoftwareSerial
#include <TinyGPS.h>//incluimos TinyGPS

TinyGPS gps;//Declaramos el objeto gps
SoftwareSerial serialgps(4,3);//Declaramos el pin 4 Tx y 3 Rx

//Declaramos la variables para la obtención de datos
int year; byte month, day, hour, minute, second, hundredths; unsigned long chars; unsigned short sentences, failed_checksum; void setup() { Serial.begin(115200);//Iniciamos el puerto serie serialgps.begin(9600);//Iniciamos el puerto serie del gps //Imprimimos: Serial.println(""); Serial.println("GPS GY-GPS6MV2 Leantec"); Serial.println(" ---Buscando senal--- "); Serial.println(""); } void loop() { while(serialgps.available()) { int c = serialgps.read();
if(gps.encode(c)) { float latitude, longitude; gps.f_get_position(&latitude, &longitude); Serial.print("Latitud/Longitud: "); Serial.print(latitude,5); Serial.print(", "); Serial.println(longitude,5);


gps.crack_datetime(&year,&month,&day,&hour,&minute,&second,&hundredths); Serial.print("Fecha: "); Serial.print(day, DEC); Serial.print("/"); Serial.print(month, DEC); Serial.print("/"); Serial.print(year); Serial.print(" Hora: "); Serial.print(hour, DEC); Serial.print(":"); Serial.print(minute, DEC); Serial.print(":"); Serial.print(second, DEC); Serial.print("."); Serial.println(hundredths, DEC); Serial.print("Altitud (metros): ");
Serial.println(gps.f_altitude()); Serial.print("Rumbo (grados): "); Serial.println(gps.f_course()); Serial.print("Velocidad(kmph): ");
Serial.println(gps.f_speed_kmph()); Serial.print("Satelites: "); Serial.println(gps.satellites()); Serial.println(); gps.stats(&chars, &sentences, &failed_checksum); } } }

En la siguiente imagen vemos como se verán los datos recogidos por el GPS.

Pantallazo datos GPS
Salida de los datos obtenidos con el GPS

Por último y para comprobar que la información recopilada por el módulo GPS6MV2 introducimos la latitud y la longitud en Google Maps.

Google Maps con GPS Arduino

Esperamos que les sea de utilidad y no olviden que en nuestro blog encontrará muchos otros post de su interes.


Etiquetas: , , , ,

43 Comments

  • Jonatan dice:

    Gracias!!! Equipo de Leantec
    me ayudaron, logre montar el GPS con un ES8266MOD ya transmitir a mi red local las coordenadas

  • Gloria dice:

    Hola, me gustaría saber cuál es el alcance del GPS, quiero lanzarlo en un globo que subirá a unos 20km. Si alguien sabe… Muchas gracias

  • Ricardo dice:

    Buen dia. Como seguramente habran comprobado, al conectar el modulo NEO-6M, este comienza a emitir tramas NMEA en forma continua, a razon de una por segundo. Mientras se encuentra en este modo de operacion he intentado enviarle comandos por la misma puerta serie sin exito alguno. Por este motivo me surge la duda de si debo sincronizar el envio del comando con el espacio de silencio entre tramas, o si existe un comando para poner el modulo en modo eco y a partir de ahi comienza a funcionar en modo interrogado. Gracias.

  • Miguel dice:

    Hola saludos, estoy intentado hacer lo mismo con el gps neo-6m gyne06mv2 con antena que uno de color rojo pero no encuentro mucha informacion al respecto alguien que tenga informacion se lo agradeceria

  • alejo dice:

    Holas
    Para el cambio de semana de GPS y el apagon de varios dispositivos GPS, el NEO-6M Y 8M con fecha de compra del 2015 en adelante estan afectados por este problema, gracias

  • nelson dice:

    Hola.. También tengo problemas para ajustar la hora

  • Migue dice:

    Hola. Me ha parecido muy interesante el tutorial pues tengo un poyecto en mente parecido. Pero tengo una duda muy tonta que espero me perdoneis (llevo 15 dias trasteando con arduino, asi que muy novato). Compre ese mismo modulo gps y me llego tal cual la foto. Pero por lo que he visto hay que ponerle una especie de «peine» que es con lo que se conecta a la protoboard. Pero no tengi ni idea de como se llama esos pinchos para poder conectarlo. Como mi definicion es rara especifico. Son unas piezas metalicas (en este caso cuatro) unidas por un plastico que atraviesan los huecos de vcc, gnd, rx y tx y fijan el modulo a la protoboard.

    Gracias por adelantado

  • Ainhoa dice:

    Me funciona perfectamente pero la hora me la da mal pone en el monitor seie que son las 23:21 y en mi reloj son la 1:21 por lo que me gustaría saber como programarlo para que salga la hora relacionada con mi zona horaria que es España. He probado a hacer esto: byte hora-verano=2; byte hora; hora=hora+hora-verano; pero no me funciona

    • Leantec.ES dice:

      Hola Ainhoa, siguiendo nuestro ejemplo la variable es «hour», no «hora». Si tu intención es modificar la salida, puedes operar sobre esa variable pero definiendo una función para tal fin que controle que no acabes con 26 horas en un día 🙂

      En breve redactaremos una extensión para este tutorial explicando como aplicar distintas zonas horarias.

  • Ainhoa dice:

    He utilizado el mismo programa y cuando lo compiló se sube correctamente pero en el monitor serie solo me sale buscando señal y no me sale la longitud ni la latitud ni nada. Tengo un mega y un modulo GPS Neo 6M, alguien me podría decir porque es ??

    • Leantec.ES dice:

      Hola Ainhoa, puedes ir descartando posibles causas de error:
      – Asegurate de usar la última versión de la libreria TinyGPS.
      – Asegurate de estar enviando correctamente la alimentación necesaria al módulo
      – Asegurate de estar usando los pines que defines en el código fuente y prueba a cambiarlos para descartar una falla del Arduino Mega.

      Por último comentarte que existen reportes de problemas con ese módulo concreto, trata de verificar su correcto funcionamiento.

      • Ainhoa dice:

        El problema era que con el arduino mega lo tenía que conectar a los pines ex y tz y poner en el programa el serial correspondiente a esos pines. Pero gracias por la respuesta

  • gato dice:

    Hola Mr Leantec :
    He conseguido con wemos d1 r2 hacer la transmision por wifi red local(192.168.1.129 en mi red) , sin embargo es muy lenta y a veces se cuelga .
    Es posible que sea por la velocidad de transmision de serialgps.
    ¿Alguna idea?


    #include
    #include
    #include

    TinyGPS gps;
    SoftwareSerial serialgps(4,3);

    int year;
    byte month, day, hour, minute, second, hundredths;
    unsigned long chars;
    unsigned short sentences, failed_checksum;

    const char* ssid = "*********";
    const char* password = "*********";
    WiFiServer server(80);

    void setup()
    {

    Serial.begin(115200);
    serialgps.begin(9600);
    WiFi.begin(ssid, password);
    server.begin();
    Serial.println("");
    Serial.println("GPS GY-GPS6MV2 Leantec");
    Serial.println(" ---Buscando senal--- ");
    Serial.println("");
    }
    void loop()
    {
    while(serialgps.available())
    {
    int c = serialgps.read();
    if(gps.encode(c))
    {
    float latitude, longitude;
    gps.f_get_position(&latitude, &longitude);
    Serial.print("Latitud/Longitud: ");

    Serial.print(latitude,5);
    Serial.print(", ");
    Serial.println(longitude,5);
    gps.crack_datetime(&year,&month,&day,&hour,&minute,&second,&hundredths);
    Serial.print("Fecha: "); Serial.print(day, DEC); Serial.print("/");
    Serial.print(month, DEC); Serial.print("/"); Serial.println(year);
    Serial.print("Hora: "); Serial.print(hour, DEC); Serial.print(":");
    Serial.print(minute, DEC); Serial.print(":"); Serial.print(second, DEC);
    Serial.print("."); Serial.println(hundredths, DEC);
    Serial.print("Altitud (metros): "); Serial.println(gps.f_altitude());
    Serial.print("Rumbo (grados): "); Serial.println(gps.f_course());
    Serial.print("Velocidad(kmph): "); Serial.println(gps.f_speed_kmph());
    Serial.print("Satelites: "); Serial.println(gps.satellites());
    Serial.println();
    gps.stats(&chars, &sentences, &failed_checksum);

    WiFiClient client = server.available();
    // if (!client) {
    // return;
    // }
    delay(100);

    client.println("HTTP/1.1 200 OK");
    client.println("");
    client.print("<h1 align=center>Latitud/Longitud: ");
    client.print(latitude,4);
    client.print(", ");
    client.println(longitude,4);
    client.print("</h1>");

    client.println("<h1 align=center>Fecha: "); client.print(day, DEC);client.print("/");
    client.print(month, DEC); client.print("/"); client.print(year);
    client.print("</h1>");

    client.println("<h1 align=center> Hora(Z): ");client.print(hour, DEC); client.print(":");
    client.print(minute, DEC); client.print(":"); client.print(second, DEC);
    client.print("."); client.print(hundredths, DEC);
    client.print("</h1>");

    client.println("</html>");
    delay(1000);
    }
    }
    }

  • wabbit dice:

    ese modulo necesita conexion a internet?

  • JOSÉ dice:

    Hola mi estimado amigo muy buen aporte gracias
    Quisiera me puedas ayudar en un problema que tengo ya con varios códigos
    1.- La hora no es la misma
    ¿Coge la hora del satélite o de dónde?
    2.- Me sale la S de Sur y estoy posesionado en el norte
    3.- Los grados en 0.
    Espero me puedas ayudar, en espera de una favorable respuesta, deseándote éxitos!!!

  • Alejandro dice:

    Hola
    Sabes como guadar en memoria no volatil los parametros ?
    solo utilizo el $GPRMC (para no saturar el buffer) . ya logre que me diera solo ese comando, pero al apagarlo y volverlo a prender, me manda todos otra vez…

    gracias !!

  • Luis Salazar dice:

    hola buenas tardes. hice todo lo que dice en este tutorial. y no me capta la ubicacion el GPS, me sale la V que significa que no es correcta la ubicación. en un principio si me salio, pero ahora ya no me sale. entonces quisiera saber si esto tiene solucion, o es que mi gps se me malogró. gracias

    • Juancho dice:

      El error que veo que muchos cometen es que no saben que el módulo puede tener bastante mala recepción en edificios o sitios techados y es recomendable tenerlo al aire libre o al menos cerca de una ventana, y para que empiece a dar los datos correctos hay que esperar a que el led del módulo empiece a parpadear y deje de dar el void (v en el codigo NMEA), al empezar a parpadear el led está funcionando bien el módulo, en algunos casos para verificar el estado del módulo se puede cargar un codigo vacio al arduino (void setup y void loop en blanco) y conectando el TX del gps al RX o TX(no recuerdo bien) del arduino y ver que datos nos entrega

  • Juan dice:

    Hola a todos, alguien sabrá como calcular desplazamiento con este modulo, necesito marcar un punto, desplazarme una distancia x (que previamente fue seteada) y me de aviso cuando llegue a esta.Desde ya muchas gracias

  • Sergio dice:

    Hola. Estoy teniendo cierto problema con lo siguiente: compilo el programa y lo subo al arduino y siempre que lo ejecuto, recibo señal, bien. Pero en ocasiones, recibo los datos correctos pero en otras obtengo una altura de 1000000m y 255 satélites, lo cual es imposible. Entonces, no sé por qué es ni cómo solucionarlo. Podrían ayudarme?

  • Gustavo dice:

    Cuando corro el programa solo obtengo «⸮⸮⸮» Alguien sabe como puedo solucionar esto? estoy usando un arduino uno. Ya he intentado varios ejemplos y en todos obtengo caracteres raros.

  • rey salcedo dice:

    Excelente, gracias, todo funcionó con el arduino nano, mil gracias

  • Jorge Andrés Romero dice:

    Hola buenas tardes, primero que todo gracias por tan excelente tutorial. Soy nuevo en esto del arduino. Tengo una pregunta. Primero tengo un arduino MEGA en vez del UNO (no creó que tenga problema) siguiendo el pasó a pasó cada una de las indicaciones, en el monitor serial pueden pasar horas y no me arroja ningun tipo de dato, el gps enciende el link, quiere decir que funciona así como el arduino funciona también, no se que pueda estar haciendo mal o que pueda estar fallando, me podrian ayudar x favor. De ante mano muchas gracias.

  • Jose Alejandro dice:

    Hola buenas tardes,

    Tu sabes como puedo hacer la implementacion con Labview…??

    Infinitas gracias…saludos…

  • Mauricio dice:

    Hola, He adquirido el GpS6MV2 y ha sido imposible recibir datos utilizando arduino YUN, Solo obtengo asteriscos y ceros. Sin embargo utilizando el mismo programa y el arduino UNO funciona perfectamente. Que debo hacer para que funcione en el YUN, necesito recibir datos y subirlos a la web via wifi. Por favor responder. Muchas Gracias..

    • Jaime dice:

      Hola, tengo el mismo problema, me da ceros y asteriscos pero para arduino uno. Conseguiste solucionarlo? sabes a qué se debe? yo tengo un shield que incorpora el ublox.

      Saludos

  • javier dice:

    hola buenas, he utilizado el segundo programa y la librería,
    no me funciona, lo estoy utilizando con un arduino mega, ¿puede ser esa la causa?
    muchas gracias

  • Carlos dice:

    Yo he conseguido hacerlo funcionar… Ahora, en la hora me muestra 1 hora me la y en la altura se sube casi 100m más o menos…. Esto como se podría calibrar??

    • Sergio López dice:

      Podríamos hacer una escapada a la playa y situarte a una altura de nivel de mar o calibrarlo desde una zona donde conozcas exactamente la altura. Para calibrarlo deberías añadir o reducir un error

  • Blanca López dice:

    Buenos días,
    quería saber si sería muy complicado recibir esos datos en una tablet (qué cambiaría en el código) a través de un bluetooth hc-06 que ya estaría conectado a los pines Rx y Tx de Arduino.
    Muchas gracias.

  • Nicolás dice:

    Hola buenas, tengo un problema con el GPS, he probado con dos modelos distintos de GPS, actualmente estoy probando con el GY-GPS6MV2 con una placa arduino Leonardo. Al compilar el código de ejemplo de la librería TinyGPS simple_test en el moditor serie solo me saca
    CHARS=0 SENTENCES=0 CSUM ERR=0 ** No characters received from GPS: check wiring **
    He revisado que las conexiones esten bien e incluso he probado variar la velocidad del GPS desde 4800 hasta 115200 baudios y nada, ¿que podría ser?.
    Un saludo, gracias.

Deja una respuesta

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