SD-CARD МОДУЛЬ

При выполнении проектов на Arduino большое внимание уделяется отведенной памяти. Arduino не очень щедра на этот ресурс.

ATmega 8
Память программ (FLASH) 8 Кбайт
ОЗУ(RAM) 1 Кбайт
Энергонезависимая память (EEPROM) 512 байт

ATmega168
Память программ (FLASH) 16 Кбайт
ОЗУ(RAM) 1 Кбайт
Энергонезависимая память (EEPROM) 512 байт

Atmega328
Память программ (FLASH) 32 Кбайт
ОЗУ(RAM) 2 Кбайт
Энергонезависимая память (EEPROM) 512 байт

Но есть проекты когда требуется большой банк данных и энергонезависимой памяти (EEPROM) в 512 байт не хватает.
В моем проекте требуется запись огромного количества данных и я столкнулся с такой проблемой как нехватка памяти.
Немного поискав в интернете нашел самое простое и оптимальное решение: использовать SD-CARD. Это не дорогой, но в тоже время действенный метод расширить память на нужный вам размер.
Secure Digital Memory Card.
В настоящее время именно этот формат карт широко распространен на рынке электронных технологий. вспомните любое устройство и в нем обязательно будет присутствовать SD карта.


но как же подключить это маленькое " чудо " к Arduino? это оказалось не очень сложным решением.
SD карты имеют SPI интерфейс. Давно знакомый нам и полюбившийся.
Выводы SD карты имеют следующие обозначения:

А это значит, что карту можно подключать напрямую к Arduino с небольшим дополнением: входы карты рассчитаны на 3,3 вольта. хотя сколько я не работал с картой, мне это не мешало.
Многие умельцы делают разные shield для работы с SD картами:


на нижнем фото представлен тот самый преобразователь уровней(резисторный делитель). Выглядит не очень эстетично, но зато работает.
Я же подумал зачем заморачиваться и приобрел готовый shield:SD-CARD МОДУЛЬ




Размеры:
длина  - 46 мм
ширина - 30 мм


На плате имеется стабилизатор на 3,3 В. питать данный модуль можно от 5 В Arduin'ы. так же на плате имеется гребенка 8*2. нижний ряд дублирует верхний.
с описанием модуля закончили, теперь перейдем к работе с ним.
В Arduino IDE есть готовая библиотека SD для работы с SD картами.

В библиотеке примеров Arduino уже имеется четыре тестовые программы для SD карт:
CardInfo — вывод характеристик карты;
Datalogger — пример простого журнала датчиков;
DumpFile — чтение файла и вывод его в последовательный порт;
Files — создание и удаление файла;
ListFiles — вывод списка файлов;
ReadWrite — запись/чтение файла;
Подробное описание можно найти по ссылке.

В библиотеке предусмотрены 2 класса :
SD class — доступ к карте и управление каталогами и файлами;
File class — чтение и запись отдельных файлов;

Пройдемся по функциям:

SD class:
-> begin(CS) — инициализирует библиотеку. chipSelect по умолчанию является 10 пин и он обязательно должен быть задан как выход, иначе библиотека не будет работать;

-> exists(filename) — проверяет существование файла или каталога;

-> mkdir() — создание каталога (замечу, что исключительно каталога )

-> open() — открывает файл на карте для записи. Возможен вариант SD.open(filepath, mode)- где mode FILE_READ запись с начала или FILE_WRITE -чтение и запись, начиная с конца файла;

-> remove() — удаление файл;

-> rmdir() — удаление каталога;

все эти функции возвращают false если не функция выполнилась или true если выполнилась.

File class:
-> available() — проверка, есть ли доступные байты для записи. Возвращает их количество;

-> close() — закрытие файла;

-> flush() — сохранение файла;

-> peek() — считывание байта из файла без продвижения к следующему;

-> position() — получение позиции, куда будет записываться или читаться файл;

-> print() — запись в файл данных. возможен такой вариант: file.print(data, BASE) — где BASE в какой системе исчислений писать;

-> println() — запись в фал с переносом каретки;

-> seek() — проверка существования положения в файле;

-> size() — получение размера файла в байтах;

-> read() — возвращение бит из файла с переходом к следующему;

-> write() или write(data,buf) — запись данных в файл;

теперь рассмотрим пример:

/*
  SD card read/write
 
 
 	 
 */
 
#include <SD.h>

File myFile; // создаем объект класса File 

void setup()
{
 // открываем serial порт 
  Serial.begin(9600);
  


  Serial.print("Initializing SD card...");
 
   pinMode(10, OUTPUT);
 //задаем 10 пин на выход, для корректной  работы библиотеки 
   
  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
  
  // Открываем файл. обратите внимание, что только один файл может быть открыт , 
   // Так что вы должны закрыть этот перед открытием другого.
  myFile = SD.open("test.txt", FILE_WRITE);
  
  // если файл открыт , написать в него:
  if (myFile) {
    Serial.print("Writing to test.txt...");
    myFile.println("testing 1, 2, 3.");
	// close the file:
    myFile.close();
    Serial.println("done.");
  } else {
    // если файл не открылся, печатаем ошибку:
    Serial.println("error opening test.txt");
  }
  
  // повторно открываем файл для чтения:
  myFile = SD.open("test.txt");
  if (myFile) {
    Serial.println("test.txt:");
    
    // читаем из файла, пока не закончатся биты для чтения:
    while (myFile.available()) {
    	Serial.write(myFile.read());
    }
    // закрываем файл:
    myFile.close();
  } else {
  	// если файл не открылся, печатаем ошибку:
    Serial.println("error opening test.txt");
  }
}

void loop()
{
	// здесь ничего не происходит
}


Теперь узнав как это все работает, напишем что нибудь свое. Мне стала интересна скорость записи и чтения. Переработаем немного
пример который мы разобрали выше:

#include <SD.h>

File myFile;
unsigned int time, dt1, dt2, i;
const byte CSPin = 10;
byte x;

const unsigned short len = 1024;

void setup(){
    Serial.begin(9600);
    Serial.print("Initializing SD card...\n");
    pinMode(CSPin, OUTPUT);
   
    if( !SD.begin(CSPin)) {
        Serial.println("initialization failed!");
        return;
    }

    Serial.println("initialization done.");

    SD.remove("test.txt");

    Serial.print("Write data. ");
    Serial.print(len);
    Serial.println(" bytes...");
    time = millis();
    myFile = SD.open("test.txt", FILE_WRITE);
    if (myFile) {
        for( i=0; i<len; i++ )
            myFile.write("a");
        myFile.close();
        dt1 = millis()-time;
    } else {
        Serial.println("error opening file");
    }
    Serial.print("write data time: ");
    Serial.println(dt1);
  
    Serial.println("Read data...");
    time = millis();
    myFile = SD.open("test.txt");
    if (myFile) {
        i = 0;
        while (myFile.available() && i<len) {
            x = myFile.read();
        }
        myFile.close();
        dt2 = millis()-time;
    } else {
        Serial.println("error opening file");
    }
    Serial.print("read data time: ");
    Serial.println(dt2);
}

void loop(){
}


данные могут отличаться, в зависимости от типа кары sd
вот что у меня получилось:
Байт	 Запись, мс	 Чтение, мс
 1	     25	             2
 256	     35	             11
 1024	     66	             39


как видно, работа с sd библиотекой очень простая.

Надеюсь кому нибудь будет полезна информация этой статьи.
Жду вашей критики, предложений и пожеланий. Спасибо.

ДА ПРИБУДЕТ С ТОБОЙ СИЛА!!!

Комментарии (1)

RSS свернуть / развернуть
+
0
Здравствуйте! А как сделать чтобы через час создался новый файл? Для даталлогера нужно.
avatar

Valera140582

  • 1 июля 2016, 20:19

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.