Androidのメモとか

ポキオの日記です。今日も遅延してない。

ESP8266ボードとSDカードモジュールをつかってMicro SDの情報取得と読み書きをしてみる

SDカードモジュールをESP8266ボードに繋ぐ

ESP8266

こんな感じのSDモジュールを使います。

  • CS(⇔ボードのSS(D8)に接続)
  • SCK(⇔ボードのSCK(D5)に接続)
  • MOSI(⇔ボードのMOSI(D7)に接続)
  • MISO(⇔ボードのMISO(D6)に接続)
  • VCC(⇔ボードのVCC(5V)に接続)
  • GND(⇔ボードのGNDに接続)

端子はいわゆるSPIと電源/GND。これらをESP8266の端子につなぎます。CS(ChipSelect)端子は、ボードのSS(SlaveSelect)端子に接続。ジャンパワイヤで繋ぐと、こんな感じでキモくなります。

ESP8266

まずは接続されたSDの情報を引っこ抜いてみる

サンプルコードを参考に、こんな感じのコードを書いてみました。

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

int chipSelect = D8;
Sd2Card card;
SdVolume volume;

void setup() {
  Serial.begin(115200);
  Serial.println("");

  if (!card.init(SPI_HALF_SPEED, chipSelect)) {
    Serial.println("card.init : error");
    return;
  }

  Serial.println("card.init : success");

  if (!volume.init(card)) {
    Serial.println("volume.init : error");
    return;
  }

  Serial.println("volume.init : success");

  uint32_t size;
  size = volume.blocksPerCluster() * volume.clusterCount() * 512;

  Serial.println("size : " + String(size) + " [B]");

  size /= 1024 * 1024;

  Serial.println("size : " + String(size) + " [MB]");
}

void loop() {

}

SDライブラリを使うと簡単に実装できます。実際に、家にあった2GBのMicroSDの情報を読み取ってみました。

ESP8266

card.init : success
volume.init : success
size : 1986297856 [B]
size : 1894 [MB]

キッチリ容量を取得できてます。

次に書き込み

人間、誰しもがSDを見ると何かを書き込みたいという衝動にかられると思います。僕も書き込んでみます。とりあえず意味不明な文字列を書いてみます。

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

int chipSelect = D8;
File file;
String testData = "hogehoge.fugafuga";

void setup() {
  Serial.begin(115200);
  Serial.println("");

  if (!SD.begin(chipSelect)) {
    Serial.println("SD.begin : error");
    return;
  }

  Serial.println("SD.begin : success");

  SD.remove("testdata.txt");

  file = SD.open("testdata.txt", FILE_WRITE);

  if (!file) {
    Serial.println("SD.open : error");
    return;
  }

  Serial.println("SD.open : success");

  file.println(testData);
  Serial.println("file.println : " + testData);

  file.close();
  Serial.println("file.close : success");
}

void loop() {

}

で、書いてみました。シリアルモニター的には書けてるとのころ。

ESP8266

SD.begin : success
SD.open : success
file.println : hogehoge.fugafuga
file.close : success

テキストデータを書き込んだSDをMacで読み込んでみると、たしかにファイルができています。

ESP8266

ファイル名は、Arduinoのコード上では全て小文字のtestdata.txtとしていたはずですが、Mac上で見るとTESTDATA.TXTという感じですべて大文字になっています。そして、ファイル作成日時も2000年の元日になっています。

ESP8266

ファイルを開くと、たしかに書き込めています。こちらは小文字のままでした。

最後に読み込み

やっぱり書けたら読みたくなるのが性というもの。

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

int chipSelect = D8;
File file;
String testData = "hogehoge.fugafuga";

void setup() {
  Serial.begin(115200);
  Serial.println("");

  if (!SD.begin(chipSelect)) {
    Serial.println("SD.begin : error");
    return;
  }

  Serial.println("SD.begin : success");

  file = SD.open("testdata.txt", FILE_READ);

  if (!file) {
    Serial.println("SD.open : error");
    return;
  }

  Serial.println("SD.open : success");
  
  String str = "";

  while (file.available()) {
    str += (char)file.read();
  }

  Serial.println("file.read : " + str);

  file.close();
  Serial.println("file.close : success");
}

void loop() {

}

Stringのまま読む方法が分からず、Char1文字ずつ読み込んで、Stringにappendしています。他にいい方法があれば教えてください。

ESP8266

SD.begin : success
SD.open : success
file.read : hogehoge.fugafuga

file.close : success

取り敢えず読めてそうです。

「Androidのメモとか」は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。

このブログは個人的なメモ書きであったり、考えを書く場所であります。執筆者の所属する団体や企業のコメントや意向とは無関係であります。また、このブログは必ずしも正しいことが書かれているとは限らず、誤字脱字や意図せず誤った情報を載せる場合がありえます。それが原因で読者が不利益を被ったとしても、執筆者はいかなる責任も負いません。ありがとうございます。