Kurs Arduino 8 - Obsluga modulu AVTduino SD.pdf

(632 KB) Pobierz
KURS
Obsługa modułu AVTDuino SD
W  listopadowym numerze
Elektroniki Praktycznej
opisaliśmy moduł AVTduino
SD (AVT1649). Umożliwia on
dołączenie karty pamięci SD do
zestawu Arduino i  zastosowanie
jej do zapamiętywania danych.
W  artykule opisano programową
obsługę modułu AVTDuino SD
dla systemu Arduino UNO. Taka
karta przyda się zwłaszcza
w  urządzeniach multimedialnych
lub do akwizycji danych,
w  których niedroga pamięć
o  dużej pojemności jest atutem
nie do przecenienia.
Moduł umożliwia obsługę kart SD jak
i SDHC z systemem plików FAT16 lub FAT32.
Te systemy plików są kompatybilne ze stoso-
wanymi w komputerach PC, więc kartę zapi-
saną przez Arduino można odczytywać np.
za pomocą Windows i vice versa. Jedynym
wymaganiem jest zastosowanie w układzie
lub zestawie Arduino UNO mikrokontrolera
o dużej pamięci np. ATmega328.
Przykładowy program opisany w artyku-
le odczyta i prześle przez RS232 parametry
karty SD i utworzy przykładowy plik tek-
stowy zawierający pewne dane. Następnie
te dane zostaną odczytane i przesłane przez
interfejs szeregowy, a utworzony wcześniej
plik zostanie usunięty.
Do obsługi karty SD jest przeznaczona
biblioteka SD.h , w której są dostępne są ko-
mendy do obsługi karty SD. Zostały on po-
dzielone na grupy SD FILE . Jak łatwo do-
myślić się, pierwsza grupa komend jest zwią-
zana z obsługą karty SD, a druga z obsługą
systemu plików.
Dodatkowe materiały na CD/FTP:
ftp://ep.com.pl , user: 15031 , pass: 40nep417
Grupa komend SD do obsługi karty pamięci
begin() inicjalizacja karty SD
exists() sprawdzenie czy istnieje plik lub katalog
o podanej nazwie
mkdir() utworzenie katalogu
open() – utworzenie lub otwarcie pliku
remove() – usunięcie pliku
rmdir() usunięcie katalogu
Wszystkie dostępne komendy do ob-
sługi kart SD można znaleźć w opisie tej
biblioteki na stronie Arduino. W przykła-
dowym programie pokazanym na listingu 1
wykorzystano tylko niektóre z pokazanych
komend przeznaczonych do obsługi karty
SD. Program odczytuje parametry karty SD,
tworzy, zapisuje, odczytuje i usuwa plik tek-
stowy.
W  pierwszej kolejności są tworzone
zmienne pomocnicze wymagane do obsłu-
gi karty SD. W programie, w procedurze
konigurującej, oprócz nastawy prędkości
interfejsu RS232 znajduje się komenda
SD.begin(8) inicjująca kartę SD. Parame-
trem wywołania jest numer linii CS inter-
fejsu karty. Za pomocą instrukcji if (!card.
init(SPI_HALF_SPEED, chipSelect)) jest
sprawdzany stan inicjalizacji. Jeśli nie
przebiegła ona poprawnie, wyświetlany
jest odpowiedni komunikat. W  proce-
durze głównej programu, za pomocą ko-
mendy card.type() , jest odczytywany typ
karty. Funkcja zwraca wartości SD1 , SD2 ,
SDHC lub nieznany . Są one przesyłane
za pomocą interfejsu RS232 do terminala
uruchomionego na komputerze PC. Dalej,
za pomocą instrukcji volume.fatType() jest
odczytywany i wysyłany rodzaj systemu
plików, dla którego jest sformatowana karta
SD. Komendy:
volumesize = volume.
blocksPerCluster();
Grupa komend FILE do obsługi plików
available() – liczba bajtów dostępnych w pliku
close() zamknięcie pliku
print() zapis danych w pliku
println() zapis danych w pliku ze znakami końca
i nowej linii
size() – wielkość pliku
read() – odczyt pojedynczego bajtu danych
write() – zapis pojedynczego bajtu danych
volumesize *= volume.
clusterCount();
volumesize *= 512;
volumesize /= 1024;
volumesize /= 1024;
Serial.print(“Pojemnosc: (Mb):
“);
Serial.println(volumesize);
służą do odczytania i obliczenia pojemno-
ści karty SD umieszczonej w złączu mo-
dułu.
Teraz w programie przykładowym z uży-
ciem instrukcji myFile=SD.open(“test.txt”,
FILE_WRITE) jest tworzony plik o  nazwie
test.txt. Zmienna myFile jest odnośnikiem
do zastosowanej karty SD. Pierwszym argu-
mentem komendy SD.open jest nazwa pli-
ku, natomiast drugim metoda jego otwarcia.
W przykładzie jest to FILE_WRITE , która two-
Rysunek 1. Komunikaty pojawiające się
w trakcie pracy programu
96
ELEKTRONIKA PRAKTYCZNA 1/2012
892232558.001.png 892232558.002.png
Obsługa modułu AVTDuino SD
rzy plik lub otwiera go do zapisu. Dostępny
jest również tryb FILE_READ – otwarcie pliku
tylko do odczytu.
Zapis przykładowych danych do utwo-
rzonego pliku test.txt odbywa się z użyciem
komendy myFile.println() . Po zapisaniu da-
nych plik zostaje zamknięty za pomocą in-
strukcji myFile.close() . Komendy:
root.openRoot(volume);
root.ls(LS_R | LS_DATE | LS_
SIZE);
służą do oczytania i wysłania do termi-
nala (za pomocą interfejsu RS232) wyka-
zu plików znajdujących się na karcie SD.
W dalszej części programu, plik test.txt jest
otwierany do odczytu, a jego zawartość jest
przesyłana przez RS232 za pomocą pole-
ceń:
if (myFile){
Serial.println(“Zawartosc pliku
test.txt:”);
while (myFile.available()){
Serial.write(myFile.read());
}
Komenda myFile.available() wskazuje
ile pozostało do odczytania danych z pli-
ku które są odczytywane z  wykorzysta-
niem komendy myFile.read() . Po odczycie
plik zostaje zamknięty z wykorzystaniem
komendy myFile.close() . Po odczycie plik
test.txt zostaje trwale usunięty z  karty
z użyciem komendy SD.remove(“test.txt”);
Argumentem jej wywołania jest nazwa pli-
ku. Instrukcja SD.exists(“test.txt”) służy do
upewnienia się, że plik testowy na pewno
został usunięty. Informacja o usunięciu lub
istnieniu pliku test.txt jest przesyłana do
komputera PC.
Komunikaty przesyłane przez program
opisywany w tym przykładzie pokazano na
rysunku 1 .
Listing 1. Przykład programu obsługi modułu AVTDuino SD
/*
Przykład obsługi modułu AVTDuino SD.
W pierwszej kolejności jest inicjowana karta SD oraz są wyświetlane informacje
o jej typie i pojemności. Na karcie SD jest otwierany plik test.txt , w którym
zostaje zapamiętany przykładowy tekst. Następnie zawartość utworzonego pliku
jest odczytywana i wywysłana do komputera PC, a plik zostaje usunięty z karty
SD. Komunikaty o operacjach wykonywane na karcie SD są wysyłane w za pomocą
RS232.
*/
#include <SD.h> //Biblioteka obsługi karty SD
Sd2Card card; //zmienne pomocnicze do obsługi karty
SdVolume volume;
SdFile root;
File myFile; //zmienna potrzebna dla utworzenia pliku
const int chipSelect = 8; //wyprowadzenie aktywujące kartę SD
void setup() //procedura koniguracyjna
{
Serial.begin(9600); //ustawienie prędkości interfejsu RS232
Serial.print(“\nInicjalizacja karty SD...”); //komunikat
SD.begin(8); //inicjacja SD
pinMode(10, OUTPUT);
//jeśli inicjalizacja nie przebiegła prawidłowo to
if (!card.init(SPI_HALF_SPEED, chipSelect)) {
Serial.println(“Brak karty”); //wyświetlenie komunikatu
while(1); //pętla pusta
}
}
void loop(void) { //procedura główna programu
Serial.print(“\nTyp karty:: “); //komunikat
switch(card.type()) { //sprawdzenie typu karty
case SD_CARD_TYPE_SD1: //jest typ SD1
Serial.println(“SD1”); //komunikat
break;
case SD_CARD_TYPE_SD2: //jesli typ SD2
Serial.println(“SD2”); //komunikat
break;
case SD_CARD_TYPE_SDHC: //jesli typ SDHC
Serial.println(“SDHC”); //komunikat
break;
default: //w przeciwnym razie
Serial.println(„Nieznany“); //typ karty nieznany
}
if (!volume.init(card)) { //sprawdzenie typu partycji karty
Serial.println(„Typ partycji nieznany“); //komunikat
while(1); //pętla pusta
}
uint32_t volumesize; //zmienna
Serial.print(“\nTyp partycji: “); //wyświetlenie typu partycji
Serial.println(volume.fatType(), DEC);
Serial.println(); //pusta linia
volumesize = volume.blocksPerCluster(); //obliczenie pojemności karty SD
volumesize *= volume.clusterCount();
volumesize *= 512;
volumesize /= 1024;
volumesize /= 1024;
Serial.print(“Pojemnosc: (Mb): “); //wyświetlenie pojemności
Serial.println(volumesize);
Serial.println(“Otwarcie pliku test.txt”); //komunikat
myFile = SD.open(“test.txt”, FILE_WRITE); //utworzenie test.txt
//plik utworzony, więc zapis komunikatu
if (myFile) {
Serial.println(“Zapis danych do pliku...”);
myFile.println(“Przykladowy tekst dla modulu AVTDuino SD”);
myFile.close(); //zamkniecie pliku
}
else { //w przeciwnym razie wyświetlenie
Serial.println(“Blad otwarcia pliku test.txt”); //komunikatu
}
Serial.println(“Wyswietlenie zawartosci karty:”); //komunikat
root.openRoot(volume); //wyświetlenie zawartości karty
root.ls(LS_R | LS_DATE | LS_SIZE);
Serial.println(“Wyswietlenie zawartosci pliku test.txt”); //komunikat
myFile = SD.open(“test.txt”); //otwarcie pliku
if (myFile) { //jeśli plik otwarty to
Serial.println(“Zawartosc pliku test.txt:”);
while (myFile.available()) { //odczyt jego zawartości
Serial.write(myFile.read()); //odczyt
}
myFile.close(); //zamkniecie pliku
}
else { //w przeciwnym razie wyświetlenie
Serial.println(“Blad otwarcia pliku test.txt”); //komunikatu
}
Serial.println(“Kasowanie pliku test.txt...”); //komunikat
SD.remove(“test.txt”); //usunięcie test.txt
if (SD.exists(“test.txt”)){ //plik usunięty?
Serial.println(“Blad usuniecia pliku test.txt.”); //komunikat
}
else { //w przeciwnym razie
Serial.println(“Plik test.txt skasowaniy.”); //komunikat
}
while(1); //pusta petla
}
Podsumowanie
Przykład dla modułu AVTDuino SD
będącego uzupełnieniem Arduino UNO
pokazuje sposób programowej obsługi
operacji na karcie SD. Jak można zauwa-
żyć, oprogramowanie Arduino zwalnia
użytkownika z  konieczności implemen-
tacji skomplikowanych funkcji obsługi
plików, a program zapisujący i odczytu-
jący dane nie jest skomplikowany. Dzięki
temu nie dosyć, że Arduino może zapa-
miętywać ogromne ilości danych, to jesz-
cze można je bez trudu przenosić w celu
obróbki czy archiwizacji na nośnik kom-
putera PC.
Zaprezentowany przykład programu
można dowolnie modyikować, tak aby
dostosować go specyiki aplikacji. Moduł
AVTduino SD będzie można z powodze-
niem zastosować w wielu budowanych
urządzeniach, w których jest wymagane
trwałe zapamiętywanie dużych plików.
Marcin Wiązania, EP
97
ELEKTRONIKA PRAKTYCZNA 1/2012
892232558.003.png
Zgłoś jeśli naruszono regulamin