背景
ESP32-WROOM-32Eの開発ボード(秋月)を使用してSDMMCでmicroSDカードに読み書きをしようとしましたが、色々エラーが起きて大変だったためメモします。
環境
- PlatformIO
- Windows11 or macOS Sonoma
- pythonインストール済み
方法
1. コードを書く
main.cpp
に以下のコードを書きます。
#include <Arduino.h>
#include <SD_MMC.h>
const char *filename = "/test.txt";
bool is_sd_initialized = false;
void setup() {
Serial.begin(115200);
Serial.println("SDMMC Initiating...");
bool result = SD_MMC.begin("/root", true, false);
if (result) {
Serial.printf("SDMMC initialized successfully\n");
} else {
Serial.printf("SDMMC initialization failed\n");
}
is_sd_initialized = result;
}
void loop() {
if (!is_sd_initialized) {
return;
}
static int count = 0;
Serial.printf("count: %d\n", count++);
// SDカードにファイルを書き込む
File file = SD_MMC.open(filename, FILE_APPEND);
if (!file) {
Serial.printf("Failed to open file for writing\n");
return;
}
file.println(count);
file.close();
delay(1000);
}
2. ピンを接続する
次の表の様にピンを接続します。
ESP32 pin | SD card pin | メモ |
---|---|---|
IO14 | CLK | 10kΩ プルアップ |
IO15 | CMD | 10kΩ プルアップ |
IO2 | D0 | 10kΩ プルアップ |
IO4 | D1 | 10kΩ プルアップ |
IO12 | D2 | 10kΩ プルアップ |
IO13 | D3 | 10kΩ プルアップ |
3.3V | VDD | 容量大きめのパスコンを配置 |
GND | VSS |
この時、3.3VとGNDの間にパスコンを配置するのを忘れないでください。
3. 書き込み設定を変更する
ESP32は起動時のIO12の電圧で、フラッシュメモリの動作電圧を切り替える機能があるみたいです。
この記事を参考に、IO12の電圧に関わらず、フラッシュメモリの動作電圧を3.3Vに固定するための設定をします。
3-1. esptoolのインストール
次のコマンドを実行してesptoolをインストールします。
pip install esptool
3-2. 設定の確認
現在の設定を確認します。
espefuse.py --port <ポート> summary
<ポート>には、使用しているポートの名称を入れてください。
(例)
- Windows:COM5
- Mac:/dev/tty.usbserial-3120
ここで、XPD_XXXXXの部分(下の方)が0になっていればOKです。
3-3. 設定を変更する
次のコマンドで、フラッシュメモリの動作電圧を3.3Vに設定します。
espefuse.py --port <ポート> set_flash_voltage 3.3V
4. 書き込む
IO2がプルアップされた状態だとESP32に書き込むことができないため、IO2のプルアップを一度外してください。
その後、PlatformIOで書き込みます。
書き込み終わったら再びIO2のプルアップを繋げてください。
5. 確認する
しばらくコードを実行した後、SDカードを外してPCに接続し確認すると、text.txt
が作成され、その中に
1
2
3
4
5
...
と書き込まれているはずです。
最後に
SDカードのパスコンがなかったり、容量が小さいと早い速度では読み書きができませんでした。
これに気づくまで時間がかかりました😢
初めてのQiitaでの記事なので、間違い等がありましたらコメントで教えてください。
参考にしたサイト等