Modulo GPS para trastear

Vamos por partes. La pila sirve para almacenar la última posición que obtubo el GPS. Esto sirve para que el GPS, haga un "quickfix". Es una función que, si no ha cambiado mucho la posición de los satélites desde la última vez, compara con la guardada, y consigue fijar la posición más rápidamente.

La ventaja de los GTop, es que funcionan hasta los 10Hz. Para proyectos en los que se necesita precisión a alta velocidad, son ideales, pero no es el caso que se trata aqui.

El neo6, tal y como viene de fábrica, da datos como coordenadas, fecha y hora (si no recuerdo mal GMT), número de satélites y nivel de señal de cada uno, heading (dirección con respecto al norte) velocidad, y seguro que me dejo alguna cosa.

Para conectarlo al pc, puedes usar el conversor ese, o puedes usar un arduino, conectando el GPS a los pines 0 y 1, sin que corra ningún sketch que use el puerto serie (el ejemplo de blink sirve), conectando el GPS y el arduino TX con TX y RX con RX. Así los pruebo yo, y puedo asegurar que funcionan.

Softwares para windows:

http://www.adafruit.com/datasheets/GlobalTop%20MT3339%20PC%20Tool%20v1.3%20without%20F2.0&I3.1.rar

http://www.adafruit.com/datasheets/MiniGPS_Tool_1.7.1.zip

Gracias por el aporte carmeloco,ahora si alguien tiene o consigue un código que de las coordenas y la hora para lcd i2C se lo agradesco enormemente.

Coincido con nuken, muy graan aporte carmeloco, se nota que hay alguien que entiende.. haha

@carmeloco , con poner un sketch que no use RX ni TX. y conectarlo al Arduino. El GPS Tool que nos has pasado lo detecta? :o Pues mira que bien! un cacharro menos xD

Respecto a lo de que imprima la latitud longitud y la hora, he encontrado un sketch que imprime bastastes datos.

Con la libreria TinyGPS parece que podemos manejarlo bastante bien

#include <SoftwareSerial.h>
#include <TinyGPS.h>


SoftwareSerial mySerial(10, 11); // RX, TX
TinyGPS gps;

void gpsdump(TinyGPS &gps);
void printFloat(double f, int digits = 2);

void setup()  
{
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  
  

  // set the data rate for the SoftwareSerial port
  mySerial.begin(9600);
  
  delay(1000);
  Serial.println("uBlox Neo 6M");
  Serial.print("Testing TinyGPS library v. "); Serial.println(TinyGPS::library_version());
  Serial.println("by Mikal Hart");
  Serial.println();
  Serial.print("Sizeof(gpsobject) = "); Serial.println(sizeof(TinyGPS));
  Serial.println();
  
}

void loop() // run over and over
{
  bool newdata = false;
  unsigned long start = millis();

  // Every 5 seconds we print an update
  while (millis() - start < 5000) {
    if (mySerial.available()) {
      char c = mySerial.read();
      // Serial.print(c);  // uncomment to see raw GPS data
      if (gps.encode(c)) {
        newdata = true;
        // break;  // uncomment to print new data immediately!
      }
    }
  }
  
  if (newdata) {
    Serial.println("Acquired Data");
    Serial.println("-------------");
    gpsdump(gps);
    Serial.println("-------------");
    Serial.println();
  }
  
}

void gpsdump(TinyGPS &gps)
{
  long lat, lon;
  float flat, flon;
  unsigned long age, date, time, chars;
  int year;
  byte month, day, hour, minute, second, hundredths;
  unsigned short sentences, failed;

  gps.get_position(&lat, &lon, &age);
  Serial.print("Lat/Long(10^-5 deg): "); Serial.print(lat); Serial.print(", "); Serial.print(lon); 
  Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");
  
  // On Arduino, GPS characters may be lost during lengthy Serial.print()
  // On Teensy, Serial prints to USB, which has large output buffering and
  //   runs very fast, so it's not necessary to worry about missing 4800
  //   baud GPS characters.

  gps.f_get_position(&flat, &flon, &age);
  Serial.print("Lat/Long(float): "); printFloat(flat, 5); Serial.print(", "); printFloat(flon, 5);
  Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");

  gps.get_datetime(&date, &time, &age);
  Serial.print("Date(ddmmyy): "); Serial.print(date); Serial.print(" Time(hhmmsscc): ");
    Serial.print(time);
  Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");

  gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
  Serial.print("Date: "); Serial.print(static_cast<int>(month)); Serial.print("/"); 
    Serial.print(static_cast<int>(day)); Serial.print("/"); Serial.print(year);
  Serial.print("  Time: "); Serial.print(static_cast<int>(hour)); Serial.print(":"); 
    Serial.print(static_cast<int>(minute)); Serial.print(":"); Serial.print(static_cast<int>(second));
    Serial.print("."); Serial.print(static_cast<int>(hundredths));
  Serial.print("  Fix age: ");  Serial.print(age); Serial.println("ms.");

  Serial.print("Alt(cm): "); Serial.print(gps.altitude()); Serial.print(" Course(10^-2 deg): ");
    Serial.print(gps.course()); Serial.print(" Speed(10^-2 knots): "); Serial.println(gps.speed());
  Serial.print("Alt(float): "); printFloat(gps.f_altitude()); Serial.print(" Course(float): ");
    printFloat(gps.f_course()); Serial.println();
  Serial.print("Speed(knots): "); printFloat(gps.f_speed_knots()); Serial.print(" (mph): ");
    printFloat(gps.f_speed_mph());
  Serial.print(" (mps): "); printFloat(gps.f_speed_mps()); Serial.print(" (kmph): ");
    printFloat(gps.f_speed_kmph()); Serial.println();

  gps.stats(&chars, &sentences, &failed);
  Serial.print("Stats: characters: "); Serial.print(chars); Serial.print(" sentences: ");
    Serial.print(sentences); Serial.print(" failed checksum: "); Serial.println(failed);
}

void printFloat(double number, int digits)
{
  // Handle negative numbers
  if (number < 0.0) {
     Serial.print('-');
     number = -number;
  }

  // Round correctly so that print(1.999, 2) prints as "2.00"
  double rounding = 0.5;
  for (uint8_t i=0; i<digits; ++i)
    rounding /= 10.0;
  
  number += rounding;

  // Extract the integer part of the number and print it
  unsigned long int_part = (unsigned long)number;
  double remainder = number - (double)int_part;
  Serial.print(int_part);

  // Print the decimal point, but only if there are digits beyond
  if (digits > 0)
    Serial.print("."); 

  // Extract digits from the remainder one at a time
  while (digits-- > 0) {
    remainder *= 10.0;
    int toPrint = int(remainder);
    Serial.print(toPrint);
    remainder -= toPrint;
  }

FUENTE

Hace un rato he dado el salto de fe :stuck_out_tongue_closed_eyes: y me he comprado este que tiene muchos vendidos jaja

A ver que tal sale...

Un saludo!

Es que me he peleado mucho con los gps, jajaja

Un consejo, usad la libreria tinyGPS++ que es mas nueva y va mejor.

Muchas gracias carmeloco!
Por ciero, por si quereis saber mas datos sobre mi futuro, espero que no muuy lejano, odenador de abordo :stuck_out_tongue: :stuck_out_tongue:

carmeloco entonces me dices que con el NEO6M no voy a tener ningún problema a la hora de portarlo en arduino uno a la hora de visionar las coordenadas en el lcd y la hora verdad,mas que nada por asegurarme de que me va a valer y no dejarlo de pisa papeles vale poco pero un poco de aquí un poco de alla se hace un móntante.

Nuken, para ver coordenadas y hora, con un refresco de datos por segundo, el neo6, sin problemas. Yo lo uso en un proyecto que no necesita refresco de alta velocidad.

Pues a mi ya me ha llegado! xD

Y que tal? Contento con él? O no lo has provado aún? Haha
Espero que vaya bien y sea facil de usar... cual te pillaste al final?

Me pille el neo6 xD

Acabo de iniciar el programa que paso carmeloco, y conectado TX- TX , RX-RX ha encontrado un par de satelites. Y ya me situa en coordenadas.

Queria preguntar.. veo muchos menús en este software, sirve parta configurar el GPS? alguna recomendación para configurarlo?

Estoy muy contento con el jajaja, como un niño chico en relles xD. Estoy deseando meterle mano al tracker que quiero hacer

Ole que bien pues, creo que encargaré el mio.. y cuando llegue empezare a trastear también :slight_smile:

El caso es que con el programa MT3339 PC Tools, en la pestaña NMEA casi todo el rato sale como si tuviera un formato invalido o algo asi:

$GPTXT,01,01,01,PMTK inv format*3E
$GPTXT,01,01,01,PMTK inv format*3E
$GPRMC,20558127.00,A,3659.52007,00894948933.43973,0.17528728715,,040915,,,D*68
$GPTXT,01,01,01,PMTK inv format*3E
$GPTXT,01,01,01,PMTK inv format*3E
$GPTXT,01,01,01,PMTK inv format*3E
$GPTXT,01,01,01,PMTK inv format*3E
$GPTXT,01,01,01,PMTK inv format*3E
$GPTXT,01,01,01,PMTK inv format*3E
$GPTXT,01,01,01,PMTK inv format*3E
$GPTXT,01,01,01,PMTK inv format*3E
$GPTXT,01,01,01,PMTK inv format*3E
$GPTXT,01,01,01,PMTK inv format*3E
$GPTXT,01,01,01,PMTK inv format*3E
$GPTXT,01,01,01,PMTK inv format*3E
$GPTXT,01,01,01,PMTK inv format*3E
$GPTXT,01,01,01,PMTK inv format*3E
$GPTXT,01,01,01,PMTK inv format*3E
$GPTXT,01,01,01,PMTK inv format*3E
$GPRMC,20515858728.00,A,3659.545687541954398,00333.43985,W,
0.414,,040915,,,D*66
$GPVTG,,T,,M,0.414,N,0.766,K,D*20
$GPGGA,205128.00,3659.519985278575872,08,0.98,875.5,M,46.5,M,,0000*45
$GPGSA,A,3,07,30,03,17,06,09,23,02,,,,,1.88,0.98,1.61*09
$GPTXT,01,01,01,PMTK inv format*3E
$GPTXT,01,01,01,PMTK inv format*3E
$GPTXT,01,01,01,PMTK inv format*3E
$GPTXT,01,01,01,PMTK inv format*3E
$GPTXT,01,01,01,PMTK inv format*3E
$GPTXT,01,01,01,PMTK inv format*3E

(He guarreado datos de las coordenadas, si xD)

Tiene 4 satelites cojidos, pero a veces pega golpes que coje 10 o 11

El caso esque con los sketch del Arduino no hay ningún mensaje de error, y me coje 7 satelites.
Por si a alguien le interesa el código (es el del ejemplo un poco cambiado)

#include <TinyGPS++.h>
#include <SoftwareSerial.h>

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

// The TinyGPS++ object
TinyGPSPlus gps;

// The serial connection to the GPS device
SoftwareSerial ss(RXPin, TXPin);

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

   Serial.print(F("Testeando la libreria TinyGPS++")); Serial.println(TinyGPSPlus::libraryVersion());
   Serial.println();
}

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("Localizacion: ")); 
 if (gps.location.isValid())
 {
   Serial.print(gps.location.lat(), 6);
   Serial.print(F(","));
   Serial.print(gps.location.lng(), 6);
 }
 else
 {
   Serial.print(F("Localizacion invalida"));
 }

 Serial.print(F("  Fecha/hora: "));
 if (gps.date.isValid())
 {
   Serial.print(gps.date.day());
   Serial.print(F("/"));
   Serial.print(gps.date.month());
   Serial.print(F("/"));
   Serial.print(gps.date.year());
 }
 else
 {
   Serial.print(F("Fecha invalida"));
 }

 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());
   Serial.print("Velocidad: ");
   Serial.print(gps.speed.kmph());
   Serial.print(" Satelites: ");
   Serial.print(gps.satellites.value());
   
 }
 else
 {
   Serial.print(F("Hora invalida"));
 }

 Serial.println();
}

Esos softwares están diseñados para los GPS Global Top. Pueden leer las sentencias nmea de otros, porque son standard, pero no puedes usar las opciones de configuración en otras marcas, porque no funcionan. Esas sentencias que te salen, deben ser que el software envía algún tipo de mensaje pidiendole información de versión o algo así al GPS, y al no ser gtop, responde como no válido, ya que las sentencias $GPTXT no pertenecen al standard nmea.

http://www.gpsinformation.org/dale/nmea.htm#nmea

En la pagina oficial de neo esta su software. Ahira estoy con el movil no puedo pasar el enlace, pero es muy facil de encontrar

Nitrosito, que tal va el gps? Conseguiste que te leyera todo bien?

Pues la verdad es que no lo he vuelto a probar. Ahora tengo un examen en la uni de física (que seguro lo suspendo jaja) y he estado liado intentando aprobarlo.

A ver si está semana le meto caña, le monto su SD, y voy por ahí a registrar coordenadas.

Pero cuando lo probé con el IDE de arduino registraba las coordenadas perfectamente. Yo os recomiendo que os pilleis uno. A mi me costo sobre 9€

Y a que velocidad se actualizaba mas o menos?

Hola buenas ,me uno al post me a llegado hoy el mio y e estado trasteando con el y con el código que a subido nitrosito,en el monitor seria no paran de salir coordenads y no paran de moverse,la hoar me la da con -2 dos horas de diferencia de donde estoy velocidad 0.99 y satélites 0 e sacado la antena ala calle que tengo que mide unos tres metros y no pilla ningún satélite,alguna sugerencia/ajuda/consejo?

Solo quiero que me muestre las coordenadas de donde esta posiocionado en ese momento y que se vea en un lcd,la hora dia y coordenadas.

Gracias.

¿Puedes poner el enlace de el GPS que has comprado exactamente?

Y si pones una foto de la antena mejor.

El mio es el Neo6M, que trae una antena (un cuadradito de unos 5x5cm) , y con eso ya pilla los GPS sin problemas (lo asomas a la ventana y los coje aún más rapido.

Un saludo