Модуль для чтения 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).
