TOP > カテゴリ > ロボット・電子工作・マイコン >

SDカード(microSDカード)の使い方 [Arduino]

Arduinoの標準SDライブラリを使用してSPI接続(Serial Peripheral Interface/シリアル周辺インターフェース)で「マイクロSDカード」にアクセスします。SDカード内のファイルの読み書きは「SDクラス」「Fileクラス」を使用します。

Arduinoの電源は5VでSDカードの動作電圧は2.7-3.6Vです。5Vのまま実行するとSDカードが壊れてしまいますので「ロジックレベル変換」で5Vの電圧を3.3Vに変換してからSDカードにアクセスします。

※電圧は抵抗分圧回路でも降圧できますが、回路が複雑になります。

[マイクロSDカードスロット]

※はんだ付けは慣れていないので雑です^^;

[ロジックレベル変換モジュール]

[配線例]

※詳細な配線図は2章で紹介しています。

1. 使用部品・材料

総額で約820円です。(Arduino本体の値段を除く)

部品/材料値段備考
ブレッドボード¥270秋月電子の通販コード(P-00315)
マイクロSDカードスロットDIP化キット¥300秋月電子の通販コード(K-05488)
8ビット双方向ロジックレベル変換モジュール¥250秋月電子の通販コード(M-04522)
microSDカード 2GB
MMAGR02GUFCA-MN(SAMSUNG)
不明2010年12月17日発売のREGZA Phone T-01C(android 2.3)の付属品

2. 配線図

SPI接続用のピン

マスターはArduino。スレーブはSDカードスロットです。

番号名称内容
13SCKシルアルクロック(Serial ClocK)。データ転送の同期の為のマスターからのクロ ック信号。
12MISOMaster In Slave Out。スレーブからマスターへデータを送る。
11MOSIMaster Out Slave In。マスターからスレーブへデータを送る。
(10)SSスレーブ選択ピン(Slave Select pin)。

SPI接続の公式リファレンスには10ピンと記載されていますが、SDライブラリが内部でSPI接続をする場合は「7,8,9,10ピン」では動作しません。実験結果から「2,3,4,5,6,7ピン」ならば動作するようです。

SDカードのピン配置

番号名称内容Arduino
1DAT2未接続未接続
2CD/DAT3チップセレクト4ピン(SS)
3CMDデータ入力11ピン(MOSI)
4VDD電源(2.7-3.6V)3.3V
5CLKシリアルクロック13ピン(SCK)
6VSSGND(グラウンド)GND
7DAT0データ出力12ピン(MISO)
8DAT1未接続未接続
9カード検出スイッチB未接続未接続
10カード検出スイッチA未接続未接続

3. スケッチ(プログラム)

SDカードに「test.txt」のファイルが存在しない場合は新規に作成して文字列を書き込みます。存在すれば文字列を追記します。

上記の処理が終わった後に、そのファイルを読み込んでシリアルモニターに表示します。

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

File myFile;

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

  // SDカードにアクセスする準備をします。 
  if (!SD.begin(4)) {
    Serial.println("SDカードにアクセスできません。");
    return;
  }
  // SDカード内のファイルを「書き込みモード」で開きます。
  // ・ファイルが存在しない場合は新規に作成して文字列を追加します。
  // ・ファイルが存在する場合はファイルの末尾から文字列を追加します。 
  // ※成功した場合は「Fileオブジェクト」が返る
  myFile = SD.open("test.txt", FILE_WRITE);

  if (myFile) {
    // 文字列を書き込む 
    myFile.println("プチモンテ : http://www.petitmonte.com/");
    myFile.close();
  } else {
    Serial.println("ファイルを開けませんでした。");
  }

  // ファイルを「読み込みモード」で開きます。
  myFile = SD.open("test.txt");
  if (myFile) {
    // ファイルの読み込み
    Serial.println("-----------------------");
    while (myFile.available()) {
      Serial.println(myFile.read());
    }
    myFile.close();
  } else {
    Serial.println("ファイルを開けませんでした。");
  }
}

void loop() {
}

[実行例]

文字化けの部分はパソコンでファイルを確認すると「Shift-JIS」の日本語が含まれている事がわかります。

...

次はArduino IDEのメニューの[ファイル][スケッチ例][SD][CardInfo]のスケッチを実行したものです。

その他にもSDカード系のサンプルがありますので、試してみてください。

4. SD/SDHC/SDCXの仕様

ファイルシステム容量備考
SDカードFAT(FAT16)128MB-2GB
SDHCカードFAT324GB-32GBSDカードと互換性がない
SDXCカードexFAT64GB-2TBSDカードと互換性がない

※その他にSDHC/SDXCで利用できる「UHS-I」「UHS-II」があります。

スピードクラス

データ転送速度(最低)
Class22MB/秒
Class44MB/秒
Class66MB/秒
Class1010MB/秒
UHS Speed Class110MB/秒
UHS Speed Class330MB/秒

5. Arduinoの対応フォーマット

種類SDカード/SDHCカードに対応。(SDXCは非対応)
ファイルシステムFAT(FAT16)とFAT32
ファイル名8.3フォーマット(拡張子以外は最大8byte、拡張子は最大3byte)

SDカードは全ての種類でアクセスできると思います。

一方、SDHCカードは読み込めない形式があるようです。Raspberry Pi用に購入したI-O DATAの「microSDHCカード 16GB Class10 EX-MSDC10」はアクセスできませんでした。

ネットで検索してみると「Fujifilm Class 4 SDHC 8GB」「SanDisk Class 4 Micro SDHC 4GB」は読み込めたようです。もしかすると、SDHCカードは4GB、8GBでスピードクラスは低い方がArduinoで動作する可能性が高いかも知れません。

...

京セラのこのページには一昔前のSDカードの一覧がありますので、購入する際の参考になるかも知れません。





掲示板

ソフトウェア、ハードウェアのプログラミング用の掲示板を作成しました。質問やわからない事は@掲示板でユーザー同士で情報を共有して下さい。

関連記事



公開日:2017年05月29日 最終更新日:2017年08月20日
記事NO:02401