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

はじめに
こんなこと、やります。
- ArduinoでマイクロSDカードの情報を表示する
- SDカードに新規ファイルを作成する
- SDカードにデータを書き込む
- SDカードにデータを読み込む
この記事では、マイクロSDカードモジュールをArduinoで使う方法を解説します。
ArduinoとSDカードモジュールの配線
ArduinoとSDカードモジュールの配線は、次の通りになります。
SDカードモジュール | Arduinoピン |
---|---|
3V3 | 3V3 |
CS | pin 10 |
MOSI | pin 11 |
CLK | pin 13 |
MISO | pin 12 |
GND | GND |
SDカードの電源電圧は3.3Vです。モジュール内に レベルシフター がない場合、5V電源を繋いでしまうと最悪の場合SDカードが壊れてしまいます。ご注意下さい。
CS番号に注意
サンプルプログラムですと、CS(チップセレクト)が4番ピンに指定されていましたが、動作が安定しなかったため10番ピンに変更しました。どうも、SDカードモジュールによって指定が異なるみたいです。
もし、SDカードの情報が表示されず、動作がおかしい場合はこのCSにつなげるピン番号を変えてみてください。その際は、プログラムのchipSelect
の書き換えもお忘れなく。
SDカードの内容を表示するプログラム
Arduino
IDEにサンプルプログラムが入っているので、ここではそれを利用してみます。Arduino
IDEのFile
メニューから、Examples
→SD
でサンプルプログラムを開くことができます。
次は、SDカードの内容を表示するプログラムです。
#include <SPI.h>
#include <SD.h>
;
Sd2Card card;
SdVolume volume;
SdFile root
const int chipSelect = 10;
void setup() {
.begin(9600);
Serialwhile (!Serial) {
;
}
.print("\nInitializing SD card...");
Serial
if (!card.init(SPI_HALF_SPEED, chipSelect)) {
.println("initialization failed.");
Serialwhile (1);
} else {
.println("Wiring is correct and a card is present.");
Serial}
.println();
Serial.print("Card type: ");
Serialswitch (card.type()) {
case SD_CARD_TYPE_SD1:
.println("SD1");
Serialbreak;
case SD_CARD_TYPE_SD2:
.println("SD2");
Serialbreak;
case SD_CARD_TYPE_SDHC:
.println("SDHC");
Serialbreak;
default:
.println("Unknown");
Serial}
if (!volume.init(card)) {
.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
Serialwhile (1);
}
.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();
Serial
uint32_t volumesize;
.print("Volume type is: FAT");
Serial.println(volume.fatType(), DEC);
Serial
= 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)
volumesize .print("Volume size (Kb): ");
Serial.println(volumesize);
Serial.print("Volume size (Mb): ");
Serial/= 1024;
volumesize .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): ");
Serial.openRoot(volume);
root
.ls(LS_R | LS_DATE | LS_SIZE);
root}
void loop(void) {
}
次のように、SDカード情報が表示されれば成功です。
ファイルを読み書きする
次にSDカードにファイルの読み書きを行ってみましょう。
#include <SPI.h>
#include <SD.h>
;
File myFile
void setup() {
.begin(9600);
Serialwhile (!Serial) {
;
}
if (!SD.begin()) {
.println("initialization failed!");
Serialwhile (1);
}
= SD.open("hoge.txt", FILE_WRITE); // creat new file
myFile
if (myFile) {
.println("Hello, SD card?"); // write contents
myFile.close();
myFile} else {
.println("file open failed!");
Serial}
= SD.open("hoge.txt");
myFile if (myFile) {
.println("-----------------------");
Serialwhile (myFile.available()) {
.write(myFile.read()); // read contents
Serial}
.close();
myFile} else {
.println("file open failed!");
Serial}
}
void loop() {
}

SD.open("ファイル名", FILE_WRITE)
で、「ファイル名」がなければ新規作成されます。myFile.println(内容);
で「内容」を書き込みます。myFile.read()
で「内容」を読み込みます。
注意
内容をシリアルモニターに表示する際、Serial.print
を使うとASCIIコードで表示されてしまいます。数字の羅列しか表示されない場合は、Serial.write
を使って出力してください。
また、ファイルハンドラ(myFile)を作ったときは、必ずmyFile.close()
でファイルハンドラを閉じてください。実践的なプログラムではメモリーリークにつながる恐れがあります。
関連記事
- fdupes で内容が重複しているファイルを見つける|シェル
- Gitと向き合うための、Gitでよく使うコマンドノート
- Antの使い方 〜 Javaプロジェクトのモジュール作成
- less|シェル
- Raspberry Piでカメラモジュールの使い方【コマ抜き撮影】