Branchement GPS - Arduino UNO

Bonjour :)

Sur lextronic j'ai vu un petit module GPS qui m'a l'air bien sympa, le EM-406. Et j'ai aussi trouvé ce qui permet de le raccorder à l'Arduino.

Mais je m'interroge pour les branchements. Le 5V et le GND je connais.

Mais où se raccorde Tx, Rx et 1PPS ?

Tx et Rx il me semble que c'est les pins 0 et 1, mais c'est automatique ou il faut faire quelque chose niveau code ?

Et 1PPS c'est où/quoi, impossible de trouver...

Merci pour votre aide :)

Tu branche tx-rx (sur les pin inverse de l'arduino et tu utilises la bibliothèque tinyGps.... et hop (ça doit jouer XD)

arduimat: B Et 1PPS c'est où/quoi, impossible de trouver...

1 PPS = 1 pulse seconde = 1 impulsion seconde

cette sortie est commune à beaucoup de module GPS, elle permet de synchroniser très precisemment l'heure . les caractéristiques du front sont pour beaucoup de modules tres cadrées et permettent . de synchroniser des équipements et/ou d'asservir des BdT sur la precision de la constellation GPS

Jean-François: Tu branche tx-rx (sur les pin inverse de l'arduino et tu utilises la bibliothèque tinyGps.... et hop (ça doit jouer XD)

Ok donc je branche TX du module GPS sur la Pin 0 (rx) et le RX sur la Pin 1 (tx), merci :)

Artouste : Et donc le 1 Pulse Per Second, ça doit pouvoir se brancher sur n'importe quelle autre pin du moment que le code précise de laquelle il s'agit je suppose.

Bon beh merci pour vos réponses les amis, je vous tiens au courant lorsque je ferai mumuse avec ce module GPS :grin:

arduimat: Artouste : Et donc le 1 Pulse Per Second, ça doit pouvoir se brancher sur n'importe quelle autre pin du moment que le code précise de laquelle il s'agit je suppose.

Bon beh merci pour vos réponses les amis, je vous tiens au courant lorsque je ferai mumuse avec ce module GPS :grin:

En utilisation basique avec un arduino, le pin 1PPS peut être "oublié" pour débuter et faire "mumuse" :grin: en utilisation plus poussée, il peut être utilisé pour générer une interruption par exemple

Bon alors j’hésite, j’ai trouvé ce GPS là :

http://www.lextronic.fr/P1400-recepteur-gps-oem-em-406a.html

Et j’ai regardé pour faire la commande, ça fait un total de 55€, ça fait un peu cher pour faire joujou mais bon. Cependant j’ai pas trouvé énormement d’exemples d’utilisation de ce modèle GPS avec l’Arduino, j’espère ça pose pas problème.

Vous connaissez des meilleurs plans que 55 euros peut être ?

Cherche celui ci :

SKYLAB SKM53

C'est celui que j'utilise et tu devrais le trouver dans les 20-25 € avec le breakout... et tu fais comme je te l'ai indiqué plus haut. (regarde tout de même la Dsheet)

Jean-François: Cherche celui ci :

SKYLAB SKM53

C'est celui que j'utilise et tu devrais le trouver dans les 20-25 € avec le breakout... et tu fais comme je te l'ai indiqué plus haut. (regarde tout de même la Dsheet)

Merci mais j'arrive pas à le trouver à la vente, apparemment il ne se vend plus. Et les seuls que je trouve sont aussi cher que le EM.

J'en ai trouvé sur ebay.com en cherchant NMEA TTL DATA Sirf, ça coute 13€ mais je sais pas ce que ça vaut ensuite !

PS : ils sont marqués comme Used sur ebay donc ils sont pas neuf, mais il y a quand même plus d'une centaine de ventes.

arduimat: ...Cependant j'ai pas trouvé énormement d'exemples d'utilisation de ce modèle GPS avec l'Arduino, j'espère ça pose pas problème.

bonjour Sur ce point, il ne faut pas chercher du code dédié à un "module GPS particulier" , La majorité des applis (arduino ou autres) ne font que récupérer/traiter des sentences au standard NMEA 0183, ce qui au passage garanti une (certaine) interchangeabilité entre "modules de réception" .

si dans les specifs , il est indiqué NMEA output, une grande partie du probleme sera(est déjà) réglée. si en plus il est spécifié TTL, le probleme est quasi déjà complétement réglé (au moins vu de l’interfaçage direct vers arduino )

Vraiment rien de compliqué avec ce module, tu branches, tu utilises la lib TinyGps et ça [u]doit[/u] marcher.

Salut,

J’ai reçu donc mon SKM53, et j’ai fais avec ce code :

/*
This Sketch will run with the SkyNav SKM53 GPS if.....
 RXD Arduino Pin 3
 TXD Arduino Pin 2
 RST Leave Open ? (Connect to a N/O momentary switch pulled low to reset?)
 NC Leave Open
 GND Ground
 VCC +5
 This is not a great program but it will tell you where you are in the world.
 Make sure you download and save to your Arduino/Libraries folder TinyGPS.h
 and NewSoftSerial.h files.
*/
/* http://www.scribd.com/doc/48759166/SKM53-Communication < That's where I got
the original code, thanks a lot man! He's also the guy I bought the SKM53 from,
which I got in working state (14/03/2011) :) */

#include <TinyGPS.h>
#include <NewSoftSerial.h>

unsigned long fix_age;

NewSoftSerial GPS(2,3);
TinyGPS gps;
void gpsdump(TinyGPS &gps);
bool feedgps();
void getGPS();
long lat, lon;
float LAT, LON;

void setup(){
  GPS.begin(9600);
  Serial.begin(115200);
}

void loop(){
  long lat, lon;
  unsigned long fix_age, time, date, speed, course;
  unsigned long chars;
  unsigned short sentences, failed_checksum;

  // retrieves +/- lat/long in 100000ths of a degree
  gps.get_position(&lat, &lon, &fix_age);

  // time in hh:mm:ss, date in dd/mm/yy
/*gps.get_datetime(&date, &time, &fix_age);
  year = date % 100;
  month = (date / 100) % 100;
  day = date / 10000;
  hour = time / 1000000;
  minute =  (time / 10000) % 100;
  second = (time / 100) % 100;
  Serial.print("Date: ");
  Serial.print(year); Serial.print("/");
  Serial.print(month); Serial.print("/");
  Serial.print(day);
  Serial.print(" :: Time: ");
  Serial.print(hour); Serial.print(":");
  Serial.print(minute); Serial.print(":");
  Serial.println(second);
*/
  getGPS();
  Serial.print("Latitude : ");
  Serial.print(LAT/100000,7);
  Serial.print(" :: Longitude : ");
  Serial.println(LON/100000,7);
}

void getGPS(){
  bool newdata = false;
  unsigned long start = millis();
  // Every 1 seconds we print an update
  while (millis() - start < 1000)
  {
    if (feedgps ()){
      newdata = true;
    }
  }
  if (newdata)
  {
    gpsdump(gps);
  }
}

bool feedgps(){
  while (GPS.available())
  {
    if (gps.encode(GPS.read()))
      return true;
  }
  return 0;
}

void gpsdump(TinyGPS &gps)
{
  //byte month, day, hour, minute, second, hundredths;
  gps.get_position(&lat, &lon);
  LAT = lat;
  LON = lon;
  {
    feedgps(); // If we don't feed the gps during this long routine, we may drop characters and get checksum errors
  }
}

Et toujours 0 en lat et long :frowning:

J’ai branché RXD sur la pin digital 3 et TXD sur la pin digital 2, 5V et GND, et j’ai téléchargé les bonnes librairies, le code s’upload bien sur l’Arduino, pas d’erreur mais toujours 0 et 0…

J’aimerai bien essayer dehors mais lorsque je branche l’Arduino à une prise électrique dehors, le code ne s’execute pas, la LED “on” de l’Arduino s’allume mais il clignote pas… Pourquoi ?

Merci :slight_smile:

Ah c'est les Serial.print qui pose problème lorsqu'on branche depuis autre que le PC...

Sinon j'ai remplacé les Serial.print par une LED avec une comparation...

Je suis parti faire un tour en voiture, une dizaine de kilomètres et toujours rien, aucune réception :(

L'alimentation du GPS est bonne je viens de tester avec le multimètre, ça donne 4.8V.

Une idée sur ce qui pourrait bloquer ?

Le truc étonnant, c'est que lorsque je tentede regarder la conso en mA du GPS avec le multimètre, il me donne 8mA ce qui est pas beaucoup...

Il y aurait pas une histoire d'utiliser les prises RST et NC ?

Sur internet les tutos ont l'air simple, en vrai c'est pas pareil :grin:

arduimat: Ah c'est les Serial.print qui pose problème lorsqu'on branche depuis autre que le PC...

Sinon j'ai remplacé les Serial.print par une LED avec une comparation...

Je suis parti faire un tour en voiture, une dizaine de kilomètres et toujours rien, aucune réception :(

L'alimentation du GPS est bonne je viens de tester avec le multimètre, ça donne 4.8V.

Une idée sur ce qui pourrait bloquer ?

ce n'est pas la peine d'aller faire un tour en voiture pour déjà voir si le module communique ou pas :grin: les sentences NMEA sortent toutes les secondes qu"elles soient "FIX" ou pas. Pas d'erreur/inversion de connexion entre TX/RX d'un coté et TX/RX de l'autre ? (TX--->RX, RX---->TX)

Je sais pas je me suis dis que peut être il y avait une mauvaise réception dans ma maison :smiley:

Non pas d’erreur sur les branchements…

Comment pourrais-je voir la sentence NMEA complète qui arrive ? (voir si elle arrive déjà)

Je teste le code donné en exemple avec TinyGPS :

#include <NewSoftSerial.h>
#include <TinyGPS.h>

/* This sample code demonstrates the normal use of a TinyGPS object.
   It requires the use of NewSoftSerial, and assumes that you have a
   4800-baud serial GPS device hooked up on pins 2(rx) and 3(tx).
*/

TinyGPS gps;
NewSoftSerial nss(2, 3);

void gpsdump(TinyGPS &gps);
bool feedgps();
void printFloat(double f, int digits = 2);

void setup()
{
  Serial.begin(115200);
  nss.begin(4800);
  
  Serial.print("Testing TinyGPS library v. "); Serial.println(TinyGPS::library_version());
  Serial.println("by Mikal Hart");
  Serial.println();
  Serial.print("Sizeof(gpsobject) = "); Serial.println(sizeof(TinyGPS));
  Serial.println();
}

void loop()
{
  bool newdata = false;
  unsigned long start = millis();

  // Every 5 seconds we print an update
  while (millis() - start < 5000)
  {
    if (feedgps())
      newdata = true;
  }
  
  if (newdata)
  {
    Serial.println("Acquired Data");
    Serial.println("-------------");
    gpsdump(gps);
    Serial.println("-------------");
    Serial.println();
  }
}

void printFloat(double number, int digits)
{
  // Handle negative numbers
  if (number < 0.0)
  {
     Serial.print('-');
     number = -number;
  }

  // Round correctly so that print(1.999, 2) prints as "2.00"
  double rounding = 0.5;
  for (uint8_t i=0; i<digits; ++i)
    rounding /= 10.0;
  
  number += rounding;

  // Extract the integer part of the number and print it
  unsigned long int_part = (unsigned long)number;
  double remainder = number - (double)int_part;
  Serial.print(int_part);

  // Print the decimal point, but only if there are digits beyond
  if (digits > 0)
    Serial.print("."); 

  // Extract digits from the remainder one at a time
  while (digits-- > 0)
  {
    remainder *= 10.0;
    int toPrint = int(remainder);
    Serial.print(toPrint);
    remainder -= toPrint; 
  } 
}

void gpsdump(TinyGPS &gps)
{
  long lat, lon;
  float flat, flon;
  unsigned long age, date, time, chars;
  int year;
  byte month, day, hour, minute, second, hundredths;
  unsigned short sentences, failed;

  gps.get_position(&lat, &lon, &age);
  Serial.print("Lat/Long(10^-5 deg): "); Serial.print(lat); Serial.print(", "); Serial.print(lon); 
  Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");
  
  feedgps(); // If we don't feed the gps during this long routine, we may drop characters and get checksum errors

  gps.f_get_position(&flat, &flon, &age);
  Serial.print("Lat/Long(float): "); printFloat(flat, 5); Serial.print(", "); printFloat(flon, 5);
  Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");

  feedgps();

  gps.get_datetime(&date, &time, &age);
  Serial.print("Date(ddmmyy): "); Serial.print(date); Serial.print(" Time(hhmmsscc): "); Serial.print(time);
  Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");

  feedgps();

  gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
  Serial.print("Date: "); Serial.print(static_cast<int>(month)); Serial.print("/"); Serial.print(static_cast<int>(day)); Serial.print("/"); Serial.print(year);
  Serial.print("  Time: "); Serial.print(static_cast<int>(hour)); Serial.print(":"); Serial.print(static_cast<int>(minute)); Serial.print(":"); Serial.print(static_cast<int>(second)); Serial.print("."); Serial.print(static_cast<int>(hundredths));
  Serial.print("  Fix age: ");  Serial.print(age); Serial.println("ms.");
  
  feedgps();

  Serial.print("Alt(cm): "); Serial.print(gps.altitude()); Serial.print(" Course(10^-2 deg): "); Serial.print(gps.course()); Serial.print(" Speed(10^-2 knots): "); Serial.println(gps.speed());
  Serial.print("Alt(float): "); printFloat(gps.f_altitude()); Serial.print(" Course(float): "); printFloat(gps.f_course()); Serial.println();
  Serial.print("Speed(knots): "); printFloat(gps.f_speed_knots()); Serial.print(" (mph): ");  printFloat(gps.f_speed_mph());
  Serial.print(" (mps): "); printFloat(gps.f_speed_mps()); Serial.print(" (kmph): "); printFloat(gps.f_speed_kmph()); Serial.println();

  feedgps();

  gps.stats(&chars, &sentences, &failed);
  Serial.print("Stats: characters: "); Serial.print(chars); Serial.print(" sentences: "); Serial.print(sentences); Serial.print(" failed checksum: "); Serial.println(failed);
}
  
bool feedgps()
{
  while (nss.available())
  {
    if (gps.encode(nss.read()))
      return true;
  }
  return false;
}

Il m’affiche :

Testing TinyGPS library v. 10
by Mikal Hart

Sizeof(gpsobject) = 103

Mais comme apparement rien d’autre arrive, il n’affiche rien d’autre…

Déjà il est bien alimenté, la tension sur les pins VCC et GND est bien de 4.8V.

Et pour les pins TXD et RXD, je sais pas quoi tester mais j’ai déjà essayé à l’endroit, à l’envers… et toujours rien.

Sur le GPS il y aussi une prise NC et RST, il y a peut être quelquechose à y faire d’abord.

Et ca envoi qqchose même si le GPS ne capte pas ?

arduimat: Je sais pas je me suis dis que peut être il y avait une mauvaise réception dans ma maison :D

Non pas d'erreur sur les branchements...

Comment pourrais-je voir la sentence NMEA complète qui arrive ? (voir si elle arrive déjà)

un duplicateur minimal qui renvoi sur sur le moniteur serie de l'IDE en 9600 ce qu'il reçoit du GPS ne connecter que le TX du GPS vers le RX de l'arduino genre (pas testé) ça doit/devrait "causer dans le poste" :grin: si tu vois des $G passer sur le moniteur ce sera déjà bon signe

int inByte = 0;       

void setup()
{
   Serial.begin(9600);

}

void loop()
{
  
  if (Serial.available() > 0) {
    // get incoming byte:
    inByte = Serial.read();
    Serial.print(inByte);
    delay(300);
  }
}

Je viens de tester un truc trouvé sur le forum anglais, mettre ce code et brancher le TX du GPS sur le TX de l'Arduino et parcourir les baud :

void setup(){
  pinMode(0,INPUT);
  digitalWrite(0,LOW);
  pinMode(1,INPUT);
  digitalWrite(1,LOW);
}

void loop(){
  while(1);
}

Et donc j'obtiens ça :

EDIT : J'avais pas vu ton message, est-ce que c'est du même genre ?

Merci pour l'aide :)

arduimat: ``` Je viens de tester un truc trouvé sur le forum anglais, mettre ce code et brancher le TX du GPS sur le TX de l'Arduino et parcourir les baud :

code]void setup(){   pinMode(0,INPUT);   digitalWrite(0,LOW);   pinMode(1,INPUT);   digitalWrite(1,LOW); }

void loop(){   while(1); }




Et donc j'obtiens ça :

![](http://img827.imageshack.us/img827/2079/arduinoskm53.jpg)

EDIT : J'avais pas vu ton message, est-ce que c'est du même genre ?

Merci pour l'aide :)

oui même idea Voilà, déjà maintenant tu es sur que ton module GPS communique correctement phase suivante attendre le FIX de la contellation GPS , un test en exterieur en position fixe, vue dégagée est préférable ! tu garde ton programme et tu attend de voir sur la trame $GPRMC passer le flag de V à A , et les 000000 vont aussi changer