SDカードモジュールを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)端子に接続。ジャンパワイヤで繋ぐと、こんな感じでキモくなります。
まずは接続された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の情報を読み取ってみました。
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() { }
で、書いてみました。シリアルモニター的には書けてるとのころ。
SD.begin : success
SD.open : success
file.println : hogehoge.fugafuga
file.close : success
テキストデータを書き込んだSDをMacで読み込んでみると、たしかにファイルができています。
ファイル名は、Arduinoのコード上では全て小文字のtestdata.txt
としていたはずですが、Mac上で見るとTESTDATA.TXT
という感じですべて大文字になっています。そして、ファイル作成日時も2000年の元日になっています。
ファイルを開くと、たしかに書き込めています。こちらは小文字のままでした。
最後に読み込み
やっぱり書けたら読みたくなるのが性というもの。
#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しています。他にいい方法があれば教えてください。
SD.begin : success
SD.open : success
file.read : hogehoge.fugafuga
file.close : success
取り敢えず読めてそうです。