Подключение SD карт к Arduino
Дата публикации: Jan 26, 2013 8:55:32 PM
Некоторое время назад я обзавелся модулем для подключения SD карт, которые я планирую использовать в ряде проектов для хранения больших объемов данных. Например, для хранения изображений с камеры, или ведения больших журналов. Как водится, модуль я приобрел в китайском магазине за небольшое количество денег. Следует отметить, что фактически я планировал приобрести вариант для подключения microSD, но слегка ошибся и заказал обычный SD, который как известно очень громоздкий :( Ну да ладно...
Модуль представляет собой довольно примитивную плату, на которой размещен контактный слот, подтягивающие резисторы для SPI шины и регулятор напряжения. Последний дает возможность подключать модуль как к +5В источнику питания, так и к +3.3В. На краю устройства имеется штыревой разъем 8x2.
На этот раз, для демонстрации я решил воспользоваться контроллером Arduino Nano 32, который ближе для большинства начинающих робототехников. В качестве тестовой карты выступила microSD на 2Гб с адаптером. Схема подключения SD модуля и Arduino Nano выглядит следующим образом:
Важно учесть, что здесь используется не сплошная нумерация ног Arduino, а нумерация цифровых выводов, то есть D10, D11, и т.п.
В библиотеке примеров Arduino уже имеется четыре тестовые программы для SD карт:
CardInfo - вывод характеристик карты;
Datalogger - пример простого журнала датчиков;
DumpFile - чтение файла и вывод его в последовательный порт;
Files - создание и удаление файла;
ListFiles - вывод списка файлов;
ReadWrite - запись/чтение файла.
Первый пример который я опробовал - CardInfo. Единственное изменение, которое следует внести в код данного примера - это заменить номер вывода CS на актуальный. В моем случае это выглядит так:
const int chipSelect = 10;
Результатом работы программы является информация о типе карты, о доступном объеме и об имеющихся на карте файлах.
Результат выполнения CardInfo
Initializing SD card...Wiring is correct and a card is present.
Card type: SD2
Volume type is FAT32
Volume size (bytes): 2037256192
Volume size (Kbytes): 1989508
Volume size (Mbytes): 1942
Files found on the card (name, date and size in bytes):
TEST.TXT 2000-01-01 01:00:00 1000
Для измерения скорости чтения/записи, я немного доработал пример "ReadWrite". Текст программы и результат её выполнения для файлов разного объема представлены ниже.
Тест скорости SD карты на Arduino
#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 карту слишком велико, чтобы её можно было использовать, например, для организации лога в мультикоптере. Ведь цикл управления в нем 20мс, что меньше чем время записи даже одного байта на SD карту. Однако, существуют методы работы с памятью карты в обход файловой системы, что может значительно ускорить работу с ней.
В ближайшее время я попробую записать на карту изображение с видео-модуля OV7670, о чем обязательно отчитаюсь.