Localización GPS con Arduino y los módulos GPS NEO-6


arduino-gps-neo-6

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

arduino-gps-neo-6-componente

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.

arduino-gps-neo-6-esquema

Mientras que la conexión con el módulo, vista desde Arduino, quedaría de la siguiente forma.

arduino-gps-neo-6-conexion

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

$GPRMC,hhmmss.ss,A,llll.ll,a,yyyyy.yy,a,x.x,x.x,ddmmyy,x.x,a*hh

Siendo,

hhmmss.ssHora UTC
AEstado receptor (A = OK, V = warning)
llll.ll,aLatitud (a = N o S)
yyyy.yy,aLongitud (a = E o W)
x.xVelocidad en nudos in knots
x.xCurso en grados
ddmmyyFecha UT
x.x,aVariacion magnética en grados (a = E o W)
*hhChecksum

Por ejemplo, la secuencia

$GPRMC,225446,A,4916.45,N,12311.12,W,000.5,054.7,191194,020.3,E*68

Tiene el siguiente significado

225446Hora 22:54:46 UTC
AEstado receptor A = OK
4916.45,NLatitud 49º 16.45 min Norte
12311.12,WLongitud 123º11.12 min Oeste
000.5Velocidad 0.5 nudos
054.7Curso 54.7º
191194Fecha 19 Noviembre 1994
020.3,EVariación magnética 20.3º East
*68Checksum

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);
}
Si te ha gustado esta entrada y quieres leer más sobre Arduino puedes consultar la sección tutoriales de Arduino

Descarga el código

Todo el código de esta entrada está disponible para su descarga en Github.



4.3 10 votes
Article Rating

Anuncio:

Previous Usar Arduino con los IMU de 9DOF MPU-9150 y MPU-9250
Next Medir el ángulo y sentido de giro con Arduino y encoder rotativo
10 Comments
oldest
newest
Inline Feedbacks
View all comments
Antonio Martín
5 years ago

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

Sergio
5 years ago

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?

Jesús
4 years ago
Reply to  Sergio

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.

Virginia
4 years ago

Gracias no sé mucho me ayudo

Javier
4 years ago

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!

santi
3 years ago

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.

Juanma
3 years ago
Reply to  santi

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.

Jorge
3 years ago

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

Santy
2 years ago

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?