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