Skip to content

Commit 88b9007

Browse files
committed
Tilt working on LG290P
1 parent 38496b6 commit 88b9007

File tree

5 files changed

+90
-37
lines changed

5 files changed

+90
-37
lines changed

Firmware/RTK_Everywhere/Begin.ino

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -712,7 +712,7 @@ void beginBoard()
712712
present.brand = BRAND_SPARKPNT;
713713
present.psram_2mb = true;
714714
present.gnss_lg290p = true;
715-
present.antennaPhaseCenter_mm = 42.0; // Default to SPK6618H APC, average of L1/L2
715+
present.antennaPhaseCenter_mm = 37.5; // APC of SPK-6E helical L1/L2/L5 antenna
716716
present.needsExternalPpl = true; // Uses the PointPerfect Library
717717
present.gnss_to_uart = true;
718718

@@ -774,7 +774,7 @@ void beginBoard()
774774
present.brand = BRAND_SPARKPNT;
775775
present.psram_2mb = true;
776776

777-
present.antennaPhaseCenter_mm = 42.0; // Default to SPK6618H APC, average of L1/L2
777+
present.antennaPhaseCenter_mm = 62.0; // APC from drawings
778778
present.radio_lora = true;
779779
present.fuelgauge_bq40z50 = true;
780780
present.charger_mp2762a = true;
@@ -785,7 +785,7 @@ void beginBoard()
785785
present.gnss_to_uart = true;
786786

787787
present.gpioExpanderSwitches = true;
788-
present.microSd = true;
788+
// present.microSd = true; // TODO remove comment out - v1.0 hardware does not have pullup on #CD so card detection does not work
789789
present.microSdCardDetectLow = true;
790790

791791
present.display_i2c0 = true;

Firmware/RTK_Everywhere/GNSS_LG290P.ino

Lines changed: 63 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ void GNSS_LG290P::baseRtcmLowDataRate()
3939
settings.lg290pMessageRatesRTCMBase[x] = 0;
4040

4141
settings.lg290pMessageRatesRTCMBase[getRtcmMessageNumberByName("RTCM3-1005")] =
42-
10; // 1005 0.1Hz - Exclude antenna height
42+
10; // 1005 0.1Hz - Exclude antenna height
4343
settings.lg290pMessageRatesRTCMBase[getRtcmMessageNumberByName("RTCM3-107X")] = 2; // 1074 0.5Hz
4444
settings.lg290pMessageRatesRTCMBase[getRtcmMessageNumberByName("RTCM3-108X")] = 2; // 1084 0.5Hz
4545
settings.lg290pMessageRatesRTCMBase[getRtcmMessageNumberByName("RTCM3-109X")] = 2; // 1094 0.5Hz
@@ -357,6 +357,31 @@ bool GNSS_LG290P::configureRover()
357357

358358
response &= setMinCnoRadio(settings.minCNO);
359359

360+
//If we are on a platform that supports tilt
361+
if (present.tiltPossible == true)
362+
{
363+
//And tilt is present and enabled
364+
if (present.imu_im19 == true && settings.enableTiltCompensation == true)
365+
{
366+
//Configure GNSS to support the tilt sensor
367+
368+
// Tilt sensor requires 5Hz at a minimum
369+
if (settings.measurementRateMs > 200)
370+
{
371+
systemPrintln("Increasing GNSS measurement rate to 5Hz for tilt support");
372+
settings.measurementRateMs = 200;
373+
}
374+
375+
// On the LG290P Flex module, UART 3 of the GNSS is connected to the IMU UART 1
376+
response &= setBaudRate(3, 115200);
377+
378+
if (response == false && settings.debugGnss)
379+
systemPrintln("configureRover: setBaud failed.");
380+
381+
// Enable of GGA, RMC, GST for tilt sensor is done in enableNMEA()
382+
}
383+
}
384+
360385
// Set the fix rate. Default on LG290P is 10Hz so set accordingly.
361386
response &= setRate(settings.measurementRateMs / 1000.0); // May require save/reset
362387
if (settings.debugGnss && response == false)
@@ -637,7 +662,6 @@ bool GNSS_LG290P::enableNMEA()
637662
{
638663
bool response = true;
639664
bool gpggaEnabled = false;
640-
bool gpzdaEnabled = false;
641665

642666
int portNumber = 1;
643667

@@ -674,10 +698,6 @@ bool GNSS_LG290P::enableNMEA()
674698
{
675699
if (strcmp(lgMessagesNMEA[messageNumber].msgTextName, "GGA") == 0)
676700
gpggaEnabled = true;
677-
678-
// ZDA not supported on LG290P
679-
// if (strcmp(lgMessagesNMEA[messageNumber].msgTextName, "ZDA") == 0)
680-
// gpzdaEnabled = true;
681701
}
682702
}
683703
}
@@ -696,24 +716,47 @@ bool GNSS_LG290P::enableNMEA()
696716
// If firmware is 4 or higher, use setMessageRateOnPort, otherwise setMessageRate
697717
if (lg290pFirmwareVersion >= 4)
698718
{
699-
// Enable GGA / ZDA on port 2 (ESP32) only
719+
// Enable GGA on UART 2 (connected to ESP32) only
700720
if (gpggaEnabled == false)
701721
response &= _lg290p->setMessageRateOnPort("GGA", 1, 2);
702-
703-
// if (gpggaEnabled == false)
704-
// response &= _lg290p->setMessageRateOnPort("GGA", 1, 1);
705722
}
706723
else
707724
{
708-
// Enable GGA / ZDA on all ports. It's the best we can do.
725+
// Enable GGA on all UARTs. It's the best we can do.
709726
if (gpggaEnabled == false)
710727
response &= _lg290p->setMessageRate("GGA", 1);
711-
712-
// if (gpzdaEnabled == false)
713-
// response &= _lg290p->setMessageRate("ZDA", 1);
714728
}
715729
}
716730

731+
// If this is Flex, we may need to enable NMEA for Tilt IMU
732+
if (present.tiltPossible == true)
733+
{
734+
if (present.imu_im19 == true && settings.enableTiltCompensation == true)
735+
{
736+
// Regardless of user settings, enable GGA, RMC, GST on UART3
737+
// If firmware is 4 or higher, use setMessageRateOnPort, otherwise setMessageRate
738+
if (lg290pFirmwareVersion >= 4)
739+
{
740+
// Enable GGA/RMS/GST on UART 3 (connected to the IMU) only
741+
response &= _lg290p->setMessageRateOnPort("GGA", 1, 3);
742+
response &= _lg290p->setMessageRateOnPort("RMC", 1, 3);
743+
response &= _lg290p->setMessageRateOnPort("GST", 1, 3);
744+
}
745+
else
746+
{
747+
// GST not supported below 4
748+
systemPrintf(
749+
"Current LG290P firmware: v%d (full form: %s). Tilt compensation requires GST on firmware v4 "
750+
"or newer. Please "
751+
"update the "
752+
"firmware on your LG290P to allow for these features. Please see "
753+
"https://bit.ly/sfe-rtk-lg290p-update\r\n Marking tilt compensation offline.",
754+
lg290pFirmwareVersion, gnssFirmwareVersion);
755+
756+
present.imu_im19 = false;
757+
}
758+
}
759+
}
717760
return (response);
718761
}
719762

@@ -826,7 +869,8 @@ bool GNSS_LG290P::enableRTCMRover()
826869
// So we set all RTCM to 1, and set PQTMCFGRTCM to the lowest value found
827870

828871
// Capture the message with the lowest rate
829-
if (settings.lg290pMessageRatesRTCMRover[messageNumber] > 0 && settings.lg290pMessageRatesRTCMRover[messageNumber] < minimumRtcmRate)
872+
if (settings.lg290pMessageRatesRTCMRover[messageNumber] > 0 &&
873+
settings.lg290pMessageRatesRTCMRover[messageNumber] < minimumRtcmRate)
830874
minimumRtcmRate = settings.lg290pMessageRatesRTCMRover[messageNumber];
831875

832876
// Force all RTCM messages to 1 or 0. See above for reasoning.
@@ -847,13 +891,11 @@ bool GNSS_LG290P::enableRTCMRover()
847891
if (lg290pFirmwareVersion >= 4)
848892
{
849893
// If any one of the commands fails, report failure overall
850-
response &= _lg290p->setMessageRateOnPort(lgMessagesRTCM[messageNumber].msgTextName,
851-
rate,
852-
portNumber);
894+
response &=
895+
_lg290p->setMessageRateOnPort(lgMessagesRTCM[messageNumber].msgTextName, rate, portNumber);
853896
}
854897
else
855-
response &= _lg290p->setMessageRate(lgMessagesRTCM[messageNumber].msgTextName,
856-
rate);
898+
response &= _lg290p->setMessageRate(lgMessagesRTCM[messageNumber].msgTextName, rate);
857899

858900
if (response == false && settings.debugGnss)
859901
systemPrintf("Enable RTCM failed at messageNumber %d %s\r\n", messageNumber,
@@ -874,8 +916,7 @@ bool GNSS_LG290P::enableRTCMRover()
874916
}
875917
else
876918
response &= _lg290p->setMessageRate(lgMessagesRTCM[messageNumber].msgTextName,
877-
settings.lg290pMessageRatesRTCMRover[messageNumber],
878-
0);
919+
settings.lg290pMessageRatesRTCMRover[messageNumber], 0);
879920

880921
if (response == false && settings.debugGnss)
881922
systemPrintf("Enable RTCM failed at messageNumber %d %s\r\n", messageNumber,

Firmware/RTK_Everywhere/SD.ino

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ bool sdCardPresent(void)
117117
}
118118
else
119119
{
120-
//reportFatalError("sdCardPresent: gpioExpander not online.");
120+
// reportFatalError("sdCardPresent: gpioExpander not online.");
121121
return (false);
122122
}
123123
}
@@ -168,7 +168,7 @@ bool sdCardPresent(void)
168168
}
169169

170170
xSemaphoreGive(sdCardSemaphore);
171-
171+
172172
if (response != 1)
173173
{
174174
previousCardPresentBySW = false;

Firmware/RTK_Everywhere/Tilt.ino

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,10 @@ void tiltUpdate()
6060
}
6161

6262
if (tiltState != TILT_STARTED) // If we failed to begin, disable future attempts
63+
{
6364
tiltFailedBegin = true;
65+
tiltState = TILT_DISABLED;
66+
}
6467
break;
6568

6669
case TILT_STARTED:
@@ -260,8 +263,8 @@ void printTiltDebug()
260263
// Start communication with the IM19 IMU
261264
void beginTilt()
262265
{
263-
tiltSensor = new IM19();
264266

267+
tiltSensor = new IM19();
265268
if (SerialForTilt == nullptr)
266269
SerialForTilt = new HardwareSerial(1); // Use UART1 on the ESP32 to receive IMU corrections
267270

@@ -292,8 +295,15 @@ void beginTilt()
292295
result &= tiltSensor->sendCommand("NAVI_OUTPUT=UART1,ON");
293296

294297
// Set the distance of the IMU from the center line - x:6.78mm y:10.73mm z:19.25mm
295-
if (present.imu_im19 == true)
298+
if (productVariant == RTK_TORCH)
296299
result &= tiltSensor->sendCommand("LEVER_ARM=-0.00678,-0.01073,-0.0314"); // From stock firmware
300+
else if (productVariant == RTK_FLEX)
301+
{
302+
result &= tiltSensor->sendCommand("LEVER_ARM=-0.0282,-0.000,-0.0237"); // -28.2, 0. -23.7mm
303+
304+
//Send AT+INSTALL_ANGLE=180,0,0 if the IM19 module is mounted on the back of the GNSS receiver (so the IM19 faces downward instead of upward), before sending the save command.
305+
result &= tiltSensor->sendCommand("INSTALL_ANGLE=180,0,0"); //IMU is mounted facing down
306+
}
297307

298308
// Set the overall length of the GNSS setup in meters: rod length 1800mm + internal length 96.45mm + antenna
299309
// POC 19.25mm = 1915.7mm
@@ -309,7 +319,10 @@ void beginTilt()
309319
result &= tiltSensor->sendCommand(clubVector);
310320

311321
// Configure interface type. This allows IM19 to receive Unicore-style binary messages
312-
result &= tiltSensor->sendCommand("GNSS_CARD=UNICORE");
322+
if (productVariant == RTK_TORCH)
323+
result &= tiltSensor->sendCommand("GNSS_CARD=UNICORE");
324+
else if (productVariant == RTK_FLEX)
325+
result &= tiltSensor->sendCommand("GNSS_CARD=OEM");
313326

314327
// Configure as tilt measurement mode
315328
result &= tiltSensor->sendCommand("WORK_MODE=408"); // From stock firmware
@@ -324,7 +337,7 @@ void beginTilt()
324337
// Unknown new command for v2
325338
result &= tiltSensor->sendCommand("CORRECT_HOLDER=ENABLE"); // From stock firmware
326339

327-
// Trigger IMU on PPS from UM980
340+
// Trigger IMU on PPS from GNSS
328341
result &= tiltSensor->sendCommand("SET_PPS_EDGE=RISING");
329342

330343
// Enable magnetic field mode
@@ -1017,7 +1030,7 @@ void tiltDetect()
10171030
if (present.tiltPossible == false)
10181031
return;
10191032

1020-
// Start test if not previously detected
1033+
// Skip test if previously detected as present
10211034
if (settings.detectedTilt == true)
10221035
{
10231036
present.imu_im19 = true; // Allow tiltUpdate() to run
@@ -1053,6 +1066,7 @@ void tiltDetect()
10531066
{
10541067
present.imu_im19 = true; // Allow tiltUpdate() to run
10551068
settings.detectedTilt = true;
1069+
settings.gnssConfiguredRover = false; // Update rover settings
10561070
break;
10571071
}
10581072
}
@@ -1061,10 +1075,8 @@ void tiltDetect()
10611075

10621076
#endif // COMPILE_IM19_IMU
10631077

1064-
if (settings.enableImuDebug == true)
1065-
systemPrintf("Tilt sensor %sdetected\r\n", settings.detectedTilt ? "" : "not ");
1066-
1067-
settings.testedTilt = true;
1078+
systemPrintf("Tilt sensor %sdetected\r\n", settings.detectedTilt ? "" : "not ");
1079+
settings.testedTilt = true; //Record this test so we don't do it again
10681080
recordSystemSettings();
10691081
return;
10701082
}

Firmware/RTK_Everywhere/menuSystem.ino

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1394,7 +1394,7 @@ void menuInstrument()
13941394
systemPrintf("1) Set Antenna Height (a.k.a. Pole Length): %0.3lfm\r\n",
13951395
settings.antennaHeight_mm / (double)1000.0);
13961396

1397-
systemPrintf("2) Set Antenna Phase Center (a.k.a. ARP): %0.1fmm\r\n", settings.antennaPhaseCenter_mm);
1397+
systemPrintf("2) Set Antenna Phase Center: %0.1fmm\r\n", settings.antennaPhaseCenter_mm);
13981398

13991399
systemPrint("3) Report Tip Altitude: ");
14001400
systemPrintf("%s\r\n", settings.outputTipAltitude ? "Enabled" : "Disabled");

0 commit comments

Comments
 (0)