Seguimos investigando nuevas funciones para el módulo GPS GY-NEO6MV2, un módulo sencillo y económico que podemos implementar en cualquier microcontrolador, desde un Arduino UNO a un ESP32.
Pero como no siempre podemos tener un dispositivo conectado para leer los datos del GPS una solución sencilla es almacenarlos.
En este caso vamos el ESP8266 que será capaz de almacenar los datos relacionados con la posición, velocidad o altitud en su memoria interna, alrededor de 4MB. (Este valor puede variar según el modelo).
Para esta funcionalidad usaremos la libreía LittleFS de la que ya hemos hablado en "ESP8266 Como usar LittleFS para guardar información".
Los datos se almacenan en un archivo con formato JSON al ser uno de los formatos de intercambio de datos sencillo de escribir, ligero y eficiente. Ideal para microcontroladores.
Este archivo con los datos en formato JSON los descargaremos con un programa escrito en Python3 para poder procesarlos posteriormente a diferentes formatos como KML o GPX, muy utilizados por dispositivos deportivos, aplicaciones móviles como GAIA GPS o programas como Google Earth.
Componentes para GPS tracker con Wemos D1 Mini
Para este proyecto solo vamos a necesitar:
- ESP8266 Wemos D1 Mini (clon)
- Módulo GPS GY-NEO6MV2
- Batería
La conexión de los dispositivos GY-NEO6MV2 y Wemos D1 Mini
Librerías necesarias para Wemos D1 Mini
Para programar el Wemos D1 usaremos el IDE de Arduino y las siguiente librerías necesarias para la instalación del sketch:
- ESP8266Wifi
Gestiona la conexión WiFi en modo AP o cliente del ESP8266. Para este proyecto usaremos el modo AP.
- LittleFS
Sistema de archivos para almacenar datos en la memoria flash (similar a SPIFFS).
- TinyGPSPlus
Decodifica datos NMEA del módulo GPS y proporciona métricas (lat, lng, alt, etc.).
- ESP8266WebServer
Crea un servidor HTTP para manejar peticiones REST (GET/DELETE).
- SoftwareSerial
Permite comunicación serial con hardware no nativo (GPS en este caso).
- ArduinoJSON
Serializa/deserializa datos JSON para la API REST.
Veamos el flujo de trabajo para el ESP8266 Wemos D1 Mini
🖥️ Procesamiento: Wemos D1 Mini
Para que todo el proyecto funcione correctamente necesitaremos algunas librerías externas:
- Decodificación de datos GPS:
Convierte el formato NMEA a valores útiles como latitud, longitud, altitud o el número de satélites usando la librería TinyGPSPlus.
- Formato de datos JSON:
Serialización y estructura de datos en formato JSON usando la librería ArduinoJsonDynamicJsonDocument doc(200); // Crea JSON de 200 bytes doc["sat"] = String(gps.satellites.value()); // Satélites visibles doc["lat"] = gps.location.lat(); // Latitud doc["lng"] = gps.location.lng(); // Longitud doc["tim"] = gps.time.value(); // Hora (formato hhmmsscc) doc["alt"] = gps.altitude.meters(); // Altitud en metros doc["spe"] = gps.speed.kmph(); // Velocidad en km/h String response; serializeJson(doc, response); // Convierte JSON a String
- Almacenamiento con LittleFS:
Guarda datos o elimina el archivo en formato JSON en la memoria interna haciendo uso de la librería LittleFS.
LittleFS.open("/gps_data.json", "a"); // Abre el archivo "gps_data.json" en el directrorio raíz "/".
LittleFS.remove("/gps_data.json"); // Elimina el archivo "gps_data.json" en el directrorio raíz "/".
Crearemos un servidor web con la librería ESP8266WebServer que se instala cuando instalamos la placa ESP8266.
ESP8266WebServer server(80); // Creamos el servidor en el puerto 80.
server.on("/gps", HTTP_GET, handleGPSData); // GET /gps → Datos actuales
server.on("/download", HTTP_GET, handleDownload); // GET /download → Archivo JSON
server.on("/clear", HTTP_DELETE, handleClear); // DELETE /clear → Borra datos
Los Endpoints son rutas URL con un metodo HTTP asignado a una función:
- "/gps", HTTP_GET, handleGPSData:
Con esta petición obtenemos los datos en tiempo real desde la función: handleGPSData. - "/download", HTTP_GET, handleDownload:
Descarga el historial completo a un archivo con extensión JSON desde la función: handleDownload. - "/clear", HTTP_DELETE, handleClear:
Borra el el archivo con el historial con la función asignada handleClear.
Para comprobar que todo esta correcto podemos abrir el monitor serial y tiene que aparecer una salida similar a la que se muestra a continuación:
Obtención de datos GY-NEO6MV2 desde el navegador
Esta opción es la más sencilla de todas si solo necesitas el archivo JSON. Solo tienes que conectarte con la IP generada por ESP8266, normalmente la 192.168.4.1.
Podemos usar cualquiera de los 3 Endpoints definidos:
- http://192.168.4.1/gps
- http://192.168.4.1/download
- http://192.168.4.1/remove
con este comando borraremos la memoria del Wemos Mini D1
Obtención de datos desde Python
Otra de las opciones para descargar los datos es el programa que tenemos a continuación:
import requests
import json
# Configuración
IP_WEMOS = "192.168.1.41" # Reemplaza con la IP de tu Wemos
# 1. Obtener último dato (endpoint /gps)
response = requests.get(f"http://{IP_WEMOS}/gps")
if response.status_code == 200:
data = response.json()
print("Última posición:", data["lat"], data["lng"])
# 2. Descargar archivo completo (endpoint /download)
response = requests.get(f"http://{IP_WEMOS}/download")
if response.status_code == 200:
with open("gps_data.json", "wb") as f:
f.write(response.content)
print("Archivo descargado!")
Sencillo pero efectivo, utiliza dos de los EndPoints, /gps y /download que ya hemos visto más arriba y nos proporcionara un archivo llamado gps_data.json.py.
Obtención y procesamiento de datos desde Python
Pero con los datos del JSON "en crudo" es difícil aplicarlos a otras aplicaciones ya que no es un estándar. Para tener una mayor compatibilidad con otros dispositivos existen otros formatos de intercambio de datos como KML y GPX
El formato KML (Keyhole Markup Language)
Es el formato nativo de Google Earth/Google Maps y es ideal para visualización en mapas interactivos y también incluye estilos, colores, iconos personalizables.
- Excelente para visualización (Google Earth/Maps)
- Muy usado en aplicaciones web
- Menos compatible con dispositivos GPS físicos
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
<Placemark>
<name>Zona de Descanso</name>
<Polygon>
<extrude>1</extrude>>
<altitudeMode>absolute</altitudeMode>
<outerBoundaryIs>
<LinearRing>
<coordinates>
-3.579900,37.707300,1850.0
-3.580000,37.707300,1850.0
-3.580000,37.707400,1850.0
-3.579900,37.707400,1850.0
-3.579900,37.707300,1850.0
</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</Placemark>
</Document>
</kml>
El formato GPX (GPS Exchange Format)
Es el estándar universal para dispositivos GPS, creado específicamente para GPS (no adaptado como KML) y el formato nativo de la mayoría de dispositivos GPS
- Metadata completa: elevación, tiempo, satélites, etc.
- Múltiples tracks/routes en un archivo
- Waypoints (puntos de interés)
- Estándar abierto y bien documentado
<?xml version="1.0" encoding="UTF-8"?>
<gpx version="1.1" creator="WEMOS D1 Mini"
xmlns="http://www.topografix.com/GPX/1/1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">
<!-- Punto 1 -->
<trkpt lat="37.707408" lon="-3.579952">
<ele>1850.5</ele>
<time>2024-01-15T08:30:00Z</time>
<speed>2.5</speed>
<sat8></sat>
<extensions>
<hr>125</hr>
<cadence>85</cadence>
<temp>15</temp>
</extensions>
</trkpt>
</gpx>
Esta conversión de formato JSON a KML o GPX la podemos realizar de la mano Python y un programa que reúne todo lo que se ha visto hasta ahora. Conexión, descarga, visualización y conversión.
Esta diseñado para su uso en terminal y con el que obtendremos el archivo .json y lo convertirá a uno de los dos formatos, KML y GPX de manera independiente, o a los dos formatos al mismo tiempo.
Estas son las opciones del menú:
- 1. Descargar datos del WEMOS (JSON)
- 2. Cargar datos desde archivo JSON
- 3. Convertir a KML (Google Earth)
- 4. Convertir a GPX (Dispositivos GPS)
- 5. Convertir a AMBOS formatos
- 6. Ver información del WEMOS
- 0. Salir
Una vez terminado ya tenemos los archivos con las extensiones KML y GPX.
Vamos a utilizar el archivo generado en formato KML para mostrar la ruta en Google Maps:
Abrimos el navegador en la ruta earth.google.com y en la barra lateral izquierda nos aparece un sigo +.
Se abrirá un desplegable y seleccionamos "Importar KML/KMZ"
Y este es el resultado final de la importacion
Conclusión del proyecto:
La comunicación entre el ESP8266 WEMOS D1 Mini y el módulo GPS GY-NEO6MV2 ha demostrado ser una solución funcional y eficiente para la captura de datos de geolocalización.
El sistema constituye una base sólida para proyectos que requieran tracking GPS, pudiendo extenderse hacia aplicaciones de monitorización de flotas, seguimiento deportivo o recopilación de datos para análisis geográfico.
Es un ejemplo que podemos modular el diseño facilitando la incorporación de sensores adicionales como el ADXL345 o el MPU6050.
Archivos para descargar
Los archivos para descargar el ejemplo los podemos encontrar en GitHub en el repositorio ESP8266 GPS tracker KML converter
Espero que os guste el proyecto!! Saludos!!!
Aquí tienes otros enlaces de este blog relacionados con sensores y Arduino:










No hay comentarios :
Publicar un comentario