Jak połączyć moduł karty MicroSD z ESP32 za pomocą Arduino IDE

Jak Polaczyc Modul Karty Microsd Z Esp32 Za Pomoca Arduino Ide



ESP32 to zaawansowana płytka mikrokontrolera, która może łączyć się z różną liczbą urządzeń peryferyjnych. Podobnie jak inne czujniki, moduł karty MicroSD można również połączyć z ESP32. Możesz użyć czujnika karty MicroSD do zastosowań związanych z rejestracją danych lub zwiększyć pojemność płytki mikrokontrolera.

W tym artykule wyjaśniono kroki łączenia karty MicroSD z płytką ESP32 za pomocą Arduino IDE.

Spis treści:







1. Moduł karty MicroSD



2. Jak połączyć ESP32 z modułem karty MicroSD



3. Sprzęt





4. Kod

5. Wyjście



6. Wykonywanie różnych funkcji na karcie MicroSD za pomocą ESP32

Wniosek

1. Moduł karty MicroSD

Moduł karty MicroSD to czujnik ESP32, który umożliwia podłączenie karty SD do płytki mikrokontrolera. Działa poprzez protokół komunikacyjny SPI. Umożliwia ESP32 lub dowolnej innej płytce mikrokontrolera, takiej jak Arduino, dostęp do danych przechowywanych na karcie SD za pośrednictwem protokołu SPI.

Napięcie robocze modułu karty SD wynosi 3,3 V, dlatego nie ma możliwości bezpośredniego podłączenia go do ESP32, ani żadnej innej płytki mikrokontrolera. W tym celu musimy zastosować moduł karty SD lub czujnik pracujący powyżej 5V.

1.1. Pinout

Karta MicroSD ma w sumie sześć pinów. Dwa z nich to piny zasilania: VCC i GND. Natomiast do odczytu cztery piny wykorzystywane są przez protokół komunikacyjny SPI. Poniżej znajdują się szczegóły dotyczące wszystkich sześciu pinów:

Piny zasilania:

  • VCC: Łączy się z pinem ESP32 5V.
  • GND: Łączy się z pinem masy (GND) ESP32.

Piny SPI:

  • MISO: (Master In Slave Out) Łączy się z pinem ESP32 MOSI (Master Out Slave In).
  • PALIĆ: Łączy się z pinem ESP32 MISO (Master In Slave Out).
  • SCK: Łączy się z pinem ESP32 SCK (zegar szeregowy).
  • SS: (Slave Select) Łączy się z pinem określonym w kodzie Arduino jako pin SS (Slave Select).

2. Jak połączyć ESP32 z modułem karty MicroSD

Aby połączyć ESP32 z modułem karty MicroSD, musisz skonfigurować piny zasilania dla czujnika karty SD. Następnie skonfiguruj piny SPI. Tutaj masz dwie możliwości: możesz ustawić domyślne piny SPI lub zdefiniować własne, niestandardowe piny SPI.

Używając domyślnych pinów SPI, dodamy SD godz I SD_MMC.h biblioteki. Domyślnie biblioteki te wykorzystują piny VSPI SPI (23, 19, 18, 5) do komunikacji SPI. Można jednak ustawić także inne piny do komunikacji SPI.

ESP32 zawiera dwa interfejsy SPI HSPI i VSPI z następującymi szczegółami pinów:

SPI PALIĆ MISO CLK CS
VSPI D23 D19 D18 D5
HSPI D13 D12 D14 D15

Powiązany: Informacje dotyczące pinów ESP32 – kompletny przewodnik

2.2. Przygotuj kartę SD

Następnie, zanim będziesz mógł kontynuować odczytywanie i zapisywanie danych na karcie MicroSD, najpierw musisz ją skonfigurować, formatując wszelkie znajdujące się na niej wcześniej dane.

Otwórz kartę SD za pomocą dowolnego czytnika kart i format To.

Wybierz system plików FAT32 dla swojej karty i kliknij Początek .

Po sformatowaniu karty wybierz OK .

Teraz Twoja karta SD jest gotowa do połączenia z ESP32 za pomocą modułu karty SD.

2.3. Schemat

Aby podłączyć czujnik karty MicroSD do ESP32 należy postępować zgodnie z poniższą konfiguracją:

Poniżej znajduje się tabela konfiguracji pinów przewodu połączeniowego:

Karta micro sd ESP32
GND GND
VCC PRZYCHODZIĆ
CS D5
PALIĆ D23
SCK D18
MISO D19

3. Sprzęt

Jeśli chodzi o sprzęt, potrzebujesz tylko przewodów połączeniowych, płytki prototypowej wraz z ESP32 i modułem karty SD.

4. Kod

Teraz napiszemy kod, który utworzy plik tekstowy na karcie MicroSD, a następnie zapisze do niego ciąg tekstowy. Po zakończeniu odczytamy zawartość pliku tekstowego na monitorze szeregowym Arduino IDE.

Uruchom Arduino IDE i skompiluj podany kod. Następnie wypal go na płycie ESP32:

#include

#include

Plik mój plik ;
konst wew CS = 5 ;

// Zapisz podaną wiadomość do pliku o określonej ścieżce
próżnia Zapisz plik ( konst zwęglać * ścieżka , konst zwęglać * wiadomość ) {
// Otwórz plik. Obsługuje otwieranie jednego pliku na raz
// zamknij inny plik przed otwarciem nowego
mój plik = SD. otwarty ( ścieżka , PLIK_ZAPIS ) ;

Jeśli ( mój plik ) {
Seryjny. drukuj ( „Pisanie do %s” , ścieżka ) ;
mój plik. drukuj ( wiadomość ) ;
mój plik. zamknąć ( ) ; // Zamknij plik
Seryjny. drukuj ( 'zakończony.' ) ;
} w przeciwnym razie {
Seryjny. drukuj ( „błąd podczas otwierania pliku” ) ;
Seryjny. drukuj ( ścieżka ) ;
}
}

// Wydrukuj zawartość pliku w określonej ścieżce
próżnia Przeczytaj plik ( konst zwęglać * ścieżka ) {
// Otwórz plik
mój plik = SD. otwarty ( ścieżka ) ;
Jeśli ( mój plik ) {
Seryjny. drukuj ( „Czytanie pliku z %s \N ' , ścieżka ) ;
// Czytaj cały plik aż do ostatniego
chwila ( mój plik. dostępny ( ) ) {
Seryjny. pisać ( mój plik. Czytać ( ) ) ;
}
mój plik. zamknąć ( ) ; // Zamknij plik
} w przeciwnym razie {
// Jeśli nie udało się otworzyć pliku, wypisz błąd:
Seryjny. drukuj ( „Błąd podczas otwierania pliku test.txt” ) ;
}
}

próżnia organizować coś ( ) {
Seryjny. zaczynać ( 9600 ) ;
opóźnienie ( 500 ) ;
chwila ( ! Seryjny ) { ; }

Seryjny. drukuj ( „Inicjowanie karty SD…” ) ;
Jeśli ( ! SD. zaczynać ( CS ) ) {
Seryjny. drukuj ( 'Inicjalizacja nieudana!' ) ;
powrót ;
}
Seryjny. drukuj ( „Inicjalizacja zakończona”. ) ;

Zapisz plik ( „/test.txt” , „Linuxhint.com” ) ;
Przeczytaj plik ( „/test.txt” ) ;
}

próżnia pętla ( ) {

}

4.1. Wyjaśnienie kodu

Dla lepszego zrozumienia podzielimy ten kod na podczęści.

Inicjalizacja i konfiguracja: Po pierwsze, kod rozpoczął się od dołączenia kilku ważnych bibliotek związanych z modułem karty SD. Dodano bibliotekę SPI.h do komunikacji z kartą SD oraz SD.h do obsługi operacji na karcie SD. Następnie definiuje zmienną globalną mój plik typu file do zarządzania operacjami na plikach. Stała CS jest ustawiona na pin 5, który będzie używany jako pin CS (Chip Select) dla karty SD.

Funkcja konfiguracji(): Wewnątrz funkcji konfiguracji rozpoczyna się komunikacja szeregowa. Następnie zainicjowaliśmy moduł karty SD za pomocą funkcji SD.begin(CS). Ponadto zdefiniowaliśmy dwie różne funkcje do czytania i zapisywania tekstu w pliku tekstowym.

Zapisywanie na karcie SD: Funkcja WriteFile() otwiera plik test.txt do zapisu przy użyciu SD.open(ścieżka, FILE_WRITE). Następnie zapisuje do pliku ciąg Linuxhint.com, używając myFile.println(message).

Odczyt z karty SD: Do odczytania zawartości pliku wykorzystaliśmy funkcję ReadFile(). Jeśli odczytanie zakończy się pomyślnie, dane zostaną przesłane do portu szeregowego Arduino i wyświetlone na monitorze szeregowym Arduino IDE.

5. Wyjście

Na wyjściu widać ten sam ciąg znaków, który zdefiniowaliśmy w kodzie Arduino IDE, który jest wyświetlany na monitorze szeregowym Arduino IDE.

6. Wykonywanie różnych funkcji na karcie MicroSD za pomocą ESP32

Możemy wykonywać różne operacje, takie jak tworzenie, usuwanie lub dodawanie katalogów na kartach MicroSD bezpośrednio za pomocą kodu Arduino IDE.

6.1. Tworzenie katalogów na karcie MicroSD

Poniższy kod utworzy nowy katalog na karcie MicroSD. Definiuje funkcję tzw utwórzDir który pobiera obiekt systemu plików (fs::FS) i ścieżkę jako dane wejściowe. Ta funkcja próbuje utworzyć katalog o określonej ścieżce i wyświetla komunikaty informujące o powodzeniu lub niepowodzeniu.

#include „FS.h”

#include „SD.h”

#include „SPI.h”

próżnia utwórzDir ( fs :: FS & fs , konst zwęglać * ścieżka ) {

Seryjny. drukuj ( „Tworzenie katalogu: %s \N ' , ścieżka ) ;

Jeśli ( fs. mkdir ( ścieżka ) ) {

Seryjny. drukuj ( „Reż. stworzony” ) ;

} w przeciwnym razie {

Seryjny. drukuj ( „mkdir nie powiódł się” ) ;

}

}

próżnia organizować coś ( ) {



Seryjny. zaczynać ( 115200 ) ;

// Zainicjuj kartę SD

Jeśli ( ! SD. zaczynać ( ) ) {

Seryjny. drukuj ( „Nie udało się zamontować karty” ) ;

powrót ;

}

// Utwórz katalog o nazwie „mydir”

utwórzDir ( SD , „/mójkatalog” ) ;

}

próżnia pętla ( ) {



}

Na wyjściu widać, że tworzony jest nowy katalog /mydir nazwa.

6.2. Wyświetlanie katalogów na karcie MicroSD

W poniższym kodzie wyświetlimy listę wszystkich katalogów znajdujących się na karcie MicroSD. The listareż funkcja rekurencyjnie wyświetla zawartość katalogu na karcie SD. Wypisuje informacje zarówno o katalogach (z przedrostkiem „DIR”), jak i plikach (z przedrostkiem „FILE”), łącznie z ich nazwami i rozmiarami.

#include „FS.h”
#include „SD.h”
#include „SPI.h”

próżnia listaDir ( fs :: FS & fs , konst zwęglać * nazwa katalogu , uint8_t poziomy ) {
Seryjny. drukuj ( „Katalog z listą: %s \N ' , nazwa katalogu ) ;
Katalog główny pliku = fs. otwarty ( nazwa katalogu ) ;
Jeśli ( ! źródło ) {
Seryjny. drukuj ( „Nie udało się otworzyć katalogu” ) ;
powrót ;
}
Jeśli ( ! źródło. jestKatalog ( ) ) {
Seryjny. drukuj ( „To nie jest katalog” ) ;
powrót ;
}
Plik plik = źródło. otwórz następny plik ( ) ;
chwila ( plik ) {
Jeśli ( plik. jestKatalog ( ) ) {
Seryjny. wydrukować ( ' TY : ' ) ;
Seryjny. drukuj ( plik. nazwa ( ) ) ;
Jeśli ( poziomy ) {
listaDir ( fs , plik. nazwa ( ) , poziomy - 1 ) ;
}
} w przeciwnym razie {
Seryjny. wydrukować ( ' PLIK: ' ) ;
Seryjny. wydrukować ( plik. nazwa ( ) ) ;
Seryjny. wydrukować ( ' ROZMIAR: ' ) ;
Seryjny. drukuj ( plik. rozmiar ( ) ) ;
}
plik = źródło. otwórz następny plik ( ) ;
}
}

próżnia organizować coś ( ) {
Seryjny. zaczynać ( 115200 ) ;
Jeśli ( ! SD. zaczynać ( ) ) {
Seryjny. drukuj ( „Nie udało się zamontować karty” ) ;
powrót ;
}
listaDir ( SD , „/” , 0 ) ;
}

próżnia pętla ( ) {

}

Na wyjściu możesz zobaczyć dwa różne pliki. Jeden to plik tekstowy, drugi to katalog, który utworzyliśmy w poprzednim kodzie.

6.3. Usuwanie katalogów

Teraz usuniemy wcześniej utworzone katalogi i pliki tekstowe. W tym celu użyjemy usuńDir funkcja, spróbuje usunąć katalog określony przez ścieżkę. Jeśli się powiedzie, drukuje Dyrektor usunięty ; w przeciwnym razie drukuje rmdir nie powiódł się .

#include „FS.h”
#include „SD.h”
#include „SPI.h”

próżnia usuńDir ( fs :: FS & fs , konst zwęglać * ścieżka ) {
Seryjny. drukuj ( „Usuwanie katalogu: %s \N ' , ścieżka ) ;
Jeśli ( fs. jest rm ( ścieżka ) ) {
Seryjny. drukuj ( „Katalog usunięty” ) ;
} w przeciwnym razie {
Seryjny. drukuj ( „rmdir nie powiódł się” ) ;
}
}

próżnia organizować coś ( ) {
Seryjny. zaczynać ( 115200 ) ;

Jeśli ( ! SD. zaczynać ( ) ) {
Seryjny. drukuj ( „Nie udało się zamontować karty” ) ;
powrót ;
}


}

próżnia pętla ( ) {

}

6.4. Uzyskaj typ karty MicroSD

Karta microSD lub S bezpieczny D Karta igital została pierwotnie zaprojektowana przez stowarzyszenie kart SD i przeznaczona do użytku w urządzeniach przenośnych, takich jak smartfony i aparaty fotograficzne. Karty SD zawierają głównie cztery typy rodzin:

  • SDSC (SD o standardowej pojemności): Karty te oferują skromny zakres pojemności 2 GB i korzystają z systemów plików FAT-12 i FAT-16.
  • SDHC (SD o dużej pojemności): Karty te mają pojemność od 2 GB do 32 GB i korzystają z systemu plików FAT-32.
  • SDXC (SD o zwiększonej pojemności): Karty te korzystają z systemu plików exFAT i mają pojemności od 32 GB do nawet 2 TB.
  • SDIO: Karty SDIO służą dwóm celom, łącząc przechowywanie danych z funkcjami WEJŚCIA/WYJŚCIA.

Aby sprawdzić typ karty, uruchom poniższy kod:

#include „FS.h”
#include „SD.h”
#include „SPI.h”

próżnia organizować coś ( ) {
Seryjny. zaczynać ( 115200 ) ;

Jeśli ( ! SD. zaczynać ( ) ) {
Seryjny. drukuj ( „Nie udało się zamontować karty” ) ;
powrót ;
}

uint8_t typ karty = SD. typ karty ( ) ;
Jeśli ( typ karty == KARTA_Brak ) {
Seryjny. drukuj ( „Brak podłączonej karty SD” ) ;
powrót ;
}

Seryjny. wydrukować ( „Typ karty SD:” ) ;
Jeśli ( typ karty == KARTA_MMC ) {
Seryjny. drukuj ( „MMC” ) ;
} w przeciwnym razie Jeśli ( typ karty == KARTA_SD ) {
Seryjny. drukuj ( „SDSC” ) ;
} w przeciwnym razie Jeśli ( typ karty == KARTA_SDHC ) {
Seryjny. drukuj ( „SDHC” ) ;
} w przeciwnym razie {
Seryjny. drukuj ( 'NIEZNANY' ) ;
}

uint64_t Rozmiar karty = SD. Rozmiar karty ( ) / ( 1024 * 1024 ) ;
Seryjny. drukuj ( „Rozmiar karty SD: %lluMB \N ' , Rozmiar karty ) ;
}

próżnia pętla ( ) {
}

Jako, że mam kartę 32 GB, widać, że mieści się ona w przedziale SDHC karty.

6.5. Uzyskaj rozmiar karty MicroSD

Rozmiar karty SD można również sprawdzić, przesyłając poniższy kod na płytkę ESP32.

#include „FS.h”
#include „SD.h”
#include „SPI.h”

próżnia organizować coś ( ) {
Seryjny. zaczynać ( 115200 ) ;

Jeśli ( ! SD. zaczynać ( ) ) {
Seryjny. drukuj ( „Nie udało się zamontować karty” ) ;
powrót ;
}

uint8_t typ karty = SD. typ karty ( ) ;
Jeśli ( typ karty == KARTA_Brak ) {
Seryjny. drukuj ( „Brak podłączonej karty SD” ) ;
powrót ;
}

uint64_t Rozmiar karty = SD. Rozmiar karty ( ) / ( 1024 * 1024 ) ;
Seryjny. drukuj ( „Rozmiar karty SD: %lluMB \N ' , Rozmiar karty ) ;

// Można tu wywołać inne funkcje (listDir, createDir, RemoveDir itp.).
}

próżnia pętla ( ) {

}

Na wyjściu widać, że mam kartę SD o pojemności około 30 GB.

Wniosek

Moduł karty MicroSD służy do odczytu i zapisu danych z karty SD za pomocą płytki ESP32. Moduł karty MicroSD komunikuje się z mikrokontrolerem za pomocą interfejsu SPI. Możesz więc użyć biblioteki SPI lub zdefiniować własne piny SPI w kodzie. Po podłączeniu możesz czytać, zapisywać pliki tekstowe lub tworzyć nowe katalogi na karcie SD.