Kurs Arduino #16: Obsługa kart SD

KURS 16Cześć,
w dzisiejszej części chcielibyśmy Wam pokazać w jaki sposób obsługiwać karty SD. Zapraszamy

 

 

 

 

 

 

 

Spis treści:

  1. Co to jest karta SD, podstawowe parametry
  2. Podstawowe funkcje do obsługi karty
  3. Pierwszy program: Zapis do karty SD
  4. Drugi program: Odczyt z karty SD

Co będziemy potrzebować:

Zaczynamy ;)

 

1.Co to jest karta SD, podstawowe parametry

Karta SD, a dokładniej Standard SD (ang. secure digital) to jeden ze standardów kart pamięci opracowany przez firmy Panasonic, SanDisk i Toshiba w 2000 roku. Karty SD charakteryzują się niewielkimi wymiarami (24 × 32 × 2,1 mm).
Karty SD posiadają 9 wyprowadzeń. Dodatkowo karta SD ma na brzegu przełącznik blokujący możliwość zapisu. Karta SD operuje na napięciu 3,3V.

sd-card-pinout

Przy zakupie kart mamy do wyboru rodzaj standardu oraz klasę karty. Można powiedzieć, że standard karty oznacza między innymi zakres pamięci karty

  • SD (8MB – 2GB)
  • SDHC (4GB – 32GB)
  • SDXC (64GB – 2TB)

Natomiast klasa karty określa prędkość odczytu i zapisu z karty (tutaj panuje zasada „im wyższy numer tym lepsza”):

odczyt (zapis)

  • klasa 2: 16 Mb/s (2 MB/s)
  • klasa 4: 32 Mb/s (4 MB/s)
  • klasa 6: 48 Mb/s (6 MB/s)
  • klasa 10: 80 Mb/s (10 MB/s)

Na potrzeby tej części kursu powiem, że mikrokontrolery są w stanie bezproblemowo obsługiwać karty SD do 4GB klasy 4. Oczywiście są również wyjątki, jakim jest w moim przypadku karta SDHC 8GB klasy 4. Karta musi być sformatowana w systemie FAT16/FAT32.
Karta SD łączy się z mikrokontrolerem przy pomocy interfejsu SPI, w którego skład wchodzą piny MISO, MOSI, SCK, CS.

2. Podstawowe funkcje do obsługi karty

Teraz opiszę funkcję, które musimy znać, aby być w stanie bez problemu obsługiwać kartę SD.

Na początku musimy dodać biblioteki obsługujące interfejs SPI oraz standard SD:

Następnie tworzymy instancję do klasy File, która jest odpowiedzialna m.in. za operacje na plikach:

Instancji File możemy nadać dowolną nazwę, ja nadałem po prostu nazwę plik.

Uruchamiamy obsługę karty. Można to zrobić na dwa sposoby:

  1. Dajemy Arduino bezpośrednią informację, że karta jest podłączona. On wtedy nie sprawdza stanu faktycznego tylko próbuje wykonywać program
  2. Arduino sprawdzi czy karta jest podłączona do Arduino i wtedy podejmie decyzję co zrobić.

W pierwszym przypadku po prostu piszemy:

Drugi sposób opiera się na sprawdzeniu warunku:

Sprawdź czy nie ma karty, wstawiając operator zaprzeczenia „!”. Jeżeli karta nie zostanie wykryta to wydrukuj komunikat i przerwij wykonywanie programu przy pomocy funkcji return. Wtedy dalsza część programu nie będzie wykonywana. Dopiero po włożeniu karty i ponownym zresetowaniu Arduino będzie wykonywana dalsza część programu.

Teraz, gdy Arduino już wie, czy karta jest podłączona czy nie to możemy przejść do wykonywania operacji na plikach.

Możemy sprawdzić czy w pamięci karty znajduje się dany plik, w następujący sposób:

W nazwie pliku musi się znajdować również rozszerzenie. Ważne aby nazwy plików nie były dłuższe niż 8 znaków i nie zawierały specjalnych znaków.

Kolejną funkcją tworzymy plik, otwieramy oraz przyznajemy prawa zapisu i odczytu danych:

plik to reprezentacja instancji, w nazwie pliku podajemy również nazwę maksymalnie 8 znakową wraz z rozszerzeniem, a przy pomocy FILE_WRITE przyznajemy prawa zapisu i odczytu. Możemy jeszcze użyć FILE_READ, ale wtedy przyznamy tylko prawa do odczytu danych z pliku. Przy operacji na plikach ważne jest, iż jednocześnie może być otwarty tylko jeden plik.

Do usuwania plików, używam analogicznie SD.remove() z pominięciem instancji:

Jeżeli tworzymy jakiś rozbudowany projekt to możemy również tworzyć katalogi na karcie przy pomocy funkcji:

Literki a b c oznaczają strukturę katologów, czyli zostanie utworzony folder „c” w folderze „b” i te oba foldery jeszcze w folderze „a”. Aby zapisać jakiś plik w takiej strukturze to musimy użyć funkcji SD.open:

Gdybyśmy nie poprzedzili ścieżki do pliku po przez „/” to by utworzyło plik o takiej nazwie jak wygląda ścieżka.

W taki sam sposób działa usuwanie katalogów, tylko, że zamiast mkdir piszemy rmdir:

Teraz przejdźmy do operacji na plikach:

Przy pomocy poniższej funkcji możemy zapisywać dane do pliku:

plik to instancja klasy File. Zasada obsługi print jest taka sama jak dla UARTu, czyli print– pisanie w jednej linii, println– pisanie od nowej linii.

Aby odczytać dane to już nie jest tak łatwo- tzn. nie przy pomocy jednej funkcji ;)

Najpierw musimy sprawdzić czy w danym pliku są jakieś dane (bajty danych) do odczytania przy pomocy:

Następnie gdy jakieś dane będą to musimy wykorzystać funkcję:

Nie mniej jednak nie można wpisać tak bezpośrednio tych funkcji, tylko muszą tworzyć logiczną całość, ale o tym później ;)

Okej „przebrnęliśmy” przez podstawowe funkcje. Wydaje się, że jest ich dużo, ale jak zobaczycie sposób ich wykorzystania to się okaże, że obsługa kart jest banalnie prosta ;)