Hello friends, I hope you all are doing great. Today, I am going to share the new NEO-M8N GNSS Library for Proteus V1.1. The u-blox NEO-M8N is the GPS module of choice for drones, robots and trackers, because it listens to GPS and GLONASS at the same time. More satellites mean a faster, steadier and more accurate position, especially between buildings. With this NEO-M8N Library for Proteus, you can test your GNSS sketches on your PC and actually measure how much the second satellite system helps.
In this version, you get two devices: NEO-M8N Simple, with a GNSS screen drawn on the schematic, and NEO-M8N Advance, with a pop-up window that holds the screen and five measured GNSS test tools. The star of this article is the Constellations test, which runs GPS only, GLONASS only and GPS + GLONASS one after another and compares them side by side.
NOTICE: Our NEO-M8N model runs two complete satellite systems at once, 30 GPS satellites and 24 GLONASS satellites, and combines them into one fix with real dilution-of-precision maths. It took our team a lot of hard work, many test runs and many design changes, and this library is a tribute to that effort. Your feedback is the fuel that keeps us going, so please tell us what you think in the comments below or in the Proteus Libraries category of our forum. And if our free libraries help you in your studies or work, you can buy us a coffee (our donation page is coming soon). So, let's get started with the NEO-M8N Library for Proteus:
What is the NEO-M8N GNSS Module?
The NEO-M8N is a u-blox M8 GNSS receiver (GNSS = any satellite navigation system: GPS, GLONASS, Galileo, BeiDou). Most people buy it on the blue GY-GPSV3-NEO-M8N board, with an external ceramic patch antenna on a short lead, a backup cell, a red PWR LED and a green FIX LED. It sends NMEA 4.0 sentences at 9600 baud and accepts u-blox UBX commands. If NMEA, HDOP or TTFF are new words for you, our NEO-6M Library for Proteus article explains them step by step.
Why Two Satellite Systems Help
Your receiver needs at least four satellites for a 3D fix, and it gets a better position when the satellites are spread across the sky. Buildings, trees and hills hide part of the sky. A receiver that uses GPS and GLONASS together has almost twice as many satellites to choose from, so it keeps a good fix where a GPS-only receiver struggles. This is shown with real numbers in the Constellations test below.
Talkers: $GN, $GP and $GL
With both systems on, the NEO-M8N reports the combined solution with the $GN talker and sends one $GNGSA per system:
| Sentence | With GPS + GLONASS |
|---|---|
| $GNRMC, $GNVTG, $GNGGA, $GNGLL | The combined position, speed and time |
| $GNGSA (first) | The GPS satellites used (numbers 1 - 32) |
| $GNGSA (second) | The GLONASS satellites used (numbers 65 - 88) |
| $GPGSV, $GLGSV | Satellites in view, one set per system |
| $GNTXT | Start-up text lines |
With UBX-CFG-GNSS you can also choose GPS only ($GP sentences) or GLONASS only ($GL sentences).
What's New in NEO-M8N Library for Proteus V1.1
- Two devices: NEO-M8N Simple (
NEOM8NTEP) and NEO-M8N Advance (NEOM8NADVTEP) inTEPNEOM8N.LIB. - Its own library: v1.0 shipped the NEO-7M and NEO-M8N in one package; now each has its own download and article. Both use the same model file,
TEPUBLOX.DLL, so installing both is safe. - Close and reopen the Simple GNSS screen: a red X in its header, a PANEL button on the board.
- Board: the patch antenna glows amber while acquiring and green with a fix; the red PWR and green FIX LEDs keep their real behaviour.
- Five GNSS test tools in the Advance pop-up, including the new Constellations test.
- Realistic TTFF per mode: GPS + GLONASS is the fastest, GPS only takes 29 / 26 of it and GLONASS only 30 / 26, like the data sheet (26 s, 29 s, 30 s).
- TEP Serial Monitor in the demo: each monitor also shows the raw NMEA of its module on RX2.
NEO-M8N Library for Proteus: Simple vs Advance
| Feature | Simple | Advance |
|---|---|---|
| Full NEO-M8N model (GPS + GLONASS, NMEA 4.0, UBX commands, fix, HDOP) | ✔ | ✔ |
| PWR and FIX LEDs, glowing patch antenna, animated waves | ✔ | ✔ |
| GNSS screen drawn on the schematic | ✔ | ✘ |
| GNSS screen in a pop-up window you can move and resize | ✘ | ✔ |
| Location, motion, sky, GNSS and cold start buttons | ✔ | ✔ |
| TTFF, Accuracy, NMEA check, Route and Constellations tests | ✘ | ✔ |
| TEP Dark / Light theme, text size, Help page with Copy diagnostics | ✘ | ✔ |
| Same device name as v1.0 (old designs keep working) | ✔ | ✘ |
Download NEO-M8N Library for Proteus
Click the button below to download NEO-M8N-GPS-Library-for-Proteus-v1.1.zip:
NEO-M8N GNSS Library for Proteus V1.1- README.txt: a detailed guide to the files.
- Proteus Library Files:
TEPNEOM8N.LIB(both devices),TEPSERIALMON.LIBand our Arduino UNO libraryArduinoV3TEP.LIB/ArduinoV3TEP.IDX. - Proteus Model Files:
TEPUBLOX.DLLandTEPSERIALMON.DLL. - Proteus Simulation: the demo project, the .hex file and copies of both DLLs.
- Arduino Code: the demo sketch, TinyGPS++ 1.0.3a (LGPL-2.1) and AltSoftSerial 1.4 (MIT).
If you don't have Proteus yet, read How to Download and Install Proteus 7 and 8. New to libraries? Follow How to Install a New Library in Proteus.
How to Install NEO-M8N Library for Proteus
- Close Proteus and extract the whole zip file.
- Copy the four files from Proteus Library Files into the LIBRARY folder, usually
C:\Program Files (x86)\Labcenter Electronics\Proteus 8 Professional\LIBRARY. - Copy
TEPUBLOX.DLLandTEPSERIALMON.DLLinto the MODELS folder. - Start Proteus, press P and search for NEO-M8N. You get the Simple and the Advance device (category Peripherals > Wireless).
Updating from v1.0? Replace TEPNEOM8N.LIB and TEPUBLOX.DLL, and delete any TEPNEOM8N.IDX from the LIBRARY folder. Tested in Proteus 8.5; Proteus 7 is not supported.
NEO-M8N Module in Proteus
We designed the module as a clean TEP board in the blue of the GY-GPSV3 board: four mounting holes, the u-blox NEO-M8N can, the u.FL socket with the lead to the external ceramic patch antenna, the ML1220 cell, the 24C32 EEPROM, the red PWR LED and the green FIX LED. Here is the NEO-M8N Advance:
Pinout and LEDs
| Pin / LED | Function | Demo |
|---|---|---|
| VCC | Power supply (3.3 - 5 V on the board) | +5 V |
| GND | Ground | GND |
| TXD | NMEA sentences and UBX replies | Arduino D8 |
| RXD | UBX commands from the Arduino | Arduino D9 |
| PWR LED (red) | On while powered | |
| FIX LED (green) | Off until the fix, then a 100 ms flash each second | |
| Patch antenna | Amber while acquiring, green with a fix |
Component Properties
| Property | Meaning | Default |
|---|---|---|
| GPSLAT / GPSLON | Home position (degrees) | 51.47788 / -0.00148 (Greenwich) |
| GPSALT / GPSGEOID | Home altitude / geoid separation (m) | 46 / 45.4 |
| GPSTTFF | Cold start time to first fix with GPS + GLONASS (s) | 10 (real 26) |
| GPSUTC | UTC at the start: PC or a fixed date and time | PC |
| GPSBAUD | UART baud rate at power-up | 9600 |
| GPSGNSS | Systems at power-up: GPS+GLO, GPS or GLONASS | GPS+GLO |
The GNSS Screen: NEO-M8N Simple
Beside the Simple module, we have drawn a GNSS screen. A few seconds after Run, it shows 3D FIX - 20 SATELLITES (10 GPS + 10 GLO):
Look at the numbers: 20 used / 20 in view, "GPS 10/10, GLONASS 10/10", HDOP 0.56 and PDOP 0.97. That is a much better geometry than a GPS-only receiver gets at the same place (the NEO-7M got HDOP 0.80 with 10 GPS satellites in our tests). The bottom line shows the reply to the Arduino's MON-VER poll: "ROM CORE 3.01 (107888) / 00080000". The buttons:
| Row | Buttons |
|---|---|
| LOCATION | LONDON, NEW YORK, TOKYO, SYDNEY, LAHORE, HOME |
| MOTION | STOP, WALK (5 km/h on a 100 m circle), CAR (50 km/h on a 500 m circle) |
| SKY | OPEN SKY, CITY (buildings hide satellites below 25°), INDOOR (26 dB weaker) |
| GNSS | GPS+GLO, GPS, GLONASS (does what UBX-CFG-GNSS does) |
| COLD START | Forget everything; the next fix takes GPSTTFF |
Click the red X in the screen's header to close it. The board button then says PANEL: CLOSED; click PANEL to bring the screen back:
NEO-M8N Advance: The Pop-Up Panel
The Advance device opens a TEP pop-up window at Run, with the look of our TEP Serial Monitor. The header shows U2 · 3D FIX, the tabs GPS and Test, and the theme, Settings and Help icons. Here it is with both Serial Monitors:
- Sky plot: GPS satellites as blue circles, GLONASS as pink squares (solid = used, pale = tracked, outline = no signal).
- Position and time: 51.477877° N, 0.001479° W, 47.5 m; 18 used, GPS 10 / 10, GLONASS 8 / 8; HDOP 0.61, PDOP 1.11; first fix 10.0 s after the start; NMEA 4.0 at 9600 bps, 1 Hz.
- Signal strength: blue bars for GPS and pink bars for GLONASS.
- Serial Monitors: "GPS+GLONASS fix, 18 satellites used, HDOP 0.61" and "In view: GPS 10, GLONASS 8", with $GNGGA and $GNGSA in amber.
Click GPS in the GNSS row and the receiver switches to GPS only: after the TTFF it shows "3D FIX - 10 GPS SATELLITES" with HDOP 1.07 and $GP sentences:
The Test Page: GNSS Test Tools
The Test page has five tools. Every number is measured on the running model, with the same data your Arduino receives.
1. Constellations: GPS vs GLONASS vs GPS + GLONASS
This tool switches the receiver to each mode (like UBX-CFG-GNSS), cold starts it, times the first fix, and records 20, 30 or 60 fixes: satellites used, HDOP, CEP and 2DRMS. The mode in use runs last, so the receiver ends where it started. Here is the City test with 20 fixes per mode, run live in Proteus:
| Mode | TTFF | Satellites used | In view | HDOP | CEP | 2DRMS |
|---|---|---|---|---|---|---|
| GPS | 11.3 s | 6.0 | 10.0 | 1.28 | 1.07 m | 2.82 m |
| GLONASS | 13.0 s | 5.0 | 8.0 | 1.74 | 2.03 m | 4.45 m |
| GPS + GLONASS | 10.0 s | 11.0 (6 + 5) | 18.0 | 0.95 | 1.29 m | 2.42 m |
Between the buildings, each system alone sees only 5 or 6 usable satellites. Together, the NEO-M8N uses 11, its HDOP drops to 0.95, the first fix is the fastest (10.0 s), and the 2DRMS (the radius that holds about 95 % of the fixes) is the smallest, 2.42 m. In this short run the CEP of GPS alone (1.07 m) came out a little smaller than the combined one; with only 20 fixes the CEP moves around, so judge by the HDOP and the 2DRMS, or record 60 fixes.
In the open sky the difference is just as clear. This PC render shows the same test with 30 fixes per mode: GPS 10 satellites and CEP 1.39 m, GLONASS 7.5 and CEP 1.42 m, and GPS + GLONASS 18 satellites, HDOP 0.66 and CEP 0.62 m:
Good for: seeing why the NEO-M8N's GPS + GLONASS helps between buildings: more satellites, a lower HDOP and smaller errors.
2. TTFF: Time to First Fix
Choose Cold, Warm or Hot and 3, 5 or 10 runs; each run restarts the receiver like the UBX command CFG-RST. With GPS + GLONASS, five cold starts took 10.3 to 11.0 s (average 10.7 s), with 18 satellites each time:
The model uses GPSTTFF (10 s) for GPS + GLONASS; the real data sheet gives 26 s. Good for: knowing how long your sketch waits after power-up.
3. Accuracy
The accuracy tool compares every position with the true one. With GPS + GLONASS in the open sky, 60 fixes gave CEP 0.84 m and 2DRMS 1.63 m (HDOP 0.65, 18 satellites). In the city, 60 fixes gave CEP 1.09 m and 2DRMS 2.45 m with 11 satellites:
The NEO-M8 data sheet gives 2.5 m CEP.
4. NMEA Check
The NMEA check reads the TX bytes again and shows each sentence type and talker. Run live in Proteus:
- $GNRMC, $GNVTG, $GNGGA and $GNGLL once per second; $GNGSA GPS and $GNGSA GLO each once per second; $GPGSV 3 per second and $GLGSV 2 per second; $GNTXT at start-up.
- 11.0 sentences per second, 673 bytes/s: a UART load of 70 % at 9600 bps.
- Checksums: 282 OK, 0 bad, 0 epochs dropped.
- UBX: UART1 9600 bps 8N1, NMEA 4.0, 1000 ms = 1 Hz, GPS+GLONASS, 32 channels; the Arduino's MON-VER poll was answered with "ROM CORE 3.01 (107888) / 00080000".
A 70 % UART load leaves little room: at 5 Hz with all sentences, 9600 baud is full and the module drops whole epochs, like the real one. Raise the baud rate with CFG-PRT or turn sentences off with CFG-MSG.
5. Route
The route tool drives or walks the model's circle and compares the GPS distance with the true one. One lap by car: 3140.6 m by GPS against 3138.9 m (+0.1 %):
Settings and Help
The gear icon opens Settings: theme (TEP Dark or Light), text size, open the panel at Run and the window size, saved for your Windows user.
The ? icon opens Help & Support: eight cards and Copy diagnostics, with the version strip "TEP NEO-M8N Advance v1.1, build 2026-10-06".
NEO-M8N with Arduino in Proteus
The demo project NEOM8N-GNSS-ArduinoUnoV3.pdsprj has two Arduino UNOs from our Arduino Library for Proteus V3.0, both running NEOM8N_TinyGPS: UNO 1 (ARD1) with the NEO-M8N Simple (U1) and Serial Monitor U3, and UNO 2 (ARD2) with the NEO-M8N Advance (U2) and Serial Monitor U4.
Wiring
| From | To | Why |
|---|---|---|
| NEO-M8N VCC / GND | +5 V / ground | Power |
| NEO-M8N TXD | Arduino D8 | AltSoftSerial RX: the NMEA sentences |
| NEO-M8N RXD | Arduino D9 | AltSoftSerial TX: the UBX MON-VER poll |
| Serial Monitor RXD / TXD | Arduino D1 / D0 | The sketch's output and input |
| Serial Monitor RXD2 | NEO-M8N TXD (junction) | Shows the raw NMEA beside the TinyGPS++ output |
Want to know more about these pins? Read our Introduction to Arduino UNO. The sketch uses AltSoftSerial, because SoftwareSerial cannot receive in Proteus 8.5. Keep feeding the parser: AltSoftSerial buffers only 80 bytes, and the NEO-M8N sends about 700 bytes per second, so avoid long delays.
The Arduino Code
TinyGPS++ decodes $GNRMC and $GNGGA, but two things need extra code. First, GGA's satellite field stops at 12, while the NEO-M8N often uses more. The sketch counts the satellites in the two GSA sentences instead:
void sentenceDone() {
if (strcmp(sentenceType + 2, "GSA") == 0) { // add up the GSA lines of this second
gsaSum = (gsaOpen ? gsaSum : 0) + satsInGsa;
gsaOpen = true;
} else if (gsaOpen) { // the first sentence after them: the count is complete
satellitesUsed = gsaSum;
gsaOpen = false;
}
}
Second, the satellites in view come per system, so the sketch reads field 3 of $GPGSV and $GLGSV with TinyGPSCustom, and works out which systems are on:
TinyGPSCustom gpsInView(gps, "GPGSV", 3); // field 3 of $GPGSV: GPS satellites in view
TinyGPSCustom gloInView(gps, "GLGSV", 3); // field 3 of $GLGSV: GLONASS satellites in view
const bool gpsOn = gpsInView.age() < 1500, gloOn = gloInView.age() < 1500;
const char *system = gpsOn && !gloOn ? "GPS" : gloOn && !gpsOn ? "GLONASS" : "GPS+GLONASS";
At start-up, the sketch polls the firmware with the UBX command MON-VER. If you change it, see How to get the HEX file from Arduino. New to Arduino? Start with our Arduino Tutorial for Beginners.
Simulation Results
Each monitor prints the firmware, then a status block every 2 seconds, with the raw NMEA in amber (RX2):
NEO-M8N + TinyGPS++
u-blox firmware: ROM CORE 3.01 (107888), hardware: 00080000
FWVER=SPG 3.01
PROTVER=18.00
GPS;GLO;GAL;BDS
SBAS;IMES;QZSS
...
22:02:32 UTC 05/10/2026 GPS+GLONASS fix, 18 satellites used, HDOP 0.61
Lat 51.477878 Lon -0.001475 Alt 47.4 m
Speed 0.2 km/h Course --
In view: GPS 10, GLONASS 8
In the same second, RX2 shows $GNGGA,...,1,12,0.61,...: GGA says 12 while the sketch counts 18, exactly the GGA limit explained above. Click the GNSS buttons and watch the system name and the talkers change. Read all about the monitor in TEP Serial Monitor Advance for Proteus.
How the NEO-M8N Model Works
Knowing what happens inside the model helps you understand the numbers on the screen and in your sketch.
Start-up
0.4 s after power-up, the module prints the twelve $GNTXT lines of the ROM-only UBX-M8030 found on many GY-GPSV3 boards: u-blox AG, HW UBX-M8030 00080000, ROM CORE 3.01 (107888), FWVER=SPG 3.01, PROTVER=18.00, the supported systems GPS;GLO;GAL;BDS and SBAS;IMES;QZSS, and the antenna lines. After the first epochs it adds ANTSTATUS=INIT and ANTSTATUS=OK. Then RMC, VTG, GGA, GSA, GSV and GLL follow every second, in NMEA 4.0.
Satellites and the Fix
- Two skies: 30 GPS satellites in 6 orbit planes (12 h orbits) and 24 GLONASS satellites, numbers 65 - 88, in 3 planes (11 h 15 min orbits). Their elevation, azimuth and signal come from the geometry.
- Thresholds: acquired from 26 dB-Hz, tracked down to 14 dB-Hz, used in the fix from 20 dB-Hz.
- Fix: with one system, 3 satellites give a 2D fix and 4 a 3D fix. With GPS + GLONASS the receiver needs one more satellite, because it must also solve the time offset between the two systems. This is why a combined receiver only pays off when there are enough satellites, and why the city results above are so interesting.
- GGA limit: the satellites field of GGA stops at 12, like the real receiver, even when the NEO-M8N uses 18.
UBX Commands Supported
Send these on the module's RXD pin (frames start with B5 62; the checksum is checked):
| Command | What it does in the model |
|---|---|
| CFG-PRT (06 00) | Poll, or set the UART speed 4800 - 460800 (ACK at the old speed, then switch) |
| CFG-RATE (06 08) | Poll, or set the rate: down to 100 ms (10 Hz) with GPS + GLONASS, 56 ms (18 Hz) with one system |
| CFG-MSG (06 01) | Poll, or set the rate of GGA, GLL, GSA, GSV, RMC, VTG, NAV-POSLLH, NAV-STATUS |
| CFG-GNSS (06 3E) | Choose GPS, GLONASS or both (Galileo, BeiDou, SBAS and QZSS are accepted, not simulated) |
| CFG-NMEA (06 17) | NMEA 2.1 / 2.3 / 4.0 / 4.1 and the talker IDs |
| CFG-RST (06 04) | Hot / warm / cold start, module restart, GNSS stop / start |
| CFG-CFG (06 09) | Clear / save / load the configuration (kept for the run) |
| MON-VER (0A 04) | "ROM CORE 3.01 (107888)", "00080000" and the extension strings |
The module also understands the NMEA input commands $PUBX,40 (set a sentence rate) and $xxGPQ (poll one sentence).
Troubleshooting
- No fix: wait GPSTTFF seconds (one system a little longer), check that SKY is not INDOOR, and after a GNSS button wait the TTFF again.
- TinyGPS++ says 12 satellites, the screen says 18: GGA stops at 12; count the GSA lists like the demo sketch.
- "output dropped" in the Simulation Log: the rate and sentences do not fit the baud rate.
- The monitor shows nothing from the GPS: TXD must go to D8, and the sketch must use AltSoftSerial.
- No screen or pop-up:
TEPUBLOX.DLLis missing from MODELS and the project folder.
Things to Know Before Using a Real NEO-M8N
- Supply: the GY-GPSV3 board takes 3.3 - 5 V on VCC and has a 3.3 V regulator.
- Logic level: the NEO-M8N's RXD is not 5 V tolerant (3.6 V maximum). Put a divider between the UNO's D9 and RXD: 1 k from D9 to RXD and 2 k from RXD to GND.
- Pin order: the header order on GY-GPSV3 boards varies; check the labels on yours.
- ROM or flash: many cheap boards carry the ROM receiver (ROM CORE 3.01) modelled here; a genuine flash NEO-M8N reports EXT CORE 3.01.
- Sky view: a real module usually gets no fix indoors.
Limitations of the Simulation
- The GPS and GLONASS skies are simplified constellations, realistic in kind but not the real satellites of that day. Galileo, BeiDou, SBAS and QZSS are not simulated.
- Not modelled: I2C / SPI, power save modes, AssistNow, the backup battery (every power-up is a cold start) and the supply current.
- Tested in Proteus 8.5 (the demo and the Proteus screenshots in this article) and with 2,112 automatic checks on the PC; Proteus 7 is not supported.
Only need one system? Look for our NEO-7M Library for Proteus (GPS or GLONASS) or our NEO-6M Library for Proteus. Need GSM too? Try our SIM800L Library for Proteus.
So, that was all about the NEO-M8N GNSS Library for Proteus V1.1. I hope the Constellations test shows you clearly why two satellite systems are better than one. Please share your feedback in the comments or in our forum. Till the next tutorial, take care and have fun!