Partage
  • Partager sur Facebook
  • Partager sur Twitter

[ARDUINO] Problème de GPS (gy-gps6mv2)

[ARDUINO] Problème de GPS (gy-gps6mv2)

    9 novembre 2016 à 11:26:52

    Bonjour tout le monde :),

    J'ai testé un nouveau shield, le GPS gy-gps6mv2

    Donc j'ai cherché quelques tutos pour me lancer. Et j'ai donc choisis d'utiliser la librairie : "TinyGPS++" qui a l'air assez simple d'utilisation :D.

    Après avoir soudé mon shield, je l'ai testé avec un programme vide, avec le Tx du GPS sur la broche Tx0 de mon arduino.

    Ca marche !! :lol: MAIS, il y a une chose que je comprend pas :

    Pourquoi çà marche avec le Tx branché au Tx0 ?? Normalement on branche toujours un Tx sur un Rx, c'est différent sur la MEGA 2560 ??

    Ducoup, vu que les infos brutes s'affichaient bien, j'ai écris un petit programme ultra basique :

    #include <TinyGPS++.h> //Permet d utiliser le GPS
    #include <SoftwareSerial.h> //Permet d utiliser les TxD et RxD
    
    TinyGPSPlus gps; //Création objet Gps
    
    SoftwareSerial gps_serial(19, 0);    //Configuration du port Gps Tx sur le pin 19 (Rx1)
    
    //Variables
    double heureDepart=0.0; //Heure de départ
    double coordDepartLat=0.0; //Latitude GPS
    double coordDepartLng=0.0; //Longitude GPS
    
    void setup() 
    {
      Serial.begin(115200); //initialisation port série a 115200 bauds
      gps_serial.begin(9600); //initialisation port Rx1 a 9600 bauds
    
      Serial.println("...GPS...");
      Serial.println();
    }
    
    void loop() 
    {
        while (gps_serial.available() > 0){ //Si il y a des infos sur la ligne
      
          heureDepart=(gps.time.hour()+1)+(gps.time.minute()/60.0); //Calcule l'heure
          coordDepartLat=gps.location.lat(); //Prend la latitude GPS
          coordDepartLng=gps.location.lng(); //Prend la longitude GPS
    
          //Affichage du résultat
          Serial.println(heureDepart); 
          Serial.println(coordDepartLat);
          Serial.println(coordDepartLng);
    
          Serial.println();
          Serial.println();
    
          delay(1200);
          
        }//Fin While()
    
    }

    Mais ce programme ne fonctionne pas ! La boucle While n'est apparemment pas respectée.. 

    Ca semble donc être un problème de Tx, Rx donc j'ai essayé de mettre le Tx GPS sur la broche 19 (Rx1) ainsi que sur la broche 18 (Tx1) Mais je n'ai jamais de résultats..

    Et tous les tutos que je trouve fonctionnent avec une Uno, qui a apparemment un fonctionnement légèrement différent au niveau des Tx,Rx..

    Ca dois être une faute toute bête mais je ne vois absolument pas quoi faire..:euh:

    -
    Edité par DataCube 9 novembre 2016 à 11:34:15

    • Partager sur Facebook
    • Partager sur Twitter
      9 novembre 2016 à 19:47:20

      Tout dépend de quelle coté tu te place ;)

      Sur la carte arduino, il y a 2 éléments :

      • Le processeur ATMega qui exécute le code qui tu as écrit
      • Le processeur de gestion USB qui s'occupe de faire le lien entre le PC et l'ATmega au travers de l'USB

      Physiquement, le TX de l'ATmega est relié à la pin TX de l'arduino et à la pin RX du processeur de gestion.

      Ainsi, tout ce que le processeur ATmega envoie sur son TX est reçu par le RX du processeur de gestion USB qui se charge alors d'envoyer les informations sur la console du PC par la liaison USB.

      Dans ton cas, en branchant ton GPS sur la pin TX de l'arduino, tout ce que le GPS envoie sa se retrouver à 2 endroits :

      • La pin TX de l'ATmega, ce qui risquera de poser de gros problème si l'ATmega envoie lui aussi des données (conflit et risque de court-circuit)
      • La pin RX du processeur de gestion USB, ce qui a pour effet d'afficher les données sur la console du PC

      C'est donc pour cette raison que tu vois des choses s'afficher sur la console mais que ton code ne fait strictement rien puisqu'il n'y a rien qui arrive sur la pin RX de l'ATmega.

      -
      Edité par lorrio 9 novembre 2016 à 19:49:49

      • Partager sur Facebook
      • Partager sur Twitter
        12 novembre 2016 à 16:16:13

        D'accord ! Merci lorrio ;) !

        Au final,  j'ai réussis a faire fonctionner mon GPS en utilisant la pin 10.

        Mais j'ai toujours un problème..

        Sans changer mon programme, les informations reçus sont complètements instables..:(

        En gros, le paramètre d'altitude ainsi que celui du nombre de satellites sont parfois bons alors que parfois je dois débrancher rebrancher l'Arduino plusieurs fois.. Sinon il me renvoi 0 ou une donnée impossible (525 mètres d'altitude par exemple, alors que je suis a 330m).

        Et le paramètre de vitesse m'indique une valeur autour de 0 a l’arrêt mais si je passe sur mon pc portable sous ubuntu, cette même valeur varie entre 0 et 7Km/h...

        C'est complètement incompréhensible...

        Je n'ai pas de LCD sous la main (il arrive dans 1 semaine) mais je testerai pour voir si c'est les PC qui racontent n'importe quoi..

        Sinon voilà mon code :

        #include <TinyGPS++.h> //Permet d utiliser le GPS
        #include <SoftwareSerial.h> //Permet d utiliser les TxD et RxD
        
        
        TinyGPSPlus gps; //Création objet Gps
        
        SoftwareSerial gps_serial(10,0);    //Configuration du port Gps Tx sur le pin 10
        
        
        /*********Variables*********/
        unsigned short dateAnnee=0; //Année en cours
        unsigned short dateMois=0; //Mois en cours
        unsigned short dateJour=0; //Jour en cours 
        
        unsigned short timeHeure=0; //Heure de départ
        unsigned short timeMinute=0; //Minutes de départ
        unsigned short timeSec=0; //Secondes
        
        double vitesseReele=0.0; //Vitesse Réelle
        
        double altitudeKms=0.0; //Altitude
        
        double locationLatitude=0.0; //Latitude
        double locationLongitude=0.0; //Longitude
        
        int nbrGPS=0; //Nombre de GPS en liaison
        
        /******* FIN VARIABLES *******/
        
        
        
        void setup() 
        {
          Serial.begin(115200); //initialisation port série a 115200 bauds
          gps_serial.begin(9600); //initialisation port Rx1 GPS a 9600 bauds
        
        }//Fin Void Setup
        
        void loop() 
        {
            while (gps_serial.available() > 0) //Verifie que le GPS est branché
            {
                gps.encode(gps_serial.read());
        
                
                if((gps.time.second())!=timeSec) //Je réactualise chaque seconde
              {   
              /************************ PRISE DES INFORMATIONS DU GPS *****************************/
                    dateAnnee=(gps.date.year());
                    dateMois=(gps.date.month());
                    dateJour=(gps.date.day());
            
                    timeHeure=(gps.time.hour()+1);
                    timeMinute=(gps.time.minute());
                    timeSec=(gps.time.second());
            
                    vitesseReele=(gps.speed.kmph());
            
                    altitudeKms=(gps.altitude.meters()); //Fonctionne pas 
            
                    locationLatitude=(gps.location.lat());
                    locationLongitude=(gps.location.lng());
            
                    nbrGPS=(gps.satellites.value()); //Fonctionne pas
                    
                    affichage(); 
              /************************ FIN PRISE DES INFORMATIONS DU GPS **************************/
              }//Fin if
            }//Fin While()
        
        
        
        
        
        }//Fin Void Loop
        
        
        void affichage()
        { 
          Serial.print("DATE : "); Serial.print(dateJour); Serial.print("/"); Serial.print(dateMois); Serial.print("/"); Serial.println(dateAnnee);
          Serial.print("HEURE : "); Serial.print(timeHeure); Serial.print(":"); Serial.println(timeMinute);
          Serial.print("VITESSE : "); Serial.println(vitesseReele);
          Serial.print("ALTITUDE : "); Serial.println(altitudeKms);
          Serial.print("LATITUDE : "); Serial.println(locationLatitude);
          Serial.print("LONGITUDE : "); Serial.println(locationLongitude);
          Serial.print("NBR GPS : "); Serial.println(nbrGPS);
          Serial.println();
          Serial.println();
        }//Fin Affichage

        Sinon, les autres données (heures.. Dates..) sont Ok..

        -
        Edité par DataCube 12 novembre 2016 à 16:19:37

        • Partager sur Facebook
        • Partager sur Twitter
          12 novembre 2016 à 18:32:19

          Bah là, je ne pourrais pas vraiment faire grand chose pour toi.

          Soit ton GPS déconne un peu, soit c'est la lib TinyGPS qui ne marche pas...

          • Partager sur Facebook
          • Partager sur Twitter
            12 novembre 2016 à 19:20:43

            D'après moi le module GPS est hors de cause pour deux raisons :

            - En lisant directement les données NMEA sur le ports Tx0, ca m'a l'air correcte :

            - Le fait de faire des RESET directement sur l'Arduino (MEGA 2560) via le bouton permet parfois de faire fonctionner le programme..

            Hors le module GPS n'est normalement pas affecté par le RESET de l'Arduino. Ce module ne fait qu'envoyer des infos NMEA en continu sur le port série dès qu"il est sous tension..

            Après pour ce qui est de l'Arduino, j'en ai plusieurs, donc j'ai testé. J'ai le même résultat sur toutes les cartes..

            Et pour ce qui est de la lib elle m'a l'air assez connue et utilisée.

            Mais même en reprenant ce genre de tuto : http://lecafedugeek.fr/arduino-creer-votre-propre-compteur-gps/ , le programme bug de la même façon... 

            Est-ce que ca pourrais venir d'un problème de lecture sur le port série du PC ducoup ?? Car dans les tutos ils utilisent généralement un écran LCD pour afficher directement les infos..

            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              4 janvier 2017 à 14:59:04

              Bonjour,

              Je tombe sur ce "problème" et je me permet de te faire une réponse.

              L'instabilité des sketchs "Tiny" est assez connue et je l'ai souvent observé. J'utilise maintenant le module "Adafruit" qui me parait plus performant et surtout offrant la possibilité d'afficher directement des degrés décimaux. En ce qui concerne les ports à utiliser sur l'Arduino, la commande SoftwareSerial te permet d'utiliser n'importe quel port comme port série. Personnellement j'utilise 2,3. Il ne faut pas utiliser 0,1 car ce sont les ports série hard.

              https://cdn-learn.adafruit.com/downloads/pdf/adafruit-ultimate-gps.pdf

              Après avoir téléchargé et installé la librairie Adafruit, teste ce petit programme qui fonctionne parfaitement. Ensuite passer à l'affichage sur un écran lcd de  2x20 caractères en remplaçant la routine Sérial. Print  par lcd.print  après récupération des librairies et c'est nickel pour les balades. A suivre bien sûr si cela t’intéresse plus tard !!!

              N'importe quelle tête Gps fait l'affaire. j'en ai essayé plein. Il faut seulement ne pas inverser Tx et Rx (Inverser si ça parle pas la première fois) et c'est bon.

              #include <Adafruit_GPS.h>
              #include <SoftwareSerial.h>
              
              
              SoftwareSerial mySerial(2, 3);
              Adafruit_GPS GPS(&mySerial);
              
              
              #define GPSECHO  false
              
              boolean usingInterrupt = false;
              void useInterrupt(boolean);
              
              void setup()
              {
                Serial.begin(115200);
              
                Serial.println("Adafruit GPS library basic test!");
              
                GPS.begin(9600);
                GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
                GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);
                GPS.sendCommand(PGCMD_ANTENNA);
              
                useInterrupt(true);
              
                delay(1000);
              }
              
              SIGNAL(TIMER0_COMPA_vect)
              {
                char c = GPS.read();
              #ifdef UDR0
                if (GPSECHO)
                  if (c) UDR0 = c;
              #endif
              }
              
              void useInterrupt(boolean v)
              {
                if (v)
                {
                  OCR0A = 0xAF;
                  TIMSK0 |= _BV(OCIE0A);
                  usingInterrupt = true;
                }
                else
                {
                  TIMSK0 &= ~_BV(OCIE0A);
                  usingInterrupt = false;
                }
              }
              
              uint32_t timer = millis();
              
              void loop()
              {
                if (GPS.newNMEAreceived())
                {
              
                  if (!GPS.parse(GPS.lastNMEA()))
                    return;
                }
              
                if (timer > millis())  timer = millis();
                if (millis() - timer > 1000)
                {
                  timer = millis();
              
              
                  // Impression dans un fichier série.
              
              
                  Serial.println();
              
                  // Impression sur des données générales
              
                  Serial.print("Fix: " );
                  Serial.println((int)GPS.fix);
              
                  Serial.print("Qualite:");
                  Serial.println((int)GPS.fixquality);
              
                  Serial.print("Hdop: " );
                  Serial.println(GPS.HDOP, 1);
              
                  Serial.print("HG: " );
                  Serial.println(GPS.geoidheight, 1);
              
                  // Impression du nombre de satellites utilisés
              
                  Serial.print("Satellites:");
              
                  if ((int)GPS.satellites < 10)
                  {
                    Serial.print("0");
                    Serial.println((int)GPS.satellites);
                  }
                  else if ((int)GPS.satellites >= 10)
                  {
                    Serial.println((int)GPS.satellites);
                  }
              
                  // Impression de la date
              
                  Serial.print("Date:");
              
                  if (GPS.day < 10)
                  {
                    Serial.print("0");
                    Serial.print(GPS.day, DEC);
                  }
                  else if (GPS.day >= 10)
                  {
                    Serial.print(GPS.day, DEC);
                  }
                  Serial.print(":");
                  if (GPS.month < 10)
                  {
                    Serial.print("0");
                    Serial.print(GPS.month, DEC);
                  }
                  else if (GPS.month >= 10)
                  {
                    Serial.print(GPS.month, DEC);
                  }
                  Serial.print(":");
                  Serial.print("20");
                  Serial.print(GPS.year, DEC);
                  Serial.println("  ");
              
              
                  // Impression de l'Heure
              
                  Serial.print("Heure:");
              
                  if (GPS.hour < 10)
                  {
                    Serial.print("0");
                    Serial.print(GPS.hour, DEC);
                  }
                  else if (GPS.hour >= 10)
                  {
                    Serial.print(GPS.hour, DEC);
                  }
                  Serial.print(":");
                  if (GPS.minute < 10)
                  {
                    Serial.print("0");
                    Serial.print(GPS.minute, DEC);
                  }
                  else if (GPS.minute >= 10)
                  {
                    Serial.print(GPS.minute, DEC);
                  }
                  Serial.print(":");
                  if (GPS.seconds < 10)
                  {
                    Serial.print("0");
                    Serial.println(GPS.seconds, DEC);
                  }
                  else if (GPS.seconds >= 10)
                  {
                    Serial.println(GPS.seconds, DEC);
                  }
              
                  // Impression des Coordonnées
              
                  Serial.println("Coordonnees:");
              
              
                  Serial.print(" Latitude en degres decimaux: ");
              
                  if (GPS.latitudeDegrees < 10)
                  {
                    Serial.print("00");
                    Serial.print(GPS.latitudeDegrees, 5);
                    Serial.print(" ");
                    Serial.println(GPS.lat);
                  }
                  else if (GPS.latitudeDegrees < 100)
                  {
                    Serial.print("0");
                    Serial.print(GPS.latitudeDegrees, 5);
                    Serial.print(" ");
                    Serial.println(GPS.lat);
                  }
                  else  if (GPS.latitudeDegrees > 99)
                  {
                    Serial.print(GPS.latitudeDegrees, 5);
                    Serial.print(" ");
                    Serial.println(GPS.lat);
                  }
              
                  Serial.print("Longitude en degres decimaux: ");
              
                  if (GPS.longitudeDegrees >= 0)
                  {
                    if (GPS.longitudeDegrees < 10)
                    {
                      Serial.print("00");
                      Serial.print(GPS.longitudeDegrees, 5);
                      Serial.print(" ");
                      Serial.println(GPS.lon);
                    }
                    else if (GPS.longitudeDegrees < 100)
                    {
                      Serial.print("0");
                      Serial.print(GPS.longitudeDegrees, 5);
                      Serial.print(" ");
                      Serial.println(GPS.lon);
                    }
                    else if (GPS.longitudeDegrees > 99)
                    {
                      Serial.print(GPS.longitudeDegrees, 5);
                      Serial.print(" ");
                      Serial.println(GPS.lon);
                    }
              
                    Serial.print(" Latitude en degres minutes centesimales: ");
                    Serial.print(GPS.latitude, 5);
                    Serial.print(" ");
                    Serial.println(GPS.lat);
                    Serial.print("Longitude en degres minutes centesimales: ");
                    Serial.print(GPS.longitude, 5);
                    Serial.print(" ");
                    Serial.println(GPS.lon);
                  }
              
                  //Impression de la Vitesse et de l'Altitude
              
              
                  Serial.print("Altitude en metres: ");
                  Serial.print(GPS.altitude, 0);
                  Serial.println(" m");
              
                  Serial.print("Vitesse en Kmh: " );
                  GPS.speed = GPS.speed * 1.852;
                  Serial.print(GPS.speed, 0);
                  Serial.println(" Kmh");
                }
              }

              A ta disposition pour d'autres questions.

              @+

              • Partager sur Facebook
              • Partager sur Twitter
                24 février 2019 à 18:01:59

                Bonjour

                Je pense avoir le même problème que Data cube avec TinyGPSPlus c'est à dire, pas d'altitude et pas de de nombre de satellite sur l'écran Oled.

                Du coup, j'ai pris le code de Anonyme, j'ai installé la librairie Adafruit_Gps et tout roule sur la console !

                L'altitude et nombre de satellite apparaissent, comme par magie !

                Par contre, la longitude n'est pas renseignée et je ne vois pas d'où çà vient dans le code...

                Quelqu'un peut m'aider ?

                Cordialement,

                Howard

                • Partager sur Facebook
                • Partager sur Twitter
                  3 juin 2021 à 6:22:07

                  Tu as trouvé la réponse car ça fait un mois que je cherche est ça ne fonctionne pas. Ça devient urgent
                  • Partager sur Facebook
                  • Partager sur Twitter

                  [ARDUINO] Problème de GPS (gy-gps6mv2)

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown