Aide module GPS

Bonjour à tous !

Encore une fois j’ai besoin de vos lumières !

Voila le gps en question : http://www.drotek.fr/shop/fr/home/70-gps-pa6c-llc.html

En utilisant un module ftdi et le moniteur série de mon arduino, j’arrive à recevoir les frames du GPS, exemple ci-dessous, dans mon immeuble donc pas de coordonnées.

$GPGGA,000001.800,,,,,0,0,,,M,,M,,*41

$GPGSA,A,1,,,,,,,,,,,,,,,*1E

$GPRMC,000001.800,V,,,,,0.00,0.00,060180,,,N*4B

$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32

$GPGGA,000002.800,,,,,0,0,,,M,,M,,*42

$GPGSA,A,1,,,,,,,,,,,,,,,*1E

$GPRMC,000002.800,V,,,,,0.00,0.00,060180,,,N*48

$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32

Donc a priori le gps fonctionne…

Maintenant lorsque je branche mon GPS sur un port série virtuel avec le sketch ci-dessous, il m’affiche seulement CHARS=164 SENTENCES=0 CSUM ERR=0, seul CHARS augmente à chaque itération.

#include <SoftwareSerial.h>

#include <TinyGPS.h>

/* This sample code demonstrates the normal use of a TinyGPS 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).
*/

TinyGPS gps;
SoftwareSerial ss(4, 3);

void setup()
{
  Serial.begin(9600);
  ss.begin(9600);
  
  Serial.print("Simple TinyGPS library v. "); Serial.println(TinyGPS::library_version());
  Serial.println("by Mikal Hart");
  Serial.println();
}

void loop()
{
  bool newData = false;
  unsigned long chars;
  unsigned short sentences, failed;

  // For one second we parse GPS data and report some key values
  for (unsigned long start = millis(); millis() - start < 2000;)
  {
    while (ss.available())
    {
      char c = ss.read();
      // Serial.write(c); // uncomment this line if you want to see the GPS data flowing
      if (gps.encode(c)) // Did a new valid sentence come in?
        newData = true;
    }
  }

  if (newData)
  {
    float flat, flon;
    unsigned long age;
    gps.f_get_position(&flat, &flon, &age);
    Serial.print("LAT=");
    Serial.print(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flat, 6);
    Serial.print(" LON=");
    Serial.print(flon == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flon, 6);
    Serial.print(" SAT=");
    Serial.print(gps.satellites() == TinyGPS::GPS_INVALID_SATELLITES ? 0 : gps.satellites());
    Serial.print(" PREC=");
    Serial.print(gps.hdop() == TinyGPS::GPS_INVALID_HDOP ? 0 : gps.hdop());
  }
  
  gps.stats(&chars, &sentences, &failed);
  Serial.print(" CHARS=");
  Serial.print(chars);
  Serial.print(" SENTENCES=");
  Serial.print(sentences);
  Serial.print(" CSUM ERR=");
  Serial.println(failed);
  if (chars == 0)
    Serial.println("** No characters received from GPS: check wiring **");
}

J’ai l’impression que la librairie n’arrive pas a interpréter les frames reçu du gps.

Quand j’utilise l’exemple fournit dans l’IDE Arduino, SoftwareSerial, les frames reçu son incomplètes, c’est sans doute une piste mais je comprends pas le problème…

Bonsoir,

Avant de vouloir afficher une trame, il faut d'abord la recevoir entièrement,
puis la traiter, la vérifier éventuellement
et en dernier l'afficher.

Ton programme ne va pas en ce sens.

C'est une piste mais je ne suis pas sûr de mon coup ??

elriri:
...
En utilisant un module ftdi et le moniteur série de mon arduino, j'arrive à recevoir les frames du GPS, exemple ci-dessous, dans mon immeuble donc pas de coordonnées.

...
J'ai l'impression que la librairie n'arrive pas a interpréter les frames reçu du gps.

Bonsoir
TinyGPS ne reçoit aucune sentence exploitable, donc il ne te retourne aucune information autre que l'info de reception chars sans erreur (les sentences crachée par le gps sont sans erreurs , le crc est ok)

Mes sentence semble bonne quand je suis branché directement au GPS, en revanche en passant par l’arduino j’ai l’impression qu’il manque des caractères, les sentences ne sont pas bien formatées.

D’où cela px venir ?

elriri:
Mes sentence semble bonne quand je suis branché directement au GPS, en revanche en passant par l'arduino j'ai l'impression qu'il manque des caractères, les sentences ne sont pas bien formatées.

D'où cela px venir ?

Qu'est ce qui te fais dire ça ?
A priori ça ne semble pas être le cas, si des sentences même en "non fix" étaient "tronquées"
le crc ne serait pas OK .

A aucun moment la condition suivante n'est exécuté :

 if (newData)
  {
    float flat, flon;
    unsigned long age;
    gps.f_get_position(&flat, &flon, &age);
    Serial.print("LAT=");
    Serial.print(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flat, 6);
    Serial.print(" LON=");
    Serial.print(flon == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flon, 6);
    Serial.print(" SAT=");
    Serial.print(gps.satellites() == TinyGPS::GPS_INVALID_SATELLITES ? 0 : gps.satellites());
    Serial.print(" PREC=");
    Serial.print(gps.hdop() == TinyGPS::GPS_INVALID_HDOP ? 0 : gps.hdop());
  }

elriri:
A aucun moment la condition suivante n'est exécuté :

je n'utilise pas TinyGPS
mais plus TinyGPSPlus

ceci etant, il est fort probable pour toi que newdata est false si tu n'est pas au moins en fix 2D

A mon avis même sans fix, newdate devrait être à true car les trames envoyées même vide son bien formatées (en théorie) je continu à penser qu'elle n'arrive pas complète, du moins que ss.read(); loupe des caractères. Un problème de vitesse px etre ?

Est-ce qu'un problème de fréquence entre les deux appareils peux être en cause ? Le GPS envoi trop vite les trames par exemple ?

Est ce que tu captes des coordonnées en allant dehors?

Impossible de savoir, je n'est pas de PC portable, quand je sort avec le module alimenté, la led bleu clignote au début puis s'éteint au bout que quelques minutes.

Il n'y a aucune doc sur les différents statuts indiqués par la led...

elriri:
Est-ce qu'un problème de fréquence entre les deux appareils peux être en cause ? Le GPS envoi trop vite les trames par exemple ?

tes sentences avec ton ftdi , tu les récupère bien à 9600 sur ton PC ? (1er test)
si c'est le cas reste à 9600 pour ton softserial (le gps) et passe le serial (arduino vers pc) à 57600

Même résultat SENTENCES=0

Je pensais plus à une fréquence de fonctionnement, mais en théorie mon gps est configuré en 9600/1Hz donc bien plus lent que l'arduino.

Franchement j'y comprends vraiment rien, à moins que comme tu dis si aucun fix pas de truedata, je vais jeter un oeil à la fonction encode.

Comme prévu et sauf erreur, la fonction ne regarde pas le contenu de la trame pour renvoyé true, juste sa “nomenclature”.

bool TinyGPS::encode(char c)
{
  bool valid_sentence = false;

#ifndef _GPS_NO_STATS
  ++_encoded_characters;
#endif
  switch(c)
  {
  case ',': // term terminators
    _parity ^= c;
  case '\r':
  case '\n':
  case '*':
    if (_term_offset < sizeof(_term))
    {
      _term[_term_offset] = 0;
      valid_sentence = term_complete();
    }
    ++_term_number;
    _term_offset = 0;
    _is_checksum_term = c == '*';
    return valid_sentence;

  case '

: // sentence begin
   _term_number = _term_offset = 0;
   _parity = 0;
   _sentence_type = _GPS_SENTENCE_OTHER;
   _is_checksum_term = false;
   _gps_data_good = false;
   return valid_sentence;
 }

// ordinary characters
 if (_term_offset < sizeof(_term) - 1)
   _term[_term_offset++] = c;
 if (!_is_checksum_term)
   _parity ^= c;

return valid_sentence;
}

elriri:
Même résultat SENTENCES=0

Je pensais plus à une fréquence de fonctionnement, mais en théorie mon gps est configuré en 9600/1Hz donc bien plus lent que l'arduino.

Franchement j'y comprends vraiment rien, à moins que comme tu dis si aucun fix pas de truedata, je vais jeter un oeil à la fonction encode.

dans la mesure où ton code compile (lib OK)
Je pourrais faire un test demain avec ta config soft (un autre module gps)
et voir si fix/no fix influe

donne un lien vers la lib que tu utilise , pour être dans les mêmes conditions

Merci de ton aide !

Une chose à pas oublier, quand je lance ce script, mes sentences arrivent erronées, je suis certains que c’est mon problème :

/*
  Software serial multple serial test
 
 Receives from the hardware serial, sends to software serial.
 Receives from software serial, sends to hardware serial.
 
 The circuit: 
 * RX is digital pin 10 (connect to TX of other device)
 * TX is digital pin 11 (connect to RX of other device)
 
 Note:
 Not all pins on the Mega and Mega 2560 support change interrupts, 
 so only the following can be used for RX: 
 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69
 
 Not all pins on the Leonardo support change interrupts, 
 so only the following can be used for RX: 
 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).
 
 created back in the mists of time
 modified 25 May 2012
 by Tom Igoe
 based on Mikal Hart's example
 
 This example code is in the public domain.
 
 */
#include <SoftwareSerial.h>

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

void setup()  
{
  // Open serial communications and wait for port to open:
  Serial.begin(57600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }


  Serial.println("Goodnight moon!");

  // set the data rate for the SoftwareSerial port
  mySerial.begin(4800);
  mySerial.println("Hello, world?");
}

void loop() // run over and over
{
  if (mySerial.available())
    Serial.write(mySerial.read());
  if (Serial.available())
    mySerial.write(Serial.read());
}

Voile résultat, on peut remarquer qu’il y a un problème :

$GPVTG,0.0,T,,,0N000,,3
$GPGGA,001335.799,,,,,0,0,,,M,,M,,*4B
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPRMC,001335.799,V,,,,,0.00,0.00,060180,,,N*41
$GPVTG,0.00,T,M.,000,K*2$GPGGA,001336.799,,,,,0,0,,,M,,M,,*48
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPRMC,001336.799,V,,,,,0.00,0.00,060180,,,N*42

elriri:
Une chose à pas oublier, quand je lance ce script, mes sentences arrivent erronées, je suis certains que c’est mon problème :

// set the data rate for the SoftwareSerial port
mySerial.begin(4800);
mySerial.println(“Hello, world?”);

Voile résultat, on peut remarquer qu’il y a un problème :

$GPVTG,0.0,T,,,0N000,,3

$GPGGA,001335.799,0,0,M,M,4B
$GPGSA,A,1,1E
$GPRMC,001335.799,V,0.00,0.00,060180,N
41
$GPVTG,0.00,T,M.,000,K
2$GPGGA,001336.799,0,0,M,M,*48
$GPGSA,A,1,1E
$GPRMC,001336.799,V,0.00,0.00,060180,N
42

Donc ton gps “crache” en 4800 ?

les PB que je detecte en rouge

$GPVTG,0.0,T,0N000,3 <— là pb
$GPGGA,001335.799,0,0,M,M,4B
$GPGSA,A,1,1E
$GPRMC,001335.799,V,0.00,0.00,060180,N
41
$GPVTG,0.00,T,M.,000,K
2$GPGGA,001336.799,0,0,M,M,*48
$GPGSA,A,1,1E
$GPRMC,001336.799,V,0.00,0.00,060180,N
42

Finalement j'ai essayé la librairie proposée par adafruit et tout fonctionne correctement !

Merci pour le temps passé sur mon problème, j'aurais du essayer la seconde librairie avant...

elriri:
Finalement j'ai essayé la librairie proposée par adafruit et tout fonctionne correctement !

Merci pour le temps passé sur mon problème, j'aurais du essayer la seconde librairie avant...

:grin:
Le principal c'est que ça finisse par tomber en marche ! 8)

Exact !

Etrange malgré tout que j'arrive pas à faire fonctionner TinyGPS...