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 menu の Use 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書かなくて済みそうですね。ありがたい。
コメント
コメントを投稿