Skip to content

Introduction

Hardware Overview

Combo Breakout PCB

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

ZED-F9P

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

NEO-D9S

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.

UART2

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

Splitter

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

USB Connectors

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

LEDs

The LEDs.

  • Dual Qwiic Connectors - the breakout has two Qwiic (I2C) connectors allowing the breakout to be daisy-chained into your Qwiic project

Qwiic Connectors

The two Qwiic connectors.

  • Back-up Battery - a small rechargeable coin cell maintains the ZED-F9P battery-backed RAM while the power is disconnected

Back-up Battery

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

Breakout Pads

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

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!

How to Work with Jumper Pads and PCB Traces

There are multiple jumpers on the back of the board that can be used to modify how the board functions.

Jumpers

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

VCC_RF

The VCC_RF trace.

  • Install inductor L1 - using a 0603 inductor with impedance >500 Ohms at 1.5 GHz

L1

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

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

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

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.

u-blox GNSS Arduino Library v3

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):

{
  "frequencies": {
    "us": {
      "current": {
        "value": "1556.29"
      }
    }
  }
}

We can add that to the code as follows:

const uint32_t myLBandFreq = 1556290000; // Uncomment this line to use the US SPARTN 1.8 service

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.

SFE_UBLOX_GNSS myGNSS; // ZED-F9P

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:

L-band Dynamic Keys

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.

Dynamic Key valid from

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 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:

u-blox resources:

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