Arduino GPS "Hello World" Program
It was a slight mission to get the Sparkfun GPS shield and EM 406 chip to work with the Arduino Mega 2560 because none of the samples worked. Here's what I did differently:
a) Wired the GPS shield pin 2 (connected to the GPS chip TX pin) to the Arduino Mega 2560 pin 19 (RX1).
b) Recoded the sample program to use Serial1 instead of SoftSerial.
Here's the code I'm using:
/*
6-12-12
Aaron Weiss
SparkFun Electronics, Beerware
Example GPS Parser based off of arduiniana.org TinyGPS examples.
Parses NMEA sentences from an EM406 running at 4800bps into readable
values for latitude, longitude, elevation, date, time, course, and
speed. Use 115200 baud for your serial port baud rate
For the SparkFun GPS Shield. Make sure the switch is set to DLINE.
Once you get your longitude and latitude you can paste your
coordinates from the terminal window into Google Maps. Here is the
link for SparkFun's location.
http://maps.google.com/maps?q=40.06477,+-105.20997
Uses the NewSoftSerial library for serial communication with your GPS,
so connect your GPS TX and RX pin to any digital pin on the Arduino,
just be sure to define which pins you are using on the Arduino to
communicate with the GPS module.
REVISIONS:
1-17-11
changed values to RXPIN = 2 and TXPIN = to correspond with
hardware v14+. Hardware v13 used RXPIN = 3 and TXPIN = 2.
25-11-12
James Cox - changed to work with Arduino Mega and GPS Shield.
Jumper GPS shield pin 2 to Ardunio Mega pin 19. This connects the
gps chip TX pin to the Mega RX1 serial input.
*/
// In order for this sketch to work, you will need to download
// the TinyGPS library from arduiniana.org and put them
// into the libraries folder in your ardiuno directory.
#include
// This is the serial rate for your terminal program. It must be this
// fast because we need to print everything before a new sentence
// comes in. If you slow it down, the messages might not be valid and
// you will likely get checksum errors.
// Set this value equal to the baud rate of your terminal program
#define TERMBAUD 115200
// Set this value equal to the baud rate of your GPS
#define GPSBAUD 4800
// Create an instance of the TinyGPS object
TinyGPS gps;
// This is where you declare prototypes for the functions that will be
// using the TinyGPS library.
void getgps(TinyGPS &gps);
// In the setup function, you need to initialize two serial ports; the
// standard hardware serial port (Serial()) to communicate with your
// terminal program an another serial port (NewSoftSerial()) for your
// GPS.
void setup()
{
// Sets baud rate of your terminal program
Serial.begin(TERMBAUD);
// Sets baud rate of your GPS
Serial1.begin(GPSBAUD);
Serial.println("");
Serial.println("GPS Shield QuickStart Example Sketch v12 for Arduino Mega 2560");
Serial.println("Ensure GPS shield pin 2 connects to Ardunio MEGA pin 19");
Serial.println(" ...waiting for lock... ");
Serial.println("");
}
// This is the main loop of the code. All it does is check for data on
// the RX pin of the ardiuno, makes sure the data is valid NMEA sentences,
// then jumps to the getgps() function.
void loop()
{
while(Serial1.available()) // While there is data on the RX pin...
{
int c = Serial1.read(); // load the data into a variable...
if(gps.encode(c)) // if there is a new valid sentence...
{
getgps(gps); // then grab the data.
}
}
}
// The getgps function will get and print the values we want.
void getgps(TinyGPS &gps)
{
// To get all of the data into varialbes that you can use in your code,
// all you need to do is define variables and query the object for the
// data. To see the complete list of functions see keywords.txt file in
// the TinyGPS and NewSoftSerial libs.
// Define the variables that will be used
float latitude, longitude;
// Then call this function
gps.f_get_position(&latitude, &longitude);
// You can now print variables latitude and longitude
Serial.print("Lat/Long: ");
Serial.print(latitude,5);
Serial.print(", ");
Serial.println(longitude,5);
// Same goes for date and time
int year;
byte month, day, hour, minute, second, hundredths;
gps.crack_datetime(&year,&month,&day,&hour,&minute,&second,&hundredths);
// Print data and time
Serial.print("Date: "); Serial.print(month, DEC); Serial.print("/");
Serial.print(day, DEC); Serial.print("/"); Serial.print(year);
Serial.print(" Time: "); Serial.print(hour, DEC); Serial.print(":");
Serial.print(minute, DEC); Serial.print(":"); Serial.print(second, DEC);
Serial.print("."); Serial.println(hundredths, DEC);
//Since month, day, hour, minute, second, and hundr
// Here you can print the altitude and course values directly since
// there is only one value for the function
Serial.print("Altitude (meters): "); Serial.println(gps.f_altitude());
// Same goes for course
Serial.print("Course (degrees): "); Serial.println(gps.f_course());
// And same goes for speed
Serial.print("Speed(kmph): "); Serial.println(gps.f_speed_kmph());
//Serial.println();
// Here you can print statistics on the sentences.
unsigned long chars;
unsigned short sentences, failed_checksum;
gps.stats(&chars, &sentences, &failed_checksum);
//Serial.print("Failed Checksums: ");Serial.print(failed_checksum);
//Serial.println(); Serial.println();
// Here you can print the number of satellites in view
Serial.print("Satellites: ");
Serial.println(gps.satellites());
}
