Библиотека SD для работы Arduino с SD картами
Библиотека SD для Arduino позволяет выполнять чтение и запись на SD карты, установленные, например, на плату расширения Arduino Ethernet Shield, и поддерживает файловые системы FAT16 и FAT32 на стандартных SD картах и картах SDHC.
Содержание
Введение
Библиотека SD позволяет выполнять чтение и запись на SD карты, установленные, например, на плату расширения Arduino Ethernet Shield. Она построена на базе sdfatlib от William Greiman. Библиотека поддерживает файловые системы FAT16 и FAT32 на стандартных SD картах и картах SDHC. Она использует короткие имена файлов 8.3. Имена файлов, переданные функциям SD библиотеки, могут включать пути, разделенные прямыми слешами, /, например, » directory/filename.txt «. Поскольку рабочий каталог – это всегда корневой каталог SD карты, имя ссылается на один и тот же файл, независимо от того, включает ли оно прямой слеш (например, » /file.txt ‘ эквивалентно » file.txt «). С версии 1.0 библиотека поддерживает открытие нескольких файлов.
Связь между микроконтроллером и SD картой использует интерфейс SPI, который использует цифровые выводы 11, 12 и 13 (на большинстве плат Arduino) или 50, 51 и 52 (на платах Arduino Mega). Кроме того, для выбора SD карты должен использоваться еще один вывод. Это может быть аппаратный вывод SS – вывод 10 (на большинстве плат Arduino) или вывод 53 (на платах Arduino Mega) – или какой-либо другой вывод, заданный с помощью вызова SD.begin() . Обратите внимание, что даже если вы не используете аппаратный вывод SS, он должен быть оставлен настроенным для работы на выход, иначе библиотека SD работать не будет.
Описание методов и классов
Класс SD
Класс SD предоставляет функции для доступа к SD карте и манипуляций с файлами и каталогами.
Инициализирует библиотеку SD и карту. Это запускает использование шины SPI (цифровые выводы 11, 12 и 13 на большинстве плат Arduino; 50, 51 и 52 на Arduino Mega) и вывод выбора чипа, который по умолчанию является аппаратным выводом SS (вывод 10 на большинстве плат Arduino, 53 на Arduino Mega). Обратите внимание, что даже если вы используете какой-либо другой вывод выбора чипа, аппаратный вывод SS должен быть оставлен настроенным для работы на выход, иначе библиотека SD работать не будет.
Синтаксис
Параметры
cspin (необязательный): вывод, подключенный к линии выбора чипа на SD карте; по умолчанию устанавливается аппаратный вывод SS шины SPI.
Возвращаемое значение
true в случае успеха; false в случае неудачи.
Проверяет, существует ли на SD карте файл или каталог.
Синтаксис
Параметры
filename : имя файла, проверяемого на существование, может включать каталоги (отделенные прямыми слешами, /).
Возвращаемое значение
true , если файл или каталог существует; false , если нет.
Создает каталог на SD карте. Он также создает промежуточные каталоги, которые еще не существуют; например SD.mkdir(«a/b/c») создаст a , b и c .
Синтаксис
Параметры
filename : имя каталога, который необходимо создать, может включать подкаталоги (отделенные прямыми слешами, /).
Возвращаемое значение
true , если каталог создан успешно; false , если нет.
Открывает файл на SD карте. Если файл открывается для записи, и если он еще не существует, то он будет создан (но содержащий его каталог уже должен существовать).
Синтаксис
Параметры
filename : имя файла, который необходимо открыть, может включать каталоги (отделенные прямыми слешами, /), переменная типа char* .
mode (необязательный): режим, в котором открыть файл (по умолчанию FILE_READ ), переменная типа byte . Допустимые значения:
- FILE_READ : открыть файл для чтения, начиная с начала файла;
- FILE_WRITE : открыть файл для чтения и записи, начиная с конца файла.
Возвращаемое значение
Объект File , ссылающийся на открытый файл; если файл не может быть открыт, этот объект объект в булевом контексте будет оцениваться как false , то есть вы можете проверить возвращенное значение с помощью » if(f) «.
Удаляет файл с SD карты.
Синтаксис
Параметры
filename : имя файла, который необходимо удалить, может включать каталоги (отделенные прямыми слешами, /).
Возвращаемое значение
true , если файл удален успешно; false , если нет. Если файл не существует, возвращаемый результат не определен.
Удаляет каталог с SD карты. Каталог должен быть пустым.
Синтаксис
Параметры
filename : имя каталога, который необходимо удалить, может включать подкаталоги (отделенные прямыми слешами, /).
Возвращаемое значение
true , если каталог удален успешно; false , если нет. Если каталог не существует, возвращаемый результат не определен.
Класс File
Класс File служит для чтения и записи отдельных файлов на SD карте.
Возвращает имя файла.
Синтаксис
Возвращаемое значение
Проверяет, доступно ли какое-либо количество байтов для чтения из файла.
available() наследуется из вспомогательного класса Stream .
Синтаксис
Параметры
file : объект класса File (возвращается методом SD.open() ).
Возвращаемое значение
Количество доступных байтов ( int ).
Закрывает файл и гарантирует, что любые данные, записанные в него, физически сохранены на SD карту.
Синтаксис
Параметры
file : объект класса File (возвращается методом SD.open() ).
Возвращаемое значение
Гарантирует, что любые байты, записанные в файл, физически сохраняются на SD карту. Этот метод выполняется автоматически при закрытии файла.
flush() наследуется из вспомогательного класса Stream .
Синтаксис
Параметры
file : объект класса File (возвращается методом SD.open() ).
Возвращаемое значение
Читает байт из файла без продвижения к следующему. То есть, успешный вызов peek() возвратит то же значение, что и следующий вызов read() .
peek() наследуется из вспомогательного класса Stream .
Синтаксис
Параметры
file : объект класса File (возвращается методом SD.open() ).
Возвращаемое значение
Следующий байт (или символ) или -1, если ничего недоступно.
Выдает текущую позицию внутри файла (то есть, положение, с которого будет прочитан или записан следующий файл).
Синтаксис
Параметры
file : объект класса File (возвращается методом SD.open() ).
Возвращаемое значение
Позиция внутри файла ( unsigned long ).
Печатает данные в файл, который должен быть открыт для записи. Числа печатаются как последовательность цифр, каждая ASCII символ (то есть число 123 посылается как три символа ‘ 1 ‘, ‘ 2 ‘, ‘ 3 ‘).
Синтаксис
Параметры
file : объект класса File (возвращается методом SD.open() ).
data : данные для печати ( char , byte , int , long или string ).
BASE (необязательно): основание для печати чисел: BIN для двоичных (основание 2), DEC для десятичных (основание 10), OCT для восьмеричных (основание 8), HEX для шестнадцатеричных (основание 16).
Возвращаемое значение
print() возвратит количество записанных байтов, чтение этого значения необязательно.
Печатает данные, а затем символ возврата каретки или новой строки в файл, который должен быть открыт для записи. Числа печатаются как последовательность цифр, каждая ASCII символ (то есть число 123 посылается как три символа ‘ 1 ‘, ‘ 2 ‘, ‘ 3 ‘).
Синтаксис
Параметры
file : объект класса File (возвращается методом SD.open() ).
data : данные для печати ( char , byte , int , long или string ).
BASE (необязательно): основание для печати чисел: BIN для двоичных (основание 2), DEC для десятичных (основание 10), OCT для восьмеричных (основание 8), HEX для шестнадцатеричных (основание 16).
Возвращаемое значение
print() возвратит количество записанных байтов, чтение этого значения необязательно.
Ищет новую позицию в файле, которая должна быть между 0 и размером файла (включительно).
Синтаксис
Параметры
file : объект класса File (возвращается методом SD.open() ).
pos : позиция для поиска ( unsigned long ).
Возвращаемое значение
true , если успешно; false , если нет ( boolean ).
Получить размер файла.
Синтаксис
Параметры
file : объект класса File (возвращается методом SD.open() ).
Возвращаемое значение
Размер файла в байтах ( unsigned long ).
Прочитать из файла.
read() наследуется из вспомогательного класса Stream .
Синтаксис
Параметры
file : объект класса File (возвращается методом SD.open() ).
buf : массив символов или байтов.
len : количество элементов в buf .
Возвращаемое значение
Следующий байт (или символ), или -1, если нет доступных.
Записать данные в файл.
Синтаксис
Параметры
file : объект класса File (возвращается методом SD.open() ).
data : byte , char или строка ( char * ) для записи.
buf : массив символов или байтов.
len : количество элементов в buf .
Возвращаемое значение
write() возвратит количество записанных байтов, чтение этого значения необязательно.
Каталоги (или папки) – это специальные типы файлов, данная функция сообщает, является ли текущий файл каталогом или нет.
Синтаксис
Параметры
file : объект класса File (возвращается методом SD.open() ).
Возвращаемое значение
Пример
Возвращает следующий файл или каталог в каталоге.
Синтаксис
Параметры
file : объект класса File , который является каталогом.
Возвращаемое значение
char : следующий файл или каталог.
Пример
rewindDirectory() вернет вас назад к первому файлу в каталоге, используется совместно с openNextFile() .
Синтаксис
Параметры
file : объект класса File .
Возвращаемое значение
Пример
Примеры
Некоторые вещи, которые необходимо учитывать при использовании библиотеки SD
Обзор
Связь между микроконтроллером и SD картой использует интерфейс SPI, который занимает цифровые выводы 11, 12 и 13 (на большинстве плат Arduino) или 50, 51 и 52 (Arduino Mega). Кроме того, для выбора SD карты должен использоваться еще один дополнительный вывод. Это может быть аппаратный вывод SS – вывод 10 (на большинстве плат Arduino) или вывод 53 (на платах Arduino Mega) – или какой-либо другой вывод, заданный с помощью вызова SD.begin() . Обратите внимание, что даже если вы не используете аппаратный вывод SS, он должен быть оставлен настроенным для работы на выход, иначе библиотека SD работать не будет. Разные платы расширения для этого используют разные выводы, поэтому убедитесь в правильности выбора вывода в SD.begin() .
Форматирование/подготовка карты
Примечание: всякий раз, когда в данной статье упоминается SD карта, это означает и SD, и microSD размеры, а также SD и SDHD форматы.
Большинство SD карт работает правильно сразу из коробки, но, возможно, ваша карта использовалась в компьютере или камере и не может быть прочитана с помощью библиотеки SD. Форматирование такой карты создаст файловую систему, в которой Arduino сможет читать и писать.
Часто форматировать SD карты нежелательно, так как это уменьшает их срок службы.
Для форматирования карты вам понадобятся SD ридер и компьютер. Библиотека поддерживает файловые системы FAT16 и FAT32, но по возможности лучше используйте FAT16.
Именование файлов
Файловые системы FAT имеют ограничения, когда в них используются соглашения по именованию файлов. Вы должны использовать формат 8.3, в котором имена файлов выглядят так » NAME001.EXT «, где » NAME001 » – строка из 8 или менее символов, а » EXT » – расширение из 3 символов. Люди часто используют расширения .TXT и .LOG . Возможно использовать и более короткие имена (например, mydata.txt или time.log ), но более длинные имена файлов использовать запрещается.
Открытие/закрытие файлов
Когда вы используете file.write() , то на карту ничего не будет записано, пока вы не вызовете flush() или close() . Всякий раз, когда вы открываете файл, убедитесь, что закрыли его, чтобы сохранить свои данные.
Начиная с версии 1.0, стало возможно иметь открытыми сразу несколько файлов.
Различные платы расширения
Ниже приведено несколько различных плат расширения, поддерживающих SD карты. Этот список неполный, но в нем приведены наиболее часто используемые платы.
Как работает модуль чтения SD карт и как его подключить к Arduino
Если вы профессионально или на любительском уровне занимаетесь изучением микроконтроллеров, то наверняка вы сталкивались с ситуацией когда памяти вашего микроконтроллера не хватает для сохранения необходимого вам объема данных. Наиболее часто эта проблема возникает в логгерах каких-нибудь данных: частоты сердечных сокращений, температуры, влажности и т.д. Хорошим решением в данном случае для увеличения объема сохраняемых данных является использование SD карты. Поэтому в данной статье мы рассмотрим принципы работы модуля чтения и записи SD карт и как его правильно подключить к плате Arduino.
Ранее на нашем сайте мы уже рассматривали подключение модуля чтения SD карт к плате Arduino в статьях про логгер данных температуры и влажности и бесконтактный термометр с креплением на стену, но в этой статье мы более подробно рассмотрим вопросы взаимодействия с данным модулем.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Модуль чтения SD карт (купить на AliExpress).
Принципы работы модуля чтения SD карт
Распиновка модуля чтения SD карт
Модуль чтения Micro SD карт имеет 6 контактов: GND, VCC, MISO, MOSI, SCK и CS. Все эти контакты являются цифровыми, за исключением контактов VCC и Ground. Распиновка модуля чтения SD карт показана на следующем рисунке.
Назначение контактов модуля следующее:
GND – общий провод (земля) модуля, в нашем проекте его необходимо подключить к контакту земли (ground) платы Arduino.
VCC – контакт для подачи питания на модуль, его необходимо подключать к напряжению 5V или 3.3V.
MISO (Master In Slave Out) – контакт передачи данных по интерфейсу SPI от модуля.
MOSI (Master Out Slave In) – контакт передачи данных по интерфейсу SPI в модуль.
SCK – линия синхронизации в интерфейсе SPI, в нашем проекте источником тактовых импульсов будет плата Arduino.
CS (Chip Select) – линия для выбора ведомого устройства в интерфейсе SPI. В нашем проекте плата Arduino, управляя данным контактом, может включать/выключать работу модуля.
Компоненты модуля чтения SD карт
Это дешевый и простой в использовании модуль, который может быть использован во множестве различных приложений. Его составные части (компоненты) показаны на следующем рисунке.
Как видите из представленного рисунка, у модуля чтения SD карт всего три наиболее значимых компонента. Первый – это держатель карт формата Micro SD, он обеспечивает возможность легкой перестановки SD карты из одного модуля в другой. Второй – микросхема преобразователя уровня (level shifter IC). Поскольку сам модуль работает от питающего напряжения 3.3V, а его максимальное рабочее напряжение составляет 3.6V, то если мы непосредственно подключим его к 5V, то это с большой вероятностью выведет из строя SD карту. Кроме микросхемы преобразователя уровня модуль также содержит понижающий регулятор напряжения, который преобразует напряжение из 5V в 3.3V.
Наиболее часто задаваемые вопросы о модуле чтения SD карт
Какой стандарт форматирования лучшего всего подходит для SD карт?
При форматировании SD карт наиболее предпочтительным является формат exFAT.
Имеют ли SD карты прошивку (программное обеспечение)?
SD карты поставляются с записанной в них прошивкой, которая содержит инструкции для работы с ROM (read-only memory) и позволяют устройству «загружаться».
Уменьшает ли форматирование время жизни SD карт?
Прямого и точного ответа на этот вопрос нет. Но поскольку процесс форматирования работает со всей памятью SD карты, очищает на ней данные и помечает блоки как доступные, то, поскольку количество циклов чтения/записи для SD карты ограничено, скорее всего, он немного может уменьшать время жизни SD карты.
Что такое exFAT для SD карты?
exFAT (Extensible File Allocation Table) – это файловая система, разработанная компанией Microsoft в 2006 году и оптимизированная для различных типов флэш памяти, таких как USB носители и SD карты. exFAT была проприетарной системой до 28 августа 2019, когда Microsoft опубликовала ее спецификацию. Компания Microsoft владеет патентами над несколькими элементами ее дизайна.
Схема модуля чтения SD карт
Схема модуля чтения SD карт представлена на следующем рисунке. Как видите, она состоит из легко доступных компонентов общего назначения.
Как видно из представленной схемы, она содержит коннектор (держатель) Micro SD карт прижимного типа, который подключен к микросхеме изменения логического уровня (logic level shifter IC). Поскольку максимальное рабочее напряжение модуля составляет 3.6V, то данная микросхема в этих условиях является весьма актуальной. Для питания SD карты и конвертера логических уровней мы используем регулятор напряжения LM1117. Коннектор JP1 внизу схемы представляет собой коннектор внизу модуля чтения SD карт.
Схема проекта
Схема подключения модуля чтения SD карт к плате Arduino представлена на следующем рисунке.
Как видите, подключение модуля чтения Micro SD карт к плате Arduino UNO достаточно простое – необходимо всего лишь подключить контакты SPI модуля SCK, MISO и MOSI к аналогичным SPI контактам платы Arduino SCK (D13), MOSI (D12) и MISO(D11). Если же у нас к шине SPI будет подключено несколько устройств, то в этом случае необходимо подключить и линию CS (выбор ведомого) к плате Arduino. Более подробно об использовании интерфейса SPI в плате Arduino вы можете прочитать в этой статье.
Контакты VCC и Ground модуля чтения SD карт используются для подачи на него питания.
Внешний вид собранной конструкции проекта представлен на следующем рисунке.
Подготовка модуля чтения SD карт
Перед тем как вставлять SD карту в модуль чтения SD карт вам необходимо правильно ее отформатировать, иначе могут возникнуть проблемы с ее работой. Это связано с тем, что модуль чтения SD карт может работать только с файловыми системами FAT16 или FAT32. А при изготовлении SD карта могла быть предварительно отформатирована в другом формате. В этих случаях иногда даже проще использовать старую SD карту чем новую для уменьшения риска проблем совместимости.
Объяснение программы для Arduino
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
В коде программы мы будем проверять наличие файла с именем “ data_log.txt ”. Если этот файл существует, то мы будем записывать в него информацию. Если файл не существует, мы будем создавать на SD карте этот файл и затем записывать в него информацию. Мы потом можем открыть этот файл на компьютере и проверить действительно ли в нем содержится информация, которую мы туда записали.
Первым делом в коде программы мы подключим библиотеку для работы с SD картами, объявим контакт chipSelect модуля и объявим файловую переменную myFile.