Go Down

Topic: GPS Modules (Read 861 times) previous topic - next topic

HP0321

Hi, I am currently working on a autonomous robot projects which require a GPS for navigation.
I purchased a 3dr gps ublox lea6 and arduino leonardo. But i cant receive any data from the GPS which one the blue led is flashing.
Also, is the type gps will affect the connection like a shield is need or can have direct connection to controllers.

Regards,
Hong Ping

pylon

How did you connect it to the Leonardo? What code do you use?

Did you notice that the Leonardos USART is not referenced by the Serial but by the Serial1 object?

HP0321

#2
Mar 10, 2013, 07:14 pm Last Edit: Mar 11, 2013, 10:37 am by HP0321 Reason: 1
I am using the example in TinyGps. For the connection, i connect the Tx to pin 3 while Rx to pin 4. Apparently i also swapped both of them but it seem like the red led of the GPS do not blink, only the blue led is blinking

Code: [Select]
#include <SoftwareSerial.h>

#include <TinyGPS.h>

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

TinyGPS gps;
SoftwareSerial nss(3, 4);

static void gpsdump(TinyGPS &gps);
static bool feedgps();
static void print_float(float val, float invalid, int len, int prec);
static void print_int(unsigned long val, unsigned long invalid, int len);
static void print_date(TinyGPS &gps);
static void print_str(const char *str, int len);

void setup()
{
 Serial.begin(57600);
 nss.begin(57600);
 
 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();
 Serial.println("Sats HDOP Latitude Longitude Fix  Date       Time       Date Alt     Course Speed Card  Distance Course Card  Chars Sentences Checksum");
 Serial.println("          (deg)    (deg)     Age                        Age  (m)     --- from GPS ----  ---- to London  ----  RX    RX        Fail");
 Serial.println("--------------------------------------------------------------------------------------------------------------------------------------");
}

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

static void gpsdump(TinyGPS &gps)
{
 float flat, flon;
 unsigned long age, date, time, chars = 0;
 unsigned short sentences = 0, failed = 0;
 static const float LONDON_LAT = 51.508131, LONDON_LON = -0.128002;
 
 print_int(gps.satellites(), TinyGPS::GPS_INVALID_SATELLITES, 5);
 print_int(gps.hdop(), TinyGPS::GPS_INVALID_HDOP, 5);
 gps.f_get_position(&flat, &flon, &age);
 print_float(flat, TinyGPS::GPS_INVALID_F_ANGLE, 9, 5);
 print_float(flon, TinyGPS::GPS_INVALID_F_ANGLE, 10, 5);
 print_int(age, TinyGPS::GPS_INVALID_AGE, 5);

 print_date(gps);

 print_float(gps.f_altitude(), TinyGPS::GPS_INVALID_F_ALTITUDE, 8, 2);
 print_float(gps.f_course(), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2);
 print_float(gps.f_speed_kmph(), TinyGPS::GPS_INVALID_F_SPEED, 6, 2);
 print_str(gps.f_course() == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(gps.f_course()), 6);
 print_int(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0UL : (unsigned long)TinyGPS::distance_between(flat, flon, LONDON_LAT, LONDON_LON) / 1000, 0xFFFFFFFF, 9);
 print_float(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : TinyGPS::course_to(flat, flon, 51.508131, -0.128002), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2);
 print_str(flat == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(TinyGPS::course_to(flat, flon, LONDON_LAT, LONDON_LON)), 6);

 gps.stats(&chars, &sentences, &failed);
 print_int(chars, 0xFFFFFFFF, 6);
 print_int(sentences, 0xFFFFFFFF, 10);
 print_int(failed, 0xFFFFFFFF, 9);
 Serial.println();
}

static void print_int(unsigned long val, unsigned long invalid, int len)
{
 char sz[32];
 if (val == invalid)
   strcpy(sz, "*******");
 else
   sprintf(sz, "%ld", val);
 sz[len] = 0;
 for (int i=strlen(sz); i<len; ++i)
   sz[i] = ' ';
 if (len > 0)
   sz[len-1] = ' ';
 Serial.print(sz);
 feedgps();
}

static void print_float(float val, float invalid, int len, int prec)
{
 char sz[32];
 if (val == invalid)
 {
   strcpy(sz, "*******");
   sz[len] = 0;
       if (len > 0)
         sz[len-1] = ' ';
   for (int i=7; i<len; ++i)
       sz[i] = ' ';
   Serial.print(sz);
 }
 else
 {
   Serial.print(val, prec);
   int vi = abs((int)val);
   int flen = prec + (val < 0.0 ? 2 : 1);
   flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
   for (int i=flen; i<len; ++i)
     Serial.print(" ");
 }
 feedgps();
}

static void print_date(TinyGPS &gps)
{
 int year;
 byte month, day, hour, minute, second, hundredths;
 unsigned long age;
 gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
 if (age == TinyGPS::GPS_INVALID_AGE)
   Serial.print("*******    *******    ");
 else
 {
   char sz[32];
   sprintf(sz, "%02d/%02d/%02d %02d:%02d:%02d   ",
       month, day, year, hour, minute, second);
   Serial.print(sz);
 }
 print_int(age, TinyGPS::GPS_INVALID_AGE, 5);
 feedgps();
}

static void print_str(const char *str, int len)
{
 int slen = strlen(str);
 for (int i=0; i<len; ++i)
   Serial.print(i<slen ? str[i] : ' ');
 feedgps();
}

static bool feedgps()
{
 while (nss.available())
 {
   if (gps.encode(nss.read()))
     return true;
 }
 return false;
}

pylon

Edit your post and insert code tags!

michinyon

The blue led flashing, probably means it hasn't got a good signal.    Most of the ones with a LED will have the LED steadily on,  when they get a valid fix.

The most likely reason,  is that you are not outside,  or close to a large window.


48X24X48X

Quote
Not all pins on the Leonardo support change interrupts, so only the following can be used for RX: 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).

pylon

Just to explain the post of 48X24X48X: the SoftwareSerial class depends on the RX pin being able to produce a pin change interrupt. On an UNO all GPIO pins are able to trigger such an interrupt but on the Leonardo you haven't the same degree of freedom in choosing the RX pin, your RX pin must be one of the list 48X24X48X posted.

PaulS

Quote
but on the Leonardo you haven't the same degree of freedom in choosing the RX pin, your RX pin must be one of the list 48X24X48X posted.

On the other hand, pins 0 and 1 are tied to Serial1, not Serial, so you have independent channels to talk to the GPS and PC, unlike the UNO.

HP0321

Thanks a lot on the information !!

Go Up