SOLUCIONADO! GPS NeoM8N y Arduino Nano

Hola.
Llevo algun tiempo intentando que mi Arduino Nano me muestre en el monitor de serie los datos de Latitud, Longitud y Altitud extraidos de los datos que me da el GPS.
Cuando conecto los pines RX y TX directamente al GPS, no tengo problema que aparezcan usando el siguiente codigo:

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:

}

Logicamente, cuando el GPS adquiere señal, aparecen todos los datos al completo.
ejemplo:

$GPGSV,3,1,09,01,54,299,18,03,32,216,28,08,64,138,13,10,15,044,18*7A

$GPGSV,3,2,09,14,25,304,,17,03,311,,21,71,354,24,27,29,133,06*7A

$GPGSV,3,3,09,32,28,073,26*4B

$GLGSV,3,1,11,65,45,158,21,66,00,187,,71,14,028,25,72,52,066,09*61

$GLGSV,3,2,11,77,02,216,,78,22,267,28,79,16,320,,81,05,298,*62

$GLGSV,3,3,11,86,05,098,,87,51,059,10,88,49,329,26*58

El problema viene cuando intento extraer los datos y quedarme solo con los de Latitud, longitud y altura. (Usando los datos dados por la linea $GNGGA
He usado multiples codigos y variaciones del mismo, pero siempre con el mismo resultado: el monitor de serie no muestra nada.

Ejemplo del codigo:

#include <TinyGPSPlus.h>
#include <SoftwareSerial.h>

static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 4800;

TinyGPSPlus gps;


SoftwareSerial ss(RXPin, TXPin);

void setup()
{
  Serial.begin(115200);
  ss.begin(GPSBaud);

  
}

void loop()
{
  // This sketch displays information every time a new sentence is correctly encoded.
  while (ss.available() > 0)
    if (gps.encode(ss.read()))
      displayInfo();

  if (millis() > 5000 && gps.charsProcessed() < 10)
  {
    Serial.println(F("No GPS detected: check wiring."));
    while(true);
  }
}

void displayInfo()
{
  Serial.print(F("Location: ")); 
  if (gps.location.isValid())
  {
    Serial.print(gps.location.lat(), 6);
    Serial.print(F(","));
    Serial.print(gps.location.lng(), 6);
  }
  else
  {
    Serial.print(F("INVALID"));
  }

  Serial.print(F("  Date/Time: "));
  if (gps.date.isValid())
  {
    Serial.print(gps.date.month());
    Serial.print(F("/"));
    Serial.print(gps.date.day());
    Serial.print(F("/"));
    Serial.print(gps.date.year());
  }
  else
  {
    Serial.print(F("INVALID"));
  }

  Serial.print(F(" "));
  if (gps.time.isValid())
  {
    if (gps.time.hour() < 10) Serial.print(F("0"));
    Serial.print(gps.time.hour());
    Serial.print(F(":"));
    if (gps.time.minute() < 10) Serial.print(F("0"));
    Serial.print(gps.time.minute());
    Serial.print(F(":"));
    if (gps.time.second() < 10) Serial.print(F("0"));
    Serial.print(gps.time.second());
    Serial.print(F("."));
    if (gps.time.centisecond() < 10) Serial.print(F("0"));
    Serial.print(gps.time.centisecond());
  }
  else
  {
    Serial.print(F("INVALID"));
  }

  Serial.println();
}

Que puedo estar haciendo mal? Alguna ayuda?

A primera vista no veo nada raro (justo estoy trabajando con un Neo 6), pero estoy con el móvil y no es muy cómodo para leer. :wink:

Prueba el ejemplo DeviceExample de la librería, si te funciona bien, compara que es lo que puede estar mal en el tuyo.

¿La velocidad de conexión del GPS está bien?
Porque por defecto suele venir a 9600.

Saludos

En principio todo está correcto. Los baudios a 9600,que es lo que me indican en todos los manuales que he visto.
Con algún código de ejemplo he conseguido que me salgan los"títulos" de los datos que quiero ver, pero los datos siempre a 0 o directamente no salen..
Justo después de haber probado que recibe señal con el programa sin líneas de código.
Es como si al cambiar de los pines RX y TX a, por ejemplo, el D3 y el D4 dejase de recibir datos.
He probado con dos placas Nano y con dos Uno, y en las 4, pasa lo mismo.

Entiendo pero en el código que posteaste dice

GPSBaud = 4800;

y esperaba

GPSBaud = 9600;

por esto te pregunté si los baudios están bien.

O sea, si corres el código tal cual está en #1 y el GPS está a 9600, no te va a funcionar nunca.

En caso contrario, no se que decirte, he probado el mío desde 9600 a 115200 por Serial y desde 9600 a 57600 con SoftwareSerial, con la misma librería y no he tenido ningún problema.

Lo uso para un track logger y velocimetro y va 10 puntos.
Te digo más, está conectado a un Nano y alimentado todo con 3.3V para no andar con adaptadores de nivel y, sorprendentemente, cero problema.

Incluso estoy pensando en hacerme de un Neo 8M para obtener mejores resultados (espero).

Veo lo que dices.
Es cierto que ese código tiene los baudios a 4800, pero lo modifiqué a 9600.
El tema es que he probado tantos, que ya no sabía cual era el bueno, y pegue el de ejemplo directamente, sin revisarlo.
Voy a volver a probar ese como dices tu, a ver si obtengo resultados correctos.
En caso de que no funcione, empiezo a plantearme algún problema en el módulo GPS.
Compré el 8 por el hecho de ser más nuevo y preciso que el 6, pero me planteo comprar el 6 por fiabilidad.
Voy a probar como has dicho y posteo los resultados.
Gracias

Consejo: instala el u-center y verifica todo desde la PC (vas a necesitar un adaptador USB a serie-TTL). Además es el soft necesario para configurar el GPS y sacarle más provecho.

Complicados, jejeje
Trabajo con Mac.
Si, lo se.. Sorry, pero es lo que hay.
He buscado cosas similares, pero no encontré nada.
En ese sentido, estoy muy limitado. :man_facepalming:

No se por qué, cuando vi que no había versión para Mac pensé "Espero que no tenga Mac..." :man_facepalming:t2:

La verdad no se me ocurre nada más que pueda ayudar.

1 Like

¿Estás conectando el Tx del GPS al RXPin (seria el 4 en el ejemplo de #1) del Uno/Nano, verdad?

Como ej. de lo que ves por serial cuando hay un Fix del GPS solo pusiste 2 sentencias $GPGSV y $GLGSV que son los datos satelitales de GPS y Glonass. ¿Fue un mal ejemplo o solo aparecen esas sentencias?

¿Probaste reenviar lo que entra por RXPin a Rx directamente?

#include <SoftwareSerial.h>

#define RXPin 4
#define TXPin 3

SoftwareSerial gps(RXPin, TXPin);

void setup() {
  Serial.begin(115200);
  gps.begin(9600);
}

void loop() {
  if (gps.available()) {
    Serial.write(gps.read());
  }
}

Deberías obtener algo similar a lo que viste cuando lo conectaste a Rx directamente.

Moderador:

Cuando pones un código en este foro, nosotros opinamos y respondemos por tus posteos cronologícamente publicados.
Recuérdalo para el futuro.

EDITO: basado en este comentario

No estarás dentro de tu casa no?

1 Like

Cita ¿Estás conectando el Tx del GPS al RXPin (seria el 4 en el ejemplo de #1) del Uno/Nano, verdad?

Si, esta conectado tal y como viene en el ejemplo. Es lo que comentaba con anterioridad. Cuando lo conecto directamente a los pines TX y RX (en Nano y en Uno) me muestra toda la cadena de caracteres NMEA completa.

CitaComo ej. de lo que ves por serial cuando hay un Fix del GPS solo pusiste 2 sentencias $GPGSV y $GLGSV que son los datos satelitales de GPS y Glonass. ¿Fue un mal ejemplo o solo aparecen esas sentencias?

Si, me salen todos, solo que no puse por ejemplo GNGGA, porque vienen las coordenadas de mi casa, jajaja. Pero salir, salen todos los datos correctamente.

Cita¿Probaste reenviar lo que entra por RXPin a Rx directamente?

No, eso no lo probé. Si he probado el codigo con las correcciones que me diste anteriormente. y creo que funciona. Solo que en el trabajo me ha sido imposible que encuentre satelites. Pero al menos el mensaje de error salía, cosa que anteriormente no salia. Cuando llegue a casa, pruebo a ver si trabaja correctamente.

Gracias por tu ayuda

Gracias por las aclaraciones. Soy novato en el foro y seguramente ando perdido en las reglas de posteo.

No estarás dentro de tu casa no?

No, para nada. He probado en el jardín. Y el domingo pase mas de 2 horas al fresco esperando señal del GPS. Cada vez que tengo que ver si funciona, abrigo y a la calle con el portatil...

Revisaste la antena, esta bien conectada?

Revisaste la antena, esta bien conectada?

Si, si.. de hardware todo bien. Si cuando hago el programa simple, sin lineas de código, encuentra señal sin problemas. Al principio le costó, pero luego ya tarda menos de 1 minuto en encontrar satelites.

Eso pasa con cualquier GPS que no tenga asistencia (AGPS, como en los móviles) cuando no lo conectas por varios días porque se desactualizan el almanaque y las efemérides (tablas de posiciones satelitales), así que no solo tiene que encontrar los satélites sino que tiene que descargar todos esos datos que "viajan" a unos pocos baudios por segundo (ahora no recuerdo exactamente la velocidad de descarga pero es bajísima).

Encima estos módulos traen una batería pequeñita y que probablemente ya viene medio estropeada por no tener carga desde que salió de fábrica y no dura más de un par de días, así que la data almacenada se pierde de todos modos.

Mis Garmin, por ej. cuando no los uso por un tiempo también tardan bastante por lo mismo, a pesar de tener batería casi a plena carga.

Revisá todo bien, si ves los datos por serial se tienen que poder procesar por la librería.

En todo caso cambia los pines 3 y 4 por 9 y 10, que son los más habituales con SoftwareSerial.

1 Like

El programa de Windows se puede correr en Mac. Hay un emulador para Mac y emula bien USB y puertos serie. Lo demas no reviste gran cosa asi que deberia funcionar. Me refiero a lo que @MaximoEsfuerzo te sugiere en el post#6

1 Like

Ayer imposible de probar.
A ver si hoy saco tiempo y aplico vuestros consejos.
Muchas gracias a todos

Buenas tardes a todos,

Después de probar todo lo comentado: DECEPCIÓN!!!!
Comento:

Cuando conecto mi modulo a mi placa de esta manera con el siguiente código, obtengo los datos del GPS correctamente:
Captura de pantalla 2023-03-08 a las 19.02.43

En cuanto he comprobado que la señal llega correctamente, modifico los pines tal y como me dijisteis de la siguiente manera:
Captura de pantalla 2023-03-08 a las 19.07.50

El resultado es el que podeis ver... NADA DE NADA!!!

Estoy desesperado..
¿Que estoy haciendo mal?
¿Se me escapa algo?

Gracias por adelantado por vuestra ayuda

Creo que tu problema es de niveles de tensión.
Entonces busqué conexiones entre NEO-M8N y NANO o UNO y me encuentro con esto

lo alimentan con 5V

Dice que lo alimentan con 5V poque tiene un regulador LDO de 5 a 3.3V por lo tanto tu problema es que debes alimentarlo con 5 y no con 3.3V
Por eso no te funciona bien.

Mira que lo he mirado veces, pero siempre he leído que recomendaban 3,3v...
Un día lo puse a 5v y pensé que me lo había cargado.
En cuanto llegue a casa, pruebo.

Muchas gracias, da gusto con gente así