Salve a tutti,
sto sviluppando per la mia scuola un progetto di un computer di bordo con datalogger per un lancio di un pallone sonda che faremo il prossimo anno con gli studenti. Ho sviluppato un codice che funziona abbastanza bene e ricevo i dati dai vari sensori e li scrivo su SD, su seriale e su LCD, il tutto su ESP32.
L'unico problema che ho è che non capisco perchè se inserisco il codice per abilitare la modalità DynamicModel6 per il GPS UBX MAX M8C per farlo funzionare, non leggo più nessun valore ne su seriale ne su schermo e su seriale inizia a stampare soliti simboli come quando si sbaglia la velocità del baudrate. Il problema si verifica quando inserisco la stringa sotto l'inizializzazione del GPS che faccio in questo modo:
void setup() {
.............
// Inizializzo il GPS
gpsSerial.begin(9600, SERIAL_8N1, GPS_RX_PIN, GPS_TX_PIN);
// Configuro il GPS in modalità Dynamic Model 6
setGPS_DynamicModel6();
............
Se elimino la stringa della Dynamic Model 6 il GPS e tutti i valori vengono mostrati correttamente e il GPS funziona. Il problema è che senza questa modalità il GPS smetterebbe di funzionare a 9000 metri di altezza. Ovviamente alla fine dello sketch poi inserisco anche la restante parte di codice come mostrato a questo link da cui ho preso spunto Getting started with Ublox Part 2 – Setting Airborne Dynamic Model | Ava High Altitude Balloon Project
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) {
Serial.flush();
Serial.write(0xFF);
delay(500);
for(int i=0; i<len; i++) {
Serial.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 (Serial.available()) {
b = Serial.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
}
}
}
}
Qualcuno potrebbe aiutarmi a capire dove sbaglio e mostrarmi come integrare e a far funzionare il tutto correttamente? Eventualmente posso anche allegare il mio codice intero.
Grazie mille anticipatamente per l'aiuto.
Saluti
Buone ferie