Simple CORS RTK Setup with ublox Zed F9P

I thought I’d share my low cost CORS RTK setup using the Sparkfun RTK2 board, a Sparkfun Bluetooth module, and the Lefebure NTRIP app on my cell phone. I have about $350 invested in this system and I’ve had good performance with it so far in my testing.

I wanted to stream the corrections through my phone, since I always have it with me and I don’t want to pay for another mobile data plan on another device in the tractor cab. Fortunately, I have cell service in my fields. Also, I wanted communication between the phone and receiver to be wireless so I can keep the phone in my pocket (which means I won’t forget it in the tractor cab).

I’m in Minnesota, in the United States, and I wanted to try using CORS corrections for RTK because we have a nice CORS network here that is totally free to use. It’s a VRS system that will create a virtual base station near the location of the rover antenna. Another reason I wanted to try CORS is to eliminate the need for a base station - for convenience, simplicity, and cost savings.

I’m going to make a few posts showing my approach.


Here’s the list of what I used, roughly following the GPS-RTK2 hookup guide on the Sparkfun website.

Sparkfun GPS-RTK2 Board
I chose the Sparkfun board because the cost was pretty low, it’s small, and there’s a very good tutorial guide for it on the Sparkfun website. There are two versions - one with a U.FL antenna connector and one with an SMA antenna connector. I have the U.FL connector version since the SMA version wasn’t available at the time, so I also had to buy an adapter to connect the SMA cable on my antenna.

I chose a ublox multi-band antenna. It was more expensive than some of the other options, but it picks up L1, L2, and L5 bands, it has a magnetic base, and it’s already sealed in an enclosure. With this antenna, I’m picking up GPS, GLONASS, Galileo, and Beidou satellites. I’ll often have 25-35 satellites in view.

Bluetooth Module
I used the Sparkfun Bluetooth Mate Silver, since its pins match up to the RTK board and there’s good installation documentation from Sparkfun on using it for RTK corrections.

Configuration Software
ublox u-center

NTRIP Phone App
Lefebure NTRIP Client

I will make a post about putting it together when I get a chance.

1 Like

Did you get RTK GPS corrections working through CORS?

I have the exact same ZED-F9P module from Sparkfun sitting on my desk. The NTRIP connection works fine when I connect using the Ublock software (u-center), but I don’t get an RTK flag in Ag Open GPS. The NTRIP settings are the same between both programs. I don’t get any NTRIP errors in Ag Open, it just loses RTK accuracy after about 10-15 seconds (assuming I just had it Ntrip corrections working in U-Center).

Do you want to compare configuration files for the ZED-F9P? I turned on high precision to get additional decimal points on the Lat / Long NMEA strings. Also increased frequecy to 5 Hz…not sure what else I should change.

Here is a screenshot of my configuration in ag open gps:

With my Bluetooth and cell phone setup, I’m not using the NTRIP client in the AOG software at all. Instead, the NTRIP client is in the phone app and corrections get sent to the receiver directly. But, I can shut off the Bluetooth and log into the CORS network with the AOG NTRIP client as you are. I’m getting a full RTK fix either way, indicated by AOG and also the green light on the receiver stops blinking. Here’s what my AOG NTRIP configs look like:

It seems like AOG is not getting any corrections from your CORS network. Is your CORS network a VRS system? Do you have to give it your coordinates to get corrections? On the AOG main page, what are you seeing in the NTRIP display area in the lower left hand area of the screen (circled red below)?


Configuration of the Zed F9P in u-center:
I didn’t make many changes to the default configuration. Here they are:

  1. Changed the update rate from 1 Hz to 5 Hz.
    View>Configuration View>RATE, then change “Measurement Period” to the interval you want (200 ms = 5 Hz).
    Click “Send” in the bottom of the configuration window.
    To save the change to memory (you must do this any time you change any configuration settings, or at least do it at the end before closing, or they will be lost when the receiver is turned off) select CFG from the list of options on the left hand side of the window, then “Save current configuration”. Make sure items 0-4 are highlighted in the upper right. Then click “Send” at the bottom of the window again.
  2. Changed the UART 2 port settings to work with the Bluetooth module. You don’t have to do this if you’re not using a Bluetooth connection.
    View>Configuration View>PRT
    Change Target to “UART 2”
    Change Protocol Out to “1 NMEA” - this tells the receiver to broadcast the NMEA messages through the port the Bluetooth module is connected to, so the CORS network will receive the location of the receiver’s antenna.
    Change Baudrate to 115200 to match the default setting on the Bluetooth module
    Click “Send” at the bottom of the window and repeat the save procedure from #1.

That’s all I needed to change to get this working. #1 wasn’t required to get RTK working but 1Hz update rate is too slow for autosteer.

Another optional one is to turn off all the extra message traffic.
View>Messages View
I believe all AOG needs is the NMEA GGA message, so I think you can disable everything but that one. Disable by right clicking on a message family and selecting “Disable Child Messages”. When you’re done, repeat the Save procedure in the configuration window as described above.

The UBX family of messages is a ublox-specific set of messages that contain some extra stuff - for example, UBX will send coordinates with an extra decimal place of precision compared to NMEA. I think AOG only reads the NMEA GGA message so the UBX messages don’t add an improvement to AOG precision. But for other applications it may be interesting to use. There’s documentation on the ublox website about what each message is.

1 Like

Connecting Bluetooth Module to the RTK Board
I followed the instructions in the SparkFun GPS hookup guide to connect the Bluetooth module to the GPS receiver board - soldering a 6 pin, right angle header on each (header goes on the “RTCM Correction” connections on the GPS receiver board). When this is done, the Bluetooth module will be on whenever the GPS receiver board is powered up.
After doing this, I paired the Bluetooth module to my phone, same as any other Bluetooth device.

Here’s how it looks (I’m using a cake pan as a temporary antenna ground plane for testing)




Configuring Lefebure NTRIP App

NTRIP Settings

  • Network Protocol: NTRIP v1.0

  • Caster IP, Caster Port, Username, Password: enter your information

  • Data Stream: select the mountpoint you want to use. You many have to hit the refresh option in the menu, or leave blank and try to connect to the network so it pulls in the list of available mount points.

  • Reported Location: I set this to “Get from External Receiver” since I set up the receiver to broadcast NMEA location over Bluetooth. You could also select the manual option and enter your coordinates, or select the option to use the phone’s GPS. Pinpoint accuracy isn’t critical here, but the coordinates should be close by since I believe the CORS network will use them to set the location of the virtual base station.

Receiver Settings:

  • Receiver Connection: External via Bluetooth (NOTE: if you just want to test the NTRIP connection to the CORS network and don’t need to send the data anywhere, you could change to “None”)

  • Bluetooth Device: You’ll need to pair your phone with the Bluetooth module outside of the Lefebure app. If you do that successfully, you will be able to select the Bluetooth module in this list.

  • Bluetooth Connection Method: You can choose to have a secure connection or not

  • Auto-Enable Bluetooth: On

  • Auto-Configure Receiver: No Auto Config

  • Antenna Height: enter your antenna height

  • Rest of the boxes: I left them all unchecked

Connecting to Network and Achieving an RTK Fix
With the above work done, everything should be ready to go.

  • Connect the RTK board to your AOG device - I’m using a USB cable connected to my laptop.
  • Power up the RTK board, which should power up the Bluetooth module also.
  • Select the COM port of the RTK board as the GPS port in AOG
  • Open the Lefebure NTRIP app and press “Connect”

The app should connect to the Bluetooth module. When that happens, the light on the module will be solid green. The status updates in the NTRIP app should show various connection messages, ending with “NTRIP: Connected to Caster”. The yellow data bar should start moving, indicating RTCM corrections streaming to the phone from the CORS network. And the fix type will start to change as the solution converges: GPS > DGPS > FloatRTK > RTK (Fixed RTK). I can sometimes get an RTK fix indoors, but it’s rare. If the antenna doesn’t have a clear view of the sky, you likely won’t get past DGPS or RTK Float.
The green RTK light on the RTK board isn’t intuitive (at least not to me). It will be solid when the solution is DPGS or lower, it will blink when the solution is RTK Float, and it will turn off completely when the solution is RTK Fixed.


The AOG GPS status should show RTK Fix.
(note: I was connected through the AOG NTRIP client when I took the screenshot below. If connected through Bluetooth and the phone app, the NTRIP info in the bottom left of the screen won’t be there.)


If you stream RTK while the receiver is connected to u-center and you have the UBX messages turned on, you can watch the accuracy improve (3D Acc and 2D Acc in the upper right) and see a tight pattern of points on the deviation map if you have that displayed. Note that you can’t connect to the receiver with AOG and u-center at the same time.

ucenter view 2

That should be it - the receiver will be sending a location with RTK accuracy. This setup has been working very well for me in testing and is very convenient to use. Accuracy appears to be very good. I am still building my AOG PCB and setting up my tractor, so I haven’t used it in the field yet, but I’m looking forward to trying it out.

You need to click on the right hand side where is says NTRIP On so it turns green like in rynthln pic below your post. Confused me for a while.

Thanks @rynthln!

U-Center was keeping it’s NTRIP Client connection open even after I disconnected the serial port. It works if I turn off the Ntrip client in U-Center and then run Ag Open GPS. I was seeing " Too Many Concurrent Connections" when I looked at raw serial data sent to the GPS receiver:


FYI - I set the Zed F9P to “High precision mode”. I think it’s accurate enough to need a few more digits on the NMEA strings, per this article - GPS-RTK2 Hookup Guide -


I use simpleRTK2B. Communication with AOG via HC-06. esp 32 as a Ntrip client. Mobile phone for access point. Tested in the field and works flawlessly.

I have also been working with the Sparkfun F9P board and NTRIP on my phone. I use the CORS network in central Iowa. I’ve been testing it with an Android app that I wrote for locating tissue and soil sample spots (2 1/2 acre grid). Thought I’d enclose some pictures of my RTK case that I designed and printed with an Ender 3. I recently bought a Panasonic FZ-G1 tablet and Havis mount. AOG seems to like the F9P input just fine. I’m trying to discover what it takes to keep the F9P in Float or Fixed mode.

The cover.

RTKantenna 3Oj0Mk.png)
Antenna cable coiled doesn’t seem to affect anything.

The ground plane that came with my first C94-M8P evaluation kit. Now available from Sparkfun.

I’ll put a magnet on the bottom on a final version.

Does placing the coil of cable there have any noticeable affect on the receivers performance?

I am in doing something similar with an ardusimple f9p, but plan on the excess cable being coiled up under the ground plane.

I’m wondering about the coiled wire too. From your comment “I’m trying to discover what it takes to keep the F9P in Float or Fixed mode”, it sounds like you’re having a little trouble? With mine, signal quality matters quite a bit for holding float or fixed RTK.

This antenna has the reference point at about 8 mm above the ground plane. To me it looks like the cable is blocking visibility towards many low elevation satellites (usually down to 10 degree elevation). It could affect the antenna radiation pattern too much even if not blocking direct view to satellites.

Too easy to avoid the potential issue, there will be enough issues to worry about even if the cable is placed safely.

I made some changes to the F9P program using U-Center after rereading the Sparkfun details. It seems to keep the Float/Fixed condition okay. I will test it more. Shortening the antenna cable is doable and I have a coax cutter but I’d rather not if I don’t have to. I could design the dome to put the wire under the ground plane. I’ll see if that is necessary after testing more.