mirror of
https://github.com/meshtastic/firmware.git
synced 2025-04-24 01:16:55 +00:00
Merge pull request #3410 from meshtastic/gnss-l76b
(1/3) Support L76B GNSS chip found on pico waveshare shield.
This commit is contained in:
commit
cb3740708b
@ -78,7 +78,7 @@ lib_deps =
|
|||||||
https://github.com/meshtastic/esp8266-oled-ssd1306.git#ee628ee6c9588d4c56c9e3da35f0fc9448ad54a8 ; ESP8266_SSD1306
|
https://github.com/meshtastic/esp8266-oled-ssd1306.git#ee628ee6c9588d4c56c9e3da35f0fc9448ad54a8 ; ESP8266_SSD1306
|
||||||
mathertel/OneButton@^2.5.0 ; OneButton library for non-blocking button debounce
|
mathertel/OneButton@^2.5.0 ; OneButton library for non-blocking button debounce
|
||||||
https://github.com/meshtastic/arduino-fsm.git#7db3702bf0cfe97b783d6c72595e3f38e0b19159
|
https://github.com/meshtastic/arduino-fsm.git#7db3702bf0cfe97b783d6c72595e3f38e0b19159
|
||||||
https://github.com/meshtastic/TinyGPSPlus.git#2044b2c51e91ab4cd8cc93b15e40658cd808dd06
|
https://github.com/meshtastic/TinyGPSPlus.git#f9f4fef2183514aa52be91d714c1455dd6f26e45
|
||||||
https://github.com/meshtastic/ArduinoThread.git#72921ac222eed6f526ba1682023cee290d9aa1b3
|
https://github.com/meshtastic/ArduinoThread.git#72921ac222eed6f526ba1682023cee290d9aa1b3
|
||||||
nanopb/Nanopb@^0.4.7
|
nanopb/Nanopb@^0.4.7
|
||||||
erriez/ErriezCRC32@^1.0.1
|
erriez/ErriezCRC32@^1.0.1
|
||||||
|
@ -290,6 +290,26 @@ bool GPS::setup()
|
|||||||
// Switch to Vehicle Mode, since SoftRF enables Aviation < 2g
|
// Switch to Vehicle Mode, since SoftRF enables Aviation < 2g
|
||||||
_serial_gps->write("$PCAS11,3*1E\r\n");
|
_serial_gps->write("$PCAS11,3*1E\r\n");
|
||||||
delay(250);
|
delay(250);
|
||||||
|
} else if (gnssModel == GNSS_MODEL_MTK_L76B) {
|
||||||
|
// Waveshare Pico-GPS hat uses the L76B with 9600 baud
|
||||||
|
// Initialize the L76B Chip, use GPS + GLONASS
|
||||||
|
// See note in L76_Series_GNSS_Protocol_Specification, chapter 3.29
|
||||||
|
_serial_gps->write("$PMTK353,1,1,0,0,0*2B\r\n");
|
||||||
|
// Above command will reset the GPS and takes longer before it will accept new commands
|
||||||
|
delay(1000);
|
||||||
|
// only ask for RMC and GGA (GNRMC and GNGGA)
|
||||||
|
// See note in L76_Series_GNSS_Protocol_Specification, chapter 2.1
|
||||||
|
_serial_gps->write("$PMTK314,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*28\r\n");
|
||||||
|
delay(250);
|
||||||
|
// Enable SBAS
|
||||||
|
_serial_gps->write("$PMTK301,2*2E\r\n");
|
||||||
|
delay(250);
|
||||||
|
// Enable PPS for 2D/3D fix only
|
||||||
|
_serial_gps->write("$PMTK285,3,100*3F\r\n");
|
||||||
|
delay(250);
|
||||||
|
// Switch to Fitness Mode, for running and walking purpose with low speed (<5 m/s)
|
||||||
|
_serial_gps->write("$PMTK886,1*29\r\n");
|
||||||
|
delay(250);
|
||||||
} else if (gnssModel == GNSS_MODEL_UC6580) {
|
} else if (gnssModel == GNSS_MODEL_UC6580) {
|
||||||
// The Unicore UC6580 can use a lot of sat systems, enable it to
|
// The Unicore UC6580 can use a lot of sat systems, enable it to
|
||||||
// use GPS L1 & L5 + BDS B1I & B2a + GLONASS L1 + GALILEO E1 & E5a + SBAS
|
// use GPS L1 & L5 + BDS B1I & B2a + GLONASS L1 + GALILEO E1 & E5a + SBAS
|
||||||
@ -625,17 +645,27 @@ void GPS::setGPSPower(bool on, bool standbyOnly, uint32_t sleepTime)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef PIN_GPS_STANDBY // Specifically the standby pin for L76K and clones
|
#ifdef PIN_GPS_STANDBY // Specifically the standby pin for L76B, L76K and clones
|
||||||
if (on) {
|
if (on) {
|
||||||
LOG_INFO("Waking GPS\n");
|
LOG_INFO("Waking GPS\n");
|
||||||
pinMode(PIN_GPS_STANDBY, OUTPUT);
|
pinMode(PIN_GPS_STANDBY, OUTPUT);
|
||||||
|
// Some PCB's use an inverse logic due to a transistor driver
|
||||||
|
// Example for this is the Pico-Waveshare Lora+GPS HAT
|
||||||
|
#ifdef PIN_GPS_STANDBY_INVERTED
|
||||||
|
digitalWrite(PIN_GPS_STANDBY, 0);
|
||||||
|
#else
|
||||||
digitalWrite(PIN_GPS_STANDBY, 1);
|
digitalWrite(PIN_GPS_STANDBY, 1);
|
||||||
|
#endif
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
LOG_INFO("GPS entering sleep\n");
|
LOG_INFO("GPS entering sleep\n");
|
||||||
// notifyGPSSleep.notifyObservers(NULL);
|
// notifyGPSSleep.notifyObservers(NULL);
|
||||||
pinMode(PIN_GPS_STANDBY, OUTPUT);
|
pinMode(PIN_GPS_STANDBY, OUTPUT);
|
||||||
|
#ifdef PIN_GPS_STANDBY_INVERTED
|
||||||
|
digitalWrite(PIN_GPS_STANDBY, 1);
|
||||||
|
#else
|
||||||
digitalWrite(PIN_GPS_STANDBY, 0);
|
digitalWrite(PIN_GPS_STANDBY, 0);
|
||||||
|
#endif
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -916,7 +946,7 @@ GnssModel_t GPS::probe(int serialSpeed)
|
|||||||
uint8_t buffer[768] = {0};
|
uint8_t buffer[768] = {0};
|
||||||
delay(100);
|
delay(100);
|
||||||
|
|
||||||
// Close all NMEA sentences , Only valid for MTK platform
|
// Close all NMEA sentences , Only valid for L76K MTK platform
|
||||||
_serial_gps->write("$PCAS03,0,0,0,0,0,0,0,0,0,0,,,0,0*02\r\n");
|
_serial_gps->write("$PCAS03,0,0,0,0,0,0,0,0,0,0,,,0,0*02\r\n");
|
||||||
delay(20);
|
delay(20);
|
||||||
|
|
||||||
@ -928,6 +958,18 @@ GnssModel_t GPS::probe(int serialSpeed)
|
|||||||
return GNSS_MODEL_MTK;
|
return GNSS_MODEL_MTK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Close all NMEA sentences, valid for L76B MTK platform (Waveshare Pico GPS)
|
||||||
|
_serial_gps->write("$PMTK514,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*2E\r\n");
|
||||||
|
delay(20);
|
||||||
|
|
||||||
|
// Get version information
|
||||||
|
clearBuffer();
|
||||||
|
_serial_gps->write("$PMTK605*31\r\n");
|
||||||
|
if (getACK("Quectel-L76B", 500) == GNSS_RESPONSE_OK) {
|
||||||
|
LOG_INFO("L76B GNSS init succeeded, using L76B GNSS Module\n");
|
||||||
|
return GNSS_MODEL_MTK_L76B;
|
||||||
|
}
|
||||||
|
|
||||||
uint8_t cfg_rate[] = {0xB5, 0x62, 0x06, 0x08, 0x00, 0x00, 0x00, 0x00};
|
uint8_t cfg_rate[] = {0xB5, 0x62, 0x06, 0x08, 0x00, 0x00, 0x00, 0x00};
|
||||||
UBXChecksum(cfg_rate, sizeof(cfg_rate));
|
UBXChecksum(cfg_rate, sizeof(cfg_rate));
|
||||||
clearBuffer();
|
clearBuffer();
|
||||||
@ -1109,7 +1151,6 @@ GPS *GPS::createGps()
|
|||||||
LOG_DEBUG("Using GPIO%d for GPS RX\n", new_gps->rx_gpio);
|
LOG_DEBUG("Using GPIO%d for GPS RX\n", new_gps->rx_gpio);
|
||||||
LOG_DEBUG("Using GPIO%d for GPS TX\n", new_gps->tx_gpio);
|
LOG_DEBUG("Using GPIO%d for GPS TX\n", new_gps->tx_gpio);
|
||||||
_serial_gps->begin(GPS_BAUDRATE, SERIAL_8N1, new_gps->rx_gpio, new_gps->tx_gpio);
|
_serial_gps->begin(GPS_BAUDRATE, SERIAL_8N1, new_gps->rx_gpio, new_gps->tx_gpio);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
_serial_gps->begin(GPS_BAUDRATE);
|
_serial_gps->begin(GPS_BAUDRATE);
|
||||||
#endif
|
#endif
|
||||||
@ -1169,6 +1210,10 @@ bool GPS::factoryReset()
|
|||||||
// _serial_gps->write(_message_CFG_RST_COLDSTART, sizeof(_message_CFG_RST_COLDSTART));
|
// _serial_gps->write(_message_CFG_RST_COLDSTART, sizeof(_message_CFG_RST_COLDSTART));
|
||||||
// delay(1000);
|
// delay(1000);
|
||||||
} else {
|
} else {
|
||||||
|
// fire this for good measure, if we have an L76B - won't harm other devices.
|
||||||
|
_serial_gps->write("$PMTK104*37\r\n");
|
||||||
|
// No PMTK_ACK for this command.
|
||||||
|
delay(100);
|
||||||
// send the UBLOX Factory Reset Command regardless of detect state, something is very wrong, just assume it's UBLOX.
|
// send the UBLOX Factory Reset Command regardless of detect state, something is very wrong, just assume it's UBLOX.
|
||||||
// Factory Reset
|
// Factory Reset
|
||||||
byte _message_reset[] = {0xB5, 0x62, 0x06, 0x09, 0x0D, 0x00, 0xFF, 0xFB, 0x00, 0x00, 0x00,
|
byte _message_reset[] = {0xB5, 0x62, 0x06, 0x09, 0x0D, 0x00, 0xFF, 0xFB, 0x00, 0x00, 0x00,
|
||||||
|
@ -20,12 +20,7 @@ struct uBloxGnssModelInfo {
|
|||||||
char extension[10][30];
|
char extension[10][30];
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef enum {
|
typedef enum { GNSS_MODEL_MTK, GNSS_MODEL_UBLOX, GNSS_MODEL_UC6580, GNSS_MODEL_UNKNOWN, GNSS_MODEL_MTK_L76B } GnssModel_t;
|
||||||
GNSS_MODEL_MTK,
|
|
||||||
GNSS_MODEL_UBLOX,
|
|
||||||
GNSS_MODEL_UC6580,
|
|
||||||
GNSS_MODEL_UNKNOWN,
|
|
||||||
} GnssModel_t;
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
GNSS_RESPONSE_NONE,
|
GNSS_RESPONSE_NONE,
|
||||||
@ -92,8 +87,11 @@ class GPS : private concurrency::OSThread
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
/** If !NULL we will use this serial port to construct our GPS */
|
/** If !NULL we will use this serial port to construct our GPS */
|
||||||
|
#if defined(RPI_PICO_WAVESHARE)
|
||||||
|
static SerialUART *_serial_gps;
|
||||||
|
#else
|
||||||
static HardwareSerial *_serial_gps;
|
static HardwareSerial *_serial_gps;
|
||||||
|
#endif
|
||||||
static uint8_t _message_PMREQ[];
|
static uint8_t _message_PMREQ[];
|
||||||
static uint8_t _message_PMREQ_10[];
|
static uint8_t _message_PMREQ_10[];
|
||||||
static const uint8_t _message_CFG_RXM_PSM[];
|
static const uint8_t _message_CFG_RXM_PSM[];
|
||||||
|
Loading…
Reference in New Issue
Block a user