遥かなるひよこ道
Amebaでブログを始めよう!
Arduino Nano でSDカードをやってみます
Nanoは小さくて実用的なの!!

基本は「Arduino日本語リファレンス」がとても参考になると思いますので
ここではあまり事例の無い「容量の取得」や「終了処理」(適切かは不明どうなっても知らんでい)をまとめていきます
また、SPIによる制御事例です。配線や方法についてはネットにいくらでも転がっています


Sd2Card card;
File root;
uint8_t sd_type;             // 1:SD1 | 2:SD2 | 3:SDHC
uint32_t volumesize;      // SD容量
uint32_t usedsize;         // 使用済み容量


if (digitalRead(PORT_CD) == LOW){
      // SD検知
      Serial.print("sd detected\n");
      SD.begin();
      
      // カードタイプ
      sd_type = SD.card.type();
      Serial.print("SD_CARD_TYPE:");
      Serial.print(sd_type);
      Serial.print("\n");
      
      // 合計容量
      volumesize = SD.card.cardSize() * 512;        // SD sectors(512) count
      Serial.print(volumesize, DEC);
      Serial.print(" Bytes\n");
      
      // 使用容量
      // ファイルを順番に開きサイズだけ取得する
      root = SD.open("/");
      usedsize = getUsingsize(root, 0);
      Serial.print("(");
      Serial.print(usedsize);
      Serial.print(" Bytes used)\n");
      
      // モード移行
      digitalWrite(2, LOW);
      sd_flag = true;
      Serial.print("SD initialized\n");
}


// SDの使用容量を取得
// 全ファイルを開きsizeを取得する再帰関数
//   dir: 今開いているファイル
//   s: ファイルサイズ
//   returns: ファイルサイズの合計
uint32_t getUsingsize(File dir, uint32_t s) {
   File entry =  dir.openNextFile();
   if (! entry) {
     return 0;
   }
   if (entry.isDirectory()) {
     return getUsingsize(entry, s);
   } else {
    return entry.size() + getUsingsize(entry, s);
   }
}

// SDを終了する
void SD_dispose(){
  SPI.end();
  volumesize = 0;
  usedsize = 0;
  Serial.print("exit...\n\n");
}

●SDクラスのbegin()ですぐつながります
他のマイコンだとmountやらコマンド送信から始まるので大変だった覚えがありますがこれはコントンジョノイコ

●ArduinoのSDライブラリでは3つのタイプに対応しています(定義されているもの)
 ・SD1(1)・・・~2GB?
 ・SD2(2)・・・~2GB?
 ・SDHC(3)・・・4GB~32GB
 ・SDXC・・・未対応?

.●SDクラスはprivateメンバーにSDを詳細制御するクラスを抱えてることがわかったので
publicにしてみました
C:\Program Files (x86)\Arduino\libraries\SD\src\SD.h
 ・Sd2Card card;
 ・SdVolume volume;
 ・SdFile root;

●Disposeの処理は「SPI.end()」が主です
取り外した際はSPIを終了しないと再度挿入時に認識しません(そりゃそーじゃ)

それでは、
快適なSDライフを引き続きお過ごしください