Introduction
Hardware Overview
The Combo Breakout PCB.
The u-blox ZED-F9P NEO-D9S Combo Breakout is a sophisticated yet compact GNSS board. The following is a summary of its features and functions:
ZED-F9P
- the ZED-F9P is a top-of-the-line module for high accuracy GNSS and GPS location solutions- Concurrent reception of GPS, GLONASS, Galileo and BeiDou
- Multi-band RTK with fast convergence times and reliable performance
- Centimeter-level accuracy in a small and energy-efficient module
The ZED-F9P GNSS module.
NEO-D9S
- the NEO-D9S is a satellite data receiver for L-band correction broadcast- The NEO-D9S can be configured for use with a variety of L-band correction services including u-blox's PointPerfect service
- It decodes the satellite transmission and outputs a correction stream directly to the ZED-F9P via UART2
The NEO-D9S correction data receiver.
UART2 TX and RX
- the ZED-F9P and NEO-D9S UART2 TX and RX are interconnected (crossed-over) to allow the NEO to feed corrections directly to the ZED- The UART2 pins can be isolated if required by opening the TX2 and RX2 jumpers
- Using UART2 to pass the correction data is recommended, but is optional. You can use UART1 or I2C instead if you want to. Our u-blox Arduino Library has an example which shows how to read the correction data from the NEO-D9S and push it to the ZED-F9P using I2C.
The UART2 connections.
Antenna Power Divider
- the breakout has an on-board power divider (antenna splitter) to divide the satellite signals between the ZED and the NEO- The connector is SMA female (standard polarity)
- 3.3V power is provided for an active antenna
The antenna splitter (power divider).
Dual USB-C connections
- one USB-C connector provides a direct connection to the ZED-F9P; the second provides a direct connection to the NEO-D9S- The board can be powered via either USB-C connector, or both
- There is no on-board USB hub. Both ports can be connected simultaneously to the same computer, or different computers if desired
The two USB-C connectors.
LED Indicators
- the breakout has four LED indicators:- 3V3 Power
- RTK: Off = No Carrier Solution; Flashing = Floating Solution; On = Fixed Solution
- GEO: Geofence indication
- TP: Timing Pulse (Pulse Per Second)
- Each LED can be disabled by opening the corresponding split pad jumper on the bottom of the breakout
The LEDs.
Dual Qwiic Connectors
- the breakout has two Qwiic (I2C) connectors allowing the breakout to be daisy-chained into your Qwiic project
The two Qwiic connectors.
Back-up Battery
- a small rechargeable coin cell maintains the ZED-F9P battery-backed RAM while the power is disconnected
The rechargeable back-up battery.
Full set of breakout pads
- the breakout pads provide full access to the ZED-F9P and NEO-D9S pins- I2C
- UART1
- UART2
- External Interrupt
- Reset
- Safeboot
- ZED-F9P: TX_RDY, TP, GEO, RTK
- Power: 5V and 3.3V
The breakout pads.
Board Dimensions
The board dimensions are illustrated in the drawing below. The listed measurements are in inches. The four mounting holes are compatible with 4-40 UNC or M3.0 screws.
Board dimensions.
Left Edge Breakout Pads
With the SMA connector oriented to the 'top', the breakout pads down the left side of the board are:
Pad | Function |
---|---|
ANT_PWR | External antenna power Cut the ANT_VCC trace and install L1 to enable |
EXT_INT_NEO | Connected to the NEO-D9S EXT_INT pin |
RX1 | NEO-D9S UART1 RX Pin |
TX1 | NEO-D9S UART1 TX Pin |
RX2 | NEO-D9S UART2 RX Pin Connected to ZED-F9P TX2 (Open the TX2 jumper to isolate) |
TX2 | NEO-D9S UART2 TX Pin Connected to ZED-F9P RX2 (Open the RX2 jumper to isolate) |
GND | Power Ground (0V) |
3V3 | 3.3V Supply rail Output of regulator U2 (Can also be used as a power input) |
SDA | I2C Data Common to both ZED and NEO |
SCL | I2C Clock Common to both ZED and NEO |
For more details, users can reference the schematic.
Right Edge Breakout Pads
With the SMA connector oriented to the 'top', the breakout pads down the right side of the board are:
Pad | Function |
---|---|
RESET | Reset Active low. Common to both ZED and NEO |
EXT_INT | Connected to the ZED-F9P EXT_INT pin |
TX1 | ZED-F9P UART1 TX Pin |
RX1 | ZED-F9P UART1 RX Pin |
TX2 | ZED-F9P UART2 TX Pin Connected to NEO-D9S RX2 (Open the TX2 jumper to isolate) |
RX2 | ZED-F9P UART2 RX Pin Connected to NEO-D9S TX2 (Open the RX2 jumper to isolate) |
SCL | I2C Clock Common to both ZED and NEO |
SDA | I2C Data Common to both ZED and NEO |
3V3 | 3.3V Supply rail Output of regulator U2 (Can be used as a power input) |
GND | Power Ground (0V) |
For more details, users can reference the schematic.
Right Edge Breakout Pads
With the SMA connector oriented to the 'top', the breakout pads along the bottom edge of the board are:
Pad | Function |
---|---|
TX_RDY | Indicates the ZED-F9P has data waiting in its I2C TX buffer |
TP | ZED-F9P Timing Pulse (Pulse Per Second) |
GEO | ZED-F9P Geofence indicator |
RTK | ZED-F9P RTK indication High = No Carrier Solution. Square Wave = Floating Solution. Low = Fixed Solution |
5V | 5V Power Rail Can be used as a power input or output (from USB) (Diode protected) |
3V3 | 3.3V Supply rail Output of regulator U2 (Can be used as a power input) |
GND | Power Ground (0V) |
For more details, users can reference the schematic.
Jumpers
Note
Never modified a jumper before? Check out our Jumper Pads and PCB Traces tutorial for a quick introduction!
There are multiple jumpers on the back of the board that can be used to modify how the board functions.
The jumpers on the back of the board.
- TX2 - open this jumper to isolate NEO-D9S RX2 from ZED-F9P TX2
- RX2 - open this jumper to isolate NEO-D9S TX2 from ZED-F9P RX2
- By default, the NEO-D9S PMP (SPARTN) correction data stream is output directly from NEO-D9S TX2 to the ZED-F9P RX2
- Opening this jumper will break that connection
- Correction data can be read from the NEO-D9S and pushed to the ZED-F9P via I2C instead
- I2C - close this double jumper to connect additional pull-up resistors to I2C SCL and SDA. Not recommended
- SHLD - the two SHLD jumpers can be opened to isolate the USB-C connector shields from GND. Not recommended, but may help prevent EMI
- PWR - open this jumper to disable the Power LED
- RTK - open this jumper to disable the RTK LED
- GEO - open this jumper to disable the GEO LED
- TP - open this jumper to disable the TP (PPS) LED
ANT PWR
By default, 3.3V active antenna power is provided on the SMA connector via the NEO-D9S VCC_RF output pin. Power is delivered via a 10 Ohm resistor, to limit the current in case the antenna cable becomes shorted.
If your antenna requires a higher voltage (or current):
- Isolate VCC_RF by cutting the trace marked by the arrow symbols on the top of the PCB
The VCC_RF trace.
- Install inductor L1 - using a 0603 inductor with impedance >500 Ohms at 1.5 GHz
The position of L1.
- Inject a clean DC supply voltage between the ANT PWR breakout pad and GND
SAFEBOOT
It may be necessary to place the ZED-F9P or NEO-D9S into a "safe boot" state before applying a firmware upgrade.
If this becomes necessary:
- Disconnect power to the breakout board
- For the ZED-F9P: connect a jumper wire between the SAFEBOOT ZED test point and GND
- Reconnect the power
- Disconnect the jumper
- Upgrade the firmware using u-center
Repeat for the NEO-D9S using the SAFEBOOT NEO test point.
The two SAFEBOOT test points.
LED Indicators
The breakout has four LED indicators:
- 3V3 Power
- RTK: Off = No Carrier Solution; Flashing = Floating Solution; On = Fixed Solution
- GEO: Geofence indication
- TP: Timing Pulse (Pulse Per Second)
Each LED can be disabled by opening the corresponding split pad jumper on the bottom of the breakout
Back-up Battery
A small rechargeable coin cell maintains the ZED-F9P battery-backed RAM while the power is disconnected. It maintains the ZED's GNSS Almanac and Real Time Clock.
The battery is recharged slowly whenever 3.3V power is present.
If the battery becomes discharged, connect 3.3V power for at least 48 hours to recharge the battery.
Power Supply and I/O voltage
Both the ZED-F9P and NEO-D9S are 3.3V devices. They operate from 3.3V and all of their I/O pins are 3.3V.
Attention
Do not drive any of the ZED-F9P or NEO-D9S I/O pins using 5V signals. You may damage either or both modules if you do. Use a suitable level-shifter if you want to interface to a 5V development board.
The board has a 3.3V regulator on-board to regulate 5V USB-C power (if present) down to 3.3V.
The options for providing power to the board are as follows:
- 5V power via one or both USB-C ports
- Diode protection is provided
- 5V power via the 5V breakout pin
- Diode protection prevents the USB-C ports from being reverse-fed
- 3.3V power via:
- Either of the Qwiic connectors
- Any of the 3V3 breakout pins
Current Draw
Worst-case current draw of the ZED-F9P and NEO-D9S combined is 260mA at 3.3V.
Typical current draw of the ZED-F9P and NEO-D9S combined is 100mA.
(These figures exclude any current drawn by an active antenna.)
Hardware Assembly
At a minimum, you will need to attach an external antenna to the SparkFun GNSS Combo Breakout ZED-F9P NEO-D9S, supply 3.3V power, and connect to one of the board's peripherals.
Attaching an External Antenna
Plug in one of our patch antennas with SMA connector to the GPS board. Secure the connection using the hex nut until it is finger-tight.
Finger Tightening the SMA GPS Antenna to the SparkFun GNSS Combo Breakout ZED-F9P NEO-D9S Breakout.
Software Overview
There are three key steps to be able to achieve centimeter positioning accuracy using the ZED-F9P NEO-D9S Combo Breakout:
- Register with u-blox Thingstream and sign up for a PointPerfect L-band plan (data stream)
- Configure the NEO-D9S to receive the u-blox PointPerfect correction data stream
- Configure the ZED-F9P with encryption key(s) so it can decrypt and use the correction data
By default, the Combo Breakout is configured such that the correction data is passed from the NEO to the ZED using the UART2 interface. However, it is also possible to read the correction data from the NEO and push (write) it to the ZED using I2C.
Thingstream and PointPerfect
Thingstream is u-blox service delivery platform for IoT Communication-as-a-Service, IoT Security-as-a-Service and IoT Location-as-a-Service.
PointPerfect is u-blox GNSS augmentation service which is designed to provide high-precision GNSS corrections to suitable receivers to provide decimeter-level location accuracy.
Warning
u-blox provides products and services to "B2B Customers". Only business customers are eligible to register for a Thingstream (PointPerfect) account. You may be required to demonstrate that the use of the combo breakout is in relation to your trade, business, craft or profession. u-blox products and services are not intended for individual consumer use. Please check the u-blox Service Terms before purchasing hardware.
PointPerfect data is delivered through Thingstream. The first step is to register with Thingstream and then request an L-Band plan:
PointPerfect pricing (correct at Sept. 14th 2022).
You can find the current pricing on u-blox portal. Select IoT Location-as-a-Service and then PointPerfect.
You may need to contact u-blox first, to enable the option to purchase an L-Band plan through your Thingstream account.
The PointPerfect L-band plan provides unlimited access to the L-band satellite correction data stream (via the NEO-D9S).
If you have an internet connection, you can also receive PointPerfect corrections via IP (MQTT). The PointPerfect L-band and IP plan may be a better choice if you think you may want to receive correction data via both satellite and Internet.
Once L-band permissions are enabled on your Thingstream account, you will be able to add a new L-band Location Thing and view its credentials:
- Login to Thingstream
- Select Location Services and then Location Things
- The Add Location Thing button (top right) will allow you to select and activate an L-Band plan
- Once your L-band plan is active, you will be able to monitor your Activity and view your Credentials via the appropriate tabs
u-blox have written a comprehensive application note which describes in detail: the configuration of both NEO and ZED; and how to interpret the expiry date for the L-band encryption keys.
Software Setup
Attention
If this is your first time using Arduino, please review our tutorial on installing the Arduino IDE. If you have not previously installed an Arduino library, please check out our installation guide.
SparkFun has an extensive library for its GNSS boards. You can obtain this library through the Arduino Library Manager by searching for "GNSS v3" and installing the latest version. If you prefer downloading libraries manually, you can grab them from the GitHub Repository.
NEO-D9S Configuration
The first step is to declare the SFE_UBLOX_GNSS
object. Like most Arduino sketches, this is done at a global scope (after the include file declaration), not within the setup()
or loop()
functions.
#include <SparkFun_u-blox_GNSS_v3.h> //http://librarymanager/All#SparkFun_u-blox_GNSS_v3
SFE_UBLOX_GNSS myLBand; // NEO-D9S
Within setup()
we then need to start (initialize) communiation with the NEO-D9S.
The NEO-D9S has a default I2C address of 0x43 and so we need to provide that when calling the begin
method:
Wire.begin(); //Start I2C
while (myLBand.begin(Wire, 0x43) == false) //Connect to the u-blox NEO-D9S using Wire port. The D9S default I2C address is 0x43 (not 0x42)
{
Serial.println(F("u-blox NEO-D9S not detected at default I2C address. Please check wiring."));
delay(2000);
}
Serial.println(F("u-blox NEO-D9S connected"));
The NEO-D9S needs to be configured so it can receive the PointPerfect correction stream. The configuration items are:
Configuration item | Default value |
---|---|
CFG-PMP-CENTER_FREQUENCY | 1539812500 Hz |
CFG-PMP-SEARCH_WINDOW | 2200 Hz |
CFG-PMP-USE_SERVICE_ID | 1 (true) |
CFG-PMP-SERVICE_ID | 50821 |
CFG-PMP-DATA_RATE | 2400 (B2400) bps |
CFG-PMP-USE_DESCRAMBLER | 1 (true) |
CFG-PMP-DESCRAMBLER_INIT | 23560 |
CFG-PMP-USE_PRESCRAMBLING | 0 (false) |
CFG-PMP-UNIQUE_WORD | 0xe15ae893e15ae893 |
The centre frequency varies depending on which satellite is broadcasting corrections for your geographical area.
The up-to-date frequencies are distributed via the MQTT /pp/frequencies/Lb topic. At the time of writing, they are (in MHz):
We can add that to the code as follows:
The code to configure the NEO-D9S is as follows. Note that the UBLOX_CFG_PMP_USE_SERVICE_ID
, UBLOX_CFG_PMP_SERVICE_ID
and UBLOX_CFG_PMP_DESCRAMBLER_INIT
also need to be changed.
uint8_t ok = myLBand.setVal(UBLOX_CFG_PMP_CENTER_FREQUENCY, myLBandFreq); // Default 1539812500 Hz
if (ok) ok = myLBand.setVal(UBLOX_CFG_PMP_SEARCH_WINDOW, 2200); // Default 2200 Hz
if (ok) ok = myLBand.setVal(UBLOX_CFG_PMP_USE_SERVICE_ID, 0); // Default 1
if (ok) ok = myLBand.setVal(UBLOX_CFG_PMP_SERVICE_ID, 21845); // Default 50821
if (ok) ok = myLBand.setVal(UBLOX_CFG_PMP_DATA_RATE, 2400); // Default 2400 bps
if (ok) ok = myLBand.setVal(UBLOX_CFG_PMP_USE_DESCRAMBLER, 1); // Default 1
if (ok) ok = myLBand.setVal(UBLOX_CFG_PMP_DESCRAMBLER_INIT, 26969); // Default 23560
if (ok) ok = myLBand.setVal(UBLOX_CFG_PMP_USE_PRESCRAMBLING, 0); // Default 0
if (ok) ok = myLBand.setVal(UBLOX_CFG_PMP_UNIQUE_WORD, 16238547128276412563ull); // 0xE15AE893E15AE893
Finally, we need to ensure that the UART2 port is set correctly. We need to:
- Change the baud rate to 38400 - to match the ZED-F9P's baud rate
- Ensure that the UBX protocol is enabled for output on UART2
- Enable the RXM PMP message on UART2
- The RXM PMP message contains the SPARTN correction data in UBX format
- Perform a restart (software reset) so that the NEO-D9S starts using the new configuration items
if (ok) ok = myLBand.setVal(UBLOX_CFG_UART2_BAUDRATE, 38400); // match baudrate with ZED default
if (ok) ok = myLBand.setVal(UBLOX_CFG_UART2OUTPROT_UBX, 1); // Enable UBX output on UART2
if (ok) ok = myLBand.setVal(UBLOX_CFG_MSGOUT_UBX_RXM_PMP_UART2, 1); // Output UBX-RXM-PMP on UART2
Serial.print(F("L-Band configuration: "));
if (ok)
Serial.println(F("OK"));
else
Serial.println(F("NOT OK!"));
myLBand.softwareResetGNSSOnly(); // Do a restart
Once the NEO-D9S has aquired the signal from the satellite, it will start outputting PMP correction messages to the ZED-F9P on UART2.
ZED-F9P Configuration
We need to declare a second SFE_UBLOX_GNSS
object for the ZED-F9P. Again, this is done at a global scope (after the include file declaration), not within the setup()
or loop()
functions.
Within setup()
we need to start (initialize) communiation with the ZED-F9P:
while (myGNSS.begin() == false) //Connect to the u-blox module using Wire port and the default I2C address (0x42)
{
Serial.println(F("u-blox GNSS module not detected at default I2C address. Please check wiring."));
delay(2000);
}
Serial.println(F("u-blox GNSS module connected"));
We then need to:
- Make sure the ZED-F9P's UART2 port is configured to accept the PMP correction data
- Tell the ZED-F9P to use FIXED carrier solutions when possible (this is the default setting)
- Tell the ZED-F9P to accept L-band PMP as a correction source
ok = myGNSS.setI2CInput(COM_TYPE_UBX | COM_TYPE_NMEA | COM_TYPE_SPARTN); //Be sure SPARTN input is enabled
if (ok) ok = myGNSS.setDGNSSConfiguration(SFE_UBLOX_DGNSS_MODE_FIXED); // Set the differential mode - ambiguities are fixed whenever possible
if (ok) ok = myGNSS.setVal8(UBLOX_CFG_SPARTN_USE_SOURCE, 1); // use LBAND PMP message
The final piece of the puzzle is to provide the ZED-F9P with the keys it needs to decrypt the encrypted SPARTN (PMP) corrections.
The ZED-F9P can hold two dynamic keys: the current key; and the next key. We also need to tell it when each key is valid from, so it knows when to switch to the next key.
You can find the current and next keys in the Location Services \ Location Things \ Thing Details \ Credentials
tab in Thingstream:
PointPerfect L-band dynamic keys.
The ZED-F9P actually needs to know when the keys are valid from, rather than when they expire. Each key is walid for four weeks, so we need to work backwards 4 weeks from the expiry date.
The current key expires at midnight (UTC) at the end of Friday September 23rd. This means it became valid 4 weeks earlier at midnight (UTC) on August 27th:
Dynamic Key expiry.
Dynamic Key: Expiry and Valid From dates.
Using the website recommended in the u-blox Application Note:
http://navigationservices.agi.com/GNSSWeb
we can see that the key became valid during GPS week 2224, at time-of-week 518400.
We can use the Arduino Library setDynamicSPARTNKey
method to configure a single key:
if (ok) ok = myGNSS.setDynamicSPARTNKey(16, 2224, 518400, "500--------------------------177");
Serial.print(F("GNSS: configuration "));
if (ok)
Serial.println(F("OK"));
else
Serial.println(F("NOT OK!"));
Alternately, we can set both the current key and the next key together using setDynamicSPARTNKeys
. The next key becomes valid during GPS week 2228:
if (ok) ok = myGNSS.setDynamicSPARTNKeys(16, 2224, 518400, "500--------------------------177", 16, 2228, 518400, "582--------------------------a7d");
The keys can also be retrieved using MQTT. We have an Arduino Library example which shows how to retrieve the keys from the L-band + IP key distribution topic /pp/ubx/0236/Lb . That topic provides the keys in UBX (binary) format, ready to be pushed to the ZED.
The keys are also available in human-readable JSON format from the MQTT topic /pp/key/Lb . But note that that topic provides the valid from in Unix epoch format, in milliseconds, excluding the 18 leap seconds since GPS time started!
{
"dynamickeys": {
"current": {
"start": "1661558382000",
"duration": "2419199999",
"value": "500--------------------------177"
},
"next": {
"start": "1663977582000",
"duration": "2419199999",
"value": "582--------------------------a7d"
}
}
}
Troubleshooting
Note
Not working as expected and need help?
If you need technical assistance and more information on a product that is not working as you expected, we recommend heading on over to the SparkFun Technical Assistance page for some initial troubleshooting.
If you don't find what you need there, the SparkFun Forums are a great place to find and ask for help. Make sure you check out the GPS Forums.
Note that if this is your first visit to the forums, you'll need to create a Forum Account to search product forums and post questions.
Tips and Tricks
Attention
u-blox provides products and services to "B2B Customers". Only business customers are eligible to register for a Thingstream (PointPerfect) account. You may be required to demonstrate that the use of the combo breakout is in relation to your trade, business, craft or profession. u-blox products and services are not intended for individual consumer use.
PointPerfect L-band Reception
In order to receive the u-blox PointPerfect correction data, you will: need a suitable antenna; need to be located within contiguous USA; and have a clear view of the sky to the South.
SparkFun GNSS Multi-Band L1/L2 Surveying Antenna - TOP106
We have been successful using the SparkFun GNSS Multi-Band L1/L2 Surveying Antenna (TNC) - TOP106 (GPS-17751) antenna to receive PointPerfect correction data in the USA.
PointPerfect Coverage
The PointPerfect GNSS augmentation service is available on a continental scale with seamless coverage in the contiguous USA, including up to 12 nautical miles (~ 22 km) off coastlines.
PointPerfect Service Coverage.
PointPerfect Satellite Broadcast
PointPerfect augmentation data is broadcast from a satellite covering the contiguous USA. The satellite is in geostationary orbits over the equator - the same as for satellite television broadcasts. It is essential that your antenna has an unobstructed view of the sky, especially to the South where the satellite is positioned.
Depending on your latitude, the satellite for your area could be low in the sky. You need to ensure that trees, buildings etc. are not blocking the signal.
Don't see what you need?
The use cases for this Combo Board are too numerous and complex to cover all potential issues. If you are having issues that we haven't covered here, please refer to the SparkFun Forums for help. If this is your first visit, you'll need to create a Forum Account to search product forums and post questions.
Resources:
Resources
For more resources related to the SparkFun u-blox ZED-F9P NEO-D9S Combo Breakout, check out the links listed here:
- Schematic (PDF)
- Eagle Files (ZIP)
- Board Dimensions (PNG)
- SparkFun u-blox GNSS Arduino Library
- Example: L-Band correction with correction data push via I2C. The I2C push is not necessary on the combo breakout. The correction data will be transferred automatically via UART2.
- Example: L-Band correction with key retrieval via MQTT
u-blox resources:
- NEO-D9S and ZED-F9 configuration - SPARTN L-band correction data reception
- u-blox u-center - GNSS evaluation software for Windows
- PointPerfect GNSS augmentation service
- PointPerfect Product Summary
- PointPerfect Service Description
- PointPerfect Service Coverage
- Thingstream IoT service delivery platform
- Thingstream Login
- Thingstream Registration
Forums:
Check out other tutorials related to GPS and GNSS:
![]() SparkFun RTK L-Band Hookup Guide |
Getting Started with U-Center for u-blox |
GPS-RTK2 Hookup Guide |
![]() SparkFun GPS Breakout (ZOE-M8Q and SAM-M8Q) Hookup Guide |