Библиотека SD позволяет считывать и записывать информацию на SD-карту памяти (например, на плате расширения Arduino Ethernet).

Она основана на библиотеке sdfatlib (автор William Greiman). Библиотека поддерживает работу со стандартными картами памяти типа SD и SDHC, отформатированными в файловой системе FAT16 или FAT32. При работе с картой памяти необходимо использовать короткие имена файлов в формате 8.3 (8 символов - имя файла, 3 символа - расширение).

Функции библиотеки SD в качестве параметра могут принимать не только имя файла, но и путь к нему. При этом в качестве разделителя между каталогами используется прямой слеш (например, "directory/filename.txt"). Добавление косой черты перед именем файла необязательно, поскольку рабочей директорией всегда является корневой каталог карты памяти (таким образом, имя "/file.txt" эквивалентно "file.txt"). Начиная с версии 1.0, в библиотеке реализована возможность одновременного открытия нескольких файлов.

Взаимодействие между микроконтроллером и SD-картой памяти осуществляется по шине SPI, объединяющей в себе выводы 11, 12 и 13 (на большинстве плат Ардуино), либо 50, 51 и 52 (на Arduino Mega). Помимо перечисленных, еще один вывод должен использоваться для активизации SD-карты. Для этого может использоваться как аппаратный вывод SS - вывод 10 (на большинстве плат Ардуино) или вывод 53 (на Arduino Mega), так и любой другой вывод, указанный при вызове метода SD.begin().

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

Некоторые нюансы, которые следует помнить при использовании библиотеки SD

Общие сведения

Взаимодействие между микроконтроллером и SD-картой памяти осуществляется по шине SPI, объединяющей в себе выводы 11, 12 и 13 (на большинстве плат Ардуино), либо 50, 51 и 52 (на Arduino Mega). Помимо перечисленных, еще один вывод должен использоваться для активизации SD-карты. Для этого может использоваться как аппаратный вывод SS - вывод 10 (на большинстве плат Ардуино) или вывод 53 (на Arduino Mega), так и любой другой вывод, указанный в качестве параметра метода SD.begin().

Обратите внимание! Для корректной работы библиотеки SD, аппаратный вывод SS должен быть всегда сконфигурирован как выход, даже в тех случаях, когда он не используется. Указывая этот вывод функции SD.begin(), будьте внимательны, поскольку на разных платах расширения в качестве линии SS могут использовать различные выводы.

На странице библиотеки SD приведены не все ее функции, поскольку некоторые из них относятся к функциям вспомогательных классов.

Форматирование/подготовка карты памяти

Примечание! Здесь и далее под SD-картой памяти подразумеваются карты формата SD или SDHC стандартных размеров - как SD, так и microSD.

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

Слишком частое форматирование SD-карты не желательно, т.к. это уменьшает срок ее службы.

Для форматирования карты вам понадобится компьютер с установленным SD-кардридером. Библиотека SD поддерживает работу с двумя файловыми системами - FAT16 и FAT32, однако, по возможности рекомендуется использовать систему FAT16. Процесс форматирования карты памяти довольно прост и заключается в следующем.

На Windows: щелкните правой кнопкой на значке вашей SD-карты, после чего из контекстного меню выберите пункт "Format". Убедитесь, что в качестве файловой системы выбрана система FAT.

На OSX: откройте программу Disk Utility (расположенную в меню Applications > Utilities). Выберите карту памяти, перейдите на вкладку "Erase", в разделе "Format" выберите пункт "MS-DOS(FAT)", после чего нажмите кнопку Erase.

Примечание! При форматировании устройства, OSX размещает на нем ряд скрытых системных файлов. Чтобы этого избежать, следуйте инструкциями на сайте Ladyada.

На Linux: вставьте SD-карту памяти и откройте терминал. В командной строке наберите "df" и нажмите Enter. Команда выведет системное имя устройства, соответствующее вашей SD-карте - оно будет выглядеть примерно так: "/dev/sdb1". Отмонтируйте SD-карту памяти, не вынимая ее из кардридера. Далее, наберите в терминале "sudo mkdosfs -F 16 /dev/sdb1", где вместо "/dev/sdb1" необходимо указать системное имя вашего устройства. Извлеките и снова подключите SD-карту для проверки ее работоспособности.

Имена файлов

Файловые системы FAT предъявляют определенные требования к именам файлов. Одно из таких требований - использование формата имени 8.3, согласно которому имена файлов должны выглядеть так: "NAME001.EXT", где "NAME001" - строка из 8 (или менее) символов, а "EXT" - расширение файла из 3 символов. В качестве расширений обычно используют сокращения ".TXT" или ".LOG". Что касается имени файла - оно может быть короче 8 символов (например, "mydata.txt" или "time.log"). Подробнее о стандарте 8.3 см. здесь.

Открытие/закрытие файлов

Функция file.write() физически не записывает данные на карту памяти, она лишь помещает их в определенный буфер, который сбрасывается на карту только при вызове функции flush() или close(). Поэтому, после каждого открытия файла не забывайте закрывать его, в противном случае ваши данные могут быть утеряны.

Начиная с версии 1.0, в Арудино реализована возможность одновременного открытия нескольких файлов.

Различные платы расширения

Существуют различные платы расширения, работающие с SD-картами памяти. Список наиболее часто используемых плат приведен ниже.

Плата расширения Arduino Ethernet

Плата расширения Ethernet поставляется со встроенным разъемом для SD-карт памяти и при подключении располагается над Ардиуно. В качестве вывода CS для активизации SD-карты используется вывод 4, поскольку традиционный 10 вывод задействован Ethernet-модулем. Поэтому, для работы с SD-картой необходимо использовать команду SD.begin(4).

Отладочная плата Adafruit Micro-SD

Данная плата предназначена для работы с Micro-SD картами памяти. Прежде, чем начать с ней работать, необходимо соединить ее выводы с Ардуино несколькими проводниками. Для этого подключите вывод GND к земле, 5V к 5V, CLK - к выводу 13 Ардуино, DO - к выводу 12, DI - к выводу 11, и CS - к выводу 10. Если вывод 10 на Ардуино уже занят - можно использовать любой другой свободный вывод, указав его функции SD.begin().

Плата расширения Sparkfun SD

Плата расширения Sparkfun также крепится поверх Ардуино, но в качестве вывода CS SD-карты использует вывод 8. Поэтому, в данном случае для работы с картой памяти необходимо использовать команду SD.begin(8).

Примечание: существует новая версия платы расширения Sparkfun, которая внешне выглядит так же. Основное отличие состоит в том, что на старых версиях платы отсутствует соединение с шиной 3.3В и нет встроенного 6-разрядного инвертора.

Примеры

  • Datalogger: Запись данных с трех аналоговых датчиков на SD-карту памяти с помощью библиотеки SD
  • DumpFile: Считывание файла с SD-карты памяти и отправка его содержимого через последовательный порт
  • Files: Создание и удаление файла с SD-карты памяти
  • ReadWrite: Чтение и запись данных в файл на SD-карте
  • CardInfo: Получение информации об SD-карте памяти

Класс SD

Класс SD содержит функции для доступа к SD-карте памяти и позволяет совершать различные операции над файлами и каталогами.

  • begin()
  • exists()
  • mkdir()
  • open()
  • remove()
  • rmdir()

Класс File

Этот класс предназначен для чтения и записи данных в отдельные файлы на SD-карте памяти.

  • available()
  • close()
  • flush()
  • peek()
  • position()
  • print()
  • println()
  • seek()
  • size()
  • read()
  • write()
  • isDirectory()
  • openNextFile()
  • rewindDirectory()