[Résolu]Librairie TinyGPS et voie Série

Bonjours à tous,

Dans le cadre d'un projet futur, j'essaie d'appréhender le fonctionnement de la librairie TinyGPS, pour ce faire j'envoie des trames NMEA sur la voie série à ma carte Arduino UNO R3, j'utilise l'IDE officiel en v1.6.5 sous Mac OS X.

J'ai écris ce bout de code ci dessous et en bref, quand j'envoie une trame NMEA sur la voie série, j'espère en retour l'affichage de la latitude et longitude à la fois en retour sur le moniteur série et sur le lcd.

Seulement, ça ne fonctionne pas et me renvoie:

lat: 999999999
lon: 999999999 (que ce soit sur lcd et moniteur)

et forcement c'est renvoyé autant de fois que la trame contient de caractère, c'est à dire environ 80 fois.

J'avoue avoir essayer plein de solution mais la je sèche complètement.
Est ce que la lib requiert forcement de passer par un SoftSerial?

Ci dessous mon code:

Merci d'avance de l'aide que vous pourriez m'apporter

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

LiquidCrystal lcd(11,10,9,8,7,6); // Declaration lcd 16x2 
TinyGPS gps; // creation objet GPS

long lat,lon; // variable stockage latitude et longitude

void setup() {
Serial.begin(9600); // ouverture voie serie
lcd.begin(16,2); //initialisation du lcd 16x2
 
}

void loop()
{
  while (Serial.available()) 
  {
   //int c = Serial.read();
   //gps.encode(c);
   gps.encode(Serial.read());
   delay(10);
   

    gps.get_position(&lat,&lon); // parse latitude et longitude
    
    Serial.println("Position: ");
    Serial.print("lat: ");Serial.print(lat);Serial.println(" ");// print latitude
    Serial.print("lon: ");Serial.println(lon); // print longitude
   
    lcd.print("lat: ");lcd.print(lat);// print latitude sur lcd
    lcd.setCursor(0,1);
    lcd.print("lon: ");lcd.print(lon); // print longitude sur lcd
    }}

    
    //TRAME NMEA D'ESSAI
    //$GPGGA,064036.289,4836.5375,N,00740.9373,E,1,04,3.2,200.2,M,,,,0000*0E
    //$GPGGA,123519,4807.038,N,01131.324,E,1,08,0.9,545.4,M,46.9,M, , *42

bonjour
Rapidement et à l'oeil tes trames de test ne semblent pas valides

//TRAME NMEA D'ESSAI
//$GPGGA,064036.289,4836.5375,N,00740.9373,E,1,04,3.2,200.2,M,,,,0000*0E <--- manque une virgule avant le checksum
//$GPGGA,123519,4807.038,N,01131.324,E,1,08,0.9,545.4,M,46.9,M, , *42 <--- un espace en trop avant le cheksuim

Merci de ta réponse Artouste, mais malgré ça aucune différence

Jambe:
Merci de ta réponse Artouste, mais malgré ça aucune différence

tes sentences NMEA viennent d'un log ou tu les a construites ? cheksum inclus ?
tu les injecte avec quoi ?

C'est des exemples de trame trouvée sur le net, via gogole principalement

Je les injectes par le moniteur serie

Jambe:
C'est des exemples de trame trouvée sur le net, via gogole principalement

Je les injectes par le moniteur serie

tu utilise quel logiciel pour faire la transmission vers l'arduino ?
tu insere bien les terminateurs en fin de sentences ?
perso je n'utilise plus tinygps mais tinygps++
un exemple de sentences à envoyer

"$GPRMC,045103.000,A,3014.1984,N,09749.2872,W,0.67,161.46,030913,,,A7C\r\n"
"$GPGGA,045104.000,3014.1985,N,09749.2873,W,1,09,1.2,211.6,M,-22.5,M,,0000
62\r\n"
"$GPRMC,045200.000,A,3014.3820,N,09748.9514,W,36.88,65.02,030913,,,A77\r\n"
"$GPGGA,045201.000,3014.3864,N,09748.9411,W,1,10,1.2,200.8,M,-22.5,M,,0000
6C\r\n"
"$GPRMC,045251.000,A,3014.4275,N,09749.0626,W,0.51,217.94,030913,,,A7D\r\n"
"$GPGGA,045252.000,3014.4273,N,09749.0628,W,1,09,1.3,206.9,M,-22.5,M,,0000
6F\r\n";

Je fais tout sous l'IDE arduino en 1.6.5 , et donc le moniteur série de l'IDE,

les trames que tu me donnes ne fonctionne pas plus et si j'essaie avec TinyGPS++ (en modifiant le code correctement) , j'ai le même problème à la différence près que ma Uno renvoie 0,000000

Jambe:
Je fais tout sous l'IDE arduino en 1.6.5 , et donc le moniteur série de l'IDE,

les trames que tu me donnes ne fonctionne pas plus et si j'essaie avec TinyGPS++ (en modifiant le code correctement) , j'ai le même problème à la différence près que ma Uno renvoie 0,000000

mets ton code complet

et le code avecTinyGPS++

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

LiquidCrystal lcd(11,10,9,8,7,6); // Declaration lcd 16x2 
TinyGPSPlus gps; // creation objet GPS



void setup() {
Serial.begin(9600); // ouverture voie serie
lcd.begin(16,2); //initialisation du lcd 16x2
 
}

void loop()
{
  while (Serial.available()) 
  {
   
   gps.encode(Serial.read());
   

   Serial.print("LAT=");  Serial.println(gps.location.lat(), 6);
Serial.print("LONG="); Serial.println(gps.location.lng(), 6);
Serial.print("ALT=");  Serial.println(gps.altitude.meters());

}}

Jambe:
et le code avecTinyGPS++

je ne comprend pas où tu defini le serial à destination du parser Tinygps (ou tinygps++)

Artouste:
je ne comprend pas où tu defini le serial à destination du parser Tinygps (ou tinygps++)

C'est peu être moi qui comprend mal comment bien définir le serial à destination du parser.

Dans tout les différents tuto/post/projet fini etc... que j'ai pu trouver et étudier, à chaque fois la librairie Software serial est utilisée pour definir les broches Tx et Rx mais pour tourner avec un module GPS

Hors, de mon coté, j'utilise pas de module GPS, je cherche à l'émuler sur la voie serie et donc en entrant manuellement les trames NMEA dans le moniteur serie sur mon ordi, ma Uno connectée en USB.

Suis-je clair?

Jambe:
C'est peu être moi qui comprend mal comment bien définir le serial à destination du parser.

Dans tout les différents tuto/post/projet fini etc... que j'ai pu trouver et étudier, à chaque fois la librairie Software serial est utilisée pour definir les broches Tx et Rx mais pour tourner avec un module GPS

Hors, de mon coté, j'utilise pas de module GPS, je cherche à l'émuler sur la voie serie et donc en entrant manuellement les trames NMEA dans le moniteur serie sur mon ordi, ma Uno connectée en USB.

Suis-je clair?

oui
Je viens de faire un test avec l'exemple modifié DeviceExample de tinygps++
chez moi ça fonctionne bien avec des données log injectées :
à la main par le serial monitor en oubliant pas de mettre les 2 terminateur
en auto avec un logiciel de terminal en utilisant un fichier log injecté (qui contient les terminateurs)
attention au timeout de 5 secondes

le code

#include <TinyGPS++.h>
// #include <SoftwareSerial.h>
/*
   This sample sketch demonstrates the normal use of a TinyGPS++ (TinyGPSPlus) object.
   It requires the use of SoftwareSerial, and assumes that you have a
   4800-baud serial GPS device hooked up on pins 4(rx) and 3(tx).
*/
//static const int RXPin = 4, TXPin = 3;
//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(57600);
  // ss.begin(GPSBaud);

  Serial.println(F("DeviceExample.ino"));
  Serial.println(F("A simple demonstration of TinyGPS++ with an attached GPS module"));
  Serial.print(F("Testing TinyGPS++ library v. ")); Serial.println(TinyGPSPlus::libraryVersion());
  Serial.println(F("by Mikal Hart"));
  Serial.println();
}

void loop()
{
  // This sketch displays information every time a new sentence is correctly encoded.
  while (Serial.available() > 0)
    if (gps.encode(Serial.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();
}

Bon... Ca tourne pas chez moi, j'ai bien les messages du setup qui s'affichent sur le serial monitor et... C'est tout. Même pas les message d'erreur en cas de trame invalide. Je vais essayer depuis un autre ordinateur et je te donnerai des nouvelles

Jambe:
Bon... Ca tourne pas chez moi, j'ai bien les messages du setup qui s'affichent sur le serial monitor et... C'est tout. Même pas les message d'erreur en cas de trame invalide. Je vais essayer depuis un autre ordinateur et je te donnerai des nouvelles

Comme tu "upload" correctement les sketchs , l'hypothese d'une "non reception serial hard" est de facto levée.
A partir de là et à distance , au moins pour l'instant "je sèche" 8)

Et depuis un autre ordi (sous win7 cette fois), le problème est le même.

Je sèche aussi...

Merci en tout cas de l'aide et temps consacré

Jambe:
Et depuis un autre ordi (sous win7 cette fois), le problème est le même.

Je sèche aussi...

Merci en tout cas de l'aide et temps consacré

bonjour
par acquis de conscience j'ai retesté , c'est ok pour moi avec la lib tinygps++ (IDE 1.6.5 W7)
j'ai modifié le programme pour supprimer le timout (mais fondamentalement ça ne change rien)
fichier log NMEA
sketch de test

Aaaaah, voila quelque chose qui fonctionne enfin!

Un grand merci Artouste, j'ai plus qu'a adapter! et avancer sur mes test.

Jambe:
Aaaaah, voila quelque chose qui fonctionne enfin!

Un grand merci Artouste, j'ai plus qu'a adapter! et avancer sur mes test.

Tant mieux que ce soit finalement "tombé en marche" :grin: , mais c’était quoi ton problème ?
tu n'injectais pas assez vite tes data avant le Timeout ?

C'est vraiment tout bête quand on j'y repense mais la fonction gps.encode doit renvoyer TRUE et donc, doit être compris dans un if() sans ; à la fin sinon l'affichage des donnée tourne en boucle.

if (gps.encode(Serial.read()))

et aussi, le serial monitor doit voir son menu déroulant réglé sur "Les deux, NL et CR"

Jambe:
...
et aussi, le serial monitor doit voir son menu déroulant réglé sur "Les deux, NL et CR"

çà je te l'avais déjà indiqué hier 8)