ArduinoでマイクロSDカード〜書き込み読み込み記録する

こんなこと、やります。

  • ArduinoでマイクロSDカードの情報を表示する
  • SDカードに新規ファイルを作成する
  • SDカードにデータを書き込む
  • SDカードにデータを読み込む

Arduinoでmicro SDカード〜書き込み読み込み記録する

この記事では、マイクロSDカードモジュールをArduinoで使う方法を解説します。

つかうもの

はじめに、この記事で使うものをご紹介します。

マイクロSDカード拡張モジュール

マイクロSDカード

マイクロSDカードはSDまたはSDHCをお使いください。SDXCは使えませんのでご注意ください。

私はSDHCを使用しました。

また、SDカードはFAT16またはFAT36でフォーマットしておく必要があります。

Arduino

Arduino Uno Rev3を使用しました。

この記事の内容は、ほかのArduinoでも動作します。

まだArduinoをお持ちでないようでしたらおすすめArduinoどれを選べばいい?Arduinoで電子工作をはじめる方へをご覧ください。

その他の電子部品

また、ブレッドボードやジャンプワイヤもあると便利です。

ArduinoとSDカードモジュールの配線

ArduinoとSDカードモジュールの配線は、次の通りになります。

SDカードモジュールArduinoピン
3V33V3
CSpin 10
MOSIpin 11
CLKpin 13
MISOpin 12
GNDGND
SDカードの電源電圧は3.3Vです。モジュール内に レベルシフターがない場合、5V電源を繋いでしまうと最悪の場合SDカードが壊れてしまいます。ご注意下さい。

▼ 書き込みに失敗する場合や、電圧問題が心配な方はレベルシフターとレジュレータが内蔵された下記商品をお勧めします。

CS番号に注意

サンプルプログラムですと、CS(チップセレクト)が4番ピンに指定されていましたが、動作が安定しなかったため10番ピンに変更しました。どうも、SDカードモジュールによって指定が異なるみたいです。

もし、SDカードの情報が表示されず、動作がおかしい場合はこのCSにつなげるピン番号を変えてみてください。その際は、プログラムのchipSelectの書き換えもお忘れなく。

SDカードの内容を表示するプログラム

Arduino IDEにサンプルプログラムが入っているので、ここではそれを利用してみます。Arduino IDEのFileメニューから、ExamplesSDでサンプルプログラムを開くことができます。

次は、SDカードの内容を表示するプログラムです。

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

Sd2Card card;
SdVolume volume;
SdFile root;

const int chipSelect = 10;

void setup() {

  Serial.begin(9600);
  while (!Serial) {
    ;
  }

  Serial.print("\nInitializing SD card...");

  if (!card.init(SPI_HALF_SPEED, chipSelect)) {
    Serial.println("initialization failed.");
    while (1);
  } else {
    Serial.println("Wiring is correct and a card is present.");
  }

  Serial.println();
  Serial.print("Card type:         ");
  switch (card.type()) {
    case SD_CARD_TYPE_SD1:
      Serial.println("SD1");
      break;
    case SD_CARD_TYPE_SD2:
      Serial.println("SD2");
      break;
    case SD_CARD_TYPE_SDHC:
      Serial.println("SDHC");
      break;
    default:
      Serial.println("Unknown");
  }

  if (!volume.init(card)) {
    Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
    while (1);
  }

  Serial.print("Clusters:          ");
  Serial.println(volume.clusterCount());
  Serial.print("Blocks x Cluster:  ");
  Serial.println(volume.blocksPerCluster());

  Serial.print("Total Blocks:      ");
  Serial.println(volume.blocksPerCluster() * volume.clusterCount());
  Serial.println();


  uint32_t volumesize;
  Serial.print("Volume type is:    FAT");
  Serial.println(volume.fatType(), DEC);

  volumesize = volume.blocksPerCluster();    // clusters are collections of blocks
  volumesize *= volume.clusterCount();       // we'll have a lot of clusters
  volumesize /= 2;                           // SD card blocks are always 512 bytes (2 blocks are 1KB)
  Serial.print("Volume size (Kb):  ");
  Serial.println(volumesize);
  Serial.print("Volume size (Mb):  ");
  volumesize /= 1024;
  Serial.println(volumesize);
  Serial.print("Volume size (Gb):  ");
  Serial.println((float)volumesize / 1024.0);

  Serial.println("\nFiles found on the card (name, date and size in bytes): ");
  root.openRoot(volume);

  root.ls(LS_R | LS_DATE | LS_SIZE);
}

void loop(void) {
}

次のように、SDカード情報が表示されれば成功です。

SDカード情報が表示された
SDカード情報が表示された

ファイルを読み書きする

次にSDカードにファイルの読み書きを行ってみましょう。

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

File myFile;

void setup() {
  Serial.begin(9600);
  while (!Serial) {
    ;
  }

  if (!SD.begin()) {
    Serial.println("initialization failed!");
    while (1);
  }
  
  myFile = SD.open("hoge.txt", FILE_WRITE); // creat new file

  

  if (myFile) {
    myFile.println("Hello, SD card?"); // write contents
    myFile.close();
  } else {
    Serial.println("file open failed!");
  }

  myFile = SD.open("hoge.txt");
  if (myFile) {
    Serial.println("-----------------------");
    while (myFile.available()) {
      Serial.write(myFile.read()); // read contents
    }
    myFile.close();
  } else {
    Serial.println("file open failed!");
  }

}

void loop() {
}

ファイルの読み書き
ファイルの読み書き

  • SD.open("ファイル名", FILE_WRITE)で、「ファイル名」がなければ新規作成されます。
  • myFile.println(内容);で「内容」を書き込みます。
  • myFile.read()で「内容」を読み込みます。

注意

内容をシリアルモニターに表示する際、Serial.printを使うとASCIIコードで表示されてしまいます。数字の羅列しか表示されない場合は、Serial.writeを使って出力してください。

また、ファイルハンドラ(myFile)を作ったときは、必ずmyFile.close()でファイルハンドラを閉じてください。実践的なプログラムではメモリーリークにつながる恐れがあります。

▶︎ 類似した記事を探す #Arduino #Raspberry Pi #電子工作 #データ保存

この記事が参考になりましたら
シェアをよろしくお願いします!

人気のArduino互換機
Arduinoで人気の周辺パーツ
あると便利な道具
Arduinoのオススメ参考書

▼ Arduino初心者向きの内容です。ほかのArduino書籍と比べて図や説明がとてもていねいで読みやすいです。Arduinoで一通りのセンサーが扱えるようになります。

▼ 外国人が書いた本を翻訳したものです。この手の書籍は、目からうろこな発見をすることが多いです。

▼ Arduinoの入門書を既に読んでいる方で、次のステップを目指したい人向きの本です。C言語のプログラミングの内容が中心です。ESP32だけでなく、ふつうのArduinoにも役立つ内容でした。

関連記事