added high altitude mode

increase ublox max. altitude limit from 12.000 meters to 50.000 meters.
pull/3/head
lightaprs 2019-07-30 03:11:34 +03:00
rodzic d6c5e8fb78
commit 7a38c5916c
1 zmienionych plików z 98 dodań i 2 usunięć

Wyświetl plik

@ -75,6 +75,7 @@ uint32_t GEOFENCE_no_tx = 0;
boolean radioSetup = false;
boolean GpsFirstFix=false;
boolean ublox_high_alt_mode_enabled = false; //do not change this.
static char telemetry_buff[100];// telemetry buffer
uint16_t TxCount = 1;
@ -161,6 +162,7 @@ void loop() {
updateTelemetry();
GpsOFF;
ublox_high_alt_mode_enabled = false; //gps sleep mode resets high altitude mode.
GpsFirstFix=true;
//APRS frequency isn't the same for the whole world. (for pico balloon only)
if (!radioSetup) {
@ -209,13 +211,19 @@ void aprs_msg_callback(struct AX25Msg *msg) {
}
void sleepSeconds(int sec) {
if(GpsFirstFix)GpsOFF;//sleep gps after first fix
if (GpsFirstFix){//sleep gps after first fix
GpsOFF;
ublox_high_alt_mode_enabled = false;//gps sleep mode resets high altitude mode.
}
RfOFF;
RfPttOFF;
Serial.flush();
wdt_disable();
for (int i = 0; i < sec; i++) {
if(readBatt() < GpsMinVolt) GpsOFF; //(for pico balloon only)
if (readBatt() < GpsMinVolt){
GpsOFF;
ublox_high_alt_mode_enabled = false;//gps sleep mode resets high altitude mode.
}
LowPower.powerDown(SLEEP_1S, ADC_OFF, BOD_ON);
}
wdt_enable(WDTO_8S);
@ -561,6 +569,18 @@ int getDifference(Date dt1, Date dt2)
static void updateGpsData(int ms)
{
GpsON;
if(!ublox_high_alt_mode_enabled){
//enable ublox high altitude mode. increase ublox max. altitude limit from 12.000 meters to 50.000 meters.
delay(100);
setGPS_DynamicModel6();
#if defined(DEVMODE)
Serial.println(F("ublox DynamicModel6 enabled..."));
#endif
ublox_high_alt_mode_enabled = true;
}
while (!Serial1) {
delayMicroseconds(1); // wait for serial port to connect.
}
@ -701,4 +721,80 @@ static void printStr(const char *str, int len)
#endif
}
//following GPS code from : https://github.com/HABduino/HABduino/blob/master/Software/habduino_v4/habduino_v4.ino
void setGPS_DynamicModel6()
{
int gps_set_sucess=0;
uint8_t setdm6[] = {
0xB5, 0x62, 0x06, 0x24, 0x24, 0x00, 0xFF, 0xFF, 0x06,
0x03, 0x00, 0x00, 0x00, 0x00, 0x10, 0x27, 0x00, 0x00,
0x05, 0x00, 0xFA, 0x00, 0xFA, 0x00, 0x64, 0x00, 0x2C,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0xDC };
while(!gps_set_sucess)
{
sendUBX(setdm6, sizeof(setdm6)/sizeof(uint8_t));
gps_set_sucess=getUBX_ACK(setdm6);
}
}
void sendUBX(uint8_t *MSG, uint8_t len) {
Serial1.flush();
Serial1.write(0xFF);
delay(500);
for(int i=0; i<len; i++) {
Serial1.write(MSG[i]);
}
}
boolean getUBX_ACK(uint8_t *MSG) {
uint8_t b;
uint8_t ackByteID = 0;
uint8_t ackPacket[10];
unsigned long startTime = millis();
// Construct the expected ACK packet
ackPacket[0] = 0xB5; // header
ackPacket[1] = 0x62; // header
ackPacket[2] = 0x05; // class
ackPacket[3] = 0x01; // id
ackPacket[4] = 0x02; // length
ackPacket[5] = 0x00;
ackPacket[6] = MSG[2]; // ACK class
ackPacket[7] = MSG[3]; // ACK id
ackPacket[8] = 0; // CK_A
ackPacket[9] = 0; // CK_B
// Calculate the checksums
for (uint8_t ubxi=2; ubxi<8; ubxi++) {
ackPacket[8] = ackPacket[8] + ackPacket[ubxi];
ackPacket[9] = ackPacket[9] + ackPacket[8];
}
while (1) {
// Test for success
if (ackByteID > 9) {
// All packets in order!
return true;
}
// Timeout if no valid response in 3 seconds
if (millis() - startTime > 3000) {
return false;
}
// Make sure data is available to read
if (Serial1.available()) {
b = Serial1.read();
// Check that bytes arrive in sequence as per expected ACK packet
if (b == ackPacket[ackByteID]) {
ackByteID++;
}
else {
ackByteID = 0; // Reset and look again, invalid order
}
}
}
}