Skip to content

Arduino Due slower update rate than Uno over I2C #191

@smithan7

Description

@smithan7

Thanks for a great library and please let me know if there are any details I am leaving out. I searched for old issues on this and the closest I found was Arduino DUE Setup #66 - which was related to Serial connections.

Subject of the issue

I am using the Arduino Due with the SparkFun GPS Dead Reckoning Breakout - NEO-M8U (Qwiic) with the unmodified Example3_GetPosition.

I am wired to the Due using pins 20, 21, 3.3v, and GND (without pullup resistors) and I am able to connect and get GPS data to print on the screen as shown below:

[Deleted]

The issue is that it runs really slowly, from the timestamps it takes ~6s for each update. I originally had this on a Sparkfun redboard Qwiic (~Arduino Uno) (hooked up A5, A4, 3.3v, and GND without pullup resistors) and re-running using the exact same Example3_GetPosition I get:

[Deleted]

This is a simple example, I noticed the slowness on a separate script and am using this to demonstrate a re-creatable difference on a stock example. I have tried increasing the wire speed to 400,000 Hz (Wire.setClock(400000);) and that didn't help. I also notice that the Due is less reliable in detecting the GPS receiver, which I assume is a timeout issue. I have also used the examples to modify the GPS update behavior and on the Uno it behaves as expected and updates but on the Due it frequently does not update OR when it does it does not effect the actual update rate.

I tested running print statements on the Due and it does not lag - it appears to be something in either the i2c or GPS libraries/connections inducing the lag.

Your workbench

  • What development board or microcontroller are you using?
    * I am using a Sparkfun Redboard Qwiic (~Uno) and Arduino Due
  • What version of hardware or breakout board are you using?
    * SparkFun GPS Dead Reckoning Breakout - NEO-M8U (Qwiic)
  • How is the breakout board wired to your microcontroller?
    * Redboard UNO - A4, A5, 3.3v, GND pins without pullup resistors - direct from Arduino female headers to Qwiic connector
    * Have also used the built-in Qwiic connector on the Redboard Uno direct to the GPS Qwiic without issue and went back to this to test the cable used to connect the Due.
    * Arduino Due - 20, 21, 3.3v, GND pins without pullup resistors - direct from Arduino female headers to Qwiic connector
  • How is everything being powered?
    * Both boards are powered via USB port to micro-USB connector from my laptop to the board.
  • Are there any additional details that may help us help you?
    * Not that I can think of...

Steps to reproduce

I am using the stock Example3_GetPosition as copied below:



***********************************Begin Code ***************************************************************



/*
Reading lat and long via UBX binary commands - no more NMEA parsing!
By: Nathan Seidle
SparkFun Electronics
Date: January 3rd, 2019
License: MIT. See license file for more information but you can
basically do whatever you want with this code.

This example shows how to query a u-blox module for its lat/long/altitude. We also
turn off the NMEA output on the I2C port. This decreases the amount of I2C traffic
dramatically.

Note: Long/lat are large numbers because they are * 10^7. To convert lat/long
to something google maps understands simply divide the numbers by 10,000,000. We
do this so that we don't have to use floating point numbers.

Leave NMEA parsing behind. Now you can simply ask the module for the datums you want!

Feel like supporting open source hardware?
Buy a board from SparkFun!
ZED-F9P RTK2: https://www.sparkfun.com/products/15136
NEO-M8P RTK: https://www.sparkfun.com/products/15005
SAM-M8Q: https://www.sparkfun.com/products/15106

Hardware Connections:
Plug a Qwiic cable into the GNSS and a BlackBoard
If you don't have a platform with a Qwiic connection use the SparkFun Qwiic Breadboard Jumper (https://www.sparkfun.com/products/14425)
Open the serial monitor at 115200 baud to see the output
*/

#include <Wire.h> //Needed for I2C to GNSS

#include <SparkFun_u-blox_GNSS_Arduino_Library.h> //http://librarymanager/All#SparkFun_u-blox_GNSS
SFE_UBLOX_GNSS myGNSS;

long lastTime = 0; //Simple local timer. Limits amount if I2C traffic to u-blox module.

void setup()
{
Serial.begin(115200);
while (!Serial); //Wait for user to open terminal
Serial.println("SparkFun u-blox Example");

Wire.begin();

//myGNSS.enableDebugging(); // Uncomment this line to enable helpful debug messages on Serial

if (myGNSS.begin() == false) //Connect to the u-blox module using Wire port
{
Serial.println(F("u-blox GNSS not detected at default I2C address. Please check wiring. Freezing."));
while (1);
}

myGNSS.setI2COutput(COM_TYPE_UBX); //Set the I2C port to output UBX only (turn off NMEA noise)
myGNSS.saveConfigSelective(VAL_CFG_SUBSEC_IOPORT); //Save (only) the communications port settings to flash and BBR
}

void loop()
{
//Query module only every second. Doing it more often will just cause I2C traffic.
//The module only responds when a new position is available
if (millis() - lastTime > 1000)
{
lastTime = millis(); //Update the timer

long latitude = myGNSS.getLatitude();
Serial.print(F("Lat: "));
Serial.print(latitude);

long longitude = myGNSS.getLongitude();
Serial.print(F(" Long: "));
Serial.print(longitude);
Serial.print(F(" (degrees * 10^-7)"));

long altitude = myGNSS.getAltitude();
Serial.print(F(" Alt: "));
Serial.print(altitude);
Serial.print(F(" (mm)"));

byte SIV = myGNSS.getSIV();
Serial.print(F(" SIV: "));
Serial.print(SIV);

Serial.println();

}
}



*************************************End Code ***************************************************************



Expected behavior

I expected the Arduino Due to have the same update rate as the Uno.

Actual behavior

The Due is significantly slower than the Uno.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions