Leon Steenkamp
Building small satellites on the tip of Africa. My other ride is a CubeSat.
Raspberry Pi GPS HAT
2026-07-04I’ve been fascinated with GPS, or rather GNSS (Global Navigation Satellite Systems), receivers for a few years now, mostly just receiver development boards. Seeing if the receiver can achieve lock indoors, how long it takes, the data messages it generates, and how many satellites it receives over time.
A few years ago, I bought two u-blox receiver boards from RF Design both with Mini USB connectors - the one a LEA-5H and the other a LEA-6H. I wanted a more modern receiver, so I bought a SAM-M10Q module with an integrated antenna from RF Design. Using a UART to USB converter, I managed to get it working dead bug style as shown in image below.
![]() |
|---|
| GNSS receiver dead bug style |
![]() |
|---|
| GNSS receiver dead bug style - bottom |
At this point, it was decided to rather swap the wires for a PCB. After checking what parts were available locally, a u-blox DAN-F10N module, also with an integrated antenna, was used, and a quick PCB layout was done.
![]() |
|---|
| Completed board |
The board is based on the Raspberry Pi (RPi) HAT (Hardware Attached on Top) form factor and includes a push button, LED, and a small 128x32 pixel OLED display. The receiver can also be reset by the processor. The layout was done using KiCad that has a template for RPi HATs and manufactured using PCBWay.
![]() |
|---|
| KiCad PCB |
The GNSS receiver’s Pulse Per Second (PPS) output is connected to a RPi GPIO (General Purpose Input/Output) pin in order for the processor to receive accurate timing pulses. This PPS signal is an accurate pulse that the GNSS receiver generates once a second that can be used for timing. A RPi GPIO pin can also be used to reset the receiver.
![]() |
|---|
| Manufactured bare PCBs |
The software package gpsd was installed and configured to process messages generated by the GNSS receiver.
The software package chrony was installed and configured to take care of timing-related activities. This package also allows other hosts to synchronise their time by providing a timing service over a network interface. The RPi Zero’s WiFi connection might not be perfect for this, but should be fine for less demanding applications.
In order to keep track of the functioning of the GNSS receiver and the timing service, a “GNSS dashboard“ page was created using LLM tools, in this case, Claude.
![]() |
|---|
| GNSS dashboard page |
During “development” of this project, there were a few things I just completely forgot about. These include power supply decoupling capacitors and supply filtering. I also did not include any switch debounce components. Some capacitors were added on the supply lines after the PCBs were received, and the switch debounce seems easy enough to handle with the RPi.GPIO Python package.
Some things that can be improved from the current layout is the coin cell battery placement, which is in the way of the USB connector. This is not really an issue if you are using connector J2 to power the board. I was unsure about including the coin cell, but this turned out very useful as it greatly reduces the time to first fix from receiver cold start.
![]() |
|---|
| Populated board |
In conclusion, I am quite happy with how the board came out and is quite an improvement on the initial dead-style GNSS receiver.
![]() |
|---|
| Populated board |







