При выполнении проектов на 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 МОДУЛЬ”»
Здравствуйте! А как сделать чтобы через час создался новый файл? Для даталлогера нужно.