SD
GPL-3.0V1.3.0 Arduino, SparkFun2026/07/03
Arduino

SDカードの読み書きを可能とする。

Arduino/GenuinoボードのSPIインターフェイスにSDメモリカードを接続すると、ファイルの作成、読み書きが可能となる。SDカード内のディレクトリ移動も可能である。

リポジトリ

SDライブラリを利用することで、SDカードの読み書きが可能である。SDカードは、例えば、Arduino Ethernet Shieldに搭載されている。SDライブラリはWilliam Greimanによるsdfatlib上に作成されている。このライブラリは、SDカードとSDHCカードのFAT16とFAT32ファイルシステムをサポートしている。8.3形式のファイル名を利用する。SDライブラリの関数に渡すファイル名には、“directory/filename.txt"のように、スラッシュ(/)を含めることができる。作業ディレクトリは常にSDカードのルートディレクトリなので、先頭のスラッシュがあってもなくても同じファイルを参照する。例えば、"/file.txt"と"file.txt"は同じである。バージョン1.0からは複数ファイルの同時オープンに対応している。

マイクロコントローラとSDカードの通信にはSPIを利用する。このため、デジタルピンの11番と12番、13番(ほとんどのArduinoボードの場合)、もしくは50番と51番、52番(Arduino Megaの場合)が利用される。さらに、もう一本のピンをSDカードを選択するために利用する必要がある。これは、ハードウェアSSピンで、10番ピン(ほとんどのArduinoボードの場合)もしくは53番ピン(Arduino Megaの場合)で、SD.begin()を呼ぶときに指定するピンである。ハードウェアSSピンを使わないときでも、出力用としてとっておく必要がある。そうしないと、SDライブラリは動作しない。

このライブラリを使うためには、以下を宣言する。

#include <SPI.h>
#include <SD.h>

プログラム例

  • Card Info: SDカードの情報を取得する。
  • Datalogger: 3つのアナログセンサからのログデータをSDカードに格納する。
  • Dump File: SDカードからファイルを読み込む。
  • Files: SDカード上でファイルを作成・削除する。
  • List Files: SDカード上のディレクトリ内のファイル名を出力する。
  • Read Write: SDカードにファイルを読み書きする。

プログラム例のリンク先はすべて英語です。

このライブラリは全てのアーキテクチャで利用できるので、全てのArduinoボードで利用できる。

このライブラリを使うためには、Arduino IDEでライブラリマネージャを開きインストールする。

begin()

名称

SDClass::begin()

説明

SDライブラリとカードを初期化する。SPIバス(ほとんどのArduinoボードのデジタルピンの11番と12番、13番、Arduino Megaでは50番と51番、52番)とチップセレクトピン(デフォルトはハードウェアSSピンで、ほとんどのArduinoボードの10番、Arduino Megaでは53番)の利用を開始する。異なるチップセレクトピンを利用しても、ハードウェアSSピンは出力のままにしておく必要がある。そうしないと、SDライブラリ機能は動作しない。

書式

boolean SDClass::begin(uint8_t csPin = SD_CHIP_SELECT_PIN);

boolean SDClass::begin(uint32_t clock, uint8_t csPin);

引数

csPinSDカードのチップセレクトピンに接続するピン番号。デフォルト値はSPIバスのハードウェアSSピン。
clockクロック周波数。

戻り値

成功した場合1、失敗した場合0。

exists()

名称

SDClass::exists()

説明

ファイルもしくはディレクトリがSDカード上に存在するかを調べる。

書式

boolean SDClass::exists(const char *filepath);

boolean SDClass::exists(const String &filepath)

引数

filepath存在確認を行うファイルの名称。ディレクトリを含めてもいい(その場合はファイル名の前に/を入れる)。

戻り値

ファイルもしくはディレクトリが存在する場合1、存在しない場合0。

mkdir()

名称

SDClass::mkdir()

説明

SDカード上にディレクトリを作成する。存在しない中間のディレクトリも同時に作成する。例えば、SD.mkdir(“a/b/c”)は、aとb、cを作成する。

書式

boolean SDClass::mkdir(const char *filepath);

boolean SDClass::mkdir(const String &filepath)

引数

filepath作成するディレクトリの名前。サブディレクトリを含んでもいい。この場合、/で区切る。

戻り値

ディレクトリの作成に成功した場合1、失敗した場合0。

open()

名称

SDClass::open()

説明

SDカード上のファイルをオープンする。書込み用にオープンしたときにファイルが存在しなければそのファイルを作成する。ただし、そのファイルが存在するディレクトリは存在していなければならない。

書式

File SDClass::open(const char *filepath, uint8_t mode);

File SDClass::open(char *filepath, uint8_t mode);

File SDClass::open(const String &filepath, uint8_t mode = FILE_READ);

引数

filepathオープンするファイルの名前(ディレクトリを含む)。
modeオープンするファイルのモード。以下の2種類がある。
FILE_READ:読み込み専用。ファイルの最初から開始(読み込み)される。
FILE_WRITE:読み書きモード。ファイルの最後から開始される。

戻り値

オープンしたファイルを参照するファイルオブジェクト。ファイルをオープンすることができなかったときは、このオブジェクトはブーリアンのfalseに相当する。つまり戻り値を"if(f)“でテストすることができる。

remove()

名称

SDClass::remove()

説明

SDカード上のファイルを削除する。

書式

boolean SDClass::remove(const char *filepath);

boolean SDClass::remove(const String &filepath);

引数

filepath削除するファイルの名前。ディレクトリを含んでもいい。この場合、/で区切る。

戻り値

ファイルの削除に成功した場合1、失敗した場合0。

rmdir()

名称

SDClass::rmdir()

説明

SDカード上のディレクトリを削除する。ディレクトリは空である必要がある。

書式

boolean SDClass::rmdir(const char *filepath);

boolean SDClass::remove(const String &filepath)

引数

filepath削除するディレクトリの名前。サブディレクトリを含んでもいい。この場合、/で区切る。

戻り値

ディレクトリの削除に成功した場合1、失敗した場合0。

ディレクトリが存在しなかったときは戻り値は不定。

name()

名称

File::name()

説明

ファイル名を返す。

書式

char *File::name(void);

引数

なし。

戻り値

ファイル名。

available()

名称

File::available()

説明

ファイルから読み取り可能なバイトがあるかを確認する。

available()はStreamユーティリティクラスを継承している。

書式

int File::available();

boolean SDClass::bbegin(uint32_t clock, uint8_t csPin);

引数

なし。

戻り値

利用可能なバイト数。

close()

名称

File::close()

説明

ファイルをクローズする。これにより、そのファイルに書き込まれたデータがSDカードに物理的にセーブされることを保証する。

書式

int File::close();

引数

なし。

戻り値

なし。

flush()

名称

File::flush()

説明

ファイルに書き込まれたデータがSDカードに物理的にセーブされることを保証する。ファイルをクローズしたときには自動的に実行される。

flush()はStreamユーティリティクラスを継承している。

書式

void File::flush();

引数

なし。

戻り値

なし。

peek()

名称

File::peek()

説明

ファイルから読み取り位置を進めることなく1バイトを読み取る。peek()を連続して呼び出しても同じ値が返ることを意味する。次のread()の呼び出しも同様である。

peek()はStreamユーティリティクラスを継承している。

書式

int File::peek();

引数

なし。

戻り値

次のバイト(文字)、もしくは-1(読み込む値がない場合)。

position()

名称

File::position()

説明

ファイル内の現在の位置(次にどの位置からデータを読み取るか、もしくは、どの位置にデータを書き込むか)を取得する。

書式

uint32_t File::position();

引数

なし。

戻り値

ファイル内の現在の位置。

print()

名称

File::print()

説明

データをファイルに書き込む。ファイルに書き込む前にはファイルをオープンしておかなければならない。数値は数字の列(ASCII文字列)として書き込まれる。例えば、数値の123は文字の'1’、‘2’、‘3’として書き込まれる。

書式

size_t Print::print(const __FlashStringHelper *ifsh);

size_t Print::print(const String &s);

size_t Print::print(const char str[]);

size_t Print::print(char c);

size_t Print::print(unsigned char b, int base = DEC);

size_t Print::print(int n, int base = DEC);

size_t Print::print(unsigned int n, int base = DEC);

size_t Print::print(long n, int base = DEC);

size_t Print::print(unsigned long n, int base = DEC);

size_t Print::print(double n, int digits = 2);

引数

s, str, c, b, n書き込む文字/数値。
base書きこむ値の底。BIN:2進数、DEC:10進数、OCT:8進数、HEX:16進数。省略時は、DEC。
digits小数点以下の表示桁数。省略時は2。

戻り値

書き込んだデータのバイト数。これを読みだす必要は必ずしもない。

println()

名称

File::println()

説明

データを、改行コードを伴って、ファイルに書き込む。ファイルに書き込む前にはファイルをオープンしておかなければならない。数値は数字の列(ASCII文字列)として書き込まれる。例えば、数値の123は文字の'1’、‘2’、‘3’として書き込まれる。

書式

size_t println::println(const __FlashStringHelper *ifsh);

size_t println::println(const String &s);

size_t println::println(const char str[]);

size_t println::println(char c);

size_t println::println(unsigned char b, int base = DEC);

size_t println::println(int n, int base = DEC);

size_t println::println(unsigned int n, int base = DEC);

size_t println::println(long n, int base = DEC);

size_t println::println(unsigned long n, int base = DEC);

size_t println::println(double n, int digits = 2);

引数

s, str, c, b, n書き込む文字/数値。
base書きこむ値の底。BIN:2進数、DEC:10進数、OCT:8進数、HEX:16進数。省略時は、DEC。
digits小数点以下の表示桁数。省略時は2。

戻り値

書き込んだデータのバイト数。これを読みだす必要は必ずしもない。

seek()

名称

File::seek()

説明

ファイル内の新しい位置に移動する。移動先は0からファイルサイズ(ファイルサイズを含む)である。

書式

boolean File::seek(uint32_t pos);

引数

pos移動する位置。

戻り値

成功した場合1、失敗した場合0。

size()

名称

File::size()

説明

ファイルのサイズを取得する。

書式

uint32_t File::size();

引数

なし。

戻り値

ファイルのサイズ(単位はバイト)。

read()

名称

File::read()

説明

ファイルから1バイト読み取る。

read()はStreamユーティリティクラスを継承している。

書式

int File::read();

int File::read(void *buf, uint16_t nbyte);

引数

bufバッファ領域。
nbyte読み取りバイト数。

戻り値

読み取った値。利用可能なデータがない場合は-1。

int File::read(void *buf, uint16_t nbyte)形式の場合は、読み取ったバイト数。

write()

名称

File::write()

説明

ファイルにデータを書き込む。

書式

size_t File::write(uint8_t val);

size_t File::write(const uint8_t *buf, size_t size);

引数

val書き込む値(byte, char, char*)。
bufcharもしくはbyteの配列。
lenbufの要素数。

戻り値

書き込まれたバイト数。戻り値の利用はオプション。

isDirectory()

名称

File::isDirectory()

説明

ディレクトリ(もしくはフォルダ)は特別な種類のファイルである。この関数は現在のファイルがディレクトリなのかそうでないのかを調べる。

書式

boolean File::isDirectory(void);

引数

なし。

戻り値

ファイルがディレクトリである場合true、ない場合false。

使用例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <SD.h>

File root;

void setup()
{
  Serial.begin(9600);
  pinMode(10, OUTPUT);

  SD.begin(10);

  root = SD.open("/");

  printDirectory(root, 0);

  Serial.println("done!");
}

void loop()
{
  // nothing happens after setup finishes.
}

void printDirectory(File dir, int numTabs) {
   while(true) {

     File entry =  dir.openNextFile();
     if (! entry) {
       // no more files
       //Serial.println("**nomorefiles**");
       break;
     }
     for (uint8_t i=0; i<numTabs; i++) {
       Serial.print('\t');
     }
     Serial.print(entry.name());
     if (entry.isDirectory()) {
       Serial.println("/");
       printDirectory(entry, numTabs+1);
     } else {
       // files have sizes, directories do not
       Serial.print("\t\t");
       Serial.println(entry.size(), DEC);
     }
   }
}
openNextFile()

名称

File::openNextFile()

説明

次のファイルもしくはフォルダをオープンする。

書式

File File::openNextFile(uint8_t mode);

引数

modeオープンするファイルのモード。以下の2種類がある(オプション)。
FILE_READ: 読み込み専用。ファイルの最初から開始(読み込み)される。
FILE_WRITE: 読み書きモード。ファイルの最後から開始される。

戻り値

オープンしたファイルを参照するファイルオブジェクト。

(訳者註)オリジナルのリファレンスはcharを返すと書いているが、ソースコードや例を見る限り、Fileオブジェクトを返却している。

使用例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <SD.h>

File root;
void setup()
{
  Serial.begin(9600);
  pinMode(10, OUTPUT);
  SD.begin(10);
  root = SD.open("/");
  printDirectory(root, 0);
  delay(2000);
  Serial.println();
  Serial.println("Rewinding, and repeating below:" );
  Serial.println();
  delay(2000);
  root.rewindDirectory();
  printDirectory(root, 0);
  root.close();
}

void loop()
{
  // nothing happens after setup finishes.
}

void printDirectory(File dir, int numTabs)
{
  while (true)
  {
    File entry = dir.openNextFile();
    if (! entry)
    {
      if (numTabs == 0)
        Serial.println("** Done **");
      return;
    }
    for (uint8_t i = 0; i < numTabs; i++)
      Serial.print('\t');
    Serial.print(entry.name());
    if (entry.isDirectory())
    {
      Serial.println("/");
      printDirectory(entry, numTabs + 1);
    }
    else
    {
      Serial.print("\t\t");
      Serial.println(entry.size(), DEC);
    }
    entry.close();
  }
}
rewindDirectory()

名称

File::rewindDirectory()

説明

ディレクトリの最初のファイルに戻す。openNextFile()と一緒に使われる。

書式

File File::rewindDirectory(uint8_t mode);

引数

なし。

戻り値

なし。

使用例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <SD.h>

File root;

void setup()
{
  Serial.begin(9600);
  pinMode(10, OUTPUT);

  SD.begin(10);

  root = SD.open("/");

  printDirectory(root, 0);

  Serial.println("done!");
}

void loop()
{
  // nothing happens after setup finishes.
}

void printDirectory(File dir, int numTabs) {
   while(true) {

     File entry =  dir.openNextFile();
     if (! entry) {
       // no more files
       // return to the first file in the directory
       dir.rewindDirectory();
       break;
     }
     for (uint8_t i=0; i<numTabs; i++) {
       Serial.print('\t');
     }
     Serial.print(entry.name());
     if (entry.isDirectory()) {
       Serial.println("/");
       printDirectory(entry, numTabs+1);
     } else {
       // files have sizes, directories do not
       Serial.print("\t\t");
       Serial.println(entry.size(), DEC);
     }
   }
}

オリジナルのページ

https://docs.arduino.cc/libraries/sd/

inserted by FC2 system