Pages: [1] 2   Go Down
Author Topic: Comment puis-je debugger mon code GPS  (Read 2314 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Sr. Member
****
Karma: 0
Posts: 368
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour à tous
Je passe encore un temps fou a comprende pourquoi, et vous aller rire, ca marche la nuit et pas le jour  smiley
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:
#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:
  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
« Last Edit: January 15, 2013, 10:15:40 am by pierrot10 » Logged

Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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)
Logged

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 ?

Offline Offline
Faraday Member
**
Karma: 33
Posts: 4975
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 368
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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:
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:
  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.
Logged

Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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 ?

Offline Offline
Sr. Member
****
Karma: 0
Posts: 368
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley
Logged

Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!

Offline Offline
Sr. Member
****
Karma: 0
Posts: 368
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
#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:
  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?
Logged

Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!

Offline Offline
Sr. Member
****
Karma: 0
Posts: 368
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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é....
Logged

Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!

France
Offline Offline
Faraday Member
**
Karma: 36
Posts: 3435
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Sr. Member
****
Karma: 0
Posts: 368
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?.
Logged

Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!

france
Offline Offline
God Member
*****
Karma: 15
Posts: 849
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Christian

France
Offline Offline
Faraday Member
**
Karma: 36
Posts: 3435
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Faraday Member
**
Karma: 33
Posts: 4975
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 
« Last Edit: January 16, 2013, 07:03:33 am by Artouste » Logged

France
Offline Offline
Faraday Member
**
Karma: 36
Posts: 3435
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Faraday Member
**
Karma: 33
Posts: 4975
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Pages: [1] 2   Go Up
Jump to: