Datalogger con problemi di velocità su SD

Ciao a tutti, sono settimane che provo a risolvere il mio problema ma non ci riesco, perciò chiedo gentilmente il vostro aiuto.

Sto realizzando un datalogger per un GPS e una IMU (un Adafruit e una MPU6050).
Vorrei salvare tutti i dati su una microSD.

GPS collegato con SW serial su pin 4 e 5
MPU6050 comunica con protocollo I2C
Scheda SD collegata con adattatore ai pin 11,12,13 cs su 9 correttamente definito in sketch,,,,

Lo sketch è strutturato in modo da scrivere 100 volte al secondo i dati IMU e una volta al secondo i dati NMEA del GPS, basato su Arduino Uno

Tutto questo funziona perfettamente se mando in output su seriale, ma se provo a scrivere su SD accade che, in maniera random, alcune sentenze NMEA non vengano processate e quindi non scritte.
Questo comporta la presenza di "buchi" di posizioni GPS nel file di log che vorrei evitare.

Le ho provate tutte, ma non c'è verso. Se mando l'output su seriale funziona perfettamente, se provo a scrivere le stesse cose su SD mi perdo alcune righe del messaggio GPS (a volte anche 4, 5 messaggi).

Quindi mi chiedo?
E' un problema di lentezza della SD?
C'è un modo per velocizzare la scrittura?
??? :slight_smile:

Se provo a mandare tutto su monitor seriale e parallelamente usare Processing per salvare i dati su un file funziona perfettamente.

Grazie per qualsiasi aiuto riusciate a darmi.
Ernesto

PS
Anche se abbasso la frequenza di scrittura della IMU (ad esempio impostando il millis-timer a 100 millisecondi (circa 10 Hz) non risolvo nulla, qualche messaggio GPS non viene comunque interpretato....

log_GPS_IMU_sd.ino (6.12 KB)

Secondo me usi in maniera errata il
"Serial.flush();"

A naso interferische la scritture sulla SD la lettura della seriale software.

Ciao Uwe

Grazie UWE,
ho già provato ad eliminare quel Serial.flush()....ma nulla cambia.

100 messaggi al sec mi sembrano un po' tanti, considera che più è lungo il file più tempo ci metterà a scrivere in coda, per scrivere dopo l'ultima linea deve scorrere tutti i char precedenti, trovare l'ultimo char e poi scrivere, non esistono indici.

dentro la scrittura SD e dentro al loop fai anche dei serial.print fanno perdere tanto tempo hai provato a toglierli?
hai provato solo a scrivere i dati del gps e vedere se li salva tutti?

Hai provato ad utilizzare una scheda Shield SD? magari utilizzando sia il GPS che la MEMS su canale I2C..??

Spero di esserti stato di aiuto :slight_smile: