I’ve installed RTK Everywhere V3.1 on 2 Postcards (previously running V2.3). I did a factory reset. I then set one up as a Rover and one up as a Base. I plan to use Base Assist. I am using Putty to connect to them. When I exit the menu on both of them, I get no messages. Its still connected as if I press x & enter, I go back to the menu. Am I doing something wrong? I did the same thing on V2.3 and it worked fine.
Hi Paul (@pauldixon ),
Sorry, we messed up. RTK Everywhere v3.1 on Postcard requires the LG290P firmware to be upgraded to v2.01. RTK Everywhere v3.1 does not recognise the earlier LG290P firmware. Please use QGNSS to update.
Alternatively, we have fixed the compatibility issue in the latest v3.2 Release Candidate firmware, if you are able to install that?
Best wishes,
Paul
Well, I uploaded the 2.01 Quectel Firmware, then attempted to upgrade to the 3.1 version of RTK Everywhere.
Now, I get this each time I apply power to the Postcard:
rst:0x3 (SW_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 271414342, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0030,len:4832
load:0x40078000,len:16460
load:0x40080400,len:4
load:0x40080404,len:3504
entry 0x400805cc
E (58) esp_image: image at 0x10000 has invalid magic byte (nothing flashed here?)
E (58) boot: OTA app partition slot 0 is not bootable
E (60) esp_image: image at 0x3f0000 has invalid magic byte (nothing flashed here?)
E (68) boot: OTA app partition slot 1 is not bootable
E (72) boot: No bootable app partitions in the partition table
ets Jul 29 2019 12:21:46
Is there any hope for recovery?
Is there any hope for recovery?
Oh yes. ESP32s are extremely hard to kill via software (hammers and lightning however…).
Those messages are letting you know there is no firmware. Please re-flash the v3.1 or v3.2RC firmware onto the ESP32.
Thank you! I flashed the v3.2RC firmware and all is well, now
OK - updated the LG290P with v2.1 and the Postcard is up and running as normal. A couple of comments/questions:
- The base assist works quickly (too quick?) and puts the coordinates as the base. Is there a way to do a survey in on the base assist to get a more accurate location of the base?
- Its not clear how the base functions work under the menu of 7) commonly used base coordinates. Can I save different coordinates if I have different bases and then easily put them into the ECEF as a new base (I guess I could do this in the app that I am programming)
- Speaking of apps - is there a complete list of commands to use in the PLI?
Also, seems like the bug of SIV=0 still exists on the Base and Rover? I briefly saw numbers for SIV on the base assist but no longer see them.
Thanks,
Paul
I think (and propose) this is a good place for HAS/E6. However, Base Assist generally means the Base position was established with the benefit of an external correction. Are you using NTRIP to set the Base? If so, yes that can be an extremely quick Survey-In.
One of the possibilities for this use is - If you return to the same site days later and have a recoverable mark, you can use the previous base coordinates easily, and skip performing a new Un-Assisted Survey-In procedure (which would result in different base coordinates).
No, I am not using NTRIP - I don’t care so much about the exact location of the base as I am only worried about having repeatable measurements on my rover. The HAS/E6 would be fine for accuracy for my base but I am not sure its doing that?
This is exactly what I need to do - I may move my base station to a new site but I want to be able to go back to the old site and quickly enter in the old ECEF coordinates as my rover coordinates are all based exactly off the the base location. I should be able to do this through my (yet to be programmed) app I would think but curious if it can do it right in RTK Everywhere as this will save programming
Hi Paul (@pauldixon ),
It could well be that “Base Assist” is not the best / correct name for what this mode actually does… The name was coined in Repo Issue #751. But, from @rftop : “Base Assist generally means the Base position was established with the benefit of an external correction”. Maybe we should choose a different name?
What does RTK Everywhere “Base Assist” actually do? It reads the current GNSS position and uses it for Fixed Base. How you establish that position is up to you. You can perform a survey-in, as you would do when setting up a temporary Base. Or you can be in Rover mode, with (or without) RTK corrections. When you select “Base Assist”, the coordinates are read and Fixed Base is started using those coordinates.
If you are using survey-in to establish the Base position, you need to wait until the survey-in is complete and then select Base Assist. If you are using Rover positioning with RTK corrections, you need to wait until you have RTK Fix / Float and that the horizontal accuracy is as good as you need it to be, then select Base Assist. For HAS/E6, wait until the position is converged then select Base Assist. Base Assist is dumb, it reads the current position and starts Fixed Base using that position.
When you’ve used Base Assist to start a Fixed Base, you can save the coordinates for later re-use by:
Opening Menu Base
Opening the Commonly Used Base Coordinates menu
Select “l” to “Load From GNSS” (this will be LLh or ECEF, depending on which coordinate system you have selected in Menu Base)
Name the coordinates using “n”
Add the coordinates using “a”
Once added, they will appear in the coordinate list
You can re-use previously recorded coordinates by:
Select the coordinates by entering their number
Save Selected Coordinates into Fixed Base using “s”
When you return to Menu Base, the chosen fixed coordinates will be shown
When you exit Menu Base, the Fixed Base is (re)started using those coordinates
Base Assist is a new feature and we’d like your feedback on whether it does what you’re expecting or need. If we should change the name, please tell us. You are welcome to leave feedback here, but it is better if you open an Issue on GitHub.
Best wishes,
Paul
Oops…my fault. I remembered the previous discussions about saving coordinates for later use, but didn’t realize that was now called “Base Assist” in RTK FW. The nomenclature is fine, my mistake. I need to familiarize myself with the Base Functions in RTK Everywhere (recent updates).
Per @PaulZC 's explanation, you should be good-to-go.
[TIP]: I normally use iPhones as the data collector with my Postcards. I like to also use a cheap Android tablet to make Config changes in the field while testing. You can have an iPhone and Android connected via Bluetooth at the same time. Using a Bluetooth Serial Terminal on the Android Tablet makes quick work with Config Changes, all while the iPhone is still connected as the collector.
Of course you can only use a single device and switch to a Bluetooth terminal App to make Config changes, but I like having the 2’nd device while testing.
@PaulZC thanks for the detailed explanation. This should work fine for me.
My plan will be to either perform a survey-in or find the location using HAS/B2b with relative accuracy. Then switch to Base Assist to add those coordinates in and then save them for future as well.
I will test this and see how it goes…
Are there any other comments on my other items:
SIV still reading 0?
Program Line command list?
Thanks!
Do you have GSV turned on ?
Be careful with the rate. GSV can send multiple sentences for each Constellation. It gets hairy quick. You might want to set to every 10+ seconds. GSV can overload the bluetooth link and cause missed (important) messages.
Not sure what you mean. The Serial Interface is still “Menu” Driven.
Not sure. Can you share the serial output? This is what I see:
64:B7:08:86:A4:D0 - wifiMACAddress
64:B7:08:86:A4:D2 - btMACAddress
64:B7:08:86:A4:D3 - ethernetMACAddress
=======================
Board ADC ID (mV): 2497
=======================
LittleFS Started
profileNumber.txt not found
Using profile #0
PSRAM Size (bytes): 2097152
I2C Devices:
0x20 - PCA9554 GPIO Expander with Interrupt (Postcard)
0x3D - SSD1306 OLED Driver (Postcard/EVK/mosaic)
No devices found on this I2C bus
Display started
==========================
SparkFun RTK Postcard v3.1
==========================
Directional pad online
SD card detected @ 1970-01-01 00:00:26.016
microSD: Online @ 1970-01-01 00:00:26.236
Profile 'Profile1' loaded
GNSS LG290P online
LG290P version: v2.1 - LG290P03AANR02A01S 2025/12/12 11:21:01
Fuel gauge not detected
No GNSS date/time available for system RTC.
Bluetooth SPP and BLE broadcasting as: SparkFun Postcard-A4D205
STATE_ROVER_NOT_STARTED --> STATE_ROVER_CONFIG_WAIT
Galileo E6 HAS service enabled
Rover Accuracy (m): 0.000, SIV: 0 GNSS State: No Fix
Rover configured
STATE_ROVER_CONFIG_WAIT --> STATE_ROVER_NO_FIX
Rover Accuracy (m): 0.000, SIV: 0 GNSS State: No Fix
SD card size: 14.4 GB / Free space: 14.3 GB
Rover Accuracy (m): 0.000, SIV: 0 GNSS State: No Fix
Program Line command list?
The CLI is documented here. Your best bet is to use the LIST command. We do not have documentation for each setting (there’s a lot!):
$SPLST,alignedLogFiles,bool,false*6A
$SPLST,antennaHeight_mm,int16_t,1800*2D
$SPLST,antennaPhaseCenter_mm,float,37.50*7F
$SPLST,ARPLoggingInterval,uint16_t,10*70
$SPLST,autoFirmwareCheckMinutes,uint32_t,1440*6C
$SPLST,autoKeyRenewal,bool,true*62
$SPLST,baseCasterOverride,bool,false*04
$SPLST,batteryChargingPercentPerHour,char[1],"0"*15
$SPLST,batteryLevelPercent,char[1],"0"*1B
$SPLST,batteryVoltage,char[4],"0.00"*7F
$SPLST,bluetoothId,char[6],"A4D205"*11
$SPLST,bluetoothRadioType,BluetoothRadioType_e,2*4C
$SPLST,clearBtPairings,bool,false*61
$SPLST,configurePPP,char[30],"2 1 120 0.10 0.15"*74
$SPLST,con,tLgConst,2 1 120 0.10 0.15*29
$SPLST,con,tLgConst,2 1 120 0.10 0.15*29
$SPLST,con,tLgConst,2 1 120 0.10 0.15*29
$SPLST,con,tLgConst,2 1 120 0.10 0.15*29
$SPLST,con,tLgConst,2 1 120 0.10 0.15*29
$SPLST,con,tLgConst,2 1 120 0.10 0.15*29
$SPLST,coordinateInputType,CoordinateInputType,0*74
$SPLST,correctionsPriority_External Radio,int,0*63
$SPLST,correctionsPriority_ESP-NOW,int,1*13
$SPLST,correctionsPriority_LoRa Radio,int,2*4C
$SPLST,correctionsPriority_Bluetooth,int,3*7A
$SPLST,correctionsPriority_USB Serial,int,4*6F
$SPLST,correctionsPriority_TCP (NTRIP),int,5*1D
$SPLST,correctionsPriority_L-Band,int,6*61
$SPLST,correctionsPriority_IP (PointPerfect/MQTT),int,7*3C
$SPLST,correctionsSourcesLifetime,int,30*0C
$SPLST,dataPortBaud,uint32_t,230400*56
$SPLST,defaultDoubleTapInterval,uint32_t,250*5B
$SPLST,deviceId,char[14],"64B70886A4D205"*3D
$SPLST,deviceName,char[8],"Postcard"*51
$SPLST,disableSetupButton,bool,false*12
$SPLST,eaProtocol,char[50],"com.sparkfun.rtk"*47
$SPLST,enableARPLogging,bool,false*16
$SPLST,enableAutoFirmwareUpdate,bool,false*39
$SPLST,enableEspNow,bool,false*06
$SPLST,enableExtCorrRadio,uint8_t,0*74
$SPLST,enableGalileoHas,bool,true*62
$SPLST,enableGnssToUsbSerial,bool,false*60
$SPLST,enableLogging,bool,true*3E
$SPLST,enableNmeaOnRadio,bool,true*2A
$SPLST,enableNtripCaster,bool,false*75
$SPLST,enableNtripClient,bool,false*7E
$SPLST,enableNtripServer,bool,false*62
$SPLST,enableRCFirmware,bool,false*36
$SPLST,enableTcpClient,bool,false*68
$SPLST,enableTcpServer,bool,false*74
$SPLST,enableUdpServer,bool,false*72
$SPLST,espnowPeer_0,uint8_t[6],0:0:0:0:0:0*26
$SPLST,espnowPeer_1,uint8_t[6],0:0:0:0:0:0*27
$SPLST,espnowPeer_2,uint8_t[6],0:0:0:0:0:0*24
$SPLST,espnowPeer_3,uint8_t[6],0:0:0:0:0:0*25
$SPLST,espnowPeer_4,uint8_t[6],0:0:0:0:0:0*22
$SPLST,espnowPeerCount,uint8_t,0*30
$SPLST,fixedAltitude,double,1560.0890*1A
$SPLST,fixedBase,bool,false*54
$SPLST,fixedBaseCoordinateType,bool,false*4E
$SPLST,fixedEcefX,double,-1280206.568*7D
$SPLST,fixedEcefY,double,-4716804.403*77
$SPLST,fixedEcefZ,double,4086665.484*51
$SPLST,fixedLat,double,40.090294790*4C
$SPLST,fixedLong,double,-105.185057610*23
$SPLST,gnssModuleInfo,char[56],"LG290P Firmware: LG290P03AANR02A01S ID: 00001C023EBBD1C1"*57
$SPLST,lastState,SystemState,0*7B
$SPLST,lbandFixTimeout,uint16_t,180*1E
$SPLST,maxLogLength,int,1440*1A
$SPLST,maxLogTime,int,1440*13
$SPLST,mdnsHostName,char[50],"rtk"*01
$SPLST,measurementRateMs,uint16_t,500*0D
$SPLST,measurementScale,uint8_t,0*73
$SPLST,mes,tLgMRNmea,0*48
$SPLST,mes,tLgMRNmea,0*48
$SPLST,mes,tLgMRNmea,0*48
$SPLST,mes,tLgMRNmea,0*48
$SPLST,mes,tLgMRNmea,0*48
$SPLST,mes,tLgMRNmea,0*48
$SPLST,mes,tLgMRNmea,0*48
$SPLST,mes,tLgMRNmea,0*48
$SPLST,mes,tLgMRNmea,0*48
$SPLST,mes,tLgMRNmea,0*48
$SPLST,mes,tLgMRPqtm,0*57
$SPLST,mes,tLgMRPqtm,0*57
$SPLST,mes,tLgMRBaRT,0*4A
$SPLST,mes,tLgMRBaRT,0*4A
$SPLST,mes,tLgMRBaRT,0*4A
$SPLST,mes,tLgMRBaRT,0*4A
$SPLST,mes,tLgMRBaRT,0*4A
$SPLST,mes,tLgMRBaRT,0*4A
$SPLST,mes,tLgMRBaRT,0*4A
$SPLST,mes,tLgMRBaRT,0*4A
$SPLST,mes,tLgMRBaRT,0*4A
$SPLST,mes,tLgMRBaRT,0*4A
$SPLST,mes,tLgMRBaRT,0*4A
$SPLST,mes,tLgMRBaRT,0*4A
$SPLST,mes,tLgMRBaRT,0*4A
$SPLST,mes,tLgMRBaRT,0*4A
$SPLST,mes,tLgMRBaRT,0*4A
$SPLST,mes,tLgMRRvRT,0*4D
$SPLST,mes,tLgMRRvRT,0*4D
$SPLST,mes,tLgMRRvRT,0*4D
$SPLST,mes,tLgMRRvRT,0*4D
$SPLST,mes,tLgMRRvRT,0*4D
$SPLST,mes,tLgMRRvRT,0*4D
$SPLST,mes,tLgMRRvRT,0*4D
$SPLST,mes,tLgMRRvRT,0*4D
$SPLST,mes,tLgMRRvRT,0*4D
$SPLST,mes,tLgMRRvRT,0*4D
$SPLST,mes,tLgMRRvRT,0*4D
$SPLST,mes,tLgMRRvRT,0*4D
$SPLST,mes,tLgMRRvRT,0*4D
$SPLST,mes,tLgMRRvRT,0*4D
$SPLST,mes,tLgMRRvRT,0*4D
$SPLST,minCN0,int16_t,10*6D
$SPLST,minElev,uint8_t,10*20
$SPLST,ntripClientCasterHost,char[50],"rtk2go.com"*3D
$SPLST,ntripClientCasterPort,uint16_t,2101*0F
$SPLST,ntripClientCasterUser,char[50],"test@test.com"*3B
$SPLST,ntripClientCasterUserPW,char[50],""*33
$SPLST,ntripClientMountPoint,char[50],"bldr_SparkFun1"*46
$SPLST,ntripClientMountPointPW,char[50],""*31
$SPLST,ntripClientTransmitGGA,bool,true*5F
$SPLST,ntripServerCasterEnabled_0,bool,false*5B
$SPLST,ntripServerCasterEnabled_1,bool,false*5A
$SPLST,ntripServerCasterEnabled_2,bool,false*59
$SPLST,ntripServerCasterEnabled_3,bool,false*58
$SPLST,ntripServerCasterHost_0,char[50],"rtk2go.com"*4E
$SPLST,ntripServerCasterHost_1,char[50],""*57
$SPLST,ntripServerCasterHost_2,char[50],""*54
$SPLST,ntripServerCasterHost_3,char[50],""*55
$SPLST,ntripServerCasterPort_0,uint16_t,2101*7C
$SPLST,ntripServerCasterPort_1,uint16_t,2101*7D
$SPLST,ntripServerCasterPort_2,uint16_t,2101*7E
$SPLST,ntripServerCasterPort_3,uint16_t,2101*7F
$SPLST,ntripServerCasterUser_0,char[50],"test@test.com"*48
$SPLST,ntripServerCasterUser_1,char[50],""*46
$SPLST,ntripServerCasterUser_2,char[50],""*45
$SPLST,ntripServerCasterUser_3,char[50],""*44
$SPLST,ntripServerCasterUserPW_0,char[50],""*40
$SPLST,ntripServerCasterUserPW_1,char[50],""*41
$SPLST,ntripServerCasterUserPW_2,char[50],""*42
$SPLST,ntripServerCasterUserPW_3,char[50],""*43
$SPLST,ntripServerMountPoint_0,char[50],"bldr_dwntwn2"*20
$SPLST,ntripServerMountPoint_1,char[50],""*44
$SPLST,ntripServerMountPoint_2,char[50],""*47
$SPLST,ntripServerMountPoint_3,char[50],""*46
$SPLST,ntripServerMountPointPW_0,char[50],"WR5wRo4H"*44
$SPLST,ntripServerMountPointPW_1,char[50],""*43
$SPLST,ntripServerMountPointPW_2,char[50],""*40
$SPLST,ntripServerMountPointPW_3,char[50],""*41
$SPLST,observationPositionAccuracy,float,5.00*69
$SPLST,observationSeconds,int,60*30
$SPLST,outputTipAltitude,bool,false*75
$SPLST,pointPerfectDeviceProfileToken,char[40],""*69
$SPLST,pointPerfectService,uint8_t,0*23
$SPLST,pplFixTimeoutS,uint16_t,180*44
$SPLST,profile0Name,char[50],"Profile1"*79
$SPLST,profile1Name,char[50],""*02
$SPLST,profile2Name,char[50],""*01
$SPLST,profile3Name,char[50],""*00
$SPLST,profile4Name,char[50],""*07
$SPLST,profile5Name,char[50],""*06
$SPLST,profile6Name,char[50],""*05
$SPLST,profile7Name,char[50],""*04
$SPLST,profileName,char[50],"Profile1"*49
$SPLST,profileNumber,uint8_t,0*09
$SPLST,radioPortBaud,uint32_t,115200*35
$SPLST,rebootMinutes,uint32_t,0*24
$SPLST,requestKeyUpdate,bool,false*00
$SPLST,rtcmMinElev,int,-90*4B
$SPLST,rtkFirmwareVersion,char[4],"v3.1"*12
$SPLST,rtkRemoteFirmwareVersion,char[21],"NotYetRetreived"*0C
$SPLST,shutdownNoChargeTimeoutMinutes,uint32_t,0*6D
$SPLST,surveyInStartingAccuracy,float,2.0*1C
$SPLST,tcpClientHost,char[50],""*01
$SPLST,tcpClientPort,uint16_t,2948*2E
$SPLST,tcpOverWiFiStation,bool,true*7E
$SPLST,tcpServerPort,uint16_t,2948*32
$SPLST,udpOverWiFiStation,bool,true*78
$SPLST,udpServerPort,uint16_t,10110*02
$SPLST,useMSM7,bool,false*10
$SPLST,wifiChannel,uint8_t,1*12
$SPLST,wifiNetwork_0Password,char[50],""*60
$SPLST,wifiNetwork_0SSID,char[50],""*52
$SPLST,wifiNetwork_1Password,char[50],""*61
$SPLST,wifiNetwork_1SSID,char[50],""*53
$SPLST,wifiNetwork_2Password,char[50],""*62
$SPLST,wifiNetwork_2SSID,char[50],""*50
$SPLST,wifiNetwork_3Password,char[50],""*63
$SPLST,wifiNetwork_3SSID,char[50],""*51
Here is what I am getting:
I turned GSV on and was then SIV gave me a number on the terminal (PuTTy). Interestingly, on the custom app I am using (I didn’t program it) I was able to see SIV without GSV turned on. Due to this, I will likely keep GSV off.
Also, I did get the Survey-in and then Base assist to work. Set the base to Survey in - reset the module and then it went into a Survey in mode. After this completed, I set it to base assist and it entered the results so seems to be working.
Interestingly, I shut off GSV and SIV continued to report fine until I rebooted the unit. Then it went back to reporting SIV:0.
On a Base, I’m not sure I’d want GSV messages turned ON.
Note: SIV info is also in GGA, but limited to a max count of 12. The NMEA standard was created 40+ years ago and we still provide backwards compatibility ![]()
GNGNS is the newer sentence with a 99 satellite limit.
