
¿Qué es un GPS NEO-6?
Los dispositivos NEO-6 son una familia de receptores fabricados por U-Blox, que pueden ser conectados con facilidad a un autómata o procesador como Arduino.
Los GPS NEO-6 disponen de interface de comunicación UART, SPI, DDC (I2C) y USB. Soportan los protocolos NMEA, UBX binary y RTCM.
La familia de receptores GPS NEO-6 están diseñados para tener un pequeño tamaño, pequeño coste, y pequeño consumo. La intensidad de corriente necesaria es de unos 37mA en modo de medición continuo.
La tensión de alimentación es de 2.7 a 3.6V para los modelos NEO-6Q/6M, y 1.75-2.0V para los modelos NEO-6G.
Anuncio:
Frecuentemente se encuentran integrados en módulos que incorporan la electrónica necesaria para conectarla de forma sencilla a un Arduino. En la mayoría de los módulos, esto incluye un regulador de voltaje que permite alimentar directamente a 5V.
El GPS NEO-6 tiene un tiempo de encendido cold y warm de unos 30s, y en hot 1 segundo. La frecuencia máxima de medición es de 5Hz.
La precisión que en posición es de 2.5m, en velocidad 0,1m/s y en orientación 0.5º, valores más que aceptables para un sistema de posicionamiento GPS.
Los GPS son muy empleados en proyectos de electrónica y Arduino, especialmente en el caso de robots y vehículos como cuadricópteros.
Precio
Los receptores de GPS Neo-6 están diseñados para ser dispositivos de bajo precio. Podemos encontrar módulos como el NEO6MV2 por unos 3.60€, en vendedores internacionales de AliExpress o eBay.
Esquema de montaje
La conexión es sencilla, ya que vamos la UART disponible en el receptor de GPS. En primer lugar alimentamos el módulo conectando Vcc y Gnd del módulo, a 5V y Gnd de Arduino.
Para que la conexión no interfiera con el puerto serie normal vamos a usar la librería SoftSerial para establecer una comunicación empleando cualquiera de los pines.
En el ejemplo usaremos el Pin 3 para RX y el Pin 4 para TX. Recordar que en la comunicación serial los pines se conectan con sus opuestos, es decir, RX – TX y viceversa, por lo que el esquema es el siguiente.
Mientras que la conexión con el módulo, vista desde Arduino, quedaría de la siguiente forma.
Ejemplos de código
Obtener lectura NMEA
El código necesario es igualmente muy sencillo, al realizarse a través de puerto se serie. Empleamos la librería SoftSerial para crear un puerto en cualquier par de pines de Arduino.
#include <SoftwareSerial.h> const int RX = 4; const int TX = 3; SoftwareSerial gps(RX, TX); void setup() { Serial.begin(115200); gps.begin(9600); } void loop() { if (gps.available()) { char data; data = gps.read(); Serial.print(data); } }
Los datos obtenidos del NEO-6 están en formato $GPRMC, uno de las secuencias disponisbles en el protocolo NMEA (National Marine Electronics Asociation).
Esta secuencia tiene la forma
Siendo,
hhmmss.ss | Hora UTC |
A | Estado receptor (A = OK, V = warning) |
llll.ll,a | Latitud (a = N o S) |
yyyy.yy,a | Longitud (a = E o W) |
x.x | Velocidad en nudos in knots |
x.x | Curso en grados |
ddmmyy | Fecha UT |
x.x,a | Variacion magnética en grados (a = E o W) |
*hh | Checksum |
Por ejemplo, la secuencia
Tiene el siguiente significado
225446 | Hora 22:54:46 UTC |
A | Estado receptor A = OK |
4916.45,N | Latitud 49º 16.45 min Norte |
12311.12,W | Longitud 123º11.12 min Oeste |
000.5 | Velocidad 0.5 nudos |
054.7 | Curso 54.7º |
191194 | Fecha 19 Noviembre 1994 |
020.3,E | Variación magnética 20.3º East |
*68 | Checksum |
Obtener coordenadas con TinyGPS
Para interpretar la secuencia $GPRMC de forma sencilla disponemos de la librería TinyGPS, que nos permite parsear los datos obtenidos del módulo GPS.
El siguiente ejemplo emplea la librería TinyGPS para obtener las coordenadas (latitud y longitud) y mostrarlas en la pantalla.
#include <SoftwareSerial.h> #include <TinyGPS.h> TinyGPS gps; SoftwareSerial softSerial(4, 3); void setup() { Serial.begin(115200); softSerial.begin(9600); } void loop() { bool newData = false; unsigned long chars; unsigned short sentences, failed; // Intentar recibir secuencia durante un segundo for (unsigned long start = millis(); millis() - start < 1000;) { while (softSerial.available()) { char c = softSerial.read(); if (gps.encode(c)) // Nueva secuencia recibida newData = true; } } if (newData) { float flat, flon; unsigned long age; gps.f_get_position(&flat, &flon, &age); Serial.print("LAT="); Serial.print(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flat, 6); Serial.print(" LON="); Serial.print(flon == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flon, 6); Serial.print(" SAT="); Serial.print(gps.satellites() == TinyGPS::GPS_INVALID_SATELLITES ? 0 : gps.satellites()); Serial.print(" PREC="); Serial.print(gps.hdop() == TinyGPS::GPS_INVALID_HDOP ? 0 : gps.hdop()); } gps.stats(&chars, &sentences, &failed); Serial.print(" CHARS="); Serial.print(chars); Serial.print(" SENTENCES="); Serial.print(sentences); Serial.print(" CSUM ERR="); Serial.println(failed); }
Descarga el código
Todo el código de esta entrada está disponible para su descarga en Github.
Anuncio:
hola buenas, me ha sido de mucha ayuda tu información.
con arduino uno me funciona perfectamente, pero cuando lo intento hacer con mega, cambiando serial por serial1 y respetando los pines de conexión 19 y 18, no me funciona.
¿podrías ayudarme?
gracias de antemano
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?
Supongo que mientras no tengas 3d fix, el dato de la altura no te lo entrega. Me pasa lo mismo que a ti. Si puedes visualizar la trama gpgga en el momento que te da latitud y longitud, en la posición 9(dato de altura) o aparece 99 o sin dato(,,). Si te fijas en el nº de satélites a los que está “escuchando” seguro son 3 o 4 solo.
Gracias no sé mucho me ayudo
Hola! Gracias por los tutoriales, son bastante didácticos y pudiendo elegir, siempre prefiero tu blog. Pongo este comentario además de para agradecer, porque no consigo recibir frases, tengo el GPS neo 6M conectado a 4 y 3 y alimentado (su led se enciende en rojo), cuando corro cualquier ejemplo de TinyGPS o TinyGPS++, en el monitor serie solo aumenta la variable chars y csum error, pero no consigo datos correctos. He probado con un Arduino uno y un Leonardo, y cambiando de orden 3 y 4. Que mas puedo hacer? Comprar otro modulo GPS y probar?
Gracias y un saludo!
Hola..
Quería preguntarte si los pines del gps rx tx ¿no se podia conectar a los pines de arduino uno r3 D0 D1 que en teoría son para transmitir y recibir datos? y si no se puede ¿porque?
Saludos tienes un blog estupendo.
Hola Santi. Si que puedes usar los pines 0 y 1, pero son los que usa por defecto el Arduino para la comunicación serie (programación, monitor serie si lo usas…) y no se recomienda usarlos por eso.
Hola Luis, Primero felicitarte por tus tutoriales, son buenos y concisos, lo cual es de agradecer.
Según indicas al principio del tutorial este modulo GPS puede funcionar por el puerto i2C. ¿Conoces alguna librería que pueda facilitar este tipo de comunicación con un arduino.
Un saludo y gracias por tus tutoriales
La verdad que todas las que he visto tiran de UART (yo siempre lo he usado por UART)
Si descubres algo más, y quieres compartirlo, estamos encantados de escucharlo
Hola Luis, gracias a este tutorial ya me hice mi propio GPS,
Sin embargo ahora pretendo hacer un localizador para mi mascota, me pregunto si seria posible hacerlo con el modulo GPS Neo-6, sin conectarlo a una Arduino, es decir alimentarlo con una pila de 3,3v y leer su ubicación con la APP Tractive GPS por ejemplo, solo que no se que hacer con los TX y RX del módulo seguramente tendrán que estar conectados para poder recibir la señal de los satélites y emitir su posición,
¿puedes ayudarme?