ESP32-CAM - použití SD karty v 1-bitovém režimu

20.11.2022 Arduino #esp32 #esp32cam #sdkarta

Návod jak upravit programový kód pro ESP32-Cam, aby fungoval zápis na SD kartu a zároveň šlo pracovat se signalizační diodou.


ESP32 se připojuje k SD kartě přes SDMMC Host Driver, přesněji přes slot 1. Je to 4-bitový slot a využívá HS2_*signály v PIN MUX. Následující tabulka ukazuje mapování pinů a signálů (srov. schematický diagram):

 

Signál GPIO Komentář
HS2_CMD GPIO15 Vystaveno
HS2_CLK GPIO14 Vystaveno
HS2_DATA0 GPIO02 Vystaveno
HS2_DATA1 GPIO04 Vystaveno a také připojené k zabudované SMD LED
HS2_DATA2 GPIO12 Vystaveno
HS2_DATA3 GPIO13 Vystaveno

Jak je ukázáno výše, ESP32-CAM používá GPIO piny GPIO02GPIO04 a pro čtení GPIO13 GPIO15 zápis dat na SD kartu. Chcete-li použít SD kartu v režimu „1-Bit“ nebo „1-Wire“, stačí inicializovat SD kartu pomocí následujícího kódu (viz jádro Espressif Arduino pro ESP32):

bool begin(const char * mountpoint="/sdcard", bool mode1bit=false); // cf. SD_MMC.h
SD_MMC.begin("/sdcard", true);

Nastavením parametru mode1bit na true, ESP32-CAM pouze používá GPIO02 ke čtení a zápisu dat na SD kartu, čímž se uvolní GPIO piny GPIO04 (HS_DATA1), GPIO12 (HS_DATA2) a GPIO13 (HS_DATA3) jako další GPIO piny pro vstup nebo výstup. Chcete-li použít jeden nebo všechny tyto piny pro vstup nebo výstup, musíte po inicializaci karty SD odpovídajícím způsobem definovat pin. Jinak by inicializace SD karty znovu překonfigurovala piny. Například následující fragment kódu nakonfiguruje pin GPIO GPIO12 jako výstupní pin a nastaví jej na low:

pinMode(12, OUTPUT);
digitalWrite(4, LOW);

Vezměte prosím na vědomí, že ESP32-CAM používá také GPIO04 k připojení k vestavěnému blesku – SMD (Surface-Mount Device) LED (Light-Emitting Diode). Chcete-li zabránit rozsvícení SMD LED, použijte následující kód:

#include "SD_MMC.h"
#include "SPI.h"

#define BUILTIN_LED 4

void setup() {
    Serial.begin(115200);

    // Initialize the SD card
    if (!SD_MMC.begin("/sdcard", true)){
        Serial.println("Failed to mount SD card");
        return;
    }

    // Specify that LED pin
    pinMode(BUILTIN_LED, OUTPUT);
    digitalWrite(BUILTIN_LED, LOW);

    // Check for an SD card
    uint8_t cardType = SD_MMC.cardType();
    if (cardType == CARD_NONE){
        Serial.println("No SD card attached");
        return;
    }

    // <Put your init code here>
}

void loop() {
  // <Put your main code here, to run repeatedly>
  Serial.println("loop end, 10sec delay");
  delay(10000);
}

Literatura:

Using the SD Card in 1-Bit Mode on the ESP32-CAM from AI-Thinker [online]. 2021 [cit. 2022-11-19]. Dostupné z: https://dr-mntn.net/2021/02/using-the-sd-card-in-1-bit-mode-on-the-esp32-cam-from-ai-thinker