[INFO]GPS defaut avec ATL SAT HDOP

Bonjour a tous,

Je suis en train de coupler un GPS UBLOX avec une puce NEO-6M-0-001 et un SHIELD SD sur un UNO.

Mon objectif est d'enregistrer toutes les 5 secondes divers infos venant du GPS et ce dans uen carte SD.
Actuellement ça enregistre dans une format CVS mais a terme je compte le faire dans un format GPX afin de faciliter l'export.

Bon jusque la j'ai réussi a faire fonctionner de manière indépendante les divers éléments.

J'utilise la bibliothèque TinyGPS++
Les exemples me permettent de faire fonctionner le GPS correctement, l'intégralité de mes données sortent nickel sur le terminal.

En ce qui concerne le Shield SD lui fonctionne avec la bibliothèque SD et la SPI et tout fonctionne.
L'ensemble fonction cependant, mes données d'altitude, de satellite et de HDOP restent a zéro sur le terminal et sur la SD.

J'ai pourtant bien vérifier les variables sur TinyGPS++ | Arduiniana

Je vous poste donc mon code :

// Tracker GPS
/* Dépendances */
#include <SPI.h> // Pour la communication SPI
#include <SD.h>  // Pour la communication avec la carte SD
#include <SoftwareSerial.h>
#include <TinyGPS++.h>
TinyGPSPlus gps; 
SoftwareSerial ss(4, 3);

/** Broche CS de la carte SD */
const byte SDCARD_CS_PIN = 10; // A remplacer suivant votre shield SD

/** Nom du fichier de sortie */
const char* OUTPUT_FILENAME = "data3.csv";

/** Delai entre deux prise de mesures */
const unsigned long DELAY_BETWEEN_MEASURES = 5000;


/** Fichier de sortie avec les mesures */
File file;


void setup() {

  /* Initialisation du port série (debug) 0/*/
  Serial.begin(115200);
  ss.begin(9600);
  /* Initialisation du port SPI */
  pinMode(10, OUTPUT); // Arduino UNO


  /* Initialisation de la carte SD */
  Serial.println(F("Initialisation de la carte SD ... "));
  if (!SD.begin(SDCARD_CS_PIN)) {
    Serial.println(F("Erreur : Impossible d'initialiser la carte SD"));
    Serial.println(F("Verifiez la carte SD et appuyez sur le bouton RESET"));
    for (;;); // Attend appui sur bouton RESET
  }

  /* Ouvre le fichier de sortie en écriture */
  Serial.println(F("Ouverture du fichier de sortie ... "));
  file = SD.open(OUTPUT_FILENAME, FILE_WRITE);
  if (!file) {
    Serial.println(F("Erreur : Impossible d'ouvrir le fichier de sortie"));
    Serial.println(F("Verifiez la carte SD et appuyez sur le bouton RESET"));
    for (;;); // Attend appui sur bouton RESET
  }
  
  /* Ajoute l'entête CSV si le fichier est vide */
  if (file.size() == 0) {
    Serial.println(F("Ecriture de l'entete CSV ..."));
    file.println(F("LAT; LONG; ALT; JOUR; MOIS; ANNEE; HEURE; MINUTE; SECONDE; SAT; HDOP"));
    file.flush();
  }
}

void loop() 
{

  // Temps de la précédente mesure et actuel
  static unsigned long previousMillis = 0;
  unsigned long currentMillis = millis();

  /* Réalise une prise de mesure toutes les DELAY_BETWEEN_MEASURES millisecondes */
  if (currentMillis - previousMillis >= DELAY_BETWEEN_MEASURES) 
  {
    previousMillis = currentMillis;
    while (ss.available() > 0)
    if (gps.encode(ss.read()))
    //if (gps.location.isValid())//si la localisation est valide et mise a jour
    //{
      measure();
    //}
  }
}


void measure()
{

/* Affiche les données sur le port série pour debug */ 
  Serial.print(gps.location.lat(), 6);
  Serial.print(F("; "));
  Serial.print(gps.location.lng(), 6);
  Serial.print(F("; "));
  Serial.print(gps.altitude.meters());
  Serial.print(F("; "));
  Serial.print(gps.date.day());
  Serial.print(F("; "));
  Serial.print(gps.date.month());
  Serial.print(F("; "));
  Serial.print(gps.date.year());
  Serial.print(F("; "));
  Serial.print(gps.time.hour());
  Serial.print(F("; "));
  Serial.print(gps.time.minute());
  Serial.print(F("; "));
  Serial.print(gps.time.second());
  Serial.print(F("; "));
  Serial.print(gps.satellites.value());
  Serial.print(F("; "));
  Serial.println(gps.hdop.hdop());
  
  /* Enregistre les données sur la carte SD */
  file.print(gps.location.lat(), 6);
  file.print(F("; "));
  file.print(gps.location.lng(), 6);
  file.print(F("; "));
  file.print(gps.altitude.meters());
  file.print(F("; "));
  file.print(gps.date.day());
  file.print(F("; "));
  file.print(gps.date.month());
  file.print(F("; "));
  file.print(gps.date.year());
  file.print(F("; "));
  file.print(gps.time.hour());
  file.print(F("; "));
  file.print(gps.time.minute());
  file.print(F("; "));
  file.print(gps.time.second());
  file.print(F("; "));
  file.print(gps.satellites.value());
  file.print(F("; "));
  file.println(gps.hdop.hdop());
  file.flush();
}

Si vous avez des idées :smiley:

Avez-vous essayé de voir si ces informations étaient disponibles dans les phrases NMEA délivrées par votre GPS. Un outil tel que celui-ci le permet.

Cordialement.

Pierre.

Absolument, la valeur sort très bien sur les phrases NMEA,
et quand j'utilise un exemple fourni par TinyGPS++, la valeur est correctement affichée.
J'ai vérifier la syntaxe, la maniere d'appeler la variable mais tout me semble identique, et pourtant je n'ai pas ces valeurs qui s'affiches ...

Je doit zapper un truc ça me rend fou :smiley:

Le problème vient peut-être de file.flush(); lié à la taille du tampon utilisé par la SD.

Ce que je fais et que certains n'aiment pas est que, à moins d'avoir un fréquence d'enregistrement élevée, j'ouvre et je ferme la fichier autour de chaque paquet enregistré. Il y a certainement des inconvénients, mais le gros avantage est que si l'application plante ou qu'il y a un problème d'alimentation, les données, sauf la dernière en cours sont sauvegardées ; ce qui n'est pas le cas si le fichier reste ouvert.

Essayez !

Cordialement.

Pierre

Merci ChPr pour ces précieuses infos,
En effet je pense que cela est plus prudent et ne me pose pas de souci puisque la fréquence d'enregistrement est faible ( toutes les 5 secondes maximum ).

Cependant sauf erreur de ma part, ceci ne devrai pas poser de souci au niveau du

Serial.println(gps.hdop.hdop());

Qui s'affiche a 0 dans le terminal.

larcenn:
Merci ChPr pour ces précieuses infos,
En effet je pense que cela est plus prudent et ne me pose pas de souci puisque la fréquence d'enregistrement est faible ( toutes les 5 secondes maximum ).

Cependant sauf erreur de ma part, ceci ne devrai pas poser de souci au niveau du

Serial.println(gps.hdop.hdop());

Qui s'affiche a 0 dans le terminal.

Bonsoir
quelle version de lib ?
la dernière dispo (1.02) date d'il y a qq jours avec cette mention :

Better HDOP support

Artouste:
Bonsoir
quelle version de lib ?
la dernière dispo (1.02) date d'il y a qq jours avec cette mention :

Better HDOP support

Sacrebleu, c'est ma veine :smiley:
Je vais tester dessuite :wink:

EDIT : Bon j'avais deja la 1.02 d'installé :confused:

Est-ce que la phrase NMEA dans laquelle vous lisez une valeur de HDOP non nulle est celle qui est traitée par "tinygpsplus" ?

Cordialement.

Pierre

ChPr:
Est-ce que la phrase NMEA dans laquelle vous lisez une valeur de HDOP non nulle est celle qui est traitée par "tinygpsplus" ?

Cordialement.

Pierre

Absolument, pour preuve si j'utilise un exemple de tinygpsplus la valeur correcte s'affiche dans le terminal, ensuite j'utilise la même ligne et elle ne s'affiche pas dans mon programme alors que les autres oui...

Avez-vous essayer de modifier l'ordre de lecture des diverses informations afin de vérifier que ce n'est pas cet ordre qui pose problème ?

Cordialement.

Pierre

non effectivement je n'ai pas fait cela.

Je teste dessuite!

EDIT :
bon j'ai changer de place le ATL, il ne marche pas pour autant, MAIS ! le nombre de satelite fonctionne et le HDOP fonctionne aussi.... ça alors :confused: