miércoles, 15 de octubre de 2025

GPS NEO-6M sobre ESP32

Un módulo GPS NEO-6M conectado a un microcontrolador ESP32 nos permite obtener datos GPS en formato NMEA. También se pueden obtener fácilmente la latitud, la longitud, la altitud, la velocidad y la hora UTC usando la biblioteca TinyGPSPlus

Podemos realizar un diseño similar al siguiente con el Cirkit Designer.

Estos son los pines del GPS que se han de conectar en el ESP32. Como podemos ver, los cables que unen el Tx y Rx del GPS y del ESP32 están cruzados. El pin Tx de uno está unido con el pin Rx del otro y viceversa.

Programa de Arduino

/*********
  Rui Santos & Sara Santos - Random Nerd Tutorials
  Complete instructions at https://RandomNerdTutorials.com/esp32-neo-6m-gps-module-arduino/
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*********/

 // Define the RX and TX pins for Serial 2
#define RXD2 16
#define TXD2 17

#define GPS_BAUD 9600

// Create an instance of the HardwareSerial class for Serial 2
HardwareSerial gpsSerial(2);

void setup(){
  // Serial Monitor
  Serial.begin(115200);
  
  // Start Serial 2 with the defined RX and TX pins and a baud rate of 9600
  gpsSerial.begin(GPS_BAUD, SERIAL_8N1, RXD2, TXD2);
  Serial.println("Serial 2 started at 9600 baud rate");
}

void loop(){
  while (gpsSerial.available() > 0){
    // get the byte data from the GPS
    char gpsData = gpsSerial.read();
    Serial.print(gpsData);
  }
  delay(1000);
  Serial.println("-------------------------------");
}

El monitor serie mostrará información en formato NMEA con datos GPS. Al ejecutar este programa por primera vez, puede tardar unos minutos en obtener una posición. Empezará a obtener datos reales cuando el LED rojo empiece a parpadear.

La información en formato NMEA comienza con el carácter $ y cada campo de datos está separado por una coma.

$GPRMC ,110827.00,A,4107.32485,N,00831.79799,W,0.888,30.44,180724,,,A*4B 

$GPVTG ,30.44,T,,M,0.888,N,1.644,K,A*01 

$GPGGA ,110827.00,41XX.32485,N,00831.79799,W,1,07,0.99,123.1,M,50.1,M,,*48 

$GPGSA ,A,3,03,32,22,08,04,14,17,,,,,,,2.25,0.99,2.02*0A 

$GPGSV ,3,1,11,3,11,22,26,296,29,27,01,142,,32,17,042,23*48 

$GPGLL ,4107.32485,N,00831.79799,W,110827.00,A,A*7F

Existen diferentes tipos de sentencias NMEA. El tipo de mensaje se indica mediante los caracteres antes de la primera coma.

El GP después del $ indica que se trata de una posición GPS. $GPGGA es el mensaje NMEA GPS básico, que proporciona datos de ubicación y precisión en 3D.

En la siguiente sentencia:

$GPGGA ,110827.00,41XX.32485,N,008XX.XXXXX,W,1,07,0.99,123.1,M,50.1,M,,*48

110827  – representa la hora en la que se tomó la ubicación fija, 11:08:27 UTC

41XX.32845,N  – latitud 41 grados XX.32845,N

00831.79799,W  – Longitud 008 grados XX.XXXXX′ O

1  – calidad de la corrección (0 = no válida; 1 = corrección GPS; 2 = corrección DGPS; 3 = corrección PPS; 4 = cinemática en tiempo real; 5 = RTK flotante; 6 = estimada (estimación); 7 = modo de entrada manual; 8 = modo de simulación)

07  – número de satélites rastreados

0,99  – Dilución horizontal de la posición (menos de uno es ideal)

123.1, M  – Altitud, en metros sobre el nivel del mar

50.1, M  – Altura del geoide (nivel medio del mar) sobre el elipsoide WGS84

campo vacío – tiempo en segundos desde la última actualización de DGPS

campo vacío – número de identificación de la estación DGPS

*4 8 – los datos de la suma de comprobación, siempre comienzan con *

Las otras sentencias NMEA proporcionan información adicional:

$GPGSA  – DOP GPS y satélites activos

$GPGSV  – Información detallada del satélite GPS

$GPGLL  – Latitud y longitud geográfica

$GPRMC  – Datos esenciales de GPS pvt (posición, velocidad, tiempo)

$GPVTG  – La velocidad se ha mantenido

Se puede utilizar este analizador NMEA en línea y pegar sus oraciones allí para interpretar los datos del GPS.

Sin embargo, la forma más sencilla de obtener e interpretar los datos GPS deseados es analizar las sentencias NMEA directamente en el código. Para ello, podemos usar la biblioteca TinyGPSPlus, que proporciona métodos para extraer datos de las sentencias NMEA fácilmente.

A continuación se puede ver la posición de la antena del GPS respecto de la ventana que tiene más cerca. Desde aquí proporciona correctamente los datos que se muestran en el puerto serie. Estuvo funcionando sin interrupción durante más de un cuarto de hora.



El siguiente programa está realizado en SteamakersBlocks.

Cuando recibe la información de los satélites, envía por el puerto serie el valor de la latitud, longitud, altitud y hora UTC. Cuando recibe señal parpadea el led rojo del módulo GPS. El valor de la altitud no es estable, ha variado entre 90 y 150 metros.


1. ¿Qué es el GPS

El GPS (Sistema de  posicionamiento global, Global Positioning System) es un dispositivo que nos permite, a través de comunicación con satélites, determinar nuestra posición en el planeta Tierra.

El módulo GPS recibe señales de varios satélites y, mediante cálculos internos, determina:

Su posición (latitud, longitud, altitud)

La hora exacta

Pero:

El GPS no mide directamente una propiedad física como la presión o la temperatura.

Sólo procesa información que recibe de los satélites y la traduce a coordenadas.

Por eso, técnicamente, el GPS  no es un sensor, sino un periférico de comunicación y posicionamiento.

Comunicación con el microcontrolador

El GPS se comunica con nuestra placa a través del puerto serie o UART.

Un puerto serie envía la información mediante una secuencia de bits. Por eso se necesitan al menos dos conectores para realizar la comunicación de datos, RX (recepción) y TX (transmisión)

Por el contrario, un puerto paralelo enviaría la información mediante múltiples canales de forma simultánea. Por eso necesitan un número superior de conductores de comunicación, que varían en función del tipo de porte (igualmente existe la posibilidad de conductores adicionales además de los de comunicación).

Sin embargo, a medida que los procesadores se hicieron más rápidos, los puertos de serie fueron desplazando progresivamente los puertos paralelos a la mayoría de aplicaciones.

Un ordenador convencional dispone de varios puertos de serie. Los más conocidos son el popular USB (Universal Serial Port) y el ya casi olvidado RS-232 (el de los antiguos ratones).

Sin embargo, dentro del ámbito de la informática y automatización existe una gran cantidad adicional de tipos de puertos serie, como el RS-485, I2C, SPI, Serial Ata, Pcie Express, Ethernet o FireWire, entre otros.

UART (universally asynchronous receiver/transmitter), o Serial Port como se le conoce más habitualmente, es un protocolo de comunicación que permite la transmisión y recepción de datos de forma asíncrona entre dispositivos.

A diferencia de las comunicaciones síncronas, como el SPI o el I2C, el UART no requiere una señal de reloj adicional. Esto hace que sea una opción flexible y muy utilizada utilizada en una gran variedad de aplicaciones. Ya hemos utilizado un puerto serie anteriormente, para comunicarnos a través del USB con el ordenador.

Por ejemplo, cuando programamos la ESP32 y queremos visualizar datos por monitos serie, lo hacemos inicializando la comunicación a través del puerto con:

 ó por código: Serial.begin(115200);

Esto significa:

Empieza la comunicación UART

Envía y recibe datos en 115200 baudios (la “velocidad” de la conversación)

Veremos que el GPS utiliza una comunicación serie para comunicarse con nuestra placa.

2. Conexionado

Montaje

El GPS se conecta a un puerto serie de nuestra placa. En concreto, el ESP32 STEAMakers tiene 2 puertos serie: el 1 (pin RX D0, pin TX D1) y el 2 (pin RX2 D5, pin TX2 D4). Conectaremos el GPS al puerto serie 2, puesto que el 1 se utiliza para comunicaciones con el ordenador y, por ejemplo, cargar los programas desde el ordenador a la placa. Conectaremos el pin RX del GPS al pin TX2 (D4/IO17) de la placa, y el pin TX del GPS al pin RX2 (D5/IO16) de la placa. El Vcc (+) del GPS se conectará a + de la placa (V), y el GND (-) del GPS se conectará al - de la placa (G).

3. Reto - Posicionamiento GPS

Conecta la pantalla OLED y el GPS de forma correcta, y muestra en pantalla, de forma legible y ordenada, los valores de latitud, longitud y altitud cada segundo. La longitud y latitud con 6 decimales, y la altura con 2. Por defecto las variables numéricas, si las presentamos directamente en una pantalla, sólo nos ofrecen 2 decimales.



 


No hay comentarios:

Publicar un comentario