Overview
The ShillehTek GT-U7 is a compact, high-sensitivity GPS receiver module based on a u-blox compatible positioning engine. It ships pre-soldered with a male 5-pin header, making it breadboard-ready out of the box. Whether you're building a GPS logger, a drone telemetry system, a vehicle tracker, or a weather balloon payload, the GT-U7 provides accurate location, velocity, and UTC time data at up to 5 Hz.
The module exposes a standard TTL UART at 9600 baud by default, so it works seamlessly with Arduino, Raspberry Pi, ESP32, and Pico via any free serial port. An onboard 3.3V regulator lets you power it directly from a 5V rail, and a u.FL (IPEX) connector is available for an external active antenna if you need to operate indoors or with limited sky view.
A backup-battery socket keeps the RTC and last-known ephemeris alive between power cycles, dramatically shortening time-to-first-fix from a cold start (~27 s) down to a hot start (~1 s). The PPS output pin provides a 1-pulse-per-second timing signal — extremely useful for precise time synchronization projects and sensor sampling.
At a Glance
Specifications
| Parameter | Value |
| GPS Chipset | u-blox 6/7 compatible |
| Operating Voltage | 3.3V - 5V (onboard LDO regulator) |
| Operating Current | ~45 mA (tracking) |
| Communication Protocol | UART (TTL), NMEA 0183 sentences |
| Default Baud Rate | 9600 bps (8N1) |
| Position Accuracy | ~2.5 m CEP (with clear sky view) |
| Update Rate | 1 Hz default (configurable up to 5 Hz) |
| Time To First Fix | Cold ~27 s / Warm ~27 s / Hot ~1 s |
| Sensitivity | -162 dBm tracking |
| Antenna | Onboard patch + u.FL (IPEX) connector |
| Backup Battery | CR1220 socket (not included) |
| Operating Temperature | -40 °C to +85 °C |
| Dimensions | ~28 mm x 28 mm |
Pinout Diagram
Wiring Guide
Arduino Wiring
The GT-U7 runs comfortably on 5V thanks to its onboard regulator. We use SoftwareSerial on pins D4 (RX) and D3 (TX) so the hardware UART (D0/D1) stays free for sketch uploads and Serial Monitor output.
| GT-U7 Pin | Arduino Pin |
|---|---|
| VCC | 5V |
| GND | GND |
| TXD | D4 (Arduino RX) |
| RXD | D3 (Arduino TX) |
| PPS | D2 (optional, INT0) |
ESP32 Wiring
ESP32 has multiple hardware UARTs. We use UART2 on GPIO16 (RX) and GPIO17 (TX) — the factory defaults for Serial2.
| GT-U7 Pin | ESP32 Pin |
|---|---|
| VCC | 5V (or 3.3V) |
| GND | GND |
| TXD | GPIO16 (RX2) |
| RXD | GPIO17 (TX2) |
| PPS | GPIO4 (optional) |
Raspberry Pi Wiring
The Pi's UART is exposed on pins 8 (GPIO14/TXD0) and 10 (GPIO15/RXD0). Before wiring, enable the serial port hardware and disable the serial console in raspi-config.
| GT-U7 Pin | Raspberry Pi Pin (BOARD) |
|---|---|
| VCC | Pin 2 or 4 (5V) |
| GND | Pin 6 (GND) |
| TXD | Pin 10 (GPIO15 / RXD) |
| RXD | Pin 8 (GPIO14 / TXD) |
| PPS | Pin 12 (GPIO18, optional) |
sudo raspi-config → Interface Options → Serial Port → disable the login shell on serial but keep the serial hardware enabled. Reboot before using the GPS.
Raspberry Pi Pico Wiring
The Pico has two hardware UARTs. We use UART0 on GP0 (TX) and GP1 (RX) for simplicity, but any UART-capable pair of GPIOs works.
| GT-U7 Pin | Pico Pin |
|---|---|
| VCC | VSYS (5V) or 3V3(OUT) |
| GND | GND |
| TXD | GP1 (UART0 RX) |
| RXD | GP0 (UART0 TX) |
| PPS | GP2 (optional) |
Code Examples
Arduino
// GT-U7 GPS: print raw NMEA sentences over USB Serial
// Wiring: VCC->5V, GND->GND, GT-U7 TXD->D4, GT-U7 RXD->D3
// Open Serial Monitor at 9600 baud
#include
SoftwareSerial gpsSerial(4, 3); // RX=D4, TX=D3
void setup() {
Serial.begin(9600);
gpsSerial.begin(9600);
Serial.println("GT-U7 GPS ready. Waiting for NMEA sentences...");
}
void loop() {
// Forward anything the GPS sends to the Serial Monitor
while (gpsSerial.available()) {
char c = gpsSerial.read();
Serial.write(c);
}
}
Arduino with TinyGPSPlus (parsed data)
// GT-U7 GPS: parse NMEA with TinyGPSPlus library
// Install via Library Manager: "TinyGPSPlus" by Mikal Hart
#include
#include
SoftwareSerial gpsSerial(4, 3); // RX=D4, TX=D3
TinyGPSPlus gps;
void setup() {
Serial.begin(9600);
gpsSerial.begin(9600);
Serial.println("GT-U7: waiting for fix...");
}
void loop() {
while (gpsSerial.available()) {
gps.encode(gpsSerial.read());
}
if (gps.location.isUpdated()) {
Serial.print("Lat: ");
Serial.print(gps.location.lat(), 6);
Serial.print(" Lng: ");
Serial.print(gps.location.lng(), 6);
Serial.print(" Alt: ");
Serial.print(gps.altitude.meters());
Serial.print(" m Sats: ");
Serial.println(gps.satellites.value());
}
}
Raspberry Pi (Python)
# GT-U7 GPS on Raspberry Pi
# Install: pip install pyserial pynmea2 --break-system-packages
# Enable serial hardware first: sudo raspi-config
import serial
import pynmea2
ser = serial.Serial('/dev/serial0', 9600, timeout=1)
print("GT-U7 GPS: reading NMEA from /dev/serial0")
while True:
try:
line = ser.readline().decode('ascii', errors='replace').strip()
if line.startswith('$GPRMC') or line.startswith('$GNRMC'):
msg = pynmea2.parse(line)
if msg.status == 'A': # 'A' = valid fix
print(f"Lat: {msg.latitude:.6f} Lon: {msg.longitude:.6f} "
f"Speed: {msg.spd_over_grnd} knots UTC: {msg.timestamp}")
else:
print("Waiting for GPS fix...")
except pynmea2.ParseError:
continue
except KeyboardInterrupt:
break
ser.close()
Raspberry Pi Pico (MicroPython)
# GT-U7 GPS on Raspberry Pi Pico (MicroPython)
# Wiring: VCC->VSYS, GND->GND, GT-U7 TXD->GP1, GT-U7 RXD->GP0
from machine import UART, Pin
import time
uart = UART(0, baudrate=9600, tx=Pin(0), rx=Pin(1))
print("GT-U7 GPS: reading NMEA sentences...")
buffer = b""
while True:
if uart.any():
buffer += uart.read(uart.any())
while b"\n" in buffer:
line, buffer = buffer.split(b"\n", 1)
try:
sentence = line.decode('ascii').strip()
if sentence.startswith('$GPGGA') or sentence.startswith('$GNGGA'):
parts = sentence.split(',')
if len(parts) > 6 and parts[6] != '0':
lat = parts[2]
lon = parts[4]
sats = parts[7]
print(f"Lat: {lat} Lon: {lon} Sats: {sats}")
else:
print("No fix yet...")
except UnicodeError:
pass
time.sleep_ms(100)
ESP32 (MicroPython)
# GT-U7 GPS on ESP32 (MicroPython)
# Wiring: VCC->5V, GND->GND, GT-U7 TXD->GPIO16, GT-U7 RXD->GPIO17
from machine import UART
import time
uart = UART(2, baudrate=9600, tx=17, rx=16)
print("GT-U7 GPS: reading from UART2...")
while True:
if uart.any():
try:
line = uart.readline()
if line:
sentence = line.decode('ascii', 'ignore').strip()
if sentence.startswith('$GPRMC') or sentence.startswith('$GNRMC'):
print(sentence)
except Exception as e:
print("Parse error:", e)
time.sleep_ms(100)