概要



SDライブラリ

SDライブラリのインストール

Arduinoでは、SDライブラリは標準で組み込まれているためインストールは不要である。

SDライブラリがインストールされているかどうかを確認する場合は、Arduino IDEのメイン画面から[ツール] - [ライブラリを管理]を選択して、検索欄で"SD"と検索する。
"SD by Arduino"ライブラリが既にインストールされているかどうかを確認する。

SDライブラリの注意点

全ての操作において、以下に示すような注意が必要である。

  • ファイル名は、8.3形式 (8文字 + 拡張子3文字) が推奨される。
  • パスの区切りには、/ (スラッシュ) を使用する。
  • 書き込み操作の後は、必ず、closeメソッドを実行する。


SDライブラリの使用

"SD.h"をインクルードする。

 #include <SD.h>


SDカードの初期化

SDカードの初期化を行う。
なお、チップセレクトピンの指定は不要である。

  • 戻り値
    • true
      初期化成功
    • false
      初期化失敗


 if (!SD.begin()) {
   Serial.println("初期化失敗");
 }


ファイルまたはディレクトリの存在確認

指定されたファイルまたはディレクトリが存在するかどうかを確認する。

 SD.exists(const char *path)


  • 引数
    パス名
  • 戻り値
    • true
      存在する
    • false
      存在しない


 // 使用例
 if (SD.exists("data.txt")) {
   Serial.println("ファイルが存在します");
 }


ファイルのオープン

指定されたファイルを開く。

 SD.open(const char *filename, uint8_t mode = FILE_READ)


  • 引数
    • filename
      ファイル名
    • mode
      オープンモード (省略可)
  • FILE_READ
    • 読み取り専用 (デフォルト)
    • FILE_WRITE
      読み書き可能
  • 戻り値
    Fileクラスのオブジェクト


 // 使用例
 
 File dataFile = SD.open("data.txt", FILE_READ);


ディレクトリの作成

新しいディレクトリを作成する。

 SD.mkdir(const char *path)


  • 引数
    作成するディレクトリのパス
  • 戻り値
    • true
      作成成功
    • false
      作成失敗


 // 使用例
 
 SD.mkdir("data_folder");


ファイル / ディレクトリの削除

指定されたファイルまたはディレクトリを削除する。

 SD.remove(const char *path)


  • 引数
    削除対象のパス
  • 戻り値
    • true
      削除成功
    • false
      削除失敗


 // 使用例
 
 SD.remove("old_data.txt");


ディレクトリの削除 (空のディレクトリのみ)

空のディレクトリを削除する。

 SD.rmdir(const char *path)


  • 引数
    削除するディレクトリのパス
  • 戻り値
    • true
      削除成功
    • false
      削除失敗


 // 使用例
 
 SD.rmdir("hoge_directory");


Fileクラス

読み取り可能なバイト数の確認

読み取り可能な残りバイト数を返す。

 File dataFile = SD.open("data.txt");
 
 dataFile.available()


  • 戻り値
    読み取り可能なバイト数 (0の場合は読み取り終了)


 // 使用例
 
 File dataFile = SD.open("data.txt");
 
 while (dataFile.available()) {
   byte data = dataFile.read();
 }


1バイトの読み取り

ファイルから1バイトのデータを読み取る。

 File dataFile = SD.open("data.txt");
 
 dataFile.read()


  • 戻り値
    読み取ったバイト値 (-1の場合は読み取り失敗)


 // 使用例
 
 File dataFile = SD.open("data.txt");
 
 int data = dataFile.read();


データの書き込み

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

 File dataFile = SD.open("data.txt");
 
 dataFile.write(const uint8_t *buf, size_t size)


  • 引数
    • buf
      書き込むデータのバッファ
    • size
      書き込むバイト数
  • 戻り値
    書き込んだバイト数


 // 使用例
 
 File dataFile = SD.open("data.txt");
 
 byte data[] = {0x41, 0x42, 0x43};
 dataFile.write(data, 3);


ファイルサイズの取得

ファイルサイズを返す。

 File dataFile = SD.open("data.txt");
 
 dataFile.size()


  • 戻り値
    ファイルサイズ (バイト単位)


 // 使用例
 
 File dataFile = SD.open("data.txt");
 
 unsigned long fileSize = dataFile.size();


ファイルポインタの移動

ファイル内の指定位置にポインタを移動する。

 File dataFile = SD.open("data.txt");
 
 dataFile.seek(unsigned long pos)


  • 引数
    移動先の位置 (バイトオフセット)
  • 戻り値
    • true
      移動成功
    • false
      移動失敗


 // 使用例
 
 File dataFile = SD.open("data.txt");
 
 // 100バイト目に移動
 dataFile.seek(100);


ファイルを閉じる

開いているファイルを閉じる。

なお、既に閉じているファイルに対してcloseメソッドを実行しても、エラーは発生しない。
ただし、ファイルが開いているかどうかを確認して後にcloseメソッドを実行することを推奨する。

 File dataFile = SD.open("data.txt");
 
 dataFile.close()



使用例 : ファイルの読み込み

 #include <SD.h>
 
 void setup()
 {
   Serial.begin(9600);
   while (!Serial);  // シリアルポートの準備待ち
 
   // SDカードの初期化
   if (!SD.begin()) {
     Serial.println("SDカードの初期化に失敗");
     while (1);
   }
 
   // ファイルを開く
   File dataFile = SD.open("data.txt");  // 読み込むファイル名を指定
 
   if (dataFile) {
     // ファイルの内容を読み込んでシリアルモニタに表示
     while (dataFile.available()) {
       Serial.write(dataFile.read());
     }
 
     dataFile.close();
   }
   else {
     Serial.println("ファイルのオープンに失敗");
   }
 }
 
 void loop()
 {
   // ...略
 }



使用例 : ファイルの書き込み

 #include <SD.h>
 
 File dataFile;
 
 void setup()
 {
   // シリアル通信の初期化 (9600[bps])
   Serial.begin(9600);
   while (!Serial);  // シリアルポートが準備できるまで待機
 
   // SDカードの初期化処理
   if (!SD.begin()) {
     Serial.println("SDカードの初期化に失敗");
     while (1);  // エラーが発生した場合は処理を停止
   }
   Serial.println("SDカードの初期化に成功");
 
   // ファイルを書き込みモードで開く
   // FILE_WRITEを指定する場合、ファイルが存在しない場合は新規作成されて、存在する場合は末尾に追記される
   dataFile = SD.open("data.txt", FILE_WRITE);
 
   if (dataFile) {
     Serial.println("ファイルのオープンに成功");
 
     // ファイルにデータを書き込む
     dataFile.println("テストデータ1");
     dataFile.println("テストデータ2");
 
     // 数値データを書き込む場合 (例 : アナログピンの値を読み取る)
     int sensorValue = analogRead(A0);
     dataFile.print("センサー値: ");
     dataFile.println(sensorValue);
 
     // 日時データを書き込む場合
     dataFile.print("書き込み時刻 : ");
     dataFile.print("2024/12/22 ");
     dataFile.println("15:30:00");
 
     // ファイルを閉じる
     dataFile.close();
     Serial.println("ファイルの書き込みが完了");
   }
   else {
     // ファイルのオープンエラー
     Serial.println("ファイルのオープンに失敗");
   }
 }
 
 void loop()
 {
   // 例1 : センサデータのロギング
   dataFile = SD.open("log.txt", FILE_WRITE);
   if (dataFile) {
     int value = analogRead(A0);
     dataFile.println(value);
     dataFile.close();
   }
 
   delay(1000);  // 1秒間隔でログを記録
 
   // 例2 : RTCライブラリを使用してタイムスタンプを書き込む
   if (dataFile) {
     dataFile.print(now.timestamp());
     dataFile.print(",");
     dataFile.println(sensorValue);
     dataFile.close();
   }
 }