venerdì 14 luglio 2017

Lettura di dati dalla SD Card

Facile trovare qualche esempio su come scrivere dati sulla SD con Arduino, ma è altrettanto facile leggere dei dati dalla SD verso Arduino?

Purtroppo no, in questa guida si affronta una possibile soluzione a questo ostico problema.

SD card:

Molti non pensano alla SD card che si ha davanti.
Che tecnologia è? che formattazione ha? la mia shield Arduino può leggerla?
  • Formattazione: per prima cosa, in accordo con le varie guide lette fino ad ora, la SD deve essere formattata in FAT16 o FAT32. In caso di problemi è caldamente consigliata la FAT16.
  • Tipi di SD card: di fatto la tecnologia usata per costruirla, che ne rappresenta soprattutto la capienza - SDSC, SDHC o SDXC - .
    Nel mio caso uso una "SDSC", vecchia ma priva di problemi.
  • Shield: spesso è riportato sulle caratteristiche della shield Arduino il tipo di SD card leggibile.

Creazione del file:

Punto chiave di tutto il processo, come andiamo a scrivere i dati nel file che carichiamo sulla SD card.
Ora, nel mio caso i dati sono:
  • Numerici - non caratteri - divisi da una virgola
  • Ogni file contiene una sola sequenza di numeri - una sola riga -
  • Ogni file contiene un numero fisso di numeri
  • L'ultimo numero della sequenza di numeri non ha una virgola, ma un "a capo" - bottone invio -
  • Al file si può dare qualunque nome ( non troppo lungo ), nel mio caso un numero incrementale
Esempio: 
Il file chiamato "1.TXT" contiene : 1,134,17354,0,1,2 ( 7 numeri + "a capo" al termine )

Perchè concludere con "a capo" - bottone invio - ?
Servirà ad Arduino per capire quando il file è terminato. 
Quando trovo il carattere "a capo" = "\r" so che il file è finito. Smetto di leggere.

Collegamento tramite SPI dello shield:

Lo shield per Arduino nasce con il collegamento SPI, il collegamento standard è questo: 

Nel caso il vostro shield funzioni solo con 3.3v, servirà un level shifter.

Codice:

Finalmente il codice, guardiamo velocemente le parti più importanti:

// array dimension
int base[6] = {5, 4, 3, 2, 1, 0};
Questo è l'array che ritornerà al termine della lettura.
Come potete notare, deve avere la stessa dimensione del file che si andrà a leggere.

L'esempio scritto nella sezione "Esempio di codice" contiene 7 numeri, quindi non starebbe in questo array - che ne contiene 6 - .

Dopo aver controllato lo stato della SD, cerchiamo il file:

File dataFile = SD.open("1.txt");
In questo esempio il file si chiama "1.txt".

Ora il file verrà aperto e salvato - in una stringa -, fino a che non troverà il carattere "a capo":

String myString = dataFile.readStringUntil('\r');
Successivamente la stringa verrà letta e tagliata in corrispondenza delle virgole:

// First comma
      int commaIndex = myString.indexOf(',');
      String Value = myString.substring(0, commaIndex);
      base[i] = Value.toInt();
In fine si riempirà l'array chiamato "base" con i singoli valori letti dalla SD.


Link al GitHub per il codice completo:



Consumo di SRAM:

Se avete provato la libreria standard SD d'Arduino, vi sarà immediatamente saltato all'occhio il peso di quest'ultima sulla SRAM.

Con l'intento di diminuire il più possibile questo "spreco" di memoria, consiglio questa libreria: SdFat

Di seguito una breve comparazione tra, dello stesso codice, masticato dalle due librerie. La differenza è notevole, a favore della libreria SdFat.


Nessun commento:

Posta un commento