Skip to content

Commit bf1088f

Browse files
author
Nathan Seidle
committed
Wait for min accuracy before starting survey in
1 parent 2a05e3b commit bf1088f

File tree

4 files changed

+134
-93
lines changed

4 files changed

+134
-93
lines changed

Firmware/RTK_Enclosed/Base.ino

Lines changed: 69 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -6,59 +6,82 @@ bool updateSurveyInStatus()
66
{
77
lastBaseUpdate = millis();
88

9-
bool response = myGPS.getSurveyStatus(2000); //Query module for SVIN status with 2000ms timeout (req can take a long time)
10-
if (response == true)
9+
if (baseState == BASE_SURVEYING_IN_NOTSTARTED)
1110
{
12-
if (myGPS.svin.valid == true)
13-
{
14-
Serial.println(F("Base survey complete! RTCM now broadcasting."));
15-
baseState = BASE_TRANSMITTING;
11+
//Check for <5m horz accuracy
12+
uint32_t accuracy = myGPS.getHorizontalAccuracy(250); //This call defaults to 1100ms and can cause the core to crash with WDT timeout
13+
14+
float f_accuracy = accuracy;
15+
f_accuracy = f_accuracy / 10000.0; // Convert the horizontal accuracy (mm * 10^-1) to a float
1616

17-
digitalWrite(baseStatusLED, HIGH); //Turn on LED
18-
}
19-
else
17+
Serial.print("Rover Accuracy (m): ");
18+
Serial.print(f_accuracy, 4); // Print the accuracy with 4 decimal places
19+
Serial.println();
20+
21+
if (f_accuracy > 0.0 && f_accuracy < 5.0)
2022
{
21-
byte SIV = myGPS.getSIV();
22-
23-
Serial.print(F("Time elapsed: "));
24-
Serial.print((String)myGPS.svin.observationTime);
25-
Serial.print(F(" Accuracy: "));
26-
Serial.print((String)myGPS.svin.meanAccuracy);
27-
Serial.print(F(" SIV: "));
28-
Serial.print(SIV);
29-
Serial.println();
30-
31-
SerialBT.print(F("Time elapsed: "));
32-
SerialBT.print((String)myGPS.svin.observationTime);
33-
SerialBT.print(F(" Accuracy: "));
34-
SerialBT.print((String)myGPS.svin.meanAccuracy);
35-
SerialBT.print(F(" SIV: "));
36-
SerialBT.print(SIV);
37-
SerialBT.println();
38-
39-
if (myGPS.svin.meanAccuracy > 6.0)
40-
baseState = BASE_SURVEYING_IN_SLOW;
41-
else
42-
baseState = BASE_SURVEYING_IN_FAST;
23+
//We've got a good positional accuracy, start survey
24+
surveyIn();
25+
}
4326

44-
if (myGPS.svin.observationTime > maxSurveyInWait_s)
45-
{
46-
Serial.println(F("Survey-In took more than 5 minutes. Restarting survey in."));
27+
} //baseState = Surveying In Not started
28+
else
29+
{
4730

48-
resetSurvey();
31+
bool response = myGPS.getSurveyStatus(2000); //Query module for SVIN status with 2000ms timeout (req can take a long time)
32+
if (response == true)
33+
{
34+
if (myGPS.svin.valid == true)
35+
{
36+
Serial.println(F("Base survey complete! RTCM now broadcasting."));
37+
baseState = BASE_TRANSMITTING;
4938

50-
surveyIn();
39+
digitalWrite(baseStatusLED, HIGH); //Turn on LED
40+
}
41+
else
42+
{
43+
byte SIV = myGPS.getSIV();
44+
45+
Serial.print(F("Time elapsed: "));
46+
Serial.print((String)myGPS.svin.observationTime);
47+
Serial.print(F(" Accuracy: "));
48+
Serial.print((String)myGPS.svin.meanAccuracy);
49+
Serial.print(F(" SIV: "));
50+
Serial.print(SIV);
51+
Serial.println();
52+
53+
SerialBT.print(F("Time elapsed: "));
54+
SerialBT.print((String)myGPS.svin.observationTime);
55+
SerialBT.print(F(" Accuracy: "));
56+
SerialBT.print((String)myGPS.svin.meanAccuracy);
57+
SerialBT.print(F(" SIV: "));
58+
SerialBT.print(SIV);
59+
SerialBT.println();
60+
61+
if (myGPS.svin.meanAccuracy > 6.0)
62+
baseState = BASE_SURVEYING_IN_SLOW;
63+
else
64+
baseState = BASE_SURVEYING_IN_FAST;
65+
66+
if (myGPS.svin.observationTime > maxSurveyInWait_s)
67+
{
68+
Serial.println(F("Survey-In took more than 5 minutes. Restarting survey in."));
69+
70+
resetSurvey();
71+
72+
surveyIn();
73+
}
5174
}
5275
}
53-
}
54-
else
55-
{
56-
Serial.println(F("SVIN request failed"));
57-
}
58-
}
76+
else
77+
{
78+
Serial.println(F("SVIN request failed"));
79+
}
80+
} //baseState = Surveying In Slow or fast
81+
} //Check every second
5982

6083
//Update the Base LED accordingly
61-
if (baseState == BASE_SURVEYING_IN_SLOW)
84+
if (baseState == BASE_SURVEYING_IN_NOTSTARTED || baseState == BASE_SURVEYING_IN_SLOW)
6285
{
6386
if (millis() - baseStateBlinkTime > 500)
6487
{
@@ -91,9 +114,9 @@ bool configureUbloxModuleBase()
91114
{
92115
bool response = true;
93116

94-
digitalWrite(positionAccuracyLED_20mm, LOW);
95-
digitalWrite(positionAccuracyLED_100mm, LOW);
96-
digitalWrite(positionAccuracyLED_1000mm, LOW);
117+
digitalWrite(positionAccuracyLED_1cm, LOW);
118+
digitalWrite(positionAccuracyLED_10cm, LOW);
119+
digitalWrite(positionAccuracyLED_100cm, LOW);
97120

98121
// Set dynamic model
99122
if (myGPS.getDynamicModel() != DYN_MODEL_STATIONARY)

Firmware/RTK_Enclosed/RTK_Enclosed.ino

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,13 @@
2828
Test system? Connection to GPS?
2929
Enable various debug output over BT?
3030
Display MAC address / broadcast name
31+
Change max survey in time before cold start
3132
3233
ESP32 crashing when in rover mode, when LEDs change?
3334
Seems very stable in base mode, during and after full survey in
35+
Still crashing. Heat issue?
3436
35-
H
37+
Home
3638
Lat: .01804188
3739
Long: .28259348
3840
Stable on Arudino 1.8.9 and default ublox lib
@@ -52,9 +54,9 @@ SFE_UBLOX_GPS myGPS;
5254
BluetoothSerial SerialBT;
5355

5456
//Hardware connections v11
55-
const int positionAccuracyLED_20mm = 2; //POSACC1
56-
const int positionAccuracyLED_100mm = 15; //POSACC2
57-
const int positionAccuracyLED_1000mm = 13; //POSACC3
57+
const int positionAccuracyLED_1cm = 2; //POSACC1
58+
const int positionAccuracyLED_10cm = 15; //POSACC2
59+
const int positionAccuracyLED_100cm = 13; //POSACC3
5860
const int baseStatusLED = 4;
5961
const int baseSwitch = 5;
6062
const int bluetoothStatusLED = 12;
@@ -80,13 +82,14 @@ volatile byte bluetoothState = BT_OFF;
8082
typedef enum
8183
{
8284
BASE_OFF = 0,
85+
BASE_SURVEYING_IN_NOTSTARTED, //User has indicated base, but current pos accuracy is too low
8386
BASE_SURVEYING_IN_SLOW,
8487
BASE_SURVEYING_IN_FAST,
8588
BASE_TRANSMITTING,
8689
} BaseState;
8790
volatile BaseState baseState = BASE_OFF;
8891
unsigned long baseStateBlinkTime = 0;
89-
const unsigned long maxSurveyInWait_s = 60L * 5L; //Re-start survey-in after X seconds
92+
const unsigned long maxSurveyInWait_s = 60L * 15L; //Re-start survey-in after X seconds
9093

9194
uint32_t lastBluetoothLEDBlink = 0;
9295
uint32_t lastRoverUpdate = 0;
@@ -120,16 +123,16 @@ void setup()
120123
Serial2.begin(115200); //UART2 on pins 16/17 for SPP. The ZED-F9P will be configured to output NMEA over its UART1 at 115200bps.
121124
Serial.println("SparkFun RTK Surveyor v1.0");
122125

123-
pinMode(positionAccuracyLED_20mm, OUTPUT);
124-
pinMode(positionAccuracyLED_100mm, OUTPUT);
125-
pinMode(positionAccuracyLED_1000mm, OUTPUT);
126+
pinMode(positionAccuracyLED_1cm, OUTPUT);
127+
pinMode(positionAccuracyLED_10cm, OUTPUT);
128+
pinMode(positionAccuracyLED_100cm, OUTPUT);
126129
pinMode(baseStatusLED, OUTPUT);
127130
pinMode(bluetoothStatusLED, OUTPUT);
128131
pinMode(baseSwitch, INPUT_PULLUP); //HIGH = rover, LOW = base
129132

130-
digitalWrite(positionAccuracyLED_20mm, LOW);
131-
digitalWrite(positionAccuracyLED_100mm, LOW);
132-
digitalWrite(positionAccuracyLED_1000mm, LOW);
133+
digitalWrite(positionAccuracyLED_1cm, LOW);
134+
digitalWrite(positionAccuracyLED_10cm, LOW);
135+
digitalWrite(positionAccuracyLED_100cm, LOW);
133136
digitalWrite(baseStatusLED, LOW);
134137
digitalWrite(bluetoothStatusLED, LOW);
135138

@@ -239,6 +242,8 @@ void loop()
239242
{
240243
Serial.println("Rover config failed!");
241244
}
245+
246+
digitalWrite(baseStatusLED, LOW);
242247
}
243248
else if (digitalRead(baseSwitch) == LOW && baseState == BASE_OFF)
244249
{
@@ -252,11 +257,10 @@ void loop()
252257

253258
startBluetooth(); //Restart Bluetooth with new name
254259

255-
//Begin Survey in
256-
surveyIn();
260+
baseState = BASE_SURVEYING_IN_NOTSTARTED; //Switch to new state
257261
}
258262

259-
if (baseState == BASE_SURVEYING_IN_SLOW || baseState == BASE_SURVEYING_IN_FAST)
263+
if (baseState == BASE_SURVEYING_IN_NOTSTARTED || baseState == BASE_SURVEYING_IN_SLOW || baseState == BASE_SURVEYING_IN_FAST)
260264
{
261265
updateSurveyInStatus();
262266
}

Firmware/RTK_Enclosed/Rover.ino

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ bool updateRoverStatus()
88

99
yield();
1010
uint32_t accuracy = myGPS.getHorizontalAccuracy(250); //This call defaults to 1100ms and can cause the core to crash with WDT timeout
11-
//uint32_t accuracy = myGPS.getPositionAccuracy(250);
11+
//uint32_t accuracy = myGPS.getPositionAccuracy(250); //Returns different units
1212
//uint32_t accuracy = myGPS.getPositionAccuracy(50);
1313
// uint32_t accuracy = 0;
1414
yield();
@@ -17,7 +17,6 @@ bool updateRoverStatus()
1717
{
1818
// Convert the horizontal accuracy (mm * 10^-1) to a float
1919
float f_accuracy = accuracy;
20-
// Now convert to m
2120
f_accuracy = f_accuracy / 10000.0; // Convert from mm * 10^-1 to m
2221
// f_accuracy = f_accuracy / 1000.0; // Convert getPositionAccuracy
2322

@@ -27,30 +26,30 @@ bool updateRoverStatus()
2726
if (f_accuracy <= 0.02)
2827
{
2928
Serial.print(" 0.02m LED");
30-
digitalWrite(positionAccuracyLED_20mm, HIGH);
31-
digitalWrite(positionAccuracyLED_100mm, HIGH);
32-
digitalWrite(positionAccuracyLED_1000mm, HIGH);
29+
digitalWrite(positionAccuracyLED_1cm, HIGH);
30+
digitalWrite(positionAccuracyLED_10cm, HIGH);
31+
digitalWrite(positionAccuracyLED_100cm, HIGH);
3332
}
3433
else if (f_accuracy <= 0.100)
3534
{
3635
Serial.print(" 0.1m LED");
37-
digitalWrite(positionAccuracyLED_20mm, LOW);
38-
digitalWrite(positionAccuracyLED_100mm, HIGH);
39-
digitalWrite(positionAccuracyLED_1000mm, HIGH);
36+
digitalWrite(positionAccuracyLED_1cm, LOW);
37+
digitalWrite(positionAccuracyLED_10cm, HIGH);
38+
digitalWrite(positionAccuracyLED_100cm, HIGH);
4039
}
4140
else if (f_accuracy <= 1.0000)
4241
{
4342
Serial.print(" 1m LED");
44-
digitalWrite(positionAccuracyLED_20mm, LOW);
45-
digitalWrite(positionAccuracyLED_100mm, LOW);
46-
digitalWrite(positionAccuracyLED_1000mm, HIGH);
43+
digitalWrite(positionAccuracyLED_1cm, LOW);
44+
digitalWrite(positionAccuracyLED_10cm, LOW);
45+
digitalWrite(positionAccuracyLED_100cm, HIGH);
4746
}
4847
else if (f_accuracy > 1.0)
4948
{
5049
Serial.print(" No LEDs");
51-
digitalWrite(positionAccuracyLED_20mm, LOW);
52-
digitalWrite(positionAccuracyLED_100mm, LOW);
53-
digitalWrite(positionAccuracyLED_1000mm, LOW);
50+
digitalWrite(positionAccuracyLED_1cm, LOW);
51+
digitalWrite(positionAccuracyLED_10cm, LOW);
52+
digitalWrite(positionAccuracyLED_100cm, LOW);
5453
}
5554
Serial.println();
5655
}
@@ -62,7 +61,22 @@ bool configureUbloxModuleRover()
6261
{
6362
bool response = myGPS.disableSurveyMode(); //Disable survey
6463

65-
return (setNMEASettings());
64+
//Disable RTCM sentences
65+
if (getRTCMSettings(UBX_RTCM_1005, COM_PORT_UART2) != 0)
66+
response &= myGPS.enableRTCMmessage(UBX_RTCM_1005, COM_PORT_UART2, 0);
67+
if (getRTCMSettings(UBX_RTCM_1074, COM_PORT_UART2) != 0)
68+
response &= myGPS.enableRTCMmessage(UBX_RTCM_1074, COM_PORT_UART2, 0);
69+
if (getRTCMSettings(UBX_RTCM_1084, COM_PORT_UART2) != 0)
70+
response &= myGPS.enableRTCMmessage(UBX_RTCM_1084, COM_PORT_UART2, 0);
71+
if (getRTCMSettings(UBX_RTCM_1094, COM_PORT_UART2) != 0)
72+
response &= myGPS.enableRTCMmessage(UBX_RTCM_1094, COM_PORT_UART2, 0);
73+
if (getRTCMSettings(UBX_RTCM_1124, COM_PORT_UART2) != 0)
74+
response &= myGPS.enableRTCMmessage(UBX_RTCM_1124, COM_PORT_UART2, 0);
75+
if (getRTCMSettings(UBX_RTCM_1230, COM_PORT_UART2) != 0)
76+
response &= myGPS.enableRTCMmessage(UBX_RTCM_1230, COM_PORT_UART2, 0);
77+
78+
response &= setNMEASettings(); //Enable high precision NMEA and extended sentences
79+
return (response);
6680
}
6781

6882
//The Ublox library doesn't directly support NMEA configuration so let's do it manually

Firmware/RTK_Enclosed/System.ino

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -222,15 +222,15 @@ void blinkError(t_errorNumber errorNumber)
222222
{
223223
for (int x = 0 ; x < errorNumber ; x++)
224224
{
225-
digitalWrite(positionAccuracyLED_20mm, HIGH);
226-
digitalWrite(positionAccuracyLED_100mm, HIGH);
227-
digitalWrite(positionAccuracyLED_1000mm, HIGH);
225+
digitalWrite(positionAccuracyLED_1cm, HIGH);
226+
digitalWrite(positionAccuracyLED_10cm, HIGH);
227+
digitalWrite(positionAccuracyLED_100cm, HIGH);
228228
digitalWrite(baseStatusLED, HIGH);
229229
digitalWrite(bluetoothStatusLED, HIGH);
230230
delay(200);
231-
digitalWrite(positionAccuracyLED_20mm, LOW);
232-
digitalWrite(positionAccuracyLED_100mm, LOW);
233-
digitalWrite(positionAccuracyLED_1000mm, LOW);
231+
digitalWrite(positionAccuracyLED_1cm, LOW);
232+
digitalWrite(positionAccuracyLED_10cm, LOW);
233+
digitalWrite(positionAccuracyLED_100cm, LOW);
234234
digitalWrite(baseStatusLED, LOW);
235235
digitalWrite(bluetoothStatusLED, LOW);
236236
delay(200);
@@ -245,32 +245,32 @@ void danceLEDs()
245245
{
246246
for (int x = 0 ; x < 2 ; x++)
247247
{
248-
digitalWrite(positionAccuracyLED_20mm, HIGH);
249-
digitalWrite(positionAccuracyLED_100mm, HIGH);
250-
digitalWrite(positionAccuracyLED_1000mm, HIGH);
248+
digitalWrite(positionAccuracyLED_1cm, HIGH);
249+
digitalWrite(positionAccuracyLED_10cm, HIGH);
250+
digitalWrite(positionAccuracyLED_100cm, HIGH);
251251
digitalWrite(baseStatusLED, HIGH);
252252
digitalWrite(bluetoothStatusLED, HIGH);
253253
delay(100);
254-
digitalWrite(positionAccuracyLED_20mm, LOW);
255-
digitalWrite(positionAccuracyLED_100mm, LOW);
256-
digitalWrite(positionAccuracyLED_1000mm, LOW);
254+
digitalWrite(positionAccuracyLED_1cm, LOW);
255+
digitalWrite(positionAccuracyLED_10cm, LOW);
256+
digitalWrite(positionAccuracyLED_100cm, LOW);
257257
digitalWrite(baseStatusLED, LOW);
258258
digitalWrite(bluetoothStatusLED, LOW);
259259
delay(100);
260260
}
261261

262-
digitalWrite(positionAccuracyLED_20mm, HIGH);
263-
digitalWrite(positionAccuracyLED_100mm, HIGH);
264-
digitalWrite(positionAccuracyLED_1000mm, HIGH);
262+
digitalWrite(positionAccuracyLED_1cm, HIGH);
263+
digitalWrite(positionAccuracyLED_10cm, HIGH);
264+
digitalWrite(positionAccuracyLED_100cm, HIGH);
265265
digitalWrite(baseStatusLED, HIGH);
266266
digitalWrite(bluetoothStatusLED, HIGH);
267267

268268
delay(250);
269-
digitalWrite(positionAccuracyLED_20mm, LOW);
269+
digitalWrite(positionAccuracyLED_1cm, LOW);
270270
delay(250);
271-
digitalWrite(positionAccuracyLED_100mm, LOW);
271+
digitalWrite(positionAccuracyLED_10cm, LOW);
272272
delay(250);
273-
digitalWrite(positionAccuracyLED_1000mm, LOW);
273+
digitalWrite(positionAccuracyLED_100cm, LOW);
274274

275275
delay(250);
276276
digitalWrite(baseStatusLED, LOW);

0 commit comments

Comments
 (0)