Pages: [1]   Go Down
Author Topic: Problem in getting GPS data  (Read 413 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hello,

I am using a GPS module (SKylab SKM53) with Arduino UNO to get location data. This is the code I use to read gps data

Code:
/*
This Sketch will run with the SkyNav SKM53 GPS
 RXD Arduino Pin 3
 TXD Arduino Pin 2
 RST Leave Open
 NC Leave Open
 GND Ground
 VCC +5
 Make sure you download and save to your Arduino/Libraries folder TinyGPS.h
 and NewSoftSerial.h files.
*/

#include <TinyGPS.h>
#include <SoftwareSerial.h>

unsigned long fix_age;

SoftwareSerial 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(9600);
}

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

  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
  }
}


Unfortunately, the gps.encode() function never returns true even though the module is sending proper NMEA data like this:

Quote
$GPGGA,002349.038,8960.0000,N,00000.0000,E,0,0,,137.0,M,13.0,M,,*44
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGSV,1,1,00*79
$GPRMC,002349.038,V,8960.0000,N,00000.0000,E,0.00,0.00,060180,,,N*79

As a result, the lattitude and longitude displayed is always ZERO. Please help...
Logged

Seattle, WA USA
Offline Offline
Brattain Member
*****
Karma: 549
Posts: 46090
Seattle, WA USA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

That getGPS() function looks pretty hokey. There is data available, or there isn't. Waiting one second, in the hopes that some shows up, is silly.

getGPS() should be deleted. The call to it should call feedgps() instead. Then, add a test for whatever interval you want, and call gpsdump() when that interval has elapsed.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Thanks. I made the changes you suggested but its still not working. Here's the new code :

Code:
/*
This Sketch will run with the SkyNav SKM53 GPS
 RXD Arduino Pin 3
 TXD Arduino Pin 2
 RST Leave Open
 NC Leave Open
 GND Ground
 VCC +5
 Make sure you download and save to your Arduino/Libraries folder TinyGPS.h
 and NewSoftSerial.h files.
*/

#include <TinyGPS.h>
#include <SoftwareSerial.h>

unsigned long fix_age;

SoftwareSerial 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(9600);
}

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

  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);
  Serial.print("Latitude : ");
  Serial.print(LAT/100000,7);
  Serial.print(" :: Longitude : ");
  Serial.println(LON/100000,7);
 
}

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
  }
}

I also modified the feedgps() function to print the GPS data. It prints NMEA strings on the serial monitor but the gps.encode() function never returns true.

feedgps() function:

Code:
bool feedgps(){
  while (GPS.available())
  {
    char c = GPS.read();
    Serial.print(c);
    if (gps.encode(c))
      return true;
  }
  return 0;
}

Serial Monitor:

Quote
$GPGGA,232851.245,8960.0000,N,00000.0000,E,0,0,,137.0,M,13.0,M,,*4F
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGSV,1,1,00*79
$GPRMC,232851.245,V,8960.0000,N,00000.0000,E,0.00,0.00,200413,,,N*79
Latitude : 0.0000000 :: Longitude : 0.0000000

How do I make it work? Any alternatives? also tried the sample code that comes with TinyGPS library but same problem smiley-sad
Logged

Seattle, WA USA
Offline Offline
Brattain Member
*****
Karma: 549
Posts: 46090
Seattle, WA USA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
  // Every 1 seconds we print an update
  while (millis() - start < 1000)
  {
    if(feedgps())
      newdata = true;
  }
What this comment says and what the code does are two completely different things.

Get rid of every bit of the timing stuff until you reliably get data from the GPS. The GPS only sends out data periodically.

Code:
long lat, lon;
float LAT, LON;

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

void loop(){
  long lat, lon;
The number of times where local and global variables of the same name are a good idea can be counted on one hand of a double amputee. Knock it off.
Logged

Pages: [1]   Go Up
Jump to: