I’m trying to use the above breakout board ( part # GPS-17285, with GPS-14986 antenna) to sample location data. I would like to get at least 10 data points per second, as this will be mounted in a race car travelling up to 100 MPH. I have attached the I2C bus on a Teensy 4.1 (Cortex M7 at 600 Mhz) to the Qwiic connector.
I’ve tried MANY different setup configurations, but none seem to be able to sample quickly. I put code in to toggle an I/O pin I can watch on my oscilloscope. When I first power up it takes 500mS to get the Latitude and Longitude, but after a few seconds this expands to 2.25 seconds.
Also, every time I change code I have to power cycle the board after uploading. Otherwise, the new code does not seem to change the configuration of the u-blox.
My code is below - can anyone see what I’m missing?
Thanks!
=====
Code
=====
#include <Wire.h> // For I2C
#include <SparkFun_u-blox_GNSS_v3.h>
// Pins for checking timing with the oscilloscope
#define PULSE_PIN 34
#define PULSE_PIN2 35
#define BAUDRATE 115200
// GPS/GNSS globals for NEO-M9N
SFE_UBLOX_GNSS theGNSS;
volatile float Latitude = 1.1;
volatile float Longitude = -1.1;
//-------------------------------------------------------------------------
// Initialize everything
void setup( void )
{
Serial.begin( BAUDRATE );
// Set the Pulse Pins (used to measure timing with an oscilloscope) to output
pinMode( PULSE_PIN, OUTPUT );
pinMode( PULSE_PIN2, OUTPUT );
digitalWrite( PULSE_PIN, LOW );
digitalWrite( PULSE_PIN2, LOW );
Wire2.begin();
Wire2.setClock( 400000 ); // Set I2C clock speed
Serial.println( "Wire2 Initialized" );
// Set up GNSS for location, velocity, etc.
while( theGNSS.begin( Wire2 ) == false ) //Connect to the u-blox module using Wire port
{
Serial.println( F("u-blox GNSS not detected at default I2C address. Retrying...") );
delay( 1000 );
}
Serial.println( "GNSS Up, " );
// Reset to factory default to clear any old test setups, auto messages, etc.
theGNSS.factoryDefault(); delay(5000);
theGNSS.setI2COutput( COM_TYPE_UBX ); //Set the I2C port to output UBX only (turn off NMEA noise)
theGNSS.saveConfigSelective( VAL_CFG_SUBSEC_IOPORT ); //Save (only) the communications port settings to flash and BBR
// Turn off all but GPS - should help speed up samples
theGNSS.enableGNSS(true, SFE_UBLOX_GNSS_ID_GPS); // Make sure GPS is enabled (we must leave at least one major GNSS enabled!)
theGNSS.enableGNSS(false, SFE_UBLOX_GNSS_ID_SBAS); // Disable SBAS
theGNSS.enableGNSS(false, SFE_UBLOX_GNSS_ID_GALILEO); // Disable Galileo
theGNSS.enableGNSS(false, SFE_UBLOX_GNSS_ID_BEIDOU); // Disable BeiDou
theGNSS.enableGNSS(false, SFE_UBLOX_GNSS_ID_IMES); // Disable IMES
theGNSS.enableGNSS(false, SFE_UBLOX_GNSS_ID_QZSS); // Disable QZSS
theGNSS.enableGNSS(false, SFE_UBLOX_GNSS_ID_GLONASS); // Disable GLONASS
theGNSS.setNavigationFrequency( 10 ); // Produce 10 solutions per second
//theGNSS.setAutoPVT( true ); // Tell the GNSS to output each solution periodically
theGNSS.saveConfiguration(); // Save current settings to Flash and Battery Backed RAM
delay( 3000 );
Serial.println( "GNSS Initialized" );
}
//-------------------------------------------------------------------------
void loop(void)
{
char buf[ 16 ];
Serial.println( "Top of Loop" );
digitalWrite( PULSE_PIN2, HIGH );
digitalWrite( PULSE_PIN, HIGH );
// Get the latitude and longitude
long latit = theGNSS.getLatitude( );
long longi = theGNSS.getLongitude();
Latitude = latit / 10000000.0;
Longitude = longi / 10000000.0;
digitalWrite( PULSE_PIN, LOW );
digitalWrite( PULSE_PIN2, LOW );
sprintf( buf, "%3.6f", Latitude );
Serial.print( buf );
Serial.print( ", " );
sprintf( buf, "%3.6f", Longitude );
Serial.println( buf );
delay( 500 );
}