Go Down

Topic: GPS EM-406 example (Read 14588 times) previous topic - next topic


hmm does anyone successfully got a GPS running over the
SoftSerial Port?


hector albornoz

I have an Arduino - Duemilanove 328, I connect the GSM / GPRS Module - SM5100B and GPS Shield with EM-406A.
Shield calls connect to each TX (1) and RX (0). How do I connect power and functioning properly.
Hector Albornoz


Jan 13, 2011, 02:14 am Last Edit: Jan 13, 2011, 02:18 am by mikecurry74 Reason: 1
had garbled output like everyone else... but now...

Acquired Data
Lat/Long(10^-5 deg): 4312611, -8029204 Fix age: 298ms.
Lat/Long(float): 43.12611, -80.29204 Fix age: 415ms.
Date(ddmmyy): 130111 Time(hhmmsscc): 1090400 Fix age: 544ms.
Date: 1/13/2011  Time: 1:9:4.0  Fix age: 648ms.
Alt(cm): 22040 Course(10^-2 deg): 27382 Speed(10^-2 knots): 37
Alt(float): 220.40 Course(float): 273.82
Speed(knots): 0.37 (mph): 0.43 (mps): 0.19 (kmph): 0.69
Stats: characters: 5699 sentences: 41 failed checksum: 4

Problem was that data was INVERTED...

do this:
NewSoftSerial nss(2, 3, true);

Here is my modified code:

Code: [Select]
#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, true); // my gps data is inverted!!

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

void setup()
 Serial.print("Testing TinyGPS library v. "); Serial.println(TinyGPS::library_version());
 Serial.println("by Mikal Hart");
 Serial.print("Sizeof(gpsobject) = "); Serial.println(sizeof(TinyGPS));

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");

void printFloat(double number, int digits)
 // Handle negative numbers
 if (number < 0.0)
    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;

 // Print the decimal point, but only if there are digits beyond
 if (digits > 0)

 // Extract digits from the remainder one at a time
 while (digits-- > 0)
   remainder *= 10.0;
   int toPrint = int(remainder);
   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.");


 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.");


 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.");

 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();


 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;


Problem was that data was INVERTED...

do this:
NewSoftSerial nss(2, 3, true);

This is not the solution to everybody. Apparently the EM-406 needs not to be inverted. Mine and lots of others with this module have them work fine.

Go Up

Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

via Egeo 16
Torino, 10131