M5StickCでできること 〜SDカードを接続する

M5StickCは、内蔵のセンサや、各種外付けセンサを使って、簡単にさまざまな環境データを採取することができ、安価なIoTデバイスとしての活用が可能です。


IoTデバイスとして使う場合、Webサーバなどにデータを送信して利用するのが一般的ですが、ネットワークに接続できない環境でデータ採取したい場合など、デバイス自体にデータを保存したいケースもあります。
しかし、M5StickCの場合、M5StackのようにSDカードスロットは付いておらず、また内蔵フラッシュの容量も小さいので、単体で保存デバイスとして利用するには不向きです。

今回、M5StickCに外付けのSDカードリーダーをつなぎ、動作確認をしてみました。
こちらこちら のブログを参考にさせていただきました。

接続方法

こちらのマイクロSDカードリーダーを使いました。


SDカードリーダーとM5StickCを、以下のとおり接続します。

SDカードリーダー M5StickC
3V3 3V3
CS GND
MOSI G26
CLK G0
MISO G36
GND GND

スケッチ

作成したスケッチは以下のとおりです。
なお、参考にさせていただいたブログに記載されているままのスケッチでは、私の場合は正常に動作しませんでした。詳しくは後述します。

#include <M5StickC.h>
#include "SD.h"

SPIClass SPI2;

void setup() {
  M5.begin();
  M5.Lcd.setRotation(3);

  SPI2.begin(0, 36, 26, -1); // SPI初期化

  if(!SD.begin(-1, SPI2)) { // SDカード初期化
    M5.Lcd.println("Card Mount Failed");
    return;
  }
  uint8_t cardType = SD.cardType(); // SDカード種別取得
  if (cardType == CARD_NONE) {
    M5.Lcd.println("None SD Card");
    return;
  } else if (cardType == CARD_MMC) {
    M5.Lcd.println("SD Card Type: MMC");
  } else if (cardType == CARD_SD) {
    M5.Lcd.println("SD Card Type: SDSC");
  } else if (cardType == CARD_SDHC) {
    M5.Lcd.println("SD Card Type: SDHC");
  } else {
    M5.Lcd.println("SD Card Type: UNKNOWN");
  }
  uint64_t cardSize = SD.cardSize() / (1024 * 1024); // SDカード容量取得
  M5.Lcd.printf("SD Card Size: %lluMB\n", cardSize);
}

void loop() {
}

動作確認結果

SDカードリーダーにマイクロSDカードを挿入し、前述のとおりにM5StickCと接続し、スケッチを書き込んだところ、以下のとおり、SDカードの種別と容量が、M5StickCのLCDに表示されます。

調査の経緯

参考にさせていただいたブログを見るかぎり、そんなに難しい処理はなさそうで、SDカードリーダーとM5StickCをつなぎ、SPIとSDカードの初期化を行うだけで、普通に使えるようです。
そんな訳で、早速SDカードリーダーを購入して試してみたのですが、「None SD Card」のメッセージが表示されるばかりで、SDカードを認識することができません。

マイクロSDカード本体、SDカードリーダー、ブレッドボード、ジャンパー線、M5StickC本体と、順番にパーツを別のものに置き換えていったのですが、一向に状況は変わりません。テスターで導通テストを行っても、問題なくつながっているようです。
その上、もしやと思い、M5StickCをESP32に置き換え、同様のスケッチを作成して書き込んだところ、なんと正常に動作してしまいました。
つまり、今回用意したハードウエアについては問題はなく、正常に動作しないのはスケッチ側の問題だと推定できます。

また、スケッチ作成に使うパソコンをWindowsからMacに変更してみたり、しまいにはArduino IDEをインストールしなおしたりもしてみましたが、状況は変わりません。

私は、この辺りに関するスキルはないのですが、分からないなりに「SPIの初期化」あたりがあやしいのではないか?と見当をつけ、こちら のページを参考にして、異なるSPIモジュールを使うようにスケッチを変更しました。

これにより、最終的に前述のスケッチにすることで、正常に動作することを確認できました。

なお、私がM5Stack、M5StickCの使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。


ごく基本的なところから、かなり複雑なスケッチや、ネットワーク接続など、比較的高度なものまで、つまづかずに読み進めていけるような構成になっており、大変わかりやすい本です。


このサイトで書いている、M5Stackシリーズ(M5Stack、M5StickCなど)に関するブログ記事を、「さとやまノート」という別のブログページに、あらためて整理してまとめました。

他のM5Stackシリーズの記事にも興味のある方は「さとやまノート」をご覧ください。