ESP32にmicroSD接続

ESP32にmicroSD接続

ESP32にmicroSD接続

ESP32にmicroSDカードを接続します。
データやHTMLなどストレージがあった方が便利ですしね。
また秋月電商さんで調達しました。

買ったのは以下になります。

マイクロSDカードスロットDIP化キット 300円


マイクロSDカード 16GB 680円

後は10kΩの抵抗を2個ですね。
流石に抵抗一個とかは買えないので100本入りとかになっちゃいますけど。

配線

以下を参考にESP32と接続してください。

microSD SPI ESP32
DAT2 - -
CD/DAT3 CS GPIO(16) CS
CMD DI GPIO(17) MOSI
VDD VDD VDD33
CLK SCLK GPIO(18) CLK
VSS VSS GND
DAT0 DO GPIO(19) MISO
DAT1 - -
SWA - -
SWB - -

VDD(3.3V)とGND以外は4本接続すればいいだけです。
CLKとCSは10kΩの抵抗でプルアップしておくと安定するようです。
ESP32のGPIOは16~19を指定してますが、これはプログラムで変更できるのでGPIOならどのピンでも構いません。

こんな感じになりました。

プログラム

ESP-IDFのサンプルから適当なものを選んで動作確認だけしてみます。
F1 (またはCtrl+Shift+P)でコマンドパレットを開いて “ESP-IDF: Show Examples Projects” を選択。
一覧から protocols - http_server - file_serving を選択。
menuconfig を開いて HTTP file_serving example menuUse SD card for file storage をチェックを入れる、そして Use SDMMC host のチェックを外します。
そうすると SD card pin configuration (SPI) の項目が出てきますので、以下のようにGPIOに16~19までの番号を割り当てます。

Save ボタンで保存したらビルド & フラッシュでESP32に書き込みます。

動作確認

ESP32にブラウザでアクセスします。IPアドレスはモニタ上に表示されています。http://192.168.1.10/ などでブラウザにアクセスしてください。
以下のような画面が出てきます。

適当なファイルをアップロードするとこんな感じです。
アップロードしたファイルはSDカード上にちゃんと保存されています。

SDカードは外してWindowsで中身をみるとちゃんと入ってます。

プログラム

サンプルの該当箇所を見て見るとこんな感じで初期化されてました。

esp_err_t example_mount_storage(const char* base_path)
{
    esp_vfs_fat_sdmmc_mount_config_t mount_config = {
        .format_if_mount_failed = false,
        .max_files = 5,
        .allocation_unit_size = 16 * 1024
    };
    esp_err_t ret;
    sdmmc_card_t* card;

    sdmmc_host_t host = SDSPI_HOST_DEFAULT();
    spi_bus_config_t bus_cfg = {
        .mosi_io_num = CONFIG_EXAMPLE_PIN_MOSI,
        .miso_io_num = CONFIG_EXAMPLE_PIN_MISO,
        .sclk_io_num = CONFIG_EXAMPLE_PIN_CLK,
        .quadwp_io_num = -1,
        .quadhd_io_num = -1,
        .max_transfer_sz = 4000,
    };

    ret = spi_bus_initialize(host.slot, &bus_cfg, SDSPI_DEFAULT_DMA);
    if (ret != ESP_OK) {
        ESP_LOGE(TAG, "Failed to initialize bus.");
        return ret;
    }

    sdspi_device_config_t slot_config = SDSPI_DEVICE_CONFIG_DEFAULT();
    slot_config.gpio_cs = CONFIG_EXAMPLE_PIN_CS;
    slot_config.host_id = host.slot;
    ret = esp_vfs_fat_sdspi_mount(base_path, &host, &slot_config, &mount_config, &card);

    sdmmc_card_print_info(stdout, card);
    return ESP_OK;
}

menuconfigで設定したGPIOは以下のように定義されてます。

定義
CONFIG_EXAMPLE_PIN_MOSI 17
CONFIG_EXAMPLE_PIN_MISO 19
CONFIG_EXAMPLE_PIN_CLK 18
CONFIG_EXAMPLE_PIN_CS 16

spi_bus_initialize でSPIバスの初期化を行って。
esp_vfs_fat_sdspi_mount でFATファイルシステムにマウント。
sdmmc_card_print_info はカード情報を出力するだけです。

初期化はこれだけですね。パラメータは色々ありますけど結構簡単になってます、ほぼライブラリがやってくれる感じ。

ファイルの読み込みや書き込みなんかはC言語標準のFILEが使えます。
fopen, fread, fwrite, fclose ですね、普通に使えるようです。
パスの指定はLinux系なので /data/EXCEL1.TXT とかになります。

ESP32は元々ファイルシステムを内部的に持ってるのかな?
esp_vfs_fat_sdspi_mountを実行する際にbase_pathを指定して、そのディレクトリにマウントされる形です。
base_pathが “/data” なら SDカードは “/data” にマウントされます。


これならPCとあまり変わらない感じに操作できて分かり易いです。
SDカードにWebPackなんかを詰め込んでやればC言語でHTML書かなくて済みそうですね。ありがたい。

コメント

このブログの人気の投稿

(真)ESP32の開発環境をVSCodeで作る

ESP32でデバッグ