Ayuda sensor GPS GY-NEO6MV2

Buenas noches

Es la primera vez que escribo puesto que tengo arduino uno hace mucho tiempo pero por falta de tiempo nunca me habia puesto en serio con esto.

Tengo un problema creando un marcador para una motocicleta, quiero coger la velocidad via GPS, tengo el modulo GY-NEO6MV2 y he conectado por ahora un lcd1602 para probar luego intentare con un lcd tft.

El problema que tengo es que actualiza la velocidad cada 9 segundos aproximadamente en la pantalla. Y añadiendo un codigo para comprobar el checksum veo un problema de desbordamiento en el SoftwareSerial.

¿ Alguien podria echarme una mano para resolver este problema ?

Os lo agradezco de antemano, os adjunto el codigo y el error para que podais mirar.

Resistencia: -- Temperatura: 31 -- Velocidad : 1.07 -- Sped : 1 km/h -- Satelites: 6 -- Checksum : 28 -- Overfload : No
Resistencia: -- Temperatura: 31 -- Velocidad : 1.07 -- Sped : 1 km/h -- Satelites: 6 -- Checksum : 28 -- Overfload : No
Resistencia: -- Temperatura: 29 -- Velocidad : 1.07 -- Sped : 1 km/h -- Satelites: 6 -- Checksum : 29 -- Overfload : Si!
Resistencia: -- Temperatura: 31 -- Velocidad : 1.07 -- Sped : 1 km/h -- Satelites: 6 -- Checksum : 30 -- Overfload : Si!
Resistencia: -- Temperatura: 31 -- Velocidad : 1.07 -- Sped : 1 km/h -- Satelites: 6 -- Checksum : 30 -- Overfload : Si!
Resistencia: -- Temperatura: 29 -- Velocidad : 1.07 -- Sped : 1 km/h -- Satelites: 6 -- Checksum : 30 -- Overfload : No
Resistencia: -- Temperatura: 31 -- Velocidad : 1.07 -- Sped : 1 km/h -- Satelites: 6 -- Checksum : 30 -- Overfload : No

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

LiquidCrystal lcd(7, 8, 9, 10, 11 , 12);

 int sensorPin = A1;
 int medio=0;
 int Temperatura=0;
 int Rc=220;
 int val;
 int tempPin = A0;
 static const int RXPin = 4, TXPin = 3;
 static const uint32_t GPSBAUD = 9600;
 int speed1=0 ;
 int sat=0;
 
 TinyGPSPlus gps;
 SoftwareSerial ss (RXPin, TXPin);
 
void setup() { 
  lcd.begin(16, 2);
  Serial.begin(115200);
  ss.begin(GPSBAUD);
  lcd.setCursor(0,0); // Vision de pantalla generico no cambiara
  lcd.print("Temp: ");
  lcd.setCursor(11,0);
  lcd.print("Sat:");
   
}

void loop()

{
 while (ss.available() > 0 )
 gps.encode(ss.read());

  medio=analogRead(sensorPin); // 
  speed1=gps.speed.kmph();
  val=analogRead(tempPin);
  int mv = (val/1024.0)*5000;
  int cel = mv/10;
  int sat =gps.satellites.value();
  
  
  Serial.print("Resistencia: "); // Serial print
  //Serial.print(medio);
  Serial.print(" -- ") ;
  Serial.print(" Temperatura: ");
  Serial.print(cel);
  Serial.print(" -- Velocidad : ");
  Serial.print(gps.speed.kmph());
  Serial.print(" -- Sped : ");
  Serial.print(speed1);
  Serial.print(" km/h"); 
  Serial.print(" -- Satelites: ");
  Serial.print(sat); // Hasta aqui
  Serial.print(" -- Checksum : ");
  Serial.print(gps.failedChecksum());
  Serial.print(" -- Overfload : ");
  Serial.println(ss.overflow() ? "Si!" : "No");
  
  lcd.setCursor(6,0); // Print Celsius
  lcd.print(cel);
  // lcd.print(" --");
  lcd.setCursor(15,0); // Print Satellites ok
  lcd.print(sat);
  lcd.setCursor(0,1); // Print speed
  lcd.print(speed1);
  lcd.print("   km/h");
 }

Gracias de antemano y saludos
Jaime

Te aconsejo el uso de un módulo gps de 10Hz como por ejemplo este:

http://www.ebay.es/itm/Very-Small-MT3339-PA6C-GPS-multiwii-multirotor-arduino-flight-controller-/271079582518?pt=LH_DefaultDomain_71&hash=item3f1d9a2b36

y olvídate del software serial. Conéctalo al serial por hardware.

Hola Carmeloco

Gracias por responderme. ¿ Donde podria mirar como conectarlo por hardware ? Si pudieses decirme un ejemplo ya me espabilo yo buscando y probando!!

Muchas gracias por la respuesta, estoy mirando el modulo de ebay.

Saludos
Jaime

Elimina

#include <SoftwareSerial.h>

Cambia

SoftwareSerial ss (RXPin, TXPin);

por

Serial.begin(19200);

y las llamadas del tipo

 while (ss.available() > 0 )
 gps.encode(ss.read());

por

 while (Serial.available() > 0 )
 gps.encode(Serial.read());

Si usas un Uno, no podras ver cosas por la consola serie. Si usas un micro o un leonardo, puedes usar Serial1 para el gps y Serial para la consola serie por el puerto usb.

Hola Carmeloco

Gracias por tu rapida respuesta. Acabo de hacer lo que me dijiste, he conectado el modulo gps en el 0 y 1 de arduino respectivamente, siguiendo el orden de RX Y TX , sobre lo que me pusiste he cambiado tu texto a 9600 que es a lo que funciona el modulo, pero no tengo conexion con el GPS y mientras tengo los cables del gps conectado a 0 y 1, no consigo transmitir el codigo a Arduino Uno.

Gracias por tu tiempo

Me supera!!!
Dime y en lugar de preguntar no se te ocurre, desconectar el GPS y conectarlo al IDE para bajarle el nuevo programa y luego lo vuelves a conectar al GPS.
Leí mal o verás el resultado por LCD? Si es así puedes prescindir del monitor Serial.
Antes no existían estas cosas y ya que tu GPS responde mal al SoftwareSerial por eso Carmeloco te dijo que lo conectaras via hardware, pero todo no se puede. o tienes GPS o tienes Monitoreo Serial.

Hola

Lo siento soy nuevo y no me aclaro mucho, adjunto el codigo nuevo. Siento incordiar.

#include <LiquidCrystal.h>
#include <TinyGPS++.h>
#include <AltSoftSerial.h>
// #include <SoftwareSerial.h>

LiquidCrystal lcd(7,5, 6, 10, 11 , 12);

 int sensorPin = A1;
 int medio=0;
 int Temperatura=0;
 int Rc=220;
 int val;
 int tempPin = A0;
 static const int RXPin = 4, TXPin = 3;
 static const uint32_t GPSBAUD = 9600;
 int speed1=0 ;
 int sat=0;
 
 TinyGPSPlus gps;
 // SoftwareSerial ss (RXPin, TXPin);
 AltSoftSerial altSerial;

 
void setup() { 
  lcd.begin(16, 2);
  Serial.begin(115200);
  altSerial.begin(GPSBAUD);
  lcd.setCursor(0,0); // Vision de pantalla generico no cambiara
  lcd.print("Temp: ");
  lcd.setCursor(11,0);
  lcd.print("Sat:");
   
}

void loop()

{
 while (altSerial.available() > 0 )
 gps.encode(altSerial.read());

  medio=analogRead(sensorPin); // 
  speed1=gps.speed.kmph();
  val=analogRead(tempPin);
  int mv = (val/1024.0)*5000;
  int cel = mv/10;
  int sat =gps.satellites.value();
  
  
  Serial.print("Resistencia: "); // Serial print
  //Serial.print(medio);
  Serial.print(" -- ") ;
  Serial.print(" Temperatura: ");
  Serial.print(cel);
  Serial.print(" -- Velocidad : ");
  Serial.print(gps.speed.kmph());
  Serial.print(" -- Sped : ");
  Serial.print(speed1);
  Serial.print(" km/h"); 
  Serial.print(" -- Satelites: ");
  Serial.print(sat); // Hasta aqui
  Serial.print(" -- Checksum : ");
  Serial.print(gps.failedChecksum());
  Serial.print(" -- Overfload : ");
  Serial.println(altSerial.overflow() ? "Si!" : "No");
  
  lcd.setCursor(6,0); // Print Celsius
  lcd.print(cel);
  // lcd.print(" --");
  lcd.setCursor(15,0); // Print Satellites ok
  lcd.print(sat);
  lcd.setCursor(0,1); // Print speed
  lcd.print(speed1);
  lcd.print("   km/h");
 }

Gracias y saludos

surbyte:
Me supera!!!
Dime y en lugar de preguntar no se te ocurre, desconectar el GPS y conectarlo al IDE para bajarle el nuevo programa y luego lo vuelves a conectar al GPS.
Leí mal o verás el resultado por LCD? Si es así puedes prescindir del monitor Serial.
Antes no existían estas cosas y ya que tu GPS responde mal al SoftwareSerial por eso Carmeloco te dijo que lo conectaras via hardware, pero todo no se puede. o tienes GPS o tienes Monitoreo Serial.

Ok Surbyte, gracias por tu ayuda, mañana lo probare.

Muchas gracias y perdona por las molestias!!

Buenas noches

Es normal que no puedas subir código con el gps conectado al serial, ya que por ahí, sube también el código. Tendrás que desconectar el gps para subir código.

Por otro lado, ¿que es esto?

 AltSoftSerial altSerial;

¿y esto?

 Serial.begin(115200);
  altSerial.begin(GPSBAUD);

Olvídate de inventos. Inicializa el serial a 9600 en vez de a 115200 y no pongas cosas como el altserial ese.

También tendrás que eliminar los Serial.print, y mostrar los resultados por la LCD para las pruebas. Como te dije, si quieres consola serie, necesitas un arduino con más puertos serie.

Por experiencia, puedo decirte que el softwareserial, es una pesadilla, y más con GPS.

carmeloco:
Es normal que no puedas subir código con el gps conectado al serial, ya que por ahí, sube también el código. Tendrás que desconectar el gps para subir código.

Por otro lado, ¿que es esto?

 AltSoftSerial altSerial;

¿y esto?

 Serial.begin(115200);

altSerial.begin(GPSBAUD);




Olvídate de inventos. Inicializa el serial a 9600 en vez de a 115200 y no pongas cosas como el altserial ese.

También tendrás que eliminar los Serial.print, y mostrar los resultados por la LCD para las pruebas. Como te dije, si quieres consola serie, necesitas un arduino con más puertos serie.

Por experiencia, puedo decirte que el softwareserial, es una pesadilla, y más con GPS.

Buenas tardes Carmeloco

He puesto el codigo tal y como comentaste en el anterior post, cuando transmito desconecto el modulo GPS, como bien me indicasteis tu y Surbyte, pero ahora los satelites disponibles en el LCD son 0 y la velocidad logicamente es 0.

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

LiquidCrystal lcd(7, 8, 9, 10, 11 , 12);

 int sensorPin = A1;
 int medio=0;
 int Temperatura=0;
 int Rc=220;
 int val;
 int tempPin = A0;
 static const int RXPin = 4, TXPin = 3;
 static const uint32_t GPSBAUD = 9600;
 int speed1=0 ;
 int sat=0;
 
 TinyGPSPlus gps;
 // SoftwareSerial ss (RXPin, TXPin);
 
void setup() { 
  lcd.begin(16, 2);
  Serial.begin(9600);
  // ss.begin(GPSBAUD);
  lcd.setCursor(0,0); // Vision de pantalla generico no cambiara
  lcd.print("Temp: ");
  lcd.setCursor(11,0);
  lcd.print("Sat:");
   
}

void loop()

{
 while (Serial.available() > 0 )
 gps.encode(Serial.read());

  medio=analogRead(sensorPin); // 
  speed1=gps.speed.kmph();
  val=analogRead(tempPin);
  int mv = (val/1024.0)*5000;
  int cel = mv/10;
  int sat =gps.satellites.value();
  
  
  /* Serial.print("Resistencia: "); // Serial print
  //Serial.print(medio);
  Serial.print(" -- ") ;
  Serial.print(" Temperatura: ");
  Serial.print(cel);
  Serial.print(" -- Velocidad : ");
  Serial.print(gps.speed.kmph());
  Serial.print(" -- Sped : ");
  Serial.print(speed1);
  Serial.print(" km/h"); 
  Serial.print(" -- Satelites: ");
  Serial.print(sat); // Hasta aqui
  Serial.print(" -- Checksum : ");
  Serial.print(gps.failedChecksum());
  Serial.print(" -- Overfload : ");
  Serial.println(ss.overflow() ? "Si!" : "No"); */
  
  lcd.setCursor(6,0); // Print Celsius
  lcd.print(cel);
  // lcd.print(" --");
  lcd.setCursor(15,0); // Print Satellites ok
  lcd.print(sat);
  lcd.setCursor(0,1); // Print speed
  lcd.print(speed1);
  lcd.print("   km/h");
 }

Este es el codigo rectificado, es un Arduino UNO, tampoco quiero haceros perder mucho el tiempo, antes ya me reconocia satelites, 9 en los mejores casos, el problema que tenia era el resfresco de la pantalla, que era cada 9 segundos aprox. por eso hice el checksum en la señal del GPS, porque en el monitor serial se me actualizaba al segundo. El objetivo de la duda era saber el motivo de porque se me refresca la velocidad cada 9 segundos (aprox) si en el serial es al segundo.

Como bien decis el problema seguramente es el SoftwareSerial, lo cambie pero creo que algo hice mal o algo me falta por modificar.

Gracias por vuestro tiempo. Saludos
Jaime

Bueno a no desesperar que ya saldrá bien el proyecto.
Debes anticipar tus resultados porque al caracer de MonitorSerie es mas dificil ver como funciona el programa.
Mi primer pregunta es: Tienes antena para el GPS, digo una antena que mejore la sensibilidad de la entrada del GPS? Considéralo si no la tienes. Algo que puedas montar en tu motocicleta, claro.

Si la consigues, vuelve a intentar con SoftwareSerial a ver si la actualización sigue siendo cada 9 segundos o mejora. No superes 9600 si usas SoftwareSerial. Entiende.. se emula dos pines como si fueran pines dedicados a reciber y enviar datos seriales, no es lo mismo y consume tiempo del CPU, de modo que velocidades altas no son aconsejables.

Hola Carmeloco y surbyte

Teniais toda la razon del mundo, tarda como 8 minutos en conectar en frio, el refresco a bajado a 1,5 segundo aproximadamente. Muchisimas gracias por vuestra ayuda. Aun asi, he comprado un arduino mega para poder tener mas puertos seriales, para no tener que desconectar cada vez que actualizo y como bien dijo Carmeloco, comprare el gps de 10 hz que seguro, que baja de 1,5 segundos a casi resfresco instantaneo.

Muchisimas gracias!!!! Siento no poder agradeceroslo en conocimiento pero lo intentare!!!

Saludos y gracias
Jaime

Y cuando pruebas el ejemplo "FullExample" de la librería, y lo dejas corriendo por un rato ¿te sucede lo mismo?

gepd:
Y cuando pruebas el ejemplo "FullExample" de la librería, y lo dejas corriendo por un rato ¿te sucede lo mismo?

Hola gepd, me funciona lento pero perfecto, con buena cobertura y estando parado coge los satelites en menos de 1 minuto. El resfresco si sigue siendo lento, pero es por la velocidad de transmision. He comprado el gps que indico Carmeloco a ver si asi gano velocidad de refresco.

Muchas gracias por vuestro tiempo.

P.D. Ahora os abrire otro post relacionado con la velocidad a modo de odometro para el gps, a ver que os parece la idea

Bueno yo uso ese mismo GPS con arduino uno, y me funciona perfectamente. Actualiza cada 1 segundo.
Los problemas de checksum siempre están relacionados con los delays o alguna función que retrase la ejecución del código.
Me parece extraño tu problema, eso por eso que preguntaba como se ejecutaba el ejemplo que trae la librería.

gepd:
Bueno yo uso ese mismo GPS con arduino uno, y me funciona perfectamente. Actualiza cada 1 segundo.
Los problemas de checksum siempre están relacionados con los delays o alguna función que retrase la ejecución del código.
Me parece extraño tu problema, eso por eso que preguntaba como se ejecutaba el ejemplo que trae la librería.

Hola gepd

Si ahora va bien, pero un segundo es demasiado lento. En una moto un segundo de frenada son casi 30 km de diferencia, ya elimine todos los delays pero creo que el problema está limitado por el hardware que uso. Ahora adquirí un mega y un gps de 10hz a ver si mejora el tema. En cuanto lo tenga montado os aviso.

Gracias!!!!

jlloret:
Hola gepd

Si ahora va bien, pero un segundo es demasiado lento. En una moto un segundo de frenada son casi 30 km de diferencia, ya elimine todos los delays pero creo que el problema está limitado por el hardware que uso. Ahora adquirí un mega y un gps de 10hz a ver si mejora el tema. En cuanto lo tenga montado os aviso.

Gracias!!!!

Un segundo de diferencia no son 30 km de diferencia! Son 30km/h de diferencia. Las cosas por su nombre :slight_smile:

Para que nos hagamos a la idea, un segundo son:

segundo = 1/3600 = 0,000277778 // horas

Por lo que la diferencia en distancia es:

Distancia = 30 * 0,000277778 = 0.00833 //km

Es decir, 8 metros en un momento concreto en el que cambias mucho de velocidad. Se compensará con otras aceleraciones. Obviamente tienes problemas al integrar, pero trabajas en órdenes de kilómetros, ok que se nota, pero yo creo que tampoco tienes que martirizarte. Prueba a ver :slight_smile: