Comment puis-je debugger mon code GPS

Bonjour à tous
Je passe encore un temps fou a comprende pourquoi, et vous aller rire, ca marche la nuit et pas le jour :slight_smile:
Sans blaguer. L'autre soir, tout fonctionnait jusqua ce que j'étteigne tout pour me coucher. Et le lendemain matin, alors que je rallume tout. Rien marche. Le meme soir, ca marche et pas le landemain.

Donc il y a forcement un bug, ou un truc de boiteux.

J'aimerias savoir si vous pouviez me dire comment debuger mon code, car je sais ou est l'erreur

D'abord voici le matos que j'utilise:
https://www.sparkfun.com/products/11021?
https://www.sparkfun.com/products/9607?
GNSS Receiver - EM-506N5 - GPS-19629 - SparkFun Electronics?
SparkFun GPS Logger Shield - GPS-13750 - SparkFun Electronics?

J'ai résumé le code ici, il est simple

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

#define RXPIN 2
#define TXPIN 3

SoftwareSerial nss(RXPIN, TXPIN);
void setup(){
  Serial.begin(4800);
    nss.begin(9600);
Serial.print("Start");

}
void loop()
{
  while (nss.available())
  {
    int c = nss.read();
     
     Serial.println("Ca ne passe pas");
     
    if (gps.encode(c))
    {
      
       Serial.println("Ca passe");
      
      // process new gps info here
      Serial.print("yes");
    }else{
    }
  }
}
  if (gps.encode(c))

Quans cette condition retourne 0 quand ca ne marche pas. Et portant, je suis sure que ce soir vers 22h, elle retournera true, aussi étrange que ca peut paraitre.

Quoi qu'il soit, savez-vous comment je peux debugger "gps" de la fonction if (gps.encode(c))?

Quelle serait les etapes que vous entreprendriez pour comprendre la problème?

Milles mercis à tous

Si gps.encode() retourne faux, c'est que tu n'obtient pas de position.
Pas forcément étonnant si tu es dans un bâtiment.

Il est aussi possible qu'en journée tu subisses plus de perturbations qui empêchent de recevoir ...

Le plus simple déjà est de voir si la comm avec le GPS fonctionne en redirigeant directement la série qui vient du GPS vers le terminal Arduino
Tu devrais avoir des phrase NMEA du genre $GPRMC, $GPVMG, ...
Dans ton code au lieu de faire un Serial.print("cane passe pas") fait un serial.print(c)

bonsoir
comme exposé par Barbudor
tu es peut etre en limite de réception (effet canyon, perturbation radioélectrique, autres)
Faire un test si possible de la reception de la constellation en zone ouverte/degagée

Bonjour.
Merci pour vos réponses.
Alors, dnans mon cas, je ne pense pas que le faite d'etre dans un batiment, change. La raison est simple, j'habite au 7eme etages et au dernier :slight_smile: et j'ai 5 fenetre en face de mois :slight_smile:

De plus, la journée je le teste au meme endroit. J'ai aussi testé ceci au travail sans succès.
Bon c'est vrai qu'a cote de chez moi, j'ai Swisscom avec des grosse antennes.....
Mais au travail et dans le train j'ai le meme problème.

Alors j'ai fait ceci

Serial.print(c);

et cam0affiche toute une série de chiffre

195
0
120
128
120
248
195
240
134
240
134
247
204
240
134
0
120
254
227
0
120
120
227
247
204
240
134
224
134
0
120
128
120
128
120
128
124
254
240
240
240
224
224
152
12

J'ai aussi changé ceci

  Serial.begin(4800);
    nss.begin(4800);

car j'ai lu que le GPS ou le shild qui le contient est limité a 4800, dans le doute je l'ai donc changé, mais ca ne resou pas le prob.

c doit être de type char. On veut voir les caractères, pas la valeur ascii

Heuuuu donc? Je métrise pas encore tout...

Par contre je viens de faire un teste. Intéressant. J'ai retiré la carte GPRS
https://www.sparkfun.com/products/9607?
Et la j'ai vu passé des truc du genre

42
53
56
13
Ca passe
yes10
36
71
80
71
83
65
44

Je fais la remettre, vu que c'est 23h, peut etre que ca marche maintenant :slight_smile:

Voilà, j'ai reussi à faire un truc qui marche

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

TinyGPS gps;

#define RXPIN 2
#define TXPIN 3

SoftwareSerial nss(RXPIN, TXPIN);

char buffer[90];

int count = 0;

PString myString(buffer,sizeof(buffer));

void setup(){
  Serial.begin(4800);
  nss.begin(4800);
  
  Serial.println("*******************");
  Serial.println("Display my position");
  Serial.println("*******************");
  Serial.println("");
}

void loop(){
  while(nss.available()) {
     int c = nss.read();
      // Serial.println(c);
      if (gps.encode(c)) {
        float flat, flon, fspeed, falt;
        unsigned long fix_age;
        gps.f_get_position(&flat,&flon,&fix_age);
        
        fspeed = gps.f_speed_kmph();
        falt = gps.f_altitude();

        //fcourse = gps.f_course();

        if(fix_age == TinyGPS::GPS_INVALID_AGE)

          Serial.println(F("No fix detected"));

        else if (fix_age > 5000)

          Serial.println(F("WARNING: Possible Stale Data!"));

        else {
          char index;
          myString.print("AT+SSTRSEND=1,\"");
          //gps_buffer[index++] = 'AT+SSTRSEND=1,"';
          
          myString.print(flat,DEC);
          
          myString.print(",");

          myString.print(flon,DEC);
          
          myString.print(",");
          
          myString.print(fspeed,2);
          
          myString.print(",");
          
          myString.print(falt,2);
          
          //myString.print(",");
          
          //myString.print(fcourse,DEC);
          
          myString.print(",");
          
          
          myString.print(String(count));
          //gps_buffer[index++] = count;
          
          myString.print("\"");

          Serial.println(myString);
          //cell.println(gps_buffer);

          myString.begin();

          count++;
          
          delay(3000);
          
      }
    } 
  }
}

Simplement es-ce que ca marchera demain?

Es-ce que ca le numro on une influance.

  Serial.begin(4800);
  nss.begin(4800);

J'ai lu dans un tuto, qu'il était bien de mettre 15200 pour le Serial, et j'ai souvent mis 9600 pour le nss.
Que me recommenderiez-vous?

Voilà, ca ne marche déjà plus,

Mais j'ai une question super importante.
Es-ce que mon module gps DOIT BOUGER pour afficher une position?????
Car là il est sur ma table et est totalement imobile et n'affiche rien (alors qu'il le fesait, il y a une heure...

Quand je le lève avec la main, par moment il affiche une position. Je ne sais pas si c'est le hasard, mais je n'y crois pas trop, car hier, il affichait constament les position. Mais bon, il n'affiche plus tot rien que quelque chose maintenant.

Pourtant je n'ai pas ajouté beaucoup de code. Tout ce que j'ai ajouté est en commentaire

On m'a dit qu'il fallait remplacer PString? Etes-vous d'accord avec?
Es-ce que mon GPS et ma shield sont de mauvaise qualité? Car ca ne peut pas jouer si ca ne marche pas pendant 3-4 heures, etc....?
Je vais de toute manière essayer dans le train, demain, mais ce code n'est pas sorcier! non? Il reste simple.
Que pensez-vous de mon ajout commenté. Ca ne fait que clignoter une led!!

Merci pour vos idées

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

TinyGPS gps;

#define RXPIN 2
#define TXPIN 3

SoftwareSerial nss(RXPIN, TXPIN);

char buffer[90];

int count = 0;

PString myString(buffer,sizeof(buffer));

//int redLedPin  = 11;
//int greenLedPin = 12;

void setup(){
 
  Serial.begin(4800);
  nss.begin(4800);
  
  //pinMode(redLedPin, OUTPUT);
  //pinMode(greenLedPin, OUTPUT);
  
  Serial.println("*******************");
  Serial.println("Display my position");
  Serial.println("*******************");
  Serial.println("");
}
/*
void blinkLed(int lPin, int nBlink, int msec) {
  if (nBlink) {
    for (int i = 0; i < nBlink; i++) {
      digitalWrite(lPin, HIGH);
      delay(msec);
      digitalWrite(lPin, LOW);
      delay(msec);
    }
  }
}
*/
void loop(){
  while(nss.available()) {
     int c = nss.read();
      Serial.println(c);
      if (gps.encode(c)) {
        float flat, flon, fspeed, falt;
        unsigned long fix_age;
        gps.f_get_position(&flat,&flon,&fix_age);
        
        fspeed = gps.f_speed_kmph();
        falt = gps.f_altitude();

        if(fix_age == TinyGPS::GPS_INVALID_AGE)

          Serial.println(F("No fix detected"));

        else if (fix_age > 5000)

          Serial.println(F("WARNING: Possible Stale Data!"));

        else {
          char index;
          myString.print("AT+SSTRSEND=1,\"");
          //gps_buffer[index++] = 'AT+SSTRSEND=1,"';
          
          myString.print(flat,DEC);
          
          myString.print(",");

          myString.print(flon,DEC);
          
          myString.print(",");
          
          myString.print(fspeed,2);
          
          myString.print(",");
          
          myString.print(falt,2);
          
          myString.print(",");
          
          myString.print(String(count));
          
          myString.print("\"");

          Serial.println(myString);

          myString.begin();

          count++;
          
         //blinkLed(greenLedPin,2,500);
         
         delay(3000);
          
      }
    } 
  }
}

Que me conseillerez-vous?
Changer de GPS? pourtant ca ne semble pas etre un GPS de mauvaise qualité....

J'ai lu dans un tuto, qu'il était bien de mettre 15200 pour le Serial, et j'ai souvent mis 9600 pour le nss.

Si le GPS est configuré pour sortir ses informations à 4800 bauds il faut mettre 4800 dans le code. On ne tire pas la valeur au hasard.

Es-ce que mon GPS et ma shield sont de mauvaise qualité? Car ca ne peut pas jouer si ca ne marche pas pendant 3-4 heures, etc....?

Les satellites bougent la réception n'est pas toujours de même qualité. Le GPS normalement donne des informations sur la quantité de satellites reçus et la qualité de la réception. Même s'il n'est pas capable de délivrer une position il doit te donner ces informations.
Qu'est-ce que le GPS te dit.

Hello,

Les satellites bougent la réception n'est pas toujours de même qualité

Ok, mais bon, ca fait depuis 8h30 qu'il tourne et il ne m'a afficher une position. La led verte n'a pas clignoté une seul fois, ezt dans mon terminal que je ne fois que des chiffres

36
44
36
71
80
46
36
71
80
50
36
71
80
50
36
71
80
52
51
36
44
36
71
80
44
36
71
80
48
36
71
80
44
36
71
80
80
44
65
48

J'ai ca comme GPS
GNSS Receiver - EM-506N5 - GPS-19629 - SparkFun Electronics?
SparkFun GPS Logger Shield - GPS-13750 - SparkFun Electronics.

pierrot10:
Es-ce que mon module gps DOIT BOUGER pour afficher une position?

Non, il marche aussi en fixe.
Il a besoin d'un déplacement uniquement pour calculer une vitesse ou une orientation estimée du Nord à partir de 2 positions successives.

Peut tu afficher le nombre de satellites vus par le GPS ?

et dans mon terminal que je ne fois que des chiffres

Des chiffres c'est aussi des codes ASCII. C'est pas si incohérent que ça

36 $
44 ,
36 $
71 G
80 P
46 .
36 $
71 G
80 P
50 2
36 $
71 G
80 P
50 2
36 $
71 G
80 P
52 4
51 3
36 $
44 ,
36 $
71 G
80 P
44 ,
36 $
71 G
80 P
48 0
36 $
71 G
80 P
44 ,
36 $
71 G
80 P
80 P

bonjour
4800 est le standard de sortie NMEA et il semble bien que ce soit le cas $GP indique le debut d'une sentence NMEA.
pour debugger
fais un simple programme qui ecoute en softserial le GPS en 4800 et qui en cas de reception reemet le caractere reçu vers le serial hard en 115200.
faire ensuite une copie du log serial pour regarder l'aspect des sentences reçues.

ou plus simple si tu a un adaptateur UART TTL-USB --->port com

Je ne connais pas trop la forme des trame NMEA mais je note que les messages ne semblent pas réguliers comme si de temps en temps des caractères étaient perdus.

Pour le test, le plus simple étant toujours le mieux la connexion directe du GPS au PC en passant par un câble FTDI (ou équivalent) me semble le plus fiable.

fdufnews:
Je ne connais pas trop la forme des trame NMEA mais je note que les messages ne semblent pas réguliers comme si de temps en temps des caractères étaient perdus.

Pour le test, le plus simple étant toujours le mieux la connexion directe du GPS au PC en passant par un câble FTDI (ou équivalent) me semble le plus fiable.

bonjour fdufnews
c'est ce que j'ai vu, mais peut etre que le parser "bouffe" la suite , la detection $GP etant peut etre un simple preambule ?
le mieux est bien sur de connecter directement la sortie NMEA TLL au PC par le biais d'un adaptateur type FTDI

He rentre et je vois vous réponse. C'est vraiment un super forum. Merci.

Peut tu afficher le nombre de satellites vus par le GPS ?

Je ne sais pas comment on fait, mais je vais chercher et apporter la réponse. Il me semble avoir vu ca a quelque part.

@Artouste,
j'ai mis ce code. Je ne sais pas si je répond bien a ta proposition:

 if(cell.available() >0)
  {
    incoming_char=cell.read();    //Get the character from the cellular serial port.
    Serial.print(incoming_char);  //Print the incoming character to the terminal.
  }
  //If a character is coming from the terminal to the Arduino...
  if(Serial.available() >0)
  {
    incoming_char=Serial.read();  //Get the character coming from the terminal
    cell.print(incoming_char);    //Send the character to the cellular module.
  }

et j'ai ca en retour, une erreur. Je précise, j'ai du mettre mon switch en UART, si non il n y a rien. Et c'est vrai que j'aurais voulu travailler en DLINE. Mais voici le retour de ma console

R??ª*'$S¡!¡¥¨©QHQT©§©: 60

+CM ERRO: 60

+CM ERRO: 60

+CM ERRO:0C¦¨
E:
ER
ER
MO
I
¦¨
:
RTjUTJJéJJ?SPHhTª
R??ª*'$¦!¡!¡¥¨©QH©©OR: 60

+ME EROR: 6

+ME EROR:
ªL¨Q
E
:
ER
MO6
MªL¨©

  • O?¨©
    =ªCR
  • *SQ
  • O4IéSQ
    +R4MR
    MOHRZjUTJJéJJ?S¨HhiªR??ª
    '$S¡!¡¥¨©QHQT©§©: 60
    +R?0CR6
    E
    ER
    =ªLSQ0
    E*¦¨©
    +j
    +CME ERROR: 60

+CME ERROR: 60

+CME ERROR: 60

+CME ERROR: 60

+CME ERROR: 60

+CME ERROR: 60

+CME ERROR: 60

+CME ERROR: 60

+M ERR 6

+CEERO:60

CM ROR 0

+M ERR 0

+MEERR:6

CEERO:60

J'ai pas encore regarder, ce que l'error 60. mais je le fais de ce pas.

le mieux est bien sur de connecter directement la sortie NMEA TLL au PC par le biais d'un adaptateur type FTDI

Ouf, mais je n'ai pas tout ca. je peux regarder pour en acheter un

Pour avoir le nombre de satellite, j'ai regardé la librairire tinyGPS et j'ai trouvé ceci:

gps.satellites();
J'ai donc ensuite fait dans la boucle loup()

  Serial.print("Nombre de Satellites : ");
  Serial.println(satellite);

à un Serial.begin(115200), j'ai ca:

Nombre de Satellites : ÿ

et j'ai un peu comme l'impression que mon programme frez.

J'ai donc essaye Serial.begin(9600); et la j'ai

char satellite = gps.satellites();
  Serial.print("Nombre de Satellites : ");
  Serial.println(satellite);

me retourne la meme chose

int satellite = gps.satellites();
  Serial.print("Nombre de Satellites : ");
  Serial.println(satellite);

me retourne:

Nombre de Satellites : 255

Ce qui me parrait juste énorme

pierrot10:
me retourne:

Nombre de Satellites : 255

Ce qui me parrait juste énorme

Oui c'est trop, il n'y a que 24 satellites pour le GPS planétaire, mais d'un endroit donné on n'en voit que quelques uns à la fois (typiquement 4 à 8). Ca sent le fil d'antenne cassé ce type de panne intermittente.

testes avec ce code et donne le résultat après

Ok, je te remercie. J'essayerai ce soir, car j'ai pas pris les modules. Mais j'ai craqué, j'ai commandé un nouveau module qui comprend le GPS/GSM/SD (all in one) qui fonctionne avec Aduirno. Ca m'a couté un peu de sous, mais bon, c'est avec le erévérence que j'y arriverai :slight_smile:
Merci