При выполнении проектов на 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
данные могут отличаться , в зависимости от типа кары sd
вот что у меня получилось :
Байт Запись, мс Чтение, мс
1 25 2
256 35 11
1024 66 39
как видно, работа с sd библиотекой очень простая.
Надеюсь кому нибудь будет полезна информация этой статьи.
Жду вашей критики, предложений и пожеланий. Спасибо.
ДА ПРИБУДЕТ С ТОБОЙ СИЛА!!!

0 комментариев на «“SD-CARD МОДУЛЬ”»
Здравствуйте! А как сделать чтобы через час создался новый файл? Для даталлогера нужно.