M5StackでSDカードのチェックとINIのダンプ表示

プログラミング関係の記事はどうやら2024年ほどで業界全体が止まっているように思う。

それはもちろんAIの影響というわけです。

ところがまだまだ需要はあって、誰かの経験や、手順などの記事を筆者も見返したりするわけですが、このブログもほとんどは自分のためのメモといった感じ。

M5Stack(以下M5)ではmicroSDカードが使えるわけですが、iniファイルがどうやら読み込まれていないようで、トラブってました。

SDが読み込まれているかチェックするためのコードをGPTにお願いしました。

ちなみに、何度もエラー。

原因はボードの選択ミスでした。

M5Stack-Core-ESP32を選択、ボードを変えると、速度ももちろん変えてください。

速度は115200じゃないと、入らなかったりします。

#include <M5Unified.h>
#include <SD.h>

/**
 * @brief SDカードのマウント確認スケッチ
 *        起動時にSDがマウントされているかを画面に表示
 */

void setup() {
  auto cfg = M5.config();
  cfg.output_power = true;      // 5Vライン供給
  M5.begin(cfg);

  M5.Display.setRotation(1);
  M5.Display.setTextSize(2);
  M5.Display.setTextColor(WHITE, BLACK);
  M5.Display.setTextDatum(MC_DATUM);

  M5.Display.fillScreen(BLACK);
  M5.Display.drawString("Checking SD Card...", 160, 60);

  // SDカードマウントテスト
  if (SD.begin(GPIO_NUM_4, SPI, 25000000)) {  // M5Stack Basic は CS = 4
    M5.Display.drawString("✅ SD Card Mounted!", 160, 100);
  } else {
    M5.Display.drawString("❌ SD Mount Failed", 160, 100);
  }
}

void loop() {
  // 何もしない
}

このコードを書き込めば、SDカードの状態を画面中央に表示できます。

SD Card Mountedが表示され、iniファイルの作成に進みます。

iniファイルはいろいろ仕込んでおくと、管理もしやすくて、プログラムコードそのものもシンプルになっていくため、デバッグもしやすい。

非常に便利なシステムですね。

あとは、INIファイルの中身をダンプ表示させるコード。

#include <M5Unified.h>
#include <SD.h>

const char* iniPath = "/config.ini";   // ルート直下のファイル名

void setup() {
  auto cfg = M5.config();
  cfg.output_power = true;
  M5.begin(cfg);

  M5.Display.setRotation(1);
  M5.Display.setTextSize(2);
  M5.Display.setTextColor(WHITE, BLACK);
  M5.Display.fillScreen(BLACK);
  M5.Display.setCursor(10, 30);

  // ★ CS=4 を明示 ★
  if (!SD.begin(GPIO_NUM_4, SPI, 25000000)) {
    M5.Display.println("SD mount failed");
    return;
  }
  M5.Display.println("SD mounted");

  File f = SD.open(iniPath);
  if (!f) {
    M5.Display.println("INI not found");
    return;
  }
  M5.Display.println("INI found!");

  // 1行目だけ表示
  String line = f.readStringUntil('\n');
  f.close();
  M5.Display.setCursor(10, 90);
  M5.Display.println(line);
}

void loop() {}

これで表示できればOK!

ちなみに超重要なことが、M5Stack Basic/Core では SD-CS = GPIO 4 が正解であるということ。
引数なしの SD.begin() にすると ボード定義側のデフォルト CS(機種によって 5 や 15)が選ばれるため、マウント失敗になります。

そのため、コード内部で、SD.begin(GPIO_NUM_4を明示してあげると確実です。

朝比奈幸太郎

音楽家:朝比奈幸太郎

神戸生まれ。2025 年、40 年近く住んだ神戸を離れ北海道・十勝へ移住。
録音エンジニア五島昭彦氏より金田式バランス電流伝送 DC 録音技術を承継し、 ヴィンテージ機材で高品位録音を実践。
ヒーリング音響ブランド「Curanz Sounds」でソルフェジオ周波数音源を配信。
“音の文化を未来へ”届ける活動を展開中。