Подключение 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. Единственное изменение, которое следует внести в код данного примера - это заменить номер вывода 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, о чем обязательно отчитаюсь.