События‎ > ‎

Подключение SD карт к Arduino

Отправлено 26 янв. 2013 г., 12:55 пользователем Олег Евсегнеев
Модуль SD карт
Некоторое время назад я обзавелся модулем для подключения SD карт, которые я планирую использовать в ряде проектов для хранения больших объемов данных. Например, для хранения изображений с камеры, или ведения больших журналов. 
Как водится, модуль я приобрел в китайском магазине за небольшое количество денег. Следует отметить, что фактически я планировал приобрести вариант для подключения microSD, но слегка ошибся и заказал обычный SD, который как известно очень громоздкий :( Ну да ладно...

Модуль представляет собой довольно примитивную плату, на которой размещен контактный слот, подтягивающие резисторы для SPI шины и регулятор напряжения. Последний дает возможность подключать модуль как к +5В источнику питания, так и к +3.3В. На краю устройства имеется штыревой разъем 8x2.  

На этот раз, для демонстрации я решил воспользоваться контроллером Arduino Nano 32, который ближе для большинства начинающих робототехников. В качестве тестовой карты выступила microSD на 2Гб с адаптером. Схема подключения SD модуля и Arduino Nano выглядит следующим образом:

 SD Arduino
 MOSI 11
 MISO 12
 CLK 13
 CS 10

Подключение SD к Arduino
Важно учесть, что здесь используется не сплошная нумерация ног 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(){
}

 Байт Запись, мс Чтение, мс
 1 25 2
 256 35 11
 1024 66 39

Как видно, время записи на SD карту слишком велико, чтобы её можно было использовать, например, для организации лога в мультикоптере. Ведь цикл управления в нем 20мс, что меньше чем время записи даже одного байта на SD карту. Однако, существуют методы работы с памятью карты в обход файловой системы, что может значительно ускорить работу с ней.

В ближайшее время я попробую записать на карту изображение с видео-модуля OV7670, о чем обязательно отчитаюсь.
Comments