-
Notifications
You must be signed in to change notification settings - Fork 7
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add new example, does not fully compile yet.
- Loading branch information
Showing
2 changed files
with
192 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,176 @@ | ||
/* | ||
This is modified from | ||
../SparkFun_u-blox_GNSS_Arduino_Library/examples/NEO-M8P-2/Example2_StartRTCMBase/Example2_StartRTCMBase.ino | ||
to compile under Linux. | ||
*/ | ||
|
||
/* | ||
Note: compiles OK with v2.0 but is currently untested | ||
Send UBX binary commands to enable RTCM sentences on u-blox NEO-M8P-2 module | ||
By: Nathan Seidle | ||
SparkFun Electronics | ||
Date: September 7th, 2018 | ||
License: MIT. See license file for more information but you can | ||
basically do whatever you want with this code. | ||
This example does all steps to configure and enable a NEO-M8P-2 as a base station: | ||
Begin Survey-In | ||
Once we've achieved 2m accuracy and 300s have passed, survey is complete | ||
Enable four RTCM messages | ||
Begin outputting RTCM bytes | ||
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 <stdint.h> | ||
#include <errno.h> | ||
#include <unistd.h> | ||
#include <cstring> | ||
|
||
#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; | ||
|
||
|
||
void setup() | ||
{ | ||
// Next line did not compile on linux, there is no operator! in class Stream (which Serial is). | ||
// while (!Serial); //Wait for user to open terminal | ||
Serial.println(F("u-blox NEO-M8P-2 base station example")); | ||
|
||
Wire.begin(); | ||
Wire.setClock(400000); //Increase I2C clock speed to 400kHz | ||
|
||
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.saveConfiguration(); //Save the current settings to flash and BBR | ||
|
||
while (Serial.available()) Serial.read(); //Clear any latent chars in serial buffer | ||
Serial.println(F("Press any key to send commands to begin Survey-In")); | ||
while (Serial.available() == 0) ; //Wait for user to press a key | ||
|
||
boolean response; | ||
|
||
//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 | ||
// You can either read the data from packetUBXNAVSVIN directly | ||
// or can use the helper functions: getSurveyInActive; getSurveyInValid; getSurveyInObservationTime; and getSurveyInMeanAccuracy | ||
response = myGNSS.getSurveyStatus(2000); //Query module for SVIN status with 2000ms timeout (request can take a long time) | ||
|
||
if (response == false) // Check if fresh data was received | ||
{ | ||
Serial.println(F("Failed to get Survey In status. Freezing...")); | ||
while (1); //Freeze | ||
} | ||
|
||
if (myGNSS.getSurveyInActive() == true) // Use the helper function | ||
{ | ||
Serial.print(F("Survey already in progress.")); | ||
} | ||
else | ||
{ | ||
//Start survey | ||
response = myGNSS.enableSurveyMode(300, 2.000); //Enable Survey in, 300 seconds, 2.0m | ||
if (response == false) | ||
{ | ||
Serial.println(F("Survey start failed. Freezing...")); | ||
while (1); | ||
} | ||
Serial.println(F("Survey started. This will run until 300s has passed and less than 2m accuracy is achieved.")); | ||
} | ||
|
||
while(Serial.available()) Serial.read(); //Clear buffer | ||
|
||
//Begin waiting for survey to complete | ||
while (myGNSS.getSurveyInValid() == false) // Call the helper function | ||
{ | ||
if(Serial.available()) | ||
{ | ||
byte incoming = Serial.read(); | ||
if(incoming == 'x') | ||
{ | ||
//Stop survey mode | ||
response = myGNSS.disableSurveyMode(); //Disable survey | ||
Serial.println(F("Survey stopped")); | ||
break; | ||
} | ||
} | ||
|
||
// 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 | ||
// You can either read the data from packetUBXNAVSVIN directly | ||
// or can use the helper functions: getSurveyInActive; getSurveyInValid; getSurveyInObservationTime; and getSurveyInMeanAccuracy | ||
response = myGNSS.getSurveyStatus(2000); //Query module for SVIN status with 2000ms timeout (req can take a long time) | ||
if (response == true) // Check if fresh data was received | ||
{ | ||
Serial.print(F("Press x to end survey - ")); | ||
Serial.print(F("Time elapsed: ")); | ||
Serial.print((int)myGNSS.getSurveyInObservationTime()); | ||
|
||
Serial.print(F(" Accuracy: ")); | ||
Serial.print(myGNSS.getSurveyInMeanAccuracy()); | ||
Serial.println(); | ||
} | ||
else | ||
{ | ||
Serial.println(F("SVIN request failed")); | ||
} | ||
|
||
delay(1000); | ||
} | ||
Serial.println(F("Survey valid!")); | ||
|
||
response = true; | ||
response &= myGNSS.enableRTCMmessage(UBX_RTCM_1005, COM_PORT_I2C, 1); //Enable message 1005 to output through I2C port, message every second | ||
response &= myGNSS.enableRTCMmessage(UBX_RTCM_1077, COM_PORT_I2C, 1); | ||
response &= myGNSS.enableRTCMmessage(UBX_RTCM_1087, COM_PORT_I2C, 1); | ||
response &= myGNSS.enableRTCMmessage(UBX_RTCM_1230, COM_PORT_I2C, 10); //Enable message every 10 seconds | ||
|
||
if (response == true) | ||
{ | ||
Serial.println(F("RTCM messages enabled")); | ||
} | ||
else | ||
{ | ||
Serial.println(F("RTCM failed to enable. Are you sure you have an NEO-M8P?")); | ||
while (1); //Freeze | ||
} | ||
|
||
Serial.println(F("Base survey complete! RTCM now broadcasting.")); | ||
} | ||
|
||
void loop() | ||
{ | ||
myGNSS.checkUblox(); //See if new data is available. Process bytes as they come in. | ||
|
||
delay(250); //Don't pound too hard on the I2C bus | ||
} | ||
|
||
//This function gets called from the SparkFun u-blox Arduino Library. | ||
//As each RTCM byte comes in you can specify what to do with it | ||
//Useful for passing the RTCM correction data to a radio, Ntrip broadcaster, etc. | ||
void SFE_UBLOX_GNSS::processRTCM(uint8_t incoming) | ||
{ | ||
//Let's just pretty-print the HEX values for now | ||
if (myGNSS.rtcmFrameCounter % 16 == 0) Serial.println(); | ||
Serial.print(F(" ")); | ||
if (incoming < 0x10) Serial.print(F("0")); | ||
Serial.print(incoming, HEX); | ||
} |