Robotics | Arcade | Electronics

Cart

Your Cart is Empty

Back To Shop

Tutorial Arduino: Modulo GPS GPS6MV2

Módulo 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.


44 thoughts on “Tutorial Arduino: Modulo GPS GPS6MV2

  1. Hola, muchas gracias por la publicación. Soy radioaficionado y me gustaría hacer esto mismo. Que se envíe las coordenadas en APRS, para luego colocar las salida a entrada de micrófono de handy VHF. Gracias

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

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

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

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

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

    1. Hola Migue.

      Creemos entender que te refieres a las tiras de pines que podrás encontrar en https://leantec.es/categorias/electronica/tiras-pin-zocalos-dip/

      Una vez soldados los pines a tu módulo:
      – Si utilizas las tiras de pines MACHO deberías usar cualquiera de nuestros cables DUPONT MACHO/HEMBRA.
      – En el acaso de elegir las tiras de pines HEMBRA deberías usar cualquiera de nuestros cables DUPONT MACHO/MACHO.

      Ambos cables puedes encontrarlos en nuestra sección de cableado https://leantec.es/categorias/electronica/cableado/ y deberías elegir la longitud que mejor se ajuste a tu proyecto, esto no modificará sus aplicación.

      Un cordial saludo.

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

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

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

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

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

  9. 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);
    }
    }
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    1. Buenas. Yo hice algo similar para recibir datos en el teléfono móvil mediante el módulo bluetooth y tuve que diseñar una aplicación android para recibir los datos y mostrarlos en pantalla

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

Cart

Your Cart is Empty

Back To Shop