Skip to content

v2.2.17 #161

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Oct 17, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
136 changes: 136 additions & 0 deletions examples/Example32_NEO-D9C/Example32_NEO-D9C.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
/*
NEO-D9C QZSS-L6 receiver example
By: SparkFun Electronics / Paul Clark
Date: September 23rd, 2022
License: MIT. See license file for more information but you can
basically do whatever you want with this code.

This example shows how to display a summary of the NEO-D9C's UBX-RXM-QZSSL6 data.
It also enables UBX-RXM-QZSSL6 message output on both UART1 and UART2 at 38400 baud
so you can feed the corrections directly to (e.g.) a ZED-F9P.

We believe the NEO-D9C's I2C address should be 0x43 (like the NEO-D9S). But, reported by users in Japan,
the initial NEO-D9C's use address 0x42 - which is the same as the ZED-F9P.

If you have one of the initial NEO-D9C's, the address 0x42 should work for you.
If you have a newer or upgraded NEO-D9C, then you may need to change to 0x43. See line 100.

Also, again reported by users in Japan, the initial NEO-D9C's do not support UBX-CFG-PRT.
The library uses UBX-CFG-PRT inside .begin (.isConnected) to check if the module is connected.
This then fails with the initial NEO-D9C's.
The work-around is to set the .begin assumeSuccess parameter to true.
With newer NEO-D9C's this work-around may not be necessary. Again see line 100.

Feel like supporting open source hardware?
Buy a board from SparkFun!
ZED-F9P RTK2: https://www.sparkfun.com/products/16481
NEO-D9S L-Band Correction Data Receiver: https://www.sparkfun.com/products/19390

Hardware Connections:
Use a Qwiic cable to connect the NEO-D9C QZSS-L6 corection data receiver to your board
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 <SparkFun_u-blox_GNSS_Arduino_Library.h> //Click here to get the library: http://librarymanager/All#SparkFun_u-blox_GNSS
SFE_UBLOX_GNSS myQZSS; // NEO-D9C

#define OK(ok) (ok ? F(" -> OK") : F(" -> ERROR!")) // Convert uint8_t into OK/ERROR

//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

// Callback: printRXMQZSSL6 will be called when new QZSS-L6 data arrives
// See u-blox_structs.h for the full definition of UBX_RXM_QZSSL6_message_data_t
// _____ You can use any name you like for the callback. Use the same name when you call setRXMQZSSL6messageCallbackPtr
// / _____ This _must_ be UBX_RXM_QZSSL6_message_data_t
// | / _____ You can use any name you like for the struct
// | | /
// | | |
void printRXMQZSSL6(UBX_RXM_QZSSL6_message_data_t *qzssL6Data)
{
Serial.println(F("New QZSS-L6 data received:"));

Serial.print(F("Message version: "));
Serial.println(qzssL6Data->payload[0]);

Serial.print(F("Satellite Identifier: "));
Serial.println(qzssL6Data->payload[1]);

Serial.print(F("Carrier / Noise: "));
double cno = (0.00390625 * ((double)qzssL6Data->payload[2])) + ((double)qzssL6Data->payload[3]);
Serial.println(cno, 1);

Serial.print(F("Bit Errors Corrected: "));
Serial.println(qzssL6Data->payload[9]);

uint16_t chInfo = (((uint16_t)qzssL6Data->payload[11]) << 8) | qzssL6Data->payload[10];
uint16_t errStatus = ((chInfo >> 12) & 0x3);
Serial.print(F("Receiver Channel: "));
Serial.println((chInfo >> 8) & 0x3);
Serial.print(F("Message Name: L6"));
Serial.println(((chInfo >> 10) & 0x1) == 0 ? F("D") : F("E"));
Serial.print(F("Error Status: "));
if (errStatus == 1)
Serial.println("error-free");
else if (errStatus == 2)
Serial.println("erroneous");
else
Serial.println("unknown");
Serial.print(F("Channel Name: "));
Serial.println(((chInfo >> 14) & 0x3) == 0 ? F("A") : F("B"));

Serial.println();
}

//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

void setup()
{
Serial.begin(115200);
Serial.println(F("NEO-D9C Example"));

Wire.begin(); //Start I2C

//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Begin and configure the NEO-D9C QZSS-L6 receiver

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

// For the initial NEO-D9C's: connect using address 0x42; set the assumeSuccess parameter to true
while (myQZSS.begin(Wire, 0x42, 1100, true) == false)
// For newer NEO-D9C's: use address 0x43; leave assumeSuccess set to false (default)
//while (myQZSS.begin(Wire, 0x43) == false)
{
Serial.println(F("u-blox NEO-D9C not detected at selected I2C address. Please check wiring and I2C address."));
delay(2000);
}
Serial.println(F("u-blox NEO-D9C connected"));

uint8_t ok = myQZSS.setVal(UBLOX_CFG_MSGOUT_UBX_RXM_QZSSL6_I2C, 1); // Output QZSS-L6 message on the I2C port

Serial.print(F("QZSS-L6: I2C configuration "));
Serial.println(OK(ok));

if (ok) ok = myQZSS.setVal(UBLOX_CFG_MSGOUT_UBX_RXM_QZSSL6_UART1, 1); // Output QZSS-L6 message on UART1
if (ok) ok = myQZSS.setVal32(UBLOX_CFG_UART1_BAUDRATE, 38400); // Match UART1 baudrate with ZED

Serial.print(F("QZSS-L6: UART1 configuration "));
Serial.println(OK(ok));

if (ok) ok = myQZSS.setVal(UBLOX_CFG_UART2OUTPROT_UBX, 1); // Enable UBX output on UART2
if (ok) ok = myQZSS.setVal(UBLOX_CFG_MSGOUT_UBX_RXM_QZSSL6_UART2, 1); // Output QZSS-L6 message on UART2
if (ok) ok = myQZSS.setVal32(UBLOX_CFG_UART2_BAUDRATE, 38400); // Match UART2 baudrate with ZED

Serial.print(F("QZSS-L6: UART2 configuration "));
Serial.println(OK(ok));

myQZSS.setRXMQZSSL6messageCallbackPtr(&printRXMQZSSL6); // Call printRXMQZSSL6 when new QZSS-L6 data arrives
}

//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

void loop()
{
myQZSS.checkUblox(); // Check for the arrival of new QZSS-L6 data and process it.
myQZSS.checkCallbacks(); // Check if any QZSS-L6 callbacks are waiting to be processed.
}
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ void setup()
Serial.println(F("Press any key to send commands to enable RTCM 3.x"));
while(Serial.available() == 0) ; //Wait for user to press a key

myGNSS.setI2COutput(COM_TYPE_UBX); //Set the I2C port to output UBX only (turn off NMEA noise)
myGNSS.setI2COutput(COM_TYPE_UBX | COM_TYPE_NMEA | COM_TYPE_RTCM3); // Ensure RTCM3 is enabled
myGNSS.saveConfiguration(); //Save the current settings to flash and BBR

bool response = true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ void setup()
while (1);
}

myGNSS.setI2COutput(COM_TYPE_UBX); //Set the I2C port to output UBX only (turn off NMEA noise)
myGNSS.setI2COutput(COM_TYPE_UBX | COM_TYPE_NMEA | COM_TYPE_RTCM3); // Ensure RTCM3 is enabled
myGNSS.saveConfiguration(); //Save the current settings to flash and BBR

while (Serial.available()) Serial.read(); //Clear any latent chars in serial buffer
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,9 @@ void setup()
lcd.setCursor(0, 1);
lcd.print("GNSS Detected");

myGNSS.setI2COutput(COM_TYPE_UBX | COM_TYPE_NMEA | COM_TYPE_RTCM3); // Ensure RTCM3 is enabled
myGNSS.saveConfiguration(); //Save the current settings to flash and BBR

//Check if Survey is in Progress before initiating one
// From v2.0, the data from getSurveyStatus (UBX-NAV-SVIN) is returned in UBX_NAV_SVIN_t packetUBXNAVSVIN
// Please see u-blox_structs.h for the full definition of UBX_NAV_SVIN_t
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,9 +78,8 @@ void setup()

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

Expand Down Expand Up @@ -400,4 +399,4 @@ void SFE_UBLOX_GNSS::processNMEA(char incoming)
ggaSentenceStarted = false;
}
}
}
}
Loading