Mostrando entradas con la etiqueta GPS6MV2. Mostrar todas las entradas
Mostrando entradas con la etiqueta GPS6MV2. Mostrar todas las entradas

sábado, 2 de noviembre de 2024

ESP8266 ADXL345 y openStreetMaps con NEO6MV2

Muy Buenas Arduineros y Arduineras

Ahora si, juntamos los proyectos con el sensor ADXL345 y el sistema GPS con NEO6MV2. Esta unión afecta tanto al microrontrolador ESP8266 tanto como al programa para Python.

Si ya has visto las entradas anteriores, Servidor socket adxl345 Servidor AP GPS NEO6MV2 socket interface hacemos un pequeño resumen.

Son interfaces para comunicar mediante Wi-Fi los sensores arriba descritos. En estas interfaces se muestran los datos de posición de los ejes para el ADXL345 y la telemetría de la señal GPS.

Tipo de conexión:

  • Cliente Se conecta a la red local.
  • Como punto de acceso Nos conectamos directamente al microcontrolador.

Ambas opciones funcionan igual de bien y la latencia dependerá más por la distancia que tengamos con respecto al módulo que por la lectura de los sensores.

En el caso que de que estemos usando un portátil la ventaja para la conexión cliente es que como estamos conectados al router de casa seguiremos teniendo internet. No pasa lo mismo con el modo AP, una vez conectado no tendremos acceso a internet a no ser que estemos usando ethernet.

El modo AP en el ESP8266 será muy útil en exteriores como gracias a su conexión directa con la interfaz.

Tener los datos de latitud y longitud esta bien pero es mucho mejor tener una representación visual del recorrido. Además podemos añadir puntos de control que irán construyendo un perímetro con estas referencias. Para lograr tener el mapa en la interfaz hemos recurrido a la librería de Tom Schimansky TkinterMapView

TkinterMapView

TkinterMapView es una biblioteca de Python que nos permite crear mapas interactivos dentro de aplicaciones que utilicen la interfaz gráfica de usuario (GUI) de Tkinter. En otras palabras, es una herramienta que te facilita la integración de mapas en tus programas.

Entre sus características destacan:

  • Mostrar mapas: Es su función principal, mostrar mapas basados en mosaicos como los que ofrece OpenStreetMap.
  • Interactuar con el mapa: Los mapas que creas con TkinterMapView son interactivos. Los usuarios pueden hacer zoom, desplazarse y, en algunos casos, buscar ubicaciones específicas.
  • Personalización: Puedes seleccionar entre diferentes proveedores de mapas y capas.
  • Agregar marcadores y overlays: También puedes añadir marcadores para señalar puntos de interés en el mapa y superponer diferentes capas de información, como datos geográficos o imágenes.
  • Facilidad de uso: La biblioteca es relativamente sencilla de usar, especialmente si ya estás familiarizado con Tkinter.
  • Integración con Tkinter: Al ser compatible con Tkinter, puedes combinar los mapas con otros elementos de tu interfaz gráfica.

Alguna de las funciones que más usaras son:

  • set_position - (set_position(x_lat, y_lon) Vamos a la posición dada por las coordenadas de latitud y longitud
  • set_marker - (set_marker(x_lat, y_lon) Crea un marcador en el mapa
  • set_zoom - (set_zoom(int)) Aplica zoom sobre el mapa
  • set_address - (set_address("Almeria", marker=True, text="Spain")) Nos sitúa en la ciudad especificada
  • set_polygon - (self.coordinates, name="Route NEO6MV2") con set_polygon crearemos una cerca que sera delimitada por una lista de puntos de latitud y longitud

Ahora que sabemos la novedad en este programa, este es un ejemplo sencillo de su uso con las funciones "set_position" y "set_marker":


import tkinter
import tkintermapview

# create tkinter window
root_tk = tkinter.Tk()
root_tk.geometry(f"{1000}x{700}")
root_tk.title("map_view_simple_example.py")

# Crea el widget con el mapa
map_widget = tkintermapview.TkinterMapView(root_tk, width=1000, height=700, corner_radius=0)
map_widget.pack(fill="both", expand=True)


# Establece la posición por latitud y longitud y aplica zoon 
map_widget.set_position(37.179790, -1.821792, marker=False)  # Garrucha, Almería 
map_widget.set_zoom(17)

# Establece la posición actual según su dirección
# map_widget.set_address("Garrucha, Almeria", marker=False)

def marker_click(marker):
    print(f"marker clicked - text: {marker.text}  position: {marker.position}")

# Establece un marcador, puede tener un color personalizado y comando "onClick"
marker_2 = map_widget.set_marker(37.179790, -1.821792, text="Garrucha Ayto.", command=marker_click)


root_tk.mainloop()



Con esta pequeña introducción a la librería TkinterMapView y como es prácticamente la única función añadida en el programa, ahora si, veamos la interfaz:

Para dar un toque diferente a la interz, le he aplicado una capa visual llamado "Forest ttk theme" alojado en GitHub para romper un poco con la monotonía del apartado visual por defecto


Como se puede apreciar, la parte superior es la dedicada al sensor ADXL345 y la parte inferior para el GPS NEO6MV2 junto con el mapa.

Para mostrar el mapa necesitamos tener conexión a internet, como explicaba más arriba esto no funcionará si estamos en el modo AP

Para usar el programa en modo AP no tendremos que realizar ningún cambio en la interfaz, pero si tener cargado el programa adecuado en el microcontrolador

Conexión ESP8266 como cliente:

Para conectarnos en modo cliente tenemos que averiguar la IP que nos asigna el router, esta información nos la proporciona el programa y la podemos ver en el monitor serial

Conexión ESP8266 como AP:

Por otra parte si nos conectamos en modo AP, primero tenemos que conectarnos a la red: "gpsServer" y su contraseña es "gps12345". Una vez estemos conectados al ESP8266, la dirección IP por defecto para el modo AP es 192.168.4.1

Espero que os guste y si estáis aprendiendo a programar en Python os puede ayudar con vuestros proyectos Aquí teneís otros enlaces de este blog relacionados con Python:

Programa de ejemplo de este articulo en GitHub

Otras interfaces:

Interfaz de ejemplo con Tkinter de este articulo en GitHub

Adxl Socket Server en GitHub

Aquí tienes otros enlaces de este blog relacionados con Python:

Muestra el estado del sistema Raspberry Pi

Raspberry pi PWM

Tienes este y otros proyectos en mi repositorio de GitHub

Espero que os guste el contenido, Saludos!!

miércoles, 2 de octubre de 2024

Modulo GPS 6MV2 Serial ESP8266 NodeMCU

¿Qué es el Módulo GPS-6MV2?

GPS-6MV2

El módulo GPS-6MV2 es un dispositivo electrónico pequeño y, sobre todo, económico. Este dispositivo que permite determinar la posición geográfica de un objeto, como un dron, a través de las señales emitidas por los satélites GPS. Es ampliamente utilizado en proyectos de electrónica, robótica y aplicaciones de seguimiento. Fácil de programar y con multitud de librerías disponibles para leer los datos que proporciona de manera serial. Datos que posteriormente se pueden buscar en paginas como Google maps.

Antes de empezar a programar vamos a ver primero sus características, los usos más comunes y, sobre todo, su funcionamiento.

Principales características módulo NEO-6MV2

  • Chipset: U-blox NEO-6M
  • Alimentación: 3.3V a 5V
  • Consumo: Aproximadamente 45mA en funcionamiento
  • Comunicación: Serial UART (TTL)
  • Velocidad de comunicación: Hasta 9600 bps (Configurable)
  • Precisión: Hasta 2.5 metros
  • Antena: Integrada (cerámica)
  • Temperatura de funcionamiento: -40°C a 85°C
  • Dimensiones: Pequeño y compacto
  • Memoria: EEPROM interna para configuración

 

¿Cómo Funciona el módulo GPS 6MV2?

El módulo recibe las señales de los satélites GPS, calcula su posición en base a la demora de las señales y proporciona esta información a través de la interfaz serial. Los datos que se pueden obtener incluyen:

  • Latitud y longitud: Coordenadas geográficas exactas.
  • Altitud: Altura sobre el nivel del mar.
  • Velocidad: Velocidad del dispositivo.
  • Curso: Dirección en la que se mueve el dispositivo.
  • Número de satélites: Cantidad de satélites detectados.
  • Hora: Hora UTC (Tiempo Universal Coordinado)

¿En que aplicaciones es un gran aliado?

La versatilidad del módulo GPS-6MV2 lo hace ideal para una amplia gama de proyectos y aplicaciones, entre las que destacan:
      Seguimiento:
    • Seguimiento de vehículos, personas o mascotas.
    • Sistemas de flotas.
    • Geolocalización de activos.
      Robótica:
    • Navegación autónoma de robots móviles.
    • Drones con GPS.
    • Vehículos aéreos no tripulados (UAV).
      Proyectos con microcontroladores:
    • Creación de sistemas de posicionamiento para Arduino.
    • Desarrollo de aplicaciones de geolocalización.
      IoT (Internet de las Cosas):
    • Dispositivos IoT con seguimiento GPS.
    • Sensores remotos con geolocalización.
      Meteorología:
    • Balones sonda con GPS.
    • Estaciones meteorológicas móviles.
      Deportes:
    • Seguimiento de actividades al aire libre (running, ciclismo, etc.).
    • Análisis de rutas.

Su capacidad para determinar la posición geográfica de un dispositivo hace que sea una opción popular y accesible para los aficionados a la electrónica y los ingenieros.

Sin embargo, como cualquier tecnología, el GPS-6MV2 presenta tanto ventajas como desventajas. A continuación, veremos los puntos positivos y negativos de este módulo, esto nos permitirá tomar la decisión adecuada sobre si aplicarlo o no en nuestro proyecto.

Ventajas del módulo GPS-6MV2:

  • Bajo costo: Es una opción económica para proyectos de GPS.
  • Fácil de usar: Su interfaz serial simplifica la integración con microcontroladores como Arduino.
  • Pequeño y ligero: Ideal para aplicaciones móviles.
  • Alta precisión: Proporciona datos de posición precisos para la mayoría de las aplicaciones.
  • Amplia disponibilidad: Se encuentra fácilmente en tiendas de electrónica y en línea.

Desventajas del módulo GPS-6MV2:

  • Precisión: La precisión, pese a ser muy buena en condiciones optimas, puede verse afectada por factores como la obstrucción de la señal GPS por edificios, vegetación o factores meteorológicos como la lluvia o tormenta. El número de satélites visibles se vera afectado por estos factores y se reducirá la precisión
  • Consumo de energía: Durante la búsqueda inicial el consumo es más elevado si lo comparamos a cuando el sistema ya ha establecido conexión.
  • Configuración: Es posible configurar el módulo para ajustar parámetros como la velocidad de baudios, el formato de datos y otros.

Como vemos no todo es bonito con el módulo GPS 6MV2, pero queda claro que sus ventajas lo hacen ideal para casi cualquier proyecto que requiera la posición de un objeto.

Librerías Arduino para el Módulo GPS-6MV2

Para comunicarnos con este módulo existen diversas librerías que puedes utilizar con Arduino para interactuar con el módulo GPS-6MV2. Cada una ofrece diferentes funcionalidades y niveles de complejidad. A continuación, te presentaré algunas de las librerías más comunes y algunas otras menos conocidas pero no por ello menos importantes:

 

Librerías Principales para el módulo GPS-6MV2

  • TinyGPS: Una de las librerías más populares y sencillas de usar. Proporciona una interfaz intuitiva para leer los datos NMEA (National Marine Electronics Association) del módulo GPS y extraer información como latitud, longitud, altitud, velocidad y tiempo. Es una excelente opción para comenzar.
  • TinyGPSPlus: Una versión mejorada de TinyGPS que ofrece funciones adicionales y un mayor rendimiento. Es ideal para proyectos que requieren un procesamiento más avanzado de los datos GPS.
  • Adafruit_GPS: Desarrollada, como su nombre indica, por Adafruit, esta librería proporciona una interfaz fácil de usar y es compatible con una amplia variedad de módulos GPS. Ofrece funciones para configurar el módulo, leer datos y calcular distancias.
  • NewSoftSerial: Esta librería no es específica para GPS, pero es útil si necesitas utilizar pines diferentes a los seriales estándar de Arduino para la comunicación con el módulo GPS.

Otras librerías menos conocidas

  • SparkFun_Ublox_GPS: Diseñada específicamente para los módulos GPS U-blox, como el NEO-6MV2. Ofrece un control más granular sobre las configuraciones del módulo y acceso a características avanzadas.
  • GPSLib: Una librería más completa que ofrece funciones para calcular distancias, rumbos y realizar otras operaciones geográficas.

Librería TinyGPSPlus y el ESP8266 NodeMCU

Es una de las librería de Arduino más populares y fáciles de usar. Procesa los datos específicos para del módulo GPS que transmite información en formato NMEA. Esta librería es una evolución de la librería TinyGPS.

Además de su facilidad de uso, cuenta con una amplia comunidad y documentación que nos proveen de toda la información necesaria para usos más específicos.

Para las conexiones entre microcontrolador y módulo unicamente usaremos 2 pines, más concretamente el pin, Rx GPIO0 (D3) y Tx GPIO2 (D4). Para la alimentación usaremos los 3.3V y GND.

Conexión entre NodeMCU y GPS6MV2

Es importante recordar que para muchos microcontroladores con un solo puerto serial, es imprescindible el uso de la librería "SoftwareSerial". Esta herramienta nos permite simular una comunicación serial en cualquier par de pines digitales de tu placa.


#include <tinyGPSPlus.h>
#include <SoftwareSerial.h>
/*
    Este ejemplo demuestra el uso de TinyGPSPlus, requiere el uso 
    de SoftwareSerial, para el dispositivo GPS-6MV2 usaremos 9600-baud 
    y conectado al pin GPIO 0 (Rx) y el GPIO 2(Tx) del microcontrolador
    ESP8266 NodeMCU.
*/

static const int RXPin = 0, TXPin = 2;
static const uint32_t GPSBaud = 9600;
String gpsdate = "";
String gpstime = "";

// Objeto TinyGPSPlus
TinyGPSPlus gps;

// Conexión serial con el dispositivo GPS
SoftwareSerial ss(RXPin, TXPin);

// Inicia el Serial y la comunicación GPS-6MV2 
void setup() 
	{
	Serial.begin(115200);
	delay(1000);
    Serial.println("Iniciando GPS-6MV2...");
	ss.begin(GPSBaud);
	}

void loop() 
	{
	Serial.println(neo6mv2data());
    smartDelay(1000);

	if (millis() > 5000 && gps.charsProcessed() < 10) 
    	{
    	Serial.println(F("No se reciben datos GPS, revise las conexiones"));
    	}
    }

static void smartDelay(unsigned long ms) {
	unsigned long start = millis();
	do 
    	{
		while (ss.available()) 
        	{
			gps.encode(ss.read());
            }
		} while (millis() - start < ms);
}

La función principal del loop() se hace una llamada a la función neo6mv2data() Esta es la función encargada de devolvernos un String con los datos que se mandan en la comunicación serial.


String neo6mv2data() {

  int satellites = -1;
  float hdop = 0.0;
  float location_lat = 0.0;
  float location_lng = 0.0;
  int age = 0;
  char dateBuffer[10]; // 00/00/0000
  char timeBuffer[8]; // 00:00:00
  float altitude = 0;
  float course = 0;
  float speed = 0;

  if (gps.satellites.isValid()) satellites = gps.satellites.value();
  else satellites = -1;
  if (gps.hdop.isValid()) hdop = gps.hdop.hdop();
  else hdop = -1;
  if (gps.location.isValid()) location_lat = gps.location.lat();
  else location_lat = 0.0;    
  if (gps.location.isValid()) location_lng = gps.location.lng();
  else location_lng = -1;
  if (gps.location.isValid()) age = gps.location.age();
  else age = -1;
  if (gps.altitude.isValid()) altitude = gps.altitude.meters();
  else altitude = -1;
  if (gps.course.isValid()) course = gps.course.deg();
  else course = -1;      
  if (gps.speed.isValid()) speed = gps.speed.kmph();
  else speed = -1;
  
   if (gps.date.isUpdated())
  {
    sprintf(dateBuffer, "%d/%d/%d", gps.date.day(), gps.date.month(), gps.date.year());
    gpsdate = String(dateBuffer);
  }
  
  if (gps.time.isUpdated())
  {
    sprintf(timeBuffer, "%d:%d:%d", gps.time.hour(), gps.time.minute(), gps.time.second());
    gpstime = String(timeBuffer);
  }

 return "<gps" 
            + String(satellites)
            + " " 
            + String(hdop)
            + " " 
            + String(location_lat,6)
            + " "
            + String(location_lng,6)
            + " "
            + String(age)
            + " "
            + String(gpsdate)
            + " "
            + String(gpstime)
            + " "
            + String(altitude, 2)
            + " "
            + String(course, 2)
            + " "
            + String(speed, 2)
            + ">";
}

Si nos fijamos en las lineas de location_lat o location_lng, al formar el Srting, conservamos los decimales, en este caso 6:


String(location_lat, 6) // x.000000

String(location_lng, 6)	// y.000000

Salida serial GPS-6MV2

Y esta es la captura de los datos seriales que recibe el microcontrolador ESP8266.

Cada uno de los valores esta delimitados por "< ">, con una cabecera con los caracteres "gps" y separados por un espacios " " y esto hace que a la hora de usar otro programa sea más sencilla su decodificación.

Versátil y barato, este módulo puede hacer las delicias de cualquier aficionado a la electrónica o la radio frecuencia. Esperamos que con esta información se pueden tener más claros ciertos conceptos y ventajas y desventajas del módulo GPS-6MV2.

Descargar ESP8266 Basic GPS6MV2 Serial desde GitHub

Saludos!!!