Библиотека 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
Общие сведения
Взаимодействие между микроконтроллером и SD-картой памяти осуществляется по шине SPI, объединяющей в себе выводы 11, 12 и 13 (на большинстве плат Ардуино), либо 50, 51 и 52 (на Arduino Mega). Помимо перечисленных, еще один вывод должен использоваться для активизации SD-карты. Для этого может использоваться как аппаратный вывод SS - вывод 10 (на большинстве плат Ардуино) или вывод 53 (на Arduino Mega), так и любой другой вывод, указанный в качестве параметра метода SD.begin().
На странице библиотеки SD приведены не все ее функции, поскольку некоторые из них относятся к функциям вспомогательных классов.
Форматирование/подготовка карты памяти
Чаще всего SD-карты продаются отформатированными и готовы к работе сразу после покупки. Если же вы используете карту памяти от фотоаппарата или компьютера, то, вероятнее всего, она не будет работать с библиотекой SD. В этом случае карту необходимо отформатировать в файловую систему, поддерживаемую Arduino.
Слишком частое форматирование SD-карты не желательно, т.к. это уменьшает срок ее службы.
Для форматирования карты вам понадобится компьютер с установленным SD-кардридером. Библиотека SD поддерживает работу с двумя файловыми системами - FAT16 и FAT32, однако, по возможности рекомендуется использовать систему FAT16. Процесс форматирования карты памяти довольно прост и заключается в следующем.
На Windows: щелкните правой кнопкой на значке вашей SD-карты, после чего из контекстного меню выберите пункт "Format". Убедитесь, что в качестве файловой системы выбрана система FAT.
На OSX: откройте программу Disk Utility (расположенную в меню Applications > Utilities). Выберите карту памяти, перейдите на вкладку "Erase", в разделе "Format" выберите пункт "MS-DOS(FAT)", после чего нажмите кнопку Erase.
На 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).
Примеры
- 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()