problema scrittura su SD con GPS adafruit e MEGA compatibile

ciao a tutti, avrei bisogno del vs aiuto per risolvere il mio problema con adafruit ultimate gps logger e una board mega compatibile.

riassumo quello che ho fatto: gps shield montata sul mega, ponticello tra pin8 e RX1 e tra pin7 e TX1, come da istruzioni adafruit.
scaricato ultima versione libreria SD dal sito adafruit.

lo sketch prevede la lettura di alcuni sensori, e la scrittura su file TXT delle coordinate e dei rispettivi valori dei sensori.
tutto funziona se utilizzo un nome file costante, ovvero così:

logFile = SD.open ("logFile.txt", FILE_WRITE);
      if (logFile) {
      logFile.print(lat); logFile.print(sep);
      logFile.print(lon); logFile.print(sep);
      logFile.print(temp); logFile.print(sep);
      logFile.print(umid); logFile.print(sep);
      logFile.println(pressure);
      logFile.close();  
    }

mentre se utilizzo una funzione esterna, per creare un nome che varia a seconda della data e dell'ora, non funziona. la funzione esterna (che tra l'altro usavo in un altro sketch, con arduino UNO, e funzionava benissimo) è la seguente:

void creaNomeFile()
{
  if (data != "")   // se riceve la stringa "data", allora creo il nome
  {
    String dataOra = (data.substring(4, 6) + data.substring(2, 4) + data.substring(0, 2) + "_" 
    + ora.substring(0, 6) + ".txt" );
    dataOra.toCharArray(nomeFile, 22);
  }

  Serial.print ("nome file: "); Serial.println (nomeFile);

}

in pratica la funzione crea un nome del tipo AAMMGG_HHMMSS.txt e funziona, dato che il Serial.println restituisce il nome corretto.

se ora sostituisco "logFile.txt" con nomeFile nel codice sopra, la variabile logFile assume sempre il valore 0, quindi non entra nell'if e non scrive niente sulla SD.

non riesco a capire il problema.

grazie in anticipo!

Credo che il problema sia questo:

The SD library allows for reading from and writing to SD cards [...]. The library supports FAT16 and FAT32 file systems on standard SD cards and SDHC cards. It uses short 8.3 names for files.

(Da SD - Arduino Reference)

Se vuoi usare i nomi file lunghi devi passare a SdFatLib.

grazie SukkoPera, in effetti con UNO usavo la libreria SdFat e andava bene.
però con MEGA sono stato costretto ad usare la nuova SD adafruit, altrimenti non funzionava la seguente parte:

if (!SD.begin(chipSelect, 11, 12, 13)) {

quindi non c'è modo di usare nomi lunghi con arduino MEGA? mi pare strano!

arduale:
però con MEGA sono stato costretto ad usare la nuova SD adafruit,

Nuova ??!? Ha i file aggiornati a 3 year ago

Nel file SD.h si legge:

class File : public Stream {
 private:
  char _name[13]; // our name

Quindi pare proprio una limitazione della lib 8+punto+3=12 char + '\0' di fine stringa

Quindi stai usando la SD di Adafruit? Di per sé la libreria non dipende dalla scheda che usi. Con la SD si parla sempre allo stesso modo (SPI). Quel che cambia sono i pin dedicati al supporto SPI hardware che, nella Uno sono 11/12/13, mentre nella Mega sono 50/51/52, per cui dovresti usare questi ultimi per collegare la SD, se possibile.

Con quella libreria ti funziona sui pin 11/12/13 perché usa un'implementazione SPI software, che però è più lenta e meno affidabile, oltre ad usare più risorse.

In ogni caso, se passi alla libreria che ti ho linkato sopra, quella supporta sia i nomi lunghi che lo SPI software, per cui potrai farci essenialmente tutto quel che vorrai, per quanto il consiglio sia di usare il supporto hardware.

Grazie, proverò ad usare i pin 50, 51 e 52. Devo ponticellare con 10, 11 e 12 immagino?
Inoltre potresti delucidarmi sul supporto hardware? Immagino sia un metodo per leggere e scrivere su SD migliorativo, dove trovo info ed esempi?

Non devi ponticellare niente. In effetti con quello shield è un po' un casino: devi allargare i pin 11/12/13 in modo che non si infilino negli header del Mega, e quindi collegarli in qualche modo, così: pin 11 -> 51, pin 12 -> 50, pin 13 -> 52.

Sul pin 10 ho qualche dubbio, non riesco a capire quale sia il pin che lo shield usa come Chip Select/Slave Select della SD. Il pin 10 puoi lasciarlo com'è, e passalo come Chip Select/Slave Select alla libreria.

Forse in effetti fai prima ad usare lo SPI software.

allora, sto un po' impazzendo!
se utilizzo la scheda UNO e la libreria SdFat tutto funziona, utilizzando:

if (!SD.begin(SD_CS)) {

se invece utilizzo la scheda MEGA, con la libreria SD solo nomi 8.3, mentre se uso la SdFat, mi dà errore qui:

if (!SD.begin(SD_CS, 11, 12, 13)) {

dove sbaglio?!?
perchè lo so che sbaglio...!

Ma che errore ti da ?

Il problema è che passando tutti quegli argomenti tu stai in qualche modo dicendo alla libreria di usare l'emulazione SPI software, ma la libreria SD supporta solo lo SPI hardware!

Ripeto: passa alla SdFatLib che ti ho linkato, quella supporta sia lo SPI software che i nomi file lunghi.

nid69ita:
Ma che errore ti da ?

no matching function for call to 'SdFat::begin(int, int, int, int)'

SukkoPera:
Il problema è che passando tutti quegli argomenti tu stai in qualche modo dicendo alla libreria di usare l'emulazione SPI software, ma la libreria SD supporta solo lo SPI hardware!

Ripeto: passa alla SdFatLib che ti ho linkato, quella supporta sia lo SPI software che i nomi file lunghi.

ok, adesso ci provo!

grazie ancora!

SukkoPera:
Ripeto: passa alla SdFatLib che ti ho linkato, quella supporta sia lo SPI software che i nomi file lunghi.

forse non ho capito bene, ma ti spiego i miei passaggi: ho scaricato lo zip ed ho preso la cartella in esso contenuta, dal nome SdFat-master\SdFat.

nel codice ho inserito queste due righe, come indicato nel readme:

#include <SdFat.h>
SdFat SD;

mi dà sempre errore qua:

if (!SD.begin(SD_CS, 11, 12, 13)) {

no matching function for call to 'SdFat::begin(int, int, int, int)'

Metti un attimo da parte quel che stai facendo e prova l'esempio SoftwareSpi incluso nella libreria. Potrebbe richiedere modifiche al file SdFatConfig.h, ti spiegherà tutto lui.

ok, ho eseguito l'esempio che mi hai indicato. mi ha suggerito le modifiche da fare al file SdFatConfig.h, come avevi previsto.
la modifica era:

#define SD_SPI_CONFIGURATION 3

poi ho riavviato l'ide e sono tornato sul mio file, ma ho sempre l'errore:

no matching function for call to 'SdFat::begin(int, int, int, int)'

Non ti ho ancora detto di tornare al tuo file :). L'esempio SoftwareSpi dunque sei riuscito a compilarlo, caricarlo sulla scheda e farlo funzionare? Vede la SD?

ah! ::slight_smile: :-[ :roll_eyes:

ok, allora, si compila e si esegue... il risultato è questo:

Type any character to start
Can't access SD card. Do not reformat.
No card, wrong chip select pin, or SPI problem?
SD errorCode: 0X1,0XFF

Beh, allora direi che non sta funzionando, e la prima cosa che dobbiamo risolvere è questa. I pin 10/11/12/13 sono collegati, sì?

Allora, ho spento tutto e sono a letto col raffreddore... Mi preparo per il w.end...

Comunque la shield è collegata a castello al mega tramite tutti i pin, quindi direi che i pin 10, 11, 12 e 13 sono collegati, se è questo che intedi.
Grazie.