Ардуино и модуль чтения MicroSD и SD карт. Запись данных на карту

Модуль для чтения MicroSD и SD карт предлагает большие возможности, когда дело доходит до хранения данных. Мы подключили данный подобный модуль к Ардуино и протестировали его возможности.

Вопреки своему названию, этот модуль может не только считывать, но также сохранять данные на карту памяти. Мы внимательно изучили два модуля для microSD и SD карт. Последний из них, благодаря соответствующему адаптеру также поддерживает и microSD карту.

Однако на практике это оказалось бесполезным из-за отсутствия преобразователя логических уровней, о котором будет подробнее в разделе о тестировании кард-ридера. Поэтому мы рассмотрим только первый из двух приведенных кард-ридеров тот, что слева на фото.

 

Технические характеристики кард-ридера microSD:

  • Питание 5В (в модуле есть регулятор напряжения)
  • Интерфейс: Шина SPI, подключение напрямую к Ардуино (встроенный преобразователь уровней 3.3В / 5В)

Выводы

  • 5V, GND — питание
  • CS, SCK, MOSI, MISO — выводы шины SPI

Тестирование кард-ридера

Для тестирования кард-ридера было использовано:

  • библиотека SDFat,
  • модуль чтения карты с преобразователем уровней
  • карта памяти Sandiska microSD емкостью 8 ГБ, отформатированная в FAT32.

Изначально был использован модуль для SD карт с делителями напряжения для преобразования уровней шины SPI (первое фото — справа). На тот момент это был единственный ридер в наличии, который оказался серьезной проблемой.

В документации библиотеки SDFat это вообще не приветствуется (делитель напряжения), и если мы хотим его использовать, желательно снизить частоту шины SPI вдвое (подробности – файл SdFat.html из папки extras библиотеки SDFat). В нашем случае очень простой скетч ReadWrite (создание файла – запись данных – считывание данных) из примера библиотеки не работал. В общем, времени с ней потратили предостаточно, что нельзя сказать о втором модуле тот, что с конвертером. С ним вообще нет никаких проблем — надежно записывает и считывает данные.

Для тестирования написан скетч, который каждые 5 секунд генерирует случайное число и сохраняет его на карту памяти вместе с информацией о времени генерации. Эти данные, разделенные символом табуляции, сохраняются в отдельных строках в файле csv. Данный файл, в свою очередь, можно открыть, например, в Excel и обработать в соответствии с вашими потребностями.

#include <SPI.h>
#include <TimeLib.h>
#include "SdFat.h"

#define SD_CS_PIN SS

SdFat sd;
File file;
ArduinoOutStream coutF(file);
ArduinoOutStream coutS(Serial);

void setup() {
    Serial.begin(9600);
    pinMode(SD_CS_PIN, OUTPUT);

    coutS << F("Initializing SD card...") << endl;

    if (!sd.begin(SD_CS_PIN)) {
        coutS << F("Initialization failed!") << endl;
    } else {
        coutS << F("Initialization done") << endl;
        coutS << F("Time\t\tValue") << endl;

        if (file.open("log.csv", FILE_WRITE)) {
            coutF << F("Time\t\tValue") << endl;
            file.flush();
        } else {
            coutS << F("Cannot open file") << endl;
        }
    }

    //Генерируем случайное значение
    randomSeed(analogRead(0));
}

void loop() {
    long val = millis() / 1000;
    int days = elapsedDays(val);
    int hours = numberOfHours(val);
    int minutes = numberOfMinutes(val);
    int seconds = numberOfSeconds(val);
    int randomValue = random(40, 60);

    printToSerial(days, hours, minutes, seconds, randomValue);
    printToFile(days, hours, minutes, seconds, randomValue);

    delay(5000);
}

void printToSerial(int days, int hours, int minutes, int seconds, int randomValue) {
    coutS << int(days);
    coutS << ":" << ((hours < 10) ? "0" : "") << int(hours);
    coutS << ":" << ((minutes < 10) ? "0" : "") << int(minutes);
    coutS << ":" << ((seconds < 10) ? "0" : "") << int(seconds);
    coutS << "\t" << randomValue << endl;
}

void printToFile(int days, int hours, int minutes, int seconds, int randomValue) {
    coutF << int(days);
    coutF << ":" << ((hours < 10) ? "0" : "") << int(hours);
    coutF << ":" << ((minutes < 10) ? "0" : "") << int(minutes);
    coutF << ":" << ((seconds < 10) ? "0" : "") << int(seconds);
    coutF << "\t" << randomValue << endl;
    file.flush();

В коде для экономии памяти контроллера строки хранятся во флэш-памяти. Еще одна удобная вещь — это класс ArduinoOutStream с SDFat, который позволяет более удобно комбинировать строки символов вместо длинных строк с функцией печати (для Serial и File).

Соединения контактов Arduino UNO и кард-ридера следующие:

  • CS — вывод 10
  • MOSI — вывод 11
  • MISO — вывод 12
  • CLK — вывод 13

В случае проблем также стоит запустить код из примера QuickStart. Код показывает информацию о подключении модуля и используемой карты памяти.

Используемая SdFat библиотека имеет хорошую функциональность, изучить которую можно с помощью встроенных примеров. Документация библиотеки находиться в каталоге extras (файл SdFat).

Добавить комментарий

Ваш электронный адрес не будет опубликован.


*