Sd open arduino не создает файл
Сегодня речь пойдет об использовании SD и micro SD карт в Arduino. Мы разберемся как можно подключить SD карты к Ардуино, как записывать и считывать информацию. Использование дополнительной памяти может быть очень полезно во многих проектах. Если вы не знаете что такое SPI, I2C и аналоговые выводы, то советую вам посмотреть прошлые уроки и разобраться с этими интерфейсами связи Ардуино.
Подключить SD карту к Arduino напрямую не получится, так как она не поддерживает нужный протокол связи. Но мы можем использовать дополнительные модули или шилды для этого. К счастью, стоят они очень дешево и доступны в разных вариантах.
В этом уроке используется:
Отличный набор для начинающих: | Купить |
Arduino Uno: | Купить |
Инфракрасный датчик расстояния: | Купить |
Плата расширения для считывания micro SD карт c SPI интерфейсом: | Купить |
Шилд для Arduino Uno: | Купить |
Карты micro SD: | Купить |
Датчики освещенности: | Купить |
Датчик температуры I2C: | Купить |
Подключение sd карт к Arduino
Модуль и шилд для считывания sd карт подключается по интерфейсу SPI. Шилд просто вставляется в Arduino Uno сверху. А плата подключается к пинам D10 -> CS, D11 -> MOSI, D12 -> MISO, D13 -> SCLK, 5V -> VIN (если на плате есть стабилизатор, если нет то 3,3V), GND -> GND. Вот наглядная схема:
Обратите внимание на напряжение питания платы. Если на плате есть стабилизатор питания, то можете подавать на нее 5 В. Если же стабилизатора нет, то необходимо подвести 3.3 В. В остальном все так же как мы разбирали в уроке по SPI интерфейсу. Теперь перейдем к программной части.
Запись и считывание SD карты на Arduino
Для работы с картами памяти в Arduino есть библиотека SD.h. Она по умолчанию доступна в Arduino IDE. С ней мы и будем работать. Для начала напишем простую программу, которая будет записывать обычную строку на SD карту. Теперь посмотрим на скетч:
Отлично! У меня все работает так как и было задумано. Теперь я хочу немного доработать этот скетч. Давайте закинем текстовый файл на карту памяти с каким-нибудь значением и попробуем считать это на Arduino. Например я создам текстовый файл в котором будет всего одно число. Это число я буду использовать в качестве задержки между записью нашей строки на эту же карту памяти. Немного доработаем предыдущий скетч.
Давайте теперь сделаем что-то более сложное и полезное. Добавим несколько датчиков и будем записывать их показания на карту памяти. Я подключу пару инфракрасных дальномеров, датчик температуры и фото резистор для определения уровня освещенности. Вот так все будет выглядеть:
Подробно скетч моего регистратора показаний я расписывать не буду, потому что мы все это уже разбирали подробно в этом и прошлых уроках. В этом скетче сочетаются навыки из уроков по аналоговым входам, I2C и SPI интерфейсам и подтягивающим резисторам. Вы можете найти все это в разделе сайта уроки по Arduino. Вот скетч:
На сегодня все. В следующий раз мы разберемся с подключением RFID метками. Надеюсь вам все было понятно.
Trema-модуль адаптер microSD — адаптер карт памяти microSD, который вы можете использовать для записи значений аналоговых и цифровых выводов Arduino.
Видео:
Спецификация:
- Поддерживаемые карты памяти: microSD-карты (FAT16/FAT32);
- Объём карты памяти: SD до 2Gb / SDHC до 32Gb;
- Питание: 5В;
- Интерфейс: SPI;
- Вывод INS для идентификации наличия вставленной карты
- Все модули линейки "Trema" выполнены в одном формате
Подключение:
Для удобства подключения к Arduino воспользуйтесь Trema Shield, Trema Power Shield, Motor Shield или Trema Set Shield.
Выводы Trema SD | Выводы Piranha Uno/Arduino Uno | Выводы Arduino Mega | Выводы Arduino Leonardo |
MISO | 12 | 50 | ICSP_MISO |
MOSI | 11 | 51 | ICSP_MOSI |
SCK | 13 | 52 | ICSP_SCK |
SS(SC) | 10 | 53 | ICSP_SS |
INS | Любой вывод | Любой вывод | Любой вывод |
GND | GND | GND | GND |
Vcc | 5V | 5V | 5V |
Модуль удобно подключать 5 способами, в зависимости от ситуации:
Способ - 1 : Используя проводной шлейф и Piranha UNO
Используя провода «Папа — Мама», подключаем напрямую к контроллеру Piranha UNO
Способ - 2 : Используя Trema Set Shield
Модуль можно подключить к любому из входов Trema Set Shield ( при использовании программного последовательного порта )
Способ - 3 : Используя проводной шлейф и Trema Shield
Способ - 4 : Используя провода и Arduino Mega
Используя провода «Папа — Мама», подключаем напрямую к контроллеру Arduino Mega
Способ - 5 : Используя провода и Arduino Leonardo
Используя 4 провода «Папа — Мама» и 3 провода «Мама — Мама», подключаем напрямую к контроллеру Arduino Leonardo
Питание:
Данный модуль питается от источника постоянного напряжения 5В.
Подробнее о модуле:
Модуль поддерживает карты microSD. Для работы с библиотекой Arduino карта должна быть отформатирована в формате FAT16 или FAT32.
У модуля есть возможность снизить энергопотребление путём отключения индикаторных светодиодов. Это производится посредством удаления двух напаянных джамперов на нижней стороне платы:
На модуле имеется вывод "INS", определяющий наличие карты.
Примеры:
Внимание: во избежание потери данных рекомендуем извлекать microSD карту во время загрузки скетча в микроконтроллер.
Инициализация карты, создание и запись файла
Чтение из файла в последовательный порт
Чтение из файла в переменные и удаление файла
Информация о карте и листинг файлов, используя утилитные функции библиотеки SD
Листинг файлов без использования утилитных функций
Создание лог-файла с использованием часов реального времени и датчика звука.
Описание функций библиотеки:
На заметку: Библиотека SD входит в стандартный набор библиотек Arduino
Библиотека SD для Arduino позволяет выполнять чтение и запись на SD карты, установленные, например, на плату расширения Arduino Ethernet Shield, и поддерживает файловые системы FAT16 и FAT32 на стандартных SD картах и картах SDHC.
Содержание
Введение
Связь между микроконтроллером и 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 ).
Синтаксис
Параметры
file : объект класса File (возвращается методом SD.open() ).
data : данные для печати ( char , byte , int , long или string ).
BASE (необязательно): основание для печати чисел: BIN для двоичных (основание 2), DEC для десятичных (основание 10), OCT для восьмеричных (основание 8), HEX для шестнадцатеричных (основание 16).
Возвращаемое значение
print() возвратит количество записанных байтов, чтение этого значения необязательно.
Синтаксис
Параметры
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 карты. Этот список неполный, но в нем приведены наиболее часто используемые платы.
Arduino Ethernet Shield
Плата расширения Ethernet Shield поставляется со слотом для SD карты. Плата устанавливается на Arduino сверху. Поскольку Ethernet модуль использует вывод 10, вывод CS для SD карты был перемещен на вывод 4. Для использования функционала SD карты вызывайте метод SD.begin(4) .
Adafruit Micro-SD breakout Board
Данная плата поддерживает Micro-SD карты. Перед использованием ее необходимо правильно подключить к Arduino. Вывод GND на плате соедините с шиной земли на Arduino, вывод 5V – с шиной 5V, CLK – с выводом 13 на Arduino, DO – с выводом 12, DI – с выводом 11, CS – с выводом 10. Если вы уже используете вывод 10, то можете к CS подключить другой вывод, но не забудьте изменить вывод в SD.begin() .
Sparkfun SD Shield
Во втором уроке просвещенном работе с SD картой . Научимся создавать и удалять файлы с помощью Arduino. Также запишем информацию в файл и считаем её. Как получить информацию о карте памяти и файлах хоронящихся на карте смотрите в предыдущем уроке: Урок13. Библиотека SD Arduino. Выводим информацию о SD карте.
Для роботы нам понадобится библиотека SD.h которую можно установить через менеджер библиотек.
Для урока нам понадобиться:
Подключаем SD-модуль к Arduino UNO по такой схеме.
Давайте создадим файл на флешке, для этого используется функции SD.open(). Которая открывает файл на SD карте. Если файл открывается для записи, и если он еще не существует, то он будет создан (но содержащий его каталог уже должен существовать).
Remove() - Удаляет файл.
SD.exists() - проверяет существует ли файл.
Простой пример скетча для создания и удаления файлов с помощью библиотеки SD.
После загрузке в мониторе порта мы увидим вот такую информацию.
Сперва мы проверяем на существование файла, создаем файл. Проверяем еще раз, что файл создан. Удаляем файл. И проверяем, что файла больше нет на карте памяти.
Если нам не нужно удалять файл, можно закомментировать строку отвечающую за удаления и уведомления, что будем удалять файл тоже лучше закомментировать.
Сейчас наш файл создан и не удален. С ним можно работать.
Давайте создадим файл и запишем информацию в него. Код будит не очень сильно измене.
В мониторе порта мы увидим, что файл создан и удачно сохранился наш текст.
Если перезагрузить Arduino. То текст запишется еще раз в файл.
Это отличное решение для сохранения показаний с датчика.
Читайте также: