1+ /*
2+ Enable Galileo High Accuracy Service: https://gssc.esa.int/navipedia/index.php/Galileo_High_Accuracy_Service_(HAS)
3+ By: Nathan Seidle
4+ SparkFun Electronics
5+ Date: May 9th, 2024
6+ License: MIT. Please see LICENSE.md for more information.
7+
8+ The UM980 is capable of receiving the new Galileo E6 signal and obtain a sub 0.2m precision
9+ location fix. This example shows how to enable E6 and HAS
10+
11+ These examples are targeted for an ESP32 platform but any platform that has multiple
12+ serial UARTs should be compatible.
13+
14+ Feel like supporting open source hardware?
15+ Buy a board from SparkFun!
16+ SparkFun Triband GNSS RTK Breakout - UM980 (GPS-23286) https://www.sparkfun.com/products/23286
17+
18+ Hardware Connections:
19+ Connect RX2 (green wire) of the UM980 to pin 4 on the ESP32
20+ Connect TX2 (orange wire) of the UM980 to pin 13 on the ESP32
21+ To make this easier, a 4-pin locking JST cable can be purchased here: https://www.sparkfun.com/products/17240
22+ Note: Almost any ESP32 pins can be used for serial.
23+ Connect a dual or triband GNSS antenna: https://www.sparkfun.com/products/21801
24+
25+ */
26+
27+ int pin_UART1_TX = 4 ;
28+ int pin_UART1_RX = 13 ;
29+
30+ #include < SparkFun_Unicore_GNSS_Arduino_Library.h> // http://librarymanager/All#SparkFun_Unicore_GNSS
31+
32+ UM980 myGNSS;
33+
34+ HardwareSerial SerialGNSS (1 ); // Use UART1 on the ESP32
35+
36+ unsigned long lastCheck = 0 ;
37+
38+ unsigned long startTime = 0 ;
39+ unsigned long convergingStartTime = 0 ;
40+ unsigned long timeToConvergence = 0 ;
41+
42+ void setup ()
43+ {
44+ Serial.begin (115200 );
45+ delay (250 );
46+ Serial.println ();
47+ Serial.println (" SparkFun UM980 Example 19" );
48+
49+ // The CONFIG response can be ~500 bytes over runing the ESP32 RX buffer of 256 bytes
50+ // Increase the size of the RX buffer
51+ SerialGNSS.setRxBufferSize (1024 );
52+
53+ // We must start the serial port before using it in the library
54+ SerialGNSS.begin (115200 , SERIAL_8N1, pin_UART1_RX, pin_UART1_TX);
55+
56+ // myGNSS.enableDebugging(); // Print all debug to Serial
57+
58+ if (myGNSS.begin (SerialGNSS) == false ) // Give the serial port over to the library
59+ {
60+ Serial.println (" UM980 failed to respond. Check ports and baud rates. Freezing..." );
61+ while (true );
62+ }
63+ Serial.println (" UM980 detected!" );
64+
65+ // E6 reception requires version 11833 or greater
66+ int um980Version = String (myGNSS.getVersion ()).toInt (); // Convert the string response to a value
67+
68+ Serial.print (" UM980 firmware version: v" );
69+ Serial.println (um980Version);
70+
71+ if (um980Version < 11833 )
72+ {
73+ Serial.println (" E6 requires 11833 or newer. Please update the firmware on your UM980. Freezing..." );
74+ while (true );
75+ }
76+ else
77+ Serial.println (" Firmware is E6-PPP compatible." );
78+
79+ if (myGNSS.isConfigurationPresent (" CONFIG SIGNALGROUP 2" ) == false )
80+ {
81+ if (myGNSS.sendCommand (" CONFIG SIGNALGROUP 2" ) == false )
82+ Serial.println (" Signal group 2 command failed" );
83+ else
84+ {
85+ Serial.println (" Enabling signal group 2 causes the UM980 to reboot. This can take a few seconds." );
86+
87+ while (1 )
88+ {
89+ delay (1000 ); // Wait for device to reboot
90+ if (myGNSS.isConnected () == true ) break ;
91+ else Serial.println (" Device still rebooting" );
92+ }
93+
94+ Serial.println (" UM980 has completed reboot." );
95+ }
96+ }
97+ else
98+ Serial.println (" Signal group 2 already enabled" );
99+
100+ if (myGNSS.isConfigurationPresent (" CONFIG PPP ENABLE E6-HAS" ) == false )
101+ {
102+ if (myGNSS.sendCommand (" CONFIG PPP ENABLE E6-HAS" ) == true )
103+ Serial.println (" E6 service enabled" );
104+ else
105+ Serial.println (" E6 config error" );
106+ }
107+ else
108+ Serial.println (" E6 service already enabled" );
109+
110+ startTime = millis ();
111+
112+ Serial.println (" E6 PPP should now be enabled. Sit back and watch the LLA deviations decrease below 0.2m!" );
113+ Serial.println (" r) Reset ESP" );
114+ Serial.println (" R) Factory reset UM980" );
115+ }
116+
117+ void loop ()
118+ {
119+ if (Serial.available ())
120+ {
121+ byte incoming = Serial.read ();
122+ if (incoming == ' r' )
123+ ESP.restart ();
124+ else if (incoming == ' R' )
125+ um980Reset ();
126+ }
127+
128+
129+ myGNSS.update (); // Regularly call to parse any new data
130+
131+ if (millis () - lastCheck > 1000 )
132+ {
133+ lastCheck = millis ();
134+ printUpdate ();
135+ }
136+ }
137+
138+ void printUpdate ()
139+ {
140+ Serial.print (" Lat/Long/Alt: " );
141+ Serial.print (myGNSS.getLatitude (), 11 ); // Accurate 11 decimal places
142+ Serial.print (" /" );
143+ Serial.print (myGNSS.getLongitude (), 11 );
144+ Serial.print (" /" );
145+ Serial.print (myGNSS.getAltitude (), 4 ); // Accurate to 4 decimal places
146+ Serial.println ();
147+
148+ Serial.print (" Deviation of Lat/Long/Alt (m): " );
149+ Serial.print (myGNSS.getLatitudeDeviation (), 4 );
150+ Serial.print (" /" );
151+ Serial.print (myGNSS.getLongitudeDeviation (), 4 );
152+ Serial.print (" /" );
153+ Serial.println (myGNSS.getAltitudeDeviation (), 4 );
154+
155+ Serial.print (" Satellites in view: " );
156+ Serial.print (myGNSS.getSIV ());
157+ Serial.println ();
158+
159+ int positionType = myGNSS.getPositionType ();
160+ Serial.print (" Position Type: " );
161+ Serial.print (positionType);
162+ Serial.print (" - " );
163+ if (positionType == 0 ) Serial.print (" No solution" );
164+ else if (positionType == 8 ) Serial.print (" Velocity computed using instantaneous Doppler" );
165+ else if (positionType == 16 ) Serial.print (" Single point positioning" );
166+ else if (positionType == 17 ) Serial.print (" Pseudorange differential solution" );
167+ else if (positionType == 18 ) Serial.print (" SBAS positioning" );
168+ else if (positionType == 32 ) Serial.print (" L1 float solution" );
169+ else if (positionType == 33 ) Serial.print (" Ionosphere-free float solution" );
170+ else if (positionType == 34 ) Serial.print (" Narrow-lane float solution" );
171+ else if (positionType == 48 ) Serial.print (" L1 fixed solution" );
172+ else if (positionType == 49 ) Serial.print (" Wide-lane fixed solution" );
173+ else if (positionType == 50 ) Serial.print (" Narrow-lane fixed solution" );
174+ else if (positionType == 68 )
175+ {
176+ Serial.print (" PPP solution converging" );
177+
178+ if (convergingStartTime == 0 ) convergingStartTime = millis ();
179+ if (convergingStartTime > 0 )
180+ {
181+ Serial.print (" - Seconds in converging phase: " );
182+ Serial.print ((millis () - (convergingStartTime - startTime)) / 1000.0 , 0 );
183+ Serial.print (" s" );
184+ }
185+ }
186+ else if (positionType == 69 )
187+ {
188+ Serial.print (" Precise Point Positioning" );
189+
190+ if (timeToConvergence == 0 ) timeToConvergence = millis ();
191+ if (timeToConvergence > 0 )
192+ {
193+ Serial.print (" - Seconds in converging phase: " );
194+ Serial.print ((millis () - (convergingStartTime - startTime)) / 1000.0 , 0 );
195+ Serial.print (" s" );
196+
197+ Serial.print (" - Total time to convergence: " );
198+ Serial.print ((timeToConvergence - startTime) / 1000.0 , 0 );
199+ Serial.print (" s" );
200+ }
201+ }
202+ else Serial.print (" Unknown" );
203+ Serial.println ();
204+
205+ Serial.println ();
206+ }
207+
208+ void um980Reset ()
209+ {
210+ while (Serial.available ()) Serial.read (); // Clear RX buffer
211+ Serial.println (" Press any key to factory reset the UM980" );
212+ while (Serial.available () == 0 ) delay (1 ); // Wait for user to press a button
213+
214+ // Clear saved configurations, satellite ephemerides, position information, and reset baud rate to 115200bps.
215+ if (myGNSS.factoryReset () == true )
216+ Serial.println (" UM980 now reset to factory defaults" );
217+ else
218+ Serial.println (" Error resetting UM980 to factory defaults" );
219+
220+ Serial.println (" Waiting for UM980 to reboot" );
221+
222+ while (1 )
223+ {
224+ delay (1000 ); // Wait for device to reboot
225+ if (myGNSS.isConnected () == true ) break ;
226+ else Serial.println (" Device still rebooting" );
227+ }
228+
229+ Serial.println (" UM980 has completed reset" );
230+ }
0 commit comments