Blog převážně jednočipový

Arduino a SD karta

Někdy je potřeba logovat průběžně data a někam si je ukládat. Arduino má v sobě EEPROM paměť ale ta má velikost jen 1kB. Pokud potřebujeme ukládat více dat tak můžeme použít SD karu.

Modul micro SD karty vyjde na www.aliexpress.com na € 0.5 tedy asi na 14 Kč a samozřejmě doprava zdarma.

Zapojení pinů:

modul SD kartyArduino UNO
GNDGND
VCC5V
MISO12
MOSI11
SCK13
CS4

Vyzkoušel jsem tři různé knihovny pro zápis na SD kartu připojenou na arduino UNO. V tuto chvíli mi šlo jen o zápis údajú. Všechny knihovny umí pracovat jak s FAT16 tak s FAT32. Napsal jsem malinký program který jen každou sekundu zapíše do souboru.

Knihovna SD (standardní v arduinu IDE)

#include <SD.h>
void setup()
{
  SD.begin(4);
}

void loop(void)
{
  File dataFile = SD.open("zapis.txt", FILE_WRITE);
  dataFile.println(millis());
  dataFile.close();
  delay(1000);
}
Práce s touto knihovnou je jednoduchá a je nejvíce rozšířená. Nemusí se instalovat jelikož je součástí arduino IDE. Bohužel tato knihovna zabírá také nejvíce mista a to 12 526 bytů což je 38% paměti pro program v arduínu a také 851 bytů což je 41% paměti pro proměnné.

Knihovna SdFat

#include <SdFat.h>
SdFat SD;
void setup()
{
  SD.begin(4);
}


void loop(void)
{
  File dataFile = SD.open("zapis2.txt", FILE_WRITE);
  dataFile.println(millis());
  dataFile.close();
  delay(1000);
}
Tato knihovna je ke stažení zde https://github.com/greiman/SdFat. Program v tuto chvíli zabírá v paměti 9 974 bytů (30%) a proměnné 662 bytů (32%). V manuálu se ale dočtete, že jde zabrané místo zmenšit pomocí konfiguračního souboru SdFatConfig.h, pokud tedy chceme ještě ušetřit nějaké místo pak stačí v tomto souboru upravit řádky.

#define USE_LONG_FILE_NAMES 0

tímto si vypneme možnost používat dlouhé názvy souborů (což při logování dat z čidel nevadí)

#define ARDUINO_FILE_USES_STREAM 0

touto directivou vypneme přístup k datům přes streamy (což při logování také nevadí)

Po tomto zákroku jsem se dostali na na velikost 8 302 bytů (25%) a proměnné 654 bytů (31%).

Knihovna PetitFs

#include "PetitFS.h"
#include "PetitSerial.h"

PetitSerial PS;
#define Serial PS

// The SD chip select pin is currently defined as 10
// in pffArduino.h.  Edit pffArduino.h to change the CS pin.

FATFS fs;

void setup()
{
  char buf[15];
  pf_mount(&fs);
  pf_open("PETIT.TXT");
  UINT n;
  for (byte i=0;i<20;i++)
  {
     itoa((int)millis(),buf,10);
     strcat(buf,"\r\n");
     pf_write(buf,strlen(buf),&n);
     delay(200);
  }
  pf_write(0,0,&n);
}
void loop() {}
Tato knihovna je ke stažení zde https://github.com/greiman/PetitFS. Tato knihovna nedokáže vytvářet soubory a ani do nich přidávat záznamy, dokáže jen přepisovat data v existujícím souboru. Soubor musí mít název ve formátu 8.3. V praxi to znamená, že si musíte na SD kartě připravit soubor který naplníte například v poznámkovém bloku nějakými znaky a tyto znaky pak přes arduino přepisujete. Ano je to opruz ale díky tomu program zabírá 5 090 bytů (15%) a proměnné 82 bytů (4%).

Takže pokud máte dost místa tak můžete použít vestavěnou knihovnu SD. Ale pokud chcete připojit například TFT dotykový displej (který má někdy SD slot rovnou na sobě) a nějaká čidla, tak můžete narazit na problém s nedostatkem místa. Pak se bude hodit knihovna SdFat a v krajním případě i knihovna PetitFs.

Vytvořeno: 2016-03-01 21:00:55
Změněno: 2016-03-06 11:04:17
Autor
2019-05-16 08:41:51
Dobry den

Bohuzel tento modul jiz doma nemam, takze to nemuzu vyzkouset.
Josef Musil
2019-05-10 09:00:20
Dobrý den

Mám jeden dotaz - nefunguje mi SD.remove() !!!!
Vyskoušel jsem vše.
Při kompilaci napíše, že je vše OK
ale soubor není odstraněn

děkuji za odpověď

rcm@wbs.cz

Josef

Napsat komentář