M5Stack CoreS3 + UIFlow2でmicroSDカードが認識しない原因がSDカード相性だった話

Tips

はじめに

以前、スタックチャンをデプロイするために購入した M5Stack CoreS3 ですが、せっかくなのでほかの用途でも遊んでみることにしました。 最初に試したかったのは、microSD カードに入れた音楽を再生する音楽プレーヤーと、画像を表示する電子フォトスタンドです。

どちらの用途でも microSD カードへのアクセスが必要です。 しかし UIFlow2 の Web 版で MicroPython コードを実行したところ、SD カードの初期化でエラーになり、ファイル一覧を読むところまで進めませんでした。

今回は M5Stack CoreS3 + UIFlow2 で SD カードを認識できなかったときに試したことと、最終的にキオクシア製の microSD カードへ交換して解決した記録をまとめます。 結論から書くと、今回の原因はコードよりも SD カードとの相性問題だった可能性が高いです。

やりたかったこと

今回 M5Stack CoreS3 で試したかったことは、次の 2 つです。

  • SD カードに入っている音楽を再生する音楽プレーヤーとして使う
  • SD カード内の画像を表示して電子フォトスタンドとして使う

M5Stack CoreS3 には画面、スピーカー、SD カードスロットがあります。 そのため、簡単な音楽プレーヤーやフォトスタンドであれば、本体だけでかなり遊べそうだと考えました。

UIFlow2 はブロックプログラミングと MicroPython の両方を扱えるため、試作にはちょうどよさそうです。 まずは SD カードをマウントし、os.listdir() でファイル一覧を出せればよい、という小さな確認から始めました。

使用環境

今回確認した環境は以下のとおりです。

項目 内容
デバイス M5Stack CoreS3
開発環境 UIFlow2 Web 版
実行言語 MicroPython
ストレージ microSD カード
フォーマット FAT32
解決時のカード キオクシア製 microSD カード

SD カードは FAT32 でフォーマットしてから試しました。 最初に使っていたカードも PC からは普通に読み書きできていたため、最初はカードそのものが原因だとは考えていませんでした。

なぜ SD カードの相性を疑う必要があるのか

SD カードの初期化では、単にファイルシステムを読む前に、カードとの通信自体が成立する必要があります。 SPI のピン設定、スロット番号、周波数、カードの応答タイミングのどれかが噛み合わないと、FAT32 の中身を見る段階まで進めません。

そのため、os.listdir() でファイルが見えない場合でも、原因はファイルシステムだけとは限りません。 カードが未フォーマットなのか、マウントに失敗しているのか、そもそも初期化応答が返っていないのかを分けて考える必要があります。

今回のように CoreS3 本体側の UserDemo では認識できる場面がある一方で、UIFlow2 のコードからは失敗する場合、ソフトウェア設定とカード相性の両方を見る必要がありました。 最終的には別メーカーの SD カードで安定したため、コードの書き方だけで追い続けると遠回りになるタイプのトラブルでした。

最初に試したコード

UIFlow2 の MicroPython から、以下のようなコードで SD カードの初期化を試しました。

sdcard.SDCard(
    slot=3,
    width=1,
    sck=36,
    miso=35,
    mosi=37,
    cs=4,
    freq=1000000
)

CoreS3 向けのピン設定を指定し、周波数はまず低めの 1000000 で試しました。 高い周波数で不安定になる可能性も考えたため、いきなり高速にせず、まずは低速で初期化できるかを見る意図です。

しかし実行すると、SD カード初期化時にエラーが発生しました。

File "hardware/sdcard.py", line 33, in sdcard

この時点では、slot の指定が違うのか、ピン番号が違うのか、カードのフォーマットが悪いのかがまだ分かりませんでした。 まずは SD カード以外の部分が動いているかを確認していきます。

UIFlow2 側のファイルシステムを確認する

最初に、UIFlow2 上で MicroPython 自体が正常に動いているかを確認しました。 カレントディレクトリを表示すると、以下のように /flash が返ってきました。

os.getcwd()
/flash

次に、ルートディレクトリ直下の一覧を確認しました。

os.listdir('/')

結果は以下のとおりです。

['system', 'flash']

/flash は本体側のフラッシュ領域です。 この一覧に SD カード用のマウントポイントが出ていないため、少なくともこの時点では SD カードはマウントされていません。

ここで分かったのは、UIFlow2 の実行環境自体は動いているということです。 問題は Python の実行そのものではなく、SD カードの初期化またはマウント処理に絞れました。

エラー内容を画面で確認する

UIFlow2 の実行結果を追いながら、画面上にエラー内容を表示して確認しました。 そこで確認できたエラーは以下です。

OSError: (-264, 'ESP_ERR_INVALID_RESPONSE')

ESP_ERR_INVALID_RESPONSE は、名前のとおり「期待した応答が返ってこない」ことを示すエラーとして読めます。 つまり、FAT32 のファイル構造を読みにいく前の段階で、SD カードとの初期化通信がうまく成立していない可能性があります。

このエラーを見て、フォーマットだけを疑うよりも、カードとの通信そのものを疑う方向に切り替えました。 コードから見ると小さな差に見えますが、切り分けとしてはかなり重要でした。

UserDemo ファームウェアで本体側を確認する

次に、CoreS3 本体や SD スロットが壊れていないかを確認しました。 UIFlow2 のコードだけを見ていると、ソフトウェア側の設定ミスなのか、ハードウェア側の問題なのかが分かりにくいためです。

CoreS3 の UserDemo ファームウェアでは、SD カードを認識できました。 ただし、SD カード一覧画面でカードの抜き差しを行う必要がありました。

この結果から、次のことが分かりました。

  • CoreS3 本体は壊れていなさそう
  • SD カードスロットも完全に故障しているわけではなさそう
  • SD カードの検出や初期化のタイミングには癖がありそう

UserDemo で一応認識できるため、最初は「UIFlow2 のコード側で何か間違っているのでは」と考えました。 一方で、カードの抜き差しが必要だった点は気になりました。 この時点で、カード側の応答タイミングや相性も候補に入れておくべきでした。

試したこと

原因を絞るために、以下を順番に試しました。

試したこと 目的 結果
slot=2slot=3 の切り替え UIFlow2 側のスロット指定違いを確認する 解決せず
SPI 周波数の変更 通信速度による不安定さを確認する 解決せず
FAT32 で再フォーマット ファイルシステム側の問題を除外する 解決せず
初期化前の待ち時間追加 起動直後のカード応答待ちを確認する 解決せず
エラー内容の画面出力 失敗箇所を把握する ESP_ERR_INVALID_RESPONSE を確認
UserDemo で認識確認 本体とスロットの故障を切り分ける 認識できる場面あり

特に slotfreq は、コード上で疑いやすいポイントです。 しかし今回の環境では、そこを変えても同じように初期化で失敗しました。

FAT32 で再フォーマットしても状況が変わらなかったため、ファイルシステム破損の可能性も低くなりました。 ここまで来ると、残る大きな候補は UIFlow2 側の実装差分か、SD カードそのものです。

キオクシア製 microSD カードに交換する

最終的に、別メーカーの microSD カードへ交換して確認しました。 使用したのはキオクシア製の microSD カードです。

カードを交換したあと、同じように UIFlow2 から SD カード初期化とファイルアクセスを試すと、正常に認識できました。 つまり、CoreS3 本体やスロットの故障ではなく、最初に使っていた SD カードとの相性問題だった可能性が高いです。

PC で読める SD カードであっても、組み込み機器側で安定して初期化できるとは限りません。 今回のケースでは、まさにそこにハマりました。

今回の判断ポイント

今回のトラブルで重要だった判断ポイントは、ESP_ERR_INVALID_RESPONSE を「マウント後のファイル読み込みエラー」として見なかったことです。 エラー名から考えると、カード初期化時の応答が期待どおりではない状態です。

そのため、以下の順番で切り分けると効率がよいと感じました。

  1. os.getcwd()os.listdir('/') で MicroPython の実行環境を確認する
  2. SD カードがマウントされているかを見る
  3. エラー内容を画面やログに出して確認する
  4. UserDemo など別ファームウェアで本体とスロットを確認する
  5. 早い段階で別の SD カードを試す

筆者は最初、コードやピン設定を中心に見ていました。 しかし今回の結論から考えると、別の SD カードを試すタイミングをもっと早くしてもよかったです。

同じエラーが出たときに確認したいこと

M5Stack CoreS3 + UIFlow2 で以下のようなエラーが出た場合は、SD カード相性も候補に入れるとよさそうです。

OSError: (-264, 'ESP_ERR_INVALID_RESPONSE')

確認する順番としては、次の流れが分かりやすいと思います。

優先度 確認内容 理由
1 別の SD カードへ交換する 相性問題なら最短で切り分けできる
2 FAT32 で再フォーマットする ファイルシステム側の問題を除外できる
3 UserDemo で認識するか確認する 本体やスロットの故障を切り分けできる
4 UIFlow2 のバージョンを確認する ファームウェア側の差分を確認できる
5 SD 初期化前に待ち時間を入れる 起動直後の応答タイミングを調整できる

特に、SD カード交換は地味ですが強い切り分け方法です。 コードを何度も書き換える前に、手元に別のカードがあれば先に試す価値があります。

まとめ

M5Stack CoreS3 + UIFlow2 で microSD カードを使おうとしたところ、OSError: (-264, 'ESP_ERR_INVALID_RESPONSE') が発生して初期化できませんでした。 slot や SPI 周波数、FAT32 フォーマット、UserDemo での確認などを試した結果、最終的にはキオクシア製 microSD カードへ交換することで正常に使えるようになりました。

今回の作業で改めて感じたのは、組み込み機器では「PC で読めるカードだから問題ない」とは言い切れないことです。 SD カードまわりで初期化応答のエラーが出る場合は、コードやピン設定だけでなく、カードそのものの相性も早めに疑うとよさそうです。 次はこの SD カードを使って、音楽プレーヤーか電子フォトスタンドのどちらかを実際に作ってみたいと思います。

コメント

タイトルとURLをコピーしました