Bonjour,
j'aimerais avoir votre aide pour un projet que je réalise. Je précise que je suis plutôt un débutant avec les cartes Arduino. Sans rentrer dans des détails superflus : j'ai besoin de récupérer la localisation de la carte arduino dans le cadre de mon projet. Pour cela j'ai acheté ceci :
Ce petit module semblait parfait : bon rapport qualité-prix selon plusieurs sites, très précis et n'utilise pas trop d'énergie. Mais problème : je n'arrive pas à obtenir les coordonnées gps avec. Le code suivant :
#include <SoftwareSerial.h>
SoftwareSerial SoftSerial(2, 3);
unsigned char buffer[64];
int count=0;
void setup() {
SoftSerial.begin(9600);
Serial.begin(9600);
}
void loop() {
if (SoftSerial.available())
{
while(SoftSerial.available())
{
buffer[count++]=SoftSerial.read();
if(count == 64)break;
}
Serial.write(buffer,count);
clearBufferArray();
count = 0;
}
}
void clearBufferArray()
{
for (int i=0; i<count;i++)
{ buffer[i]=NULL;}
}
Me permet d'afficher dans le moniteur série les "phrases" NMEA contenant normalement l'information mais elles sont toutes invalides. Je le sais surtout car celle qui commence par $GPRMC a systématiquement un V ce qui indique que la phrase est invalide d'après ce site qui a l'air plutôt fiable :
http://www.catb.org/gpsd/NMEA.html
Pensant mon code faux j'ai essayé de me servir d'une bibliothèque nommée TinyGPS et de ses dérivées TinyGPS++ ou encore TinyGPSPlus mais j'ai remarqué que dans le code :
#include "TinyGPS++.h"
#include "SoftwareSerial.h"
SoftwareSerial serial_connection(0, 1); //RX=pin 10, TX=pin 11
TinyGPSPlus gps;//This is the GPS object that will pretty much do all the grunt work with the NMEA data
void setup()
{
Serial.begin(9600);//This opens up communications to the Serial monitor in the Arduino IDE
serial_connection.begin(9600);//This opens up communications to the GPS
Serial.println("GPS Start");//Just show to the monitor that the sketch has started
}
void loop()
{
while(serial_connection.available())//While there are characters to come from the GPS
{
//gps.encode(serial_connection.read());//This feeds the serial NMEA data into the library one char at a time
//Serial.println("Et alors ? Mais qu'est-ce que ça fait !");
char c = serial_connection.read();
Serial.print("On a recupere : ");
Serial.println(c);
if(c != -1)
{
if(gps.encode(c) == true)
{
}
else
{
Serial.println("Encodage rate");
}
}
else
{
Serial.println("La lecture a echoue");
}
}
if(gps.location.isUpdated() == true)//This will pretty much be fired all the time anyway but will at least reduce it to only after a package of NMEA data comes in
{
//Get the latest info from the gps object which it derived from the data sent by the GPS unit
Serial.println("Satellite Count:");
Serial.println(gps.satellites.value());
Serial.println("Latitude:");
Serial.println(gps.location.lat(), 6);
Serial.println("Longitude:");
Serial.println(gps.location.lng(), 6);
Serial.println("Speed MPH:");
Serial.println(gps.speed.mph());
Serial.println("Altitude Feet:");
Serial.println(gps.altitude.feet());
Serial.println("");
}
}
La commande gps.encode() renvoit toujours faux et donc les différentes données de localisation ne sont jamais mises à jour. Si vous en avez besoin pour mieux comprendre ce code voici une page expliquant brièvement à quoi servent les fonctions de TinyGPS++ : TinyGPS++ | Arduiniana
J'ai fait énormément de recherche et je revenais toujours à la même solution : il suffit d'aller dehors pour que le module gps puisse bien détecter les satellites. J'ai essayé en attendant pendant plus de 30 minutes avec un ciel bien dégagé ça n'a rien changé. Puis j'ai pensé que si ce n'est pas le code le problème c'est probablement les phrases NMEA et c'est là que je me suis aperçu qu'elles sont toujours invalides.
Grâce au logiciel SIMComGPS DEMO V1.07 dont j'ai entendu parler ici : Grove - GPS | Seeed Studio Wiki
J'ai pu tester directement le montage sans passer par mon code donc mais par ce logiciel et j'ai obtenu le résultat suivant en extérieur :
E, bas à gauche vous pouvez voir les fameuses phrases NMEA toutes fausses... Apparememnt le module détecte des satellites mais comme vous pouvez le voir il ne reçoit rien concernant latitude et longitude. Je ne sais plus quoi faire... Avez-vous une idée du problème ?