Arduinoをデータロガーとして使う為にマイクロSD(TF)カードモジュールを入手しました。

SDカードモジュール

 AliExpress(FYD Open Source Hardware)で$0.41、送料無料でしたのでつい買ってしまいました。 ‘20.4/7に注文、4/10に発送され4/27に到着しました。

 購入したのはSDカードスロットと電圧をArduinoの5VからSDカードの3.3Vに変換してくれる(はずの)回路が搭載されているモジュールです。

 作りはお値段相当ということで、基板の側面から繊維が飛び出しています。

 見た感じ同じようなモジュールがAmazon や楽天、AliExpress の他のショップにも売っていて、シルクが少し違うけど乗っているチップは同じに見える。 何か違いがあるのだろうか?

配線

 インターフェイスはSPIでArduino UNOとの接続は以下のようになります。

Arduino UNO ピンSD モジュール
13SCK
12MISO
11MOSI
4CS
5VVCC
GNDGND

CS(チップセレクト)

 CSはArduinoのリファレンスではピン10と記載されていましたが、その通り接続しても動きませんでした。 サンプルコードに” const int chipSelect = 4; ”又は”SD.begin(4)”とあったのでピン4につなぐと正常に動きました。

 CSの線をUNOの空いているピン0~10に順番につないで、サンプルコードの”chipSelect”の値を合わせて書き換えて動作させると、ピン0,1 では動作せず、ピン2~10で正常に動作しました。

 ピン0,1はシリアル通信で使われているので、シリアルモニタを使っていると使えません。

 サンプルコードからシリアル通信のコードを削除して確認すると、ピン0,1でも正常に 動作しました。

micro SD

micro SDカードの準備

 micro SDカードはFAT16かFAT32でフォーマットされている必要があります。micro SDHCも使用可能ですがmicro SDXCは使えないとのことです。

 手元にあった2GBのmicro SDカードをFAT16で、16GBのmicro SDHC カードをFAT32でそれぞれPCでフォーマットしました。 SDXC は持っていなかったので試していません。

2GB のmicroSD と16GB のmicro SDHC

スケッチ

サンプルスケッチ

 SDカードの読み書きに関するサンプルスケッチがArduino IDE には入っています。『ファイル』 ⇒ 『スケッチ例』 ⇒ 『SD』 ⇒ 『CardInfo』を開きます。

 配線して、スロットにフォーマットしたmicro SD カードを入れたArduino とPC をUSB ケーブルで接続して、シリアルモニタを立ち上げておきます。

 スケッチを書きこみ正常にSDカードを読み込めると、カードの情報がシリアルモニタに表示されます。 micro SD カード、micro SDHC カード、どちらとも正常に認識されました。

 試しにmicro SDHC カードをNTFS でフォーマットしてみるとエラーとなりました。

データの書き込み及び読み出し

 データの書き込みと読み出し方法はサンプルスケッチの”ReadWrite”を参考にします。 Arduino IDE の『ファイル』 ⇒ 『スケッチ例』 ⇒ 『SD』 ⇒ 『ReadWrite』にあります。

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

File myFile;

 まず、SIP通信を行う<SPI.h>とSDカードの読み書きを行う<SD.h>の二つのライブラリを読み込みます。 この二つのライブラリはArduino IDE に標準で入っています。

 続いて”File”クラスのインスタンスを”myFile”という名前で宣言します。

書き込み
void setup() {
  if (!SD.begin(4)) {
    while (1);
  }

  myFile = SD.open("test.txt", FILE_WRITE);

  if (myFile) {
    myFile.println("testing 1, 2, 3.");
    myFile.close();
  }
}

 サンプルスケッチ”ReadWrite”の”setup”関数からSD の書き込みに関するコードのみ抜き出しました。

 * 理解しやすいように必要な部分のみ抜き出しましたが、エラートラップ等がないので、このまま使うと不具合が生じたときに原因究明が困難になります。実際にはサンプルスケッチを参考にエラートラップを入れるべきです。

 2行目の”SD.begin(4)”でライブラリを初期化します。 カッコ内の数値がCS(チップセレクト)のピン番号になります。

 3行目では、正常に初期化できなかったらArduinoの電源が切れるかリセットされるまで無限ループし、先のコードを実行しません。 カードが入っていなかったり、正常にフォーマットされていなかったり、Arduino のピンとモジュールとの接続に問題がある場合に初期化失敗します。

 6行目で”test.txt”というファイルを書き込み読み出しモードで開きます(二つ目のパラメーターで”FILE_WRITE”を記述すると書き込み読み出しモードになる)。ファイルが無ければ新しく作られます。 開いた状態で”myFile”オブジェクトに格納します。 ファイルを開くのに失敗すると”myFile”には”false”が格納されます。

 ファイル名半角8文字、拡張子半角3文字の8.3形式のファイル名で、アルファベットは大文字になります。

 8行目で”myFile”が”false”でないか(ファイルがちゃんと開けたか)確認し、ファイルが開けていたら9行目で”testing 1, 2, 3.”というテキストを書き込み改行します。 ファイル内に既に書き込まれていた内容があった場合、最後に追加して書き込まれます。 そして10行目でファイルを閉じます。

void loop() {
}

 このコードでは書き込みは1回のみなので”loop”関数には何も書きません。

読み出し
void setup() {
  Serial.begin(9600);
  while (!Serial) {
  }

  if (!SD.begin(4)) {
    while (1);
  }
  myFile = SD.open("test.txt");
  if (myFile) {
    while (myFile.available()) {
      Serial.write(myFile.read());
    }
    myFile.close();
  } 
}

 サンプルスケッチ”ReadWrite”の”setup”関数からSD からの読み出しに関するコードのみ抜き出しました。

 読み込んだファイルの内容をシリアルモニタに表示したいので、2~4行目でシリアル通信の準備をします。

 6行目の”SD.begin(4)”でライブラリを初期化します。 カッコ内の数値がCS(チップセレクト)のピン番号になります。

 7行目は、正常に初期化できなかったらArduinoの電源が切れるかリセットされるまで無限ループし、先のコードを実行しません

 9行目で”test.txt”というファイルを書き込みモードで開きます(二つ目のパラメーターを省略するとデフォルトで読み出しモードで開く。明示的に”FILE_READ”と記述しても良い。)。開いた状態で”myFile”オブジェクトに格納します。 ファイルが存在しなければ開けません。 ファイルを開くのに失敗すると”myFile”には”false”が格納されます。

 10行目で”myFile”が”false”でないか(ファイルがちゃんと開けたか)確認します。

 ファイルが開けていたら11行目フィアルに内容があるか確認し、内容があれば12行目でファイルの内容を1バイト読み出し、シリアルモニタに表示します。

 ファイルの内容の読み出しは、ファイルの最初から1バイトずつ読み出し、ファイルの最後になると”myFile.available()”が”false”を返してループを抜け、14行目でファイルを閉じて終了します。

  ”loop”関数には何も書きません。

動作確認

書き込み

 フォーマットしたmicro SD カードをスロットに刺して、書き込みを実行しました。 書き込んだmicro SD をPC で確認すると新しいファイルができており正常に書き込めたことが確認できました。

読み出し

 書き込んだmicro SD の読み出しを実行しました。 シリアルモニタにファイルの内容が表示され、正常に読み出せたことが確認できました。

2バイト文字

 読み出しは、1バイトずつ行われます。 では2バイト文字(全角文字)はどうなの見てみました。 PC で全角文字が入ったテキストファイルを作成し、読みだしたところシリアルモニタでは正常に表示されました。

 次に1バイト読み込む毎に改行を入れるようにスケッチを書き替えると、2バイト文字は正常には読み込めませんでした。

 シリアルモニタ側でつないで全角文字に変換しているようです。

 

広告
[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

SDカードシールド V4.0
価格:1827円(税込、送料別) (2021/2/3時点)

広告