SIM908 GPS giving wrong position

Hi. I have some troubles with a project in wich im involved for two weeks. But I got stuck in the (for me) dumbest part.

First of all, i exactly have this GPS/GSM/GPRS Shield connected to a normal Arduino UNO: http://www.dfrobot.com/wiki/index.php/GPS/GPRS/GSM_Module_V3.0_(SKU:TEL0051)

And using this code for testing the GPS:

// Product name: GPS/GPRS/GSM Module V3.0
// # Product SKU : TEL0051
// # Version     : 1.2
 
// # Description:
// # The sketch for driving the gps mode via the Arduino board
 
// # Steps:
// #        1. Turn the S1 switch to the Prog(right side)
// #        2. Turn the S2 switch to the Arduino side(left side)
// #        3. Set the UART select switch to middle one.
// #        4. Upload the sketch to the Arduino board
// #        5. Turn the S1 switch to the comm(left side)
// #        6. RST the board
 
// #        If you get 'inf' values, go outdoors and wait until it is connected.
// #        wiki link- http://www.dfrobot.com/wiki/index.php/GPS/GPRS/GSM_Module_V3.0_(SKU:TEL0051)
 
double Datatransfer(char *data_buf,char num)//convert the data to the float type
{                                           //*data_buf?the data array                                      
  double temp=0.0;                           //the number of the right of a decimal point
  unsigned char i,j;
 
  if(data_buf[0]=='-')
  {
    i=1;
    //process the data array
    while(data_buf[i]!='.')
      temp=temp*10+(data_buf[i++]-0x30);
    for(j=0;j<num;j++)
      temp=temp*10+(data_buf[++i]-0x30);
    //convert the int type to the float type
    for(j=0;j<num;j++)
      temp=temp/10;
    //convert to the negative numbe
    temp=0-temp;
  }
  else//for the positive number
  {
    i=0;
    while(data_buf[i]!='.')
      temp=temp*10+(data_buf[i++]-0x30);
    for(j=0;j<num;j++)
      temp=temp*10+(data_buf[++i]-0x30);
    for(j=0;j<num;j++)
      temp=temp/10 ;
  }
  return temp;
}
 
char ID()//Match the ID commands
{
  char i=0;
  char value[6]={
    '

i cant get an acceptable position; here are the results that i got last time I tested:

Imgur

Being my actual positon the blue dot, and the sim908 result the red one, that’s about 50/60 Km (38 Miles) of difference. I dont want to get between 10/20 m accuracy, i’d accept even if it were 100/150m; but that is too much.

Firstly, I thought it was because of the small integrated antenna attached to the shield, so i placed (with the SMA/uFL adaptor) this antenna: http://tienda.bricogeek.com/modulos-radiofrecuencia/218-antena-gps-3v-con-base-magnetica.html

But I’m still getting the same wrong positions…

I’ve been looking up in google for this, i tried so many things, but i dont see where am I doing wrong.

I tried, as I said, with the antenna, but also going outside with clear skies and no buildings surrounding, supplying power through and old PC PSU (with 12V in Vin Pin)…

But nothing works, if you guys could advice me, you’d be my heros.,‘G’,‘P’,‘G’,‘G’,‘A’      };//match the gps protocol
 char val[6]={
   ‘0’,‘0’,‘0’,‘0’,‘0’,‘0’      };

while(1)
 {
   if(Serial.available())
   {
     val[i] = Serial.read();//get the data from the serial interface
     if(val[i]==value[i]) //Match the protocol
     {  
       i++;
       if(i==6)
       {
         i=0;
         return 1;//break out after get the command
       }
     }
     else
       i=0;
   }
 }
}

void comma(char num)//get ‘,’
{  
 char val;
 char count=0;//count the number of ‘,’

while(1)
 {
   if(Serial.available())
   {
     val = Serial.read();
     if(val==’,’)
       count++;
   }
   if(count==num)//if the command is right, run return
     return;
 }

}
void UTC()//get the UTC data – the time
{
 char i;
 char time[9]={
   ‘0’,‘0’,‘0’,‘0’,‘0’,‘0’,‘0’,‘0’,‘0’
 };
 double t=0.0;

if( ID())//check ID
 {
   comma(1);//remove 1 ‘,’
   //get the datas after headers
   while(1)
   {
     if(Serial.available())
     {
       time[i] = Serial.read();
       i++;
     }
     if(i==9)
     {
       i=0;
       t=Datatransfer(time,2);//convert data
       t=t-30000.00;//convert to the chinese time GMT+8 Time zone
       long time=t;
       int h=time/10000;
       int m=(time/100)%100;
       int s=time%100;
       
//        if(h>=24)               //UTC+
//        {
//        h-=24;
//        }

if (h<0)               //UTC-
       {
         h+=24;
       }
       Serial.print(h);
       Serial.print(“h”);
       Serial.print(m);
       Serial.print(“m”);
       Serial.print(s);
       Serial.println(“s”);

//Serial.println(t);//Print data
       return;
     }
   }
 }
}
void latitude()//get latitude
{
 char i;
 char lat[10]={
   ‘0’,‘0’,‘0’,‘0’,‘0’,‘0’,‘0’,‘0’,‘0’,‘0’
 };

if( ID())
 {
   comma(2);
   while(1)
   {
     if(Serial.available())
     {
       lat[i] = Serial.read();
       i++;
     }
     if(i==10)
     {
       i=0;
       Serial.println(Datatransfer(lat,5)/100.0,7);//print latitude
       return;
     }
   }
 }
}
void lat_dir()//get dimensions
{
 char i=0,val;

if( ID())
 {
   comma(3);
   while(1)
   {
     if(Serial.available())
     {
       val = Serial.read();
       Serial.write(val);
       Serial.println();
       i++;
     }
     if(i==1)
     {
       i=0;
       return;
     }
   }
 }
}
void longitude()//get longitude
{
 char i;
 char lon[11]={
   ‘0’,‘0’,‘0’,‘0’,‘0’,‘0’,‘0’,‘0’,‘0’,‘0’,‘0’
 };

if( ID())
 {
   comma(4);
   while(1)
   {
     if(Serial.available())
     {
       lon[i] = Serial.read();
       i++;
     }
     if(i==11)
     {
       i=0;
       Serial.println(Datatransfer(lon,5)/100.0,7);
       return;
     }
   }
 }
}
void lon_dir()//get direction data
{
 char i=0,val;

if( ID())
 {
   comma(5);
   while(1)
   {
     if(Serial.available())
     {
       val = Serial.read();
       Serial.write(val); //Serial.println(val,BYTE);
       Serial.println();
       i++;
     }
     if(i==1)
     {
       i=0;
       return;
     }
   }
 }
}
void altitude()//get altitude data
{
 char i,flag=0;
 char alt[8]={
   ‘0’,‘0’,‘0’,‘0’,‘0’,‘0’,‘0’,‘0’
 };

if( ID())
 {
   comma(9);
   while(1)
   {
     if(Serial.available())
     {
       alt[i] = Serial.read();
       if(alt[i]==’,’)
         flag=1;
       else
         i++;
     }
     if(flag)
     {
       i=0;
       Serial.println(Datatransfer(alt,1),1);//print altitude data
       return;
     }
   }
 }
}
void setup()
{
 pinMode(3,OUTPUT);//The default digital driver pins for the GSM and GPS mode
 pinMode(4,OUTPUT);
 pinMode(5,OUTPUT);
 digitalWrite(5,HIGH);
 delay(1500);
 digitalWrite(5,LOW);

digitalWrite(3,LOW);//Enable GSM mode
 digitalWrite(4,HIGH);//Disable GPS mode
 delay(2000);
 Serial.begin(9600);
 delay(5000);//GPS ready

Serial.println(“AT”);  
 delay(2000);
 //turn on GPS power supply
 Serial.println(“AT+CGPSPWR=1”);
 delay(1000);
 //reset GPS in autonomy mode
 Serial.println(“AT+CGPSRST=1”);
 delay(1000);

digitalWrite(4,LOW);//Enable GPS mode
 digitalWrite(3,HIGH);//Disable GSM mode
 delay(2000);

Serial.println("$GPGGA statement information: ");
}
void loop()
{
 while(1)
 {
   Serial.print(“UTC:”);
   UTC();
   Serial.print(“Lat:”);
   latitude();
   Serial.print(“Dir:”);
   lat_dir();
   Serial.print(“Lon:”);
   longitude();
   Serial.print(“Dir:”);
   lon_dir();
   Serial.print(“Alt:”);
   altitude();
   Serial.println(’ ‘);
   Serial.println(’ ');
 }
}


i cant get an acceptable position; here are the results that i got last time I tested:

http://imgur.com/9RHNOHC

Being my actual positon the blue dot, and the sim908 result the red one, that's about 50/60 Km (38 Miles) of difference. I dont want to get between 10/20 m accuracy, i'd accept even if it were 100/150m; but that is too much.

Firstly, I thought it was because of the small integrated antenna attached to the shield, so i placed (with the SMA/uFL adaptor) this antenna: http://tienda.bricogeek.com/modulos-radiofrecuencia/218-antena-gps-3v-con-base-magnetica.html 

But I'm still getting the same wrong positions...

I've been looking up in google for this, i tried so many things, but i dont see where am I doing wrong.

I tried, as I said, with the antenna, but also going outside with clear skies and no buildings surrounding, supplying power through and old PC PSU (with 12V in Vin Pin)...

But nothing works, if you guys could advice me, you'd be my heros.

There is a bug in the code.

When the code converts the lat/lon data they use: Serial.println(Datatransfer(lon,5)/100.0,7);

But the data is in DD mm. dddd

So in order to convert it to DD. dddddd You need to do (DD+mm. dddd/60)

I checked manually and the result is good. Will update the code later.

Hope this helps.

have u upload the new codes n fixed the bugs?

yes, please give me a solution for this problem

Hi, did anyone was able to figure this out, and can you share the code fix, i'm having the same issue , wrong coordinates and i'm assuming is the same problem. Thanks!!!

zivlevy: There is a bug in the code.

When the code converts the lat/lon data they use: Serial.println(Datatransfer(lon,5)/100.0,7);

But the data is in DD mm. dddd

So in order to convert it to DD. dddddd You need to do (DD+mm. dddd/60)

I checked manually and the result is good. Will update the code later.

Hope this helps.

Ive just started playing with the TEL0051 and confirm the code is wrong and that the solution provided above is correct.

My problem is that I don't know enough about coding to revise the code such that it gives the correct LAT & LON. Is anyone able to do so? It would be much appreciated.

Thanks Jon