Bad GPS reception


I have a Arduino Duemilanove connected to a Libelium GPS (…).
I am accessing the GPS through the LB_GPS library Version 01a
I have a very bad reception of the satellites.
In my implementation the Arduino is switched on with a push button. Then the program tries to read data from the GPS. If it fails, delays 10 seconds and retries until 32 times.

      for( iCounter = 0, bIsValid = false; iCounter < 32; iCounter++)
          getLocation(&bIsValid, sDateGPS, sTimeGPS, sLatitude, sLongitude, sAltitude, &fLatitude, &fLongitude, &fAltitude);
          if(bIsValid) break;

Sometimes I get a position but most of the time after the 32 retries I get no signal.
I am testing in a very open sky place at the roof of my building.
I think maybe is a bad reception problem but I am not sure.
The batteries are new (4xAA) and the antenna is a ceramic ones labelled 1575R-A C.
The antenna is located at the top of a wood box inside a hole like shown in the photo.
I do not know if there is any method to improve the antenna gain. The only thing I know is to put the antenna plain.
Could it help to put a metallic ‘ground’ plate below the antenna?

Any idea, comments… ?

Thanks in advance

I haven't worked with that GPS unit in particular, but the GPS unit I'm using, it has a 45 - 60 second COLD start. Meaning it takes about 60 seconds to get a strong signal from when it is first turned on.

You'll want to look at the Start times, there should be a COLD, WARM, and HOT start. I'm not sure what the difference between a WARM and a HOT start, but I know that if you have it powered for a while, with a strong signal, then power off, and power back on, it takes less time to aquire a signal. (assuming it's not powered off too long.)

With the Unit I have.. which was SUPER cheap... it was $30 US, but it's a "speed trap tracking gps" for the UK speed cameras. If you update it with the database that's online, it will warn you when you get near to a speed-camera by beeping.. but since there are no speed cameras in the US... no need to update it!

But it has CRAZY good reception.. and I'm inside about the middle of my house, and when I use it with Google Earth, it pinpoints to right on top of me within about 5 yards. Again, only when it's warm, it lets me know by illuminating an LED on the GPS unit. (If I try before it gets a good signal, it's about 20-40 yards off, if not a few miles!!)

With the Unit I have..

Which unit would that be? I'd like to play around with a GPS, but $40 to $100 is too much to justify.


Cold start -> GPS has to determine the strongest satellite signals it can hear, get a lock (satellite ID), determine UTC time and then download the ephemeris table to identify all the available visible satellites. Given the data rate, this takes time, 40-60 seconds is lightning quick in comparison to some of the earliest units I worked with.

Warm start -> the GPS knows its last position, the ephemeris table and the time, and needs to now establish what satellites are visible.

Hot start -> the GPS unit has all the information, just needs to listen to the satellites it knows should be there and calculate its current position.

@ galtanegra

Spec Sheet for the GPS module used on this board:

This receiver has a 60 second cold start, 32 second warm start and 3 second hot start and is using an active antenna (amplified).

With a clear view of the sky up on the roof, from a cold start, your gps unit should get a lock and start spitting out NEMA data after 60 seconds. This could be verified with a FTDI TTL-232R serial cable and the GPS unit by itself. Experiment to see how long a cold acquisition takes. The next step is to see if this GPS unit stores any of the data when powered off to allow for warm and hot starts.

Does this push button you use to turn on the Ardiuno remain on, or do you push it to get GPS data and then release it to shut the Arduino off? The first time you turn it on, you will need a 60 second delay before you even bother with trying to read GPS data. Powering the GPS receiver off may cause it to lose its data which means it will require 60 seconds every time you turn it back on to reacquire lock. The spec sheet mentions that the unit may be put into a standby mode that will allow it to keep its data for 36 hours off a 1F capacitor.

Something to think about also is RF interference. I'm not sure what all the wiring and boards shown in the picture are, but you might try putting the Arduino and everything else in a grounded metal box with the antenna on the outside so it isn't getting any interference from the other electronics.


my original idea was to have the full system always turned off. When the button was pressed all the circuits were powered up, a single read was done in the GPS and then the power was cut to save batteries.

Everything was going fine but I assume this way of work was causing a GPS cold start every time. The problem was that it was not delaying 60 seconds, it was delaying about eight minutes in open sky.

The GPS I am using is the following:

Just to make a test I have connected directly the power pin of the GPS to the batteries so it is always running. And that works, firts read is always slow but after that the following reads delay about 15 seconds which is quite good. So, I think I will leave things as this.

Anyway I will do the tests proposed. I had also think on the ground metal box for the circuits but I was not sure if that was a possible solution. i will also try that. I am also checking to put the GPS in standby mode, but specs say "the system goes in standby mode for undefined time and can be waked up by hardware". I do not understand how to wake up the system.

Nevertheless I have two concerns:

1) The GPS must be powered through a (+5V) pin. Actually I have it directly connected to the batteries (4 x AA can give maybe 6.5V). I am not sure if this can be a problem.

2) I do not know which is the current consumption of the GPS and if to have it permanently started can affect significantly to the duration of the batteries

Thanks for your help

Not sure why it’s taking 8 minutes, but here’s what I can figure out from the information on Libelium’s website being correlated with the GPS Receiver manufacturer’s information…

The Tyco A1037-A is the small board mounted on the Libellium GPS Module. According to the following, it doesn’t hold data when powered off, so you get a cold start every time power is turned off and reapplied…

3.3.1 Avoiding Cold Start Behavior
A1037-A is a ROM based GPS receiver module. Powering down the module will
delete all ephemeris and almanac data in the GPS engine and will end in a cold
start next time the module will be powered on again.

This can be avoided by reading out the ephemeris / almanacs before powering
down the module and reload it after powering up the module again.

Please note: Ephemeris data are valid for 4 hours
Almanac data are valid for 3 month

So, basically, unless it can be put in standby, the Arduino would have to pull the almanac and ephemeris data off and store it before powering down, and then reload it upon powering up again, added complication that would require an SD card or memory chip and additional software to perform that operation.

Referring to Tyco’s information, you send the GPS receiver the following command to put it into standby:

PSTMSTBY Put the GPS engine in standby mode
$PSTMSTBY,(T) T Standby period (seconds);
Arguments: Acceptable values are from 0 to 99999
Description: Put the system in Standby mode. If T is 0 then the system goes in
standby mode for undefined time and can be waked up by

This would allow you to keep the GPS receiver powered, but in a low power mode that doesn’t eat batteries, from which it would wake when the time period expires. The T=0 time period would allow you to wake the receiver on demand, you’ll need to contact Libelium and see if they have allowed for one of the pins on the GPS module to wake the receiver up from standby.

Does Libelium provide a schematic for their board?

Looking through the Libelium-LB_GPS-01a library, here are some commands listed:


You might try asking here to see how they're implemented. I looked in the library's examples, but didn't see them being used.


I have solved the problem having the GPS module always powered on. When not needed the GPS module is in standby mode with T=0 (done using GPS_SLEEP). When the Arduino needs new data it wakes up the GPS module, reads the new data an puts it in standby mode again. Saving the ephemeris and almanac is not feasible because as you say it is quite complicated.

The connection schema for the GPS module is very simple. The GPS is connected directly to the pins of the Arduino and the only cabling needed is the power (+5V and GND).

Is it possible to get a copy of the document you are quoting in your last post?

Thank you very much for your help.

Glad to hear it! :D

For the cold start information and standby, updated Version 2 of the firmware documentation provided by Libelium is available from Mouser here:

The GPS_ON, GPS_OFF, GPS_STANDBY is referenced about 2/3 of the way down in the file keywords.txt located in the library. I read through the .cpp and .h files to try to figure out the programming necessary to implement them, but I don't have a unit here to experiment with.