まえがき
中華でマイクロSDカードリーダーモジュールを購入したので使ってみます。
ピンがはんだされていないタイプが1個24円くらいでした。
リンク
使用したモノ
- Arduino Uno R3 (互換機) 1個
- マイクロSDカードリーダーモジュール 1個
- ジャンパー線 6本
環境
Arduino IDE 2.3.4
使用ライブラリ
SD 1.3.0
配線
SDライブラリのサンプルコードに、ピン番号が書かれているので、参考にして接続します。
入力電圧が3.3Vのタイプと5Vのタイプがあるらしいので、自分の使用するモジュールに合わせて接続してください。
fritzingのモジュールが、使用したモジュールと同じだと仮定して接続しています。
サンプルコード
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. Things to check:");
Serial.println("* is a card inserted?");
Serial.println("* is your wiring correct?");
Serial.println("* did you change the chipSelect pin to match your shield or module?");
Serial.println("Note: press reset button on the board and reopen this Serial Monitor after fixing your issue!");
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();
volumesize *= volume.clusterCount();
volumesize /= 2;
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);
root.close();
}
void loop(void) {
}
問題がなければ、カードインフォがシリアルプリントに表示されます。
SDの読み込みと書き込み
#include <SPI.h>
#include <SD.h>
Sd2Card card;
SdVolume volume;
SdFile root;
File myFile;
const int chipSelect = 10;
const char info[] = "Hibiiroは日々の色々を掲載する個人サイトです"; //ファイルに書き込むテキストです。
void setup() {
Serial.begin(9600);
while (!Serial) {
;
}
Serial.println("読み込み中");
if (!card.init(SPI_HALF_SPEED, chipSelect)) {
Serial.println("読み込みに失敗しました");
while (1);
}
if (!SD.begin(chipSelect)) {
Serial.println("読み込みに失敗しました");
while (1);
}
if (!volume.init(card)) {
Serial.println("パーテーションが見つかりませんでした。");
while (1);
}
Serial.println("読み込みに成功しました");
if (!SD.exists("hibiiro")) {
SD.mkdir("hibiiro");
}
if (!SD.exists("hibiiro/hibiiro.txt")) { //ファイルの存在を確認します。
myFile = SD.open("hibiiro/hibiiro.txt",FILE_WRITE); //なければ作成します。
myFile.write(info);
myFile.close();
} else { //戻り値がTrueになり、elseが処理されるので、ファイルを読み取って出力します。
myFile = SD.open("hibiiro/hibiiro.txt",FILE_READ);
while (myFile.available()){
Serial.write(myFile.read());
}
myFile.close();
}
Serial.println("");
root.openRoot(volume);
root.ls(LS_R | LS_DATE | LS_SIZE);
}
void loop() {
}
SDライブラリのみでタイムスタンプの取得や変更する方法が分からなかったので、おかしな表示になっていますが、ファイルの作成と読み取りが出来ました。
参考リンク
『第5回 SDカードに記録する:SDカードシールド』
SDカードに書き込むまずSDカードシールド(シールドとは、いろいろ部品の載った基盤と思ってもらえばよいです。「モジュール...
GitHub - arduino-libraries/SD: SD Library for Arduino
SD Library for Arduino. Contribute to arduino-libraries/SD d...
コメント