There are modules like this one on EBay.
Type in 380617563592 in the search bar on EBay.
It has a built-in antenna and is reputed to be pretty sensitive.
Costs about $25US
Includes some sample code for Arduino.
Skylab GPS Module MT3329 SKM53 with Embedded GPS Antenna Arduino Compatible
Description :
Skylab UART Serial GPS Module For Arduino uController
SKM53 Series with embedded GPS antenna.It is based on MediaTek3329 single-chip architecture.SKM53 can be applied in a portable device and receiver like PND, GPS mouse, car holder, personal locator, speed camera detector and vehicle locator.
Features
- Ultra high sensitivity: -165dBm
- 22 tracking/66 acquisition-channel receiver
- WAAS/EGNOS/MSAS/GAGAN support
- NMEA protocols (default speed: 9600bps)
- Internal back-up battery and 1PPS output
- One serial port and USB port (option)
- Embedded patch antenna 18.2 x 18.2 x 4.0 mm
- Operating temperature range: -40 to 85
- RoHS compliant (Lead-free)
- Tiny form factor 30mm x20mm x 11.4mm
Specifications:
Receiver TypeL1 frequency band, C/A code
22 Tracking / 66 Acquisition-Channel
SensitivityTracking
Acquisition-165dBm
-148dBm
Accuracy
Position
Velocity
Timing (PPS)
3m 3D RMS without SA
0.1m/s without SA
60ns RMS
Acquisition TimeCold Start
Warm Start
Hot Start
Re-Acquisition36s
33s
1s
<1s
Power ConsumptionTracking
Acquisition
Sleep/Standby<30mA @ 3V Vcc
40mA
TBD
Navigation Data Update Rate1Hz
Operational LimitsAltitude
Velocity
AccelerationMax 18,000m
Max 515m/s
Less than 4g
Antenna SpecificationsOutlineDimension
Center Frequency
Bandwidth
Impedance
Axial Ratio
Polarization18.2 x 18.2 x 4.0 mm
1575 ± 3 MHz
10 MHz min
50 Ω
3 dB max
RHCP
Mechanical requirementsDimension
Weight30mm x20mm x 11.4mm
9g
Power consumptionVCC
Current5V ±5%
55mA(typical)
EnvironmentOperating temperature
Storage temperature
Humidity40 ~ +85 (w/o backup battery)
0 ~ +125
Arduino Code:
/*
RXD Arduino Pin 3
TXD Arduino Pin 2
RST Leave Open (Connect to a N/O momentary switch pulled low to reset?)
NC Leave Open
GND Ground
VCC +5
Make sure you download TinyGPS.h
*/
#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(115200);
}
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
}
}
(Written by Warren)