Skip to main content
GNSS HAT Library Documentation
Shop GitHub Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

L1/L5 GNSS RTK HAT

A professional-grade dual-band GNSS RTK HAT for Raspberry Pi based on the u-blox NEO-F9P module. It delivers centimeter-level positioning accuracy using RTK corrections and concurrent reception of up to four satellite constellations on L1 and L5 bands.

L1/L5 GNSS RTK HAT board

Features

GNSS ModuleNEO-F9P
Frequency BandsL1 + L5
ConstellationsGPS + QZSS, Galileo, GLONASS, BeiDou (4 concurrent)
Position Accuracy~0.01 m (RTK), ~2.5 m CEP (standalone)
Max Update Rate20 Hz
RTKBase station (Survey-In / Fixed Position) & Rover
RTCM3Input (rover corrections) and output (base corrections) via UART
GeofencingUp to 4 circular zones + PIO relay output
Hot Start~2 s TTFF via onboard supercapacitor backup
Timepulse (PPS)Configurable pulse on GPIO 5
Jamming / Spoofing DetectionYes
DimensionsRaspberry Pi HAT form factor

Concurrent L1 + L5 reception provides significantly better multipath resistance than single-band receivers. With RTK corrections (via RTCM3), the module achieves centimeter-level accuracy. In standalone mode it delivers ~2.5 m CEP — already improved over single-band modules thanks to dual-band ionospheric error cancellation.


Board Components

SMA Antenna Connector

The board provides an SMA female connector for an external GNSS antenna.

  • Active antenna supply: 3.3 V@30mA output on the antenna pin to power active antennas directly — no external bias-tee needed.
  • Antenna supervision: The board monitors antenna status (OK, Short, Open) and power state. This is reported via the rfBlocks field in the navigation data.
  • For best results, use an active antenna with a clear sky view. A passive antenna will also work but may yield reduced sensitivity.
Tip
The antenna status is available in the rfBlocks[].antennaStatus field returned by the library. Use it to detect antenna disconnection or short-circuit conditions.

USB Type-C

The USB-C port provides direct serial access to the NEO-F9P module, bypassing the Raspberry Pi entirely. When connected via USB cable, the module appears as a CDC-ACM serial device (/dev/ttyACM0).

Use cases:

  • u-center — connect from a PC to use u-blox’s configuration and evaluation tool for inspecting, configuring, and debugging the receiver
  • Firmware updates — flash new firmware onto the NEO-F9P via USB
  • Direct gpsd access — feed NMEA data to gpsd without the library’s SPI bridge
  • Any serial terminal — any tool that accepts serial input can connect directly
Note
USB access bypasses the library’s SPI communication. Do not use USB and the library simultaneously — they will conflict.

Super Capacitor

The onboard supercapacitor provides backup power to the module’s battery-backed domain (RTC, ephemeris, almanac, and last-known position) when the Raspberry Pi is powered off.

  • Hot start retention: up to 4 hours after power loss
  • Hot start TTFF: ~2 seconds (vs. 30–60 seconds for a cold start)
  • How it works: The supercapacitor charges while the HAT is powered. On power loss, it sustains the backup domain so the receiver remembers satellite data and can reacquire a fix almost instantly when power returns.
Note
To take advantage of hot start, use softResetUbloxSom_HotStart() instead of hardResetUbloxSom_ColdStart() while doing a software reset. A cold start clears all stored satellite data regardless of supercapacitor state.

Status LEDs

The board has several status LEDs located near the USB-C connector:

LEDColorFunction
PWRGreenPower indicator — lit when the HAT is receiving power from the Raspberry Pi
USB ONGreenUSB connection indicator — lit when the HAT is connected by USB cable
TIME PULSEIce BlueTimepulse — blinks at 1 Hz (default) when the receiver has a valid GNSS fix
GEOFENCEIce BlueGeofence status — driven by PIO pin 6, lights up based on geofence state, actual logic depends on configuration

The TIME PULSE LED provides an immediate visual confirmation that the receiver has acquired a fix. If the PPS LED is not blinking, the receiver does not yet have a position solution.

40-Pin GPIO Header

The HAT connects to the Raspberry Pi via the standard 40-pin GPIO header. The RTK HAT uses both SPI and UART interfaces:

GPIO PinFunctionDescription
GPIO 5Timepulse (PPS)1 PPS output from the NEO-F9P — usable as interrupt or PPS source for time servers
GPIO 17TxReadySPI data-ready interrupt — signals when the receiver has data to transmit
SPI0Data busSPI communication with the NEO-F9P (CE0, MOSI, MISO, SCLK) — primary interface for UBX protocol
GPIO 14 (TXD)UART TXRaspberry Pi UART transmit — sends RTCM3 corrections to the rover
GPIO 15 (RXD)UART RXRaspberry Pi UART receive — reads RTCM3 output from the base station
EEPROMData busI²C communication with the HAT’s EEPROM (SDA, SCL)

SPI is the primary interface — it carries all UBX protocol traffic (navigation, configuration, monitoring). UART is the secondary interface dedicated to RTCM3 corrections: the base station outputs RTCM3 messages on UART TX, and a rover receives corrections on UART RX.

Note
GPIO 5 Conflict — Kernel PPS (/dev/pps0) and the library’s enableTimepulse() / timepulse() both use GPIO 5. They cannot run at the same time. Choose one or the other.
Note
UART must be enabled via raspi-config before use. See Installation for details.

Geofence Relay Output

A screw terminal on the board edge provides a relay output. This output is driven by the module’s hardware geofencing engine.

Recommended operating conditions of the onboard relay:

  • Maximum voltage on both pins ≤ 48 V
  • Maximum current ≤ 325 mA
  • Maximum resistance between the terminals in ON-state ~2 Ω