Go Down

Topic: Comment puis-je debugger mon code GPS (Read 3020 times) previous topic - next topic

pierrot10

Jan 14, 2013, 10:26 pm Last Edit: Jan 15, 2013, 04:15 pm by pierrot10 Reason: 1
Bonjour à tous
Je passe encore un temps fou a comprende pourquoi, et vous aller rire, ca marche la nuit et pas le jour  :)
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?
https://www.sparkfun.com/products/465?
https://www.sparkfun.com/products/10102?

J'ai résumé le code ici, il est simple
Code: [Select]

#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{
    }
  }
}

Code: [Select]
  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
Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!

barbudor

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)
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Artouste

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

pierrot10

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  :) et j'ai 5 fenetre en face de mois   :)

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

Code: [Select]
Serial.print(c);
et cam0affiche toute une série de chiffre
Quote

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
Code: [Select]

  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.
Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!

barbudor

c doit être de type char. On veut voir les caractères, pas la valeur ascii
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

pierrot10

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
Quote

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  :)
Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!

pierrot10

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

Code: [Select]

#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.
Code: [Select]

  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?
Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!

pierrot10

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
Code: [Select]

#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é....
Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!

fdufnews

Quote
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.

Quote
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.

pierrot10

Hello,
Quote


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
Quote

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
https://www.sparkfun.com/products/465?
https://www.sparkfun.com/products/10102?.
Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!

Christian_R


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 ?
Christian

fdufnews

Quote
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

Artouste

#12
Jan 16, 2013, 12:59 pm Last Edit: Jan 16, 2013, 01:03 pm by Artouste Reason: 1
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 

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.

Artouste


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

Go Up