I'm building a Rover that has the Adafruit Ultimate GPS module on it, I am controlling it via Xbees with a controller that has 2 joysticks, sending the servo references to the rover. I also have a LCD display that is showing me the latitude and longitude. I've been able to get both the control and the GPS working but not at the same time. I've done some troubleshooting, revising and removing parts of the code and I've gotten it down to this problem.
I started with Adafruits GPS Parsing sketch. If I put the LCD.print statements in with the Serial.print statements it works fine. If I put the LCD.print statements outside of the GPS logic, at end of void loop, I loose GPS.fix. I have the same problem when I try to add any other functions, like the servo control, to this sketch. My sketch, below, shows the 2 places I've put the LCD.print statements, the one that makes it not work is commented out.
I'm using a Arduino Mega, GPS is on Serial3, Xbee on Serial1, I've left Serial for monitoring.
Obviously there is some conflict here, maybe with the GPS statements or the different baud rates but I can't seem to figure it out.
Thanks for any help
John
// Original GPS Parsing sketch from Adafruit with Wifi added
// and commented lines removed
// Add Libraries
#include <Adafruit_GPS.h>
#include <LiquidCrystal.h>
// what's the name of the hardware serial port?
#define GPSSerial Serial3 // changed from Serial1
// Connect to the GPS on the hardware port
Adafruit_GPS GPS(&GPSSerial);
// Set GPSECHO to 'false' to turn off echoing the GPS data to the Serial console
// Set to 'true' if you want to debug and listen to the raw GPS sentences
#define GPSECHO false
uint32_t timer = millis();
// initialize the lcd library with the numbers of the interface pins
LiquidCrystal lcd(33, 34, 35, 36, 37, 38);
// temporary array for parsing data from controller
const byte numChars = 64;
char receivedChars[numChars];
char tempChars[numChars];
// variables to hold the parsed data from controller
int Throttle_Ref = 0;
int Steering_Ref = 0;
int ThrottleOutValue =0;
int SteeringOutValue =0;
unsigned long Comm_Time = 0;
unsigned long Comm_Time_2 =0;
int Comm_Delay_Time = 1000;
int index = 0;
boolean newData = false;
// Variables to convert GPS NMEA values to signed degrees
float deg; //Will hold positin data in simple degree format
float degWhole; //Variable for the whole part of position
float degDec; //Variable for the decimal part of degree
float E_Long; // Google Earth format of longitude
float E_Lat; // Google Earth format of latitude
void setup()
{
//while (!Serial); // uncomment to have the sketch wait until Serial is ready
// connect at 115200 so we can read the GPS fast enough and echo without dropping chars
// also spit it out
Serial.begin(115200);
Serial.println("Adafruit GPS library basic test!");
//Serial port for Xbee from controller
Serial1.begin(9600);
// set up the LCD's number of columns and rows:
lcd.begin(20, 4);
// 9600 NMEA is the default baud rate for Adafruit MTK GPS's- some use 4800
GPS.begin(9600);
// uncomment this line to turn on RMC (recommended minimum) and GGA (fix data) including altitude
GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
// uncomment this line to turn on only the "minimum recommended" data
// GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCONLY);
// For parsing data, we don't suggest using anything but either RMC only or RMC+GGA since
// the parser doesn't care about other sentences at this time
// Set the update rate
GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); // 1 Hz update rate
// For the parsing code to work nicely and have time to sort thru the data, and
// print it out we don't suggest using anything higher than 1 Hz
// Request updates on antenna status, comment out to keep quiet
// GPS.sendCommand(PGCMD_ANTENNA);
delay(1000);
// Ask for firmware version
GPSSerial.println(PMTK_Q_RELEASE);
}
void loop() // run over and over again
{
// read data from the GPS in the 'main loop'
char c = GPS.read();
// if you want to debug, this is a good time to do it!
if (GPSECHO)
if (c) Serial.print(c);
// if a sentence is received, we can check the checksum, parse it...
if (GPS.newNMEAreceived()) {
// a tricky thing here is if we print the NMEA sentence, or data
// we end up not listening and catching other sentences!
// so be very wary if using OUTPUT_ALLDATA and trytng to print out data
Serial.println(GPS.lastNMEA()); // this also sets the newNMEAreceived() flag to false
if (!GPS.parse(GPS.lastNMEA())) // this also sets the newNMEAreceived() flag to false
return; // we can fail to parse a sentence in which case we should just wait for another
}
// if millis() or timer wraps around, we'll just reset it
if (timer > millis()) timer = millis();
// approximately every 2 seconds or so, print out the current stats
if (millis() - timer > 2000) {
timer = millis(); // reset the timer
Serial.print("GPS.fix = "); Serial.println((int)GPS.fix);
Serial.print("\nTime: ");
Serial.print(GPS.hour, DEC); Serial.print(':');
Serial.print(GPS.minute, DEC); Serial.print(':');
Serial.print(GPS.seconds, DEC); Serial.print('.');
Serial.println(GPS.milliseconds);
Serial.print("Date: ");
Serial.print(GPS.day, DEC); Serial.print('/');
Serial.print(GPS.month, DEC); Serial.print("/20");
Serial.println(GPS.year, DEC);
Serial.print("Fix: "); Serial.print((int)GPS.fix);
Serial.print(" quality: "); Serial.println((int)GPS.fixquality);
if (GPS.fix) {
Serial.print("Location: ");
Serial.print(GPS.latitude, 4); Serial.print(GPS.lat);
Serial.print(", ");
Serial.print(GPS.longitude, 4); Serial.println(GPS.lon);
Serial.print("Speed (knots): "); Serial.println(GPS.speed);
Serial.print("Angle: "); Serial.println(GPS.angle);
Serial.print("Altitude: "); Serial.println(GPS.altitude);
Serial.print("Satellites: "); Serial.println((int)GPS.satellites);
// ******* Print to LCD display *******
// GPS.fix good when LCD.prints are here
lcd.setCursor(0, 0);
lcd.print("Lat = ");
lcd.print(GPS.latitude, 4); // lcd.print(GPS.latitude);
lcd.setCursor(0, 1);
lcd.print("Lon = ");
lcd.print(GPS.longitude, 4); // lcd.print(GPS.longitude);
} // end of if (GPS.fix)
} // end of if (millis() - timer > 2000) loop
// Clear Serial Buffer
while (Serial.available() > 0) {
Serial.read();
} // end while (Serial.available()
// ******* Print to LCD display *******
// GPS.fix lost when LCD.prints are here
/* lcd.setCursor(0, 0);
lcd.print("Lat = ");
lcd.print(GPS.latitude, 4); // lcd.print(GPS.latitude);
lcd.setCursor(0, 1);
lcd.print("Lon = ");
lcd.print(GPS.longitude, 4); // lcd.print(GPS.longitude);
*/
} // end void loop