Embedded B.Tech Beginner

Goouuu Tech GT-U16 RTK L1+L5 GPS Module with Arduino - Interfacing and Parsing GNSS Data

Learn how to interface the GT-U16 RTK L1+L5 GNSS module with Arduino, decode NMEA data, and analyze real-time satellite signals using iNavTool. Covers RTK concepts, RTCM corrections, and practical setup tips, Perfect for DIY navigation, drones, and mapping applications.

  • Suitable forB.Tech Embedded students
  • Build time3-4 weeks
  • LevelBeginner
  • Available atAjvika Labs, Kakinada

About this project

The Goouuu Tech GT-U16 is a high-precision GNSS module that supports dual-frequency L1 + L5 bands, enabling fast and accurate positioning with support for multiple satellite constellations including GPS, GLONASS, Galileo, BeiDou, and QZSS. Its compatibility with the NMEA 0183 protocol enables seamless integration with a wide range of microcontrollers, making it a powerful option for precision navigation and GPS projects.

In this article, we will walk you step-by-step through the process of working with the GT-U16 RTK module. We’ll begin by covering the hardware setup and interfacing the receiver with an Arduino. Then, we’ll look at parsing raw NMEA data into human-readable formats so you can easily extract key information like position and signal strength. Also at Circuit Digest, we’ve created many other Arduino projects and tutorials as well, all freely available, so be sure to check them out if you’re interested in learning more.

Hardware Requirements

Understanding the GT-U16 Interface

Code Explanation – Raw GNSS Data Passthrough

Real-Time Kinematic (RTK) and GNSS Corrections

Working with iNavTool Software

Complete Arduino Code for GT U16 RTK L1 L5 Module

Projects Related to GNSS Modules

We will also explore important RTK and correction concepts, helping you understand the technology that underpins this receiver’s precision. From there, we’ll move on to graphical data visualization using iNavTool R5.0.1 and dive into signal quality analysis, including interpreting SNR and different satellite constellations.

Finally, we’ll wrap up with practical use-cases for the GT-U16 RTK module and discuss future enhancements and potential directions for further development. By the end of this article, you’ll have a clear understanding of the GT-U16’s capabilities and how to integrate this powerful module into your own projects.

Hardware Requirements

Before diving into the code, let’s list all the hardware you need:

Goouuu Tech GT-U16 RTK GNSS Module

Multiband(L1 + L5) RTK-capable receiver.

Arduino (Uno/Mega/Leonardo/etc.)

Microcontroller to read and parse GNSS data.

Ceramic Patch Antenna with UFL connector

30 x 30 mm or larger for optimum L1+L5 signal strength.

Active Multiband GNSS Antenna (optional)

Improves signal reception and lock speed.

Serial-to-USB Adapter

To interface GT-U16 with PC and iNavTool.

USB Cable, Jumper wires

For connections and power.

NOTE : You can choose either a Ceramic Patch Antenna with U.FL connector or an Active Multiband GNSS Antenna, depending on your project needs and availability. Both options are compatible for interfacing and parsing GNSS data using the Goouuu Tech GT-U16 RTK L1+L5 module.

GT-U16-Connection with Active Multiband GNSS Antenna

GT U16 Connection with Ceramic Patch Antenna with UFL

Understanding the GT-U16 Interface

The module outputs GNSS data over UART using the NMEA 0183 protocol with Default baud rate, which is typically 115200

NMEA sentence format

Here’s a concise table listing the common NMEA talker IDs for each satellite constellation.

Global Positioning System (GPS)

Global Navigation Satellite System (GLONASS)

Quasi-Zenith Satellite System (QZSS)

Global Positioning System Fixed Data

Geographic Position—Latitude and Longitude

GNSS DOP and active satellites

GNSS satellites in view

Recommended minimum specific GPS data

Course over ground and ground speed

For example, the sentence for Global Positioning System Fixed Data for GPS should be \" $GPGGA \".

GND - Power supply (3.3 V - 5V).

VCC - Positive Voltage Input Pin.

TXD - Transmit data from the GT-U16 to the host (e.g. Arduino RX).

RXD - Receive data into the GT-U16 from the host (e.g. Arduino TX).

PPS - Pulse-per-second output for precise timing.

TXD - D0(Arduino RX).

RXD - D1(Arduino TX).

Warning: When programming the arduino uno remove connection from D0&D1 pins so you wouldn't get any upload error.

Code Explanation – Raw GNSS Data Passthrough

Our first task is to read the raw NMEA data from the GT-U16 and output it to the Serial Monitor:

Preprocessor Definitions

In this section, we define two aliases for the same hardware Serial interface. GPSSerial will represent the serial port connected to the GNSS receiver (e.g. GT-U16), and DEBUGSerial will represent the serial port we use to print debug information to the computer. Even though both names point to the same Serial object, this makes the code clearer and more flexible allowing easy changes later if we use different serial ports for GPS and debugging.

In the setup() function, we initialize both GPSSerial and DEBUGSerial at a baud rate of 115200. This matches the default communication rate of most GNSS receivers like the GT-U16. After initializing the serial port for debugging, we print a startup message \" Waiting for GNSS data... \" so the user knows the device is running and awaiting GPS data.

In the loop() function, the code continuously checks whether any data is available from the GPS receiver by calling GPSSerial.available(). If there’s data present, it’s read one byte at a time with GPSSerial.read() and immediately sent to DEBUGSerial.write() for output to the PC or serial monitor. This effectively forwards the raw NMEA data stream from the GPS to your computer for observation or further processing.

Our next step was to convert raw NMEA sentences into understandable data: time, location, altitude, speed, satellite count, and signal strength. Let's go through them all.

Definitions and Global Variables

At the top, the GPSSerial and DEBUGSerial macros are defined as Serial, allowing the code to use a single hardware serial interface for both GPS data and debug output. Next, several global variables are declared to store GNSS data such as UTC and local time, latitude, longitude, altitude, fixed quality, and speed. Variables for satellite counts ( gpsCount, beidouCount, galileoCount, qzssCount, glonassCount ) as well as a buffer ( nmeaBuffer ) and an snrList string for signal strength are also set up.

setup() Initialization

In the setup() function, both GPSSerial and DEBUGSerial are initialized at 115200 baud rate. A startup message — \"Waiting for GNSS data...\" — is printed so the user knows the device is ready and waiting for data.

In the main loop() function, readGNSSData() is called continuously to process incoming NMEA sentences. A lastPrint timestamp is also maintained so that printGNSSInfo() is invoked every PRINT_INTERVAL (1 second). Once printing is done, resetCounters() clears satellite counts and SNR list so that fresh data is gathered for the next cycle.

readGNSSData() and NMEA Processing

The readGNSSData() function reads data one character at a time from GPSSerial. Complete NMEA sentences are assembled into nmeaBuffer. Once a newline (\
) is detected, processNMEALine() is invoked to handle the full sentence, then the buffer is cleared for the next one.

processNMEALine() Dispatching

This function first validates the sentence format, then routes each NMEA message to its appropriate parser. $GPGSV, $GBGSV, $GAGSV, $GQGSV, and $GLGSV are passed to parseGSVLine() for satellite information. $GNRMC and $GNGGA are routed to parseRMC() and parseGGA() to extract time, position, and altitude.

parseRMC() and Time Conversion

parseRMC() parses the UTC time from the NMEA $GNRMC sentence and adjusts it for local time (+5:30 offset). It also extracts the speed in knots and converts it to km/h for user-friendly output.

parseGGA() and Position Extraction

parseGGA() extracts raw latitude and longitude from the NMEA $GNGGA sentence. It then converts these into decimal degrees ( convertLatLon() ). It also parses the altitude and the GPS fix status ( fixQuality ), which tells you the quality of the positional fix.

convertLatLon() Helper

This helper converts NMEA latitude and longitude, given as degrees and minutes, into pure decimal degrees. It also accounts for north/south and east/west hemispheres.

formatTime() and describeFixQuality()

The formatTime() helper formats hours, minutes, and seconds into a human-readable HH:MM:SS string. The describeFixQuality() helper returns a textual description of the numeric fix quality value ( e.g. \"Standalone\", \"RTK Fixed\" ), making output easier to understand.

parseGSVLine() for Satellite Data

This function parses NMEA $GxGSV sentences to increment satellite counts for each constellation. It also extracts SNR (Signal-to-Noise Ratio) values for each visible satellite and passes them to appendSNR()

countSatellitesInLine() and appendSNR()

The helper countSatellitesInLine() counts satellites described in a GSV message. appendSNR() adds valid SNR values to a string list for signal strength analysis.

This utility processes the SNR list into categories — “Excellent,” “Good,” “Fair,” “Weak,” or “Invalid” — so that you can quickly see overall signal health. It prints a summary report over DEBUGSerial

printGNSSInfo() Output Formatting

Technologies used

ArduinoPICBLEUARTCAN

Hardware components

  • Arduino
  • MPU
  • LED
  • Module
  • GPS

What you get

  • Working project / hardware kit, tested before delivery
  • Complete source code with explanation
  • Project demo and guidance for your viva
  • Project report, PPT and IEEE paper support (on request)
Delivery & Payment
Delivery takes a minimum of two weeks from the date your inquiry is confirmed. Payment is in two parts: • 50% advance to start the project • Remaining 50% before delivery Note: • Documentation and PPT are not included by default • If you need documentation/PPT, it can be arranged for extra time and cost We'll confirm the exact timeline and cost with you after reviewing your requirements.