Библиотека 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 карте и манипуляций с файлами и каталогами.
begin()
Инициализирует библиотеку SD и карту.
Это запускает использование шины SPI (цифровые выводы 11, 12 и 13 на большинстве плат Arduino; 50, 51 и 52 на Arduino Mega) и вывод выбора чипа, который по умолчанию является аппаратным выводом SS (вывод 10 на большинстве плат Arduino, 53 на Arduino Mega).
Обратите внимание, что даже если вы используете какой-либо другой вывод выбора чипа, аппаратный вывод SS должен быть оставлен настроенным для работы на выход, иначе библиотека SD работать не будет.
Синтаксис
SD.begin() SD.begin(cspin)
Параметры
cspin (необязательный): вывод, подключенный к линии выбора чипа на SD карте; по умолчанию устанавливается аппаратный вывод SS шины SPI.
Возвращаемое значение
true в случае успеха; false в случае неудачи.
exists()
Проверяет, существует ли на SD карте файл или каталог.
Синтаксис
SD.exists(filename)
Параметры
filename: имя файла, проверяемого на существование, может включать каталоги (отделенные прямыми слешами, /).
Возвращаемое значение
true, если файл или каталог существует; false, если нет.
mkdir()
Создает каталог на SD карте. Он также создает промежуточные каталоги, которые еще не существуют; например SD.mkdir(“a/b/c”) создаст a, b и c.
Синтаксис
SD.mkdir(filename)
Параметры
filename: имя каталога, который необходимо создать, может включать подкаталоги (отделенные прямыми слешами, /).
Возвращаемое значение
true, если каталог создан успешно; false, если нет.
open()
Открывает файл на SD карте. Если файл открывается для записи, и если он еще не существует, то он будет создан (но содержащий его каталог уже должен существовать).
Синтаксис
SD.open(filepath) SD.open(filepath, mode)
Параметры
filename: имя файла, который необходимо открыть, может включать каталоги (отделенные прямыми слешами, /), переменная типа char*.
mode (необязательный): режим, в котором открыть файл (по умолчанию FILE_READ), переменная типа byte. Допустимые значения:
- FILE_READ: открыть файл для чтения, начиная с начала файла;
- FILE_WRITE: открыть файл для чтения и записи, начиная с конца файла.
Возвращаемое значение
Объект File, ссылающийся на открытый файл; если файл не может быть открыт, этот объект объект в булевом контексте будет оцениваться как false, то есть вы можете проверить возвращенное значение с помощью “if(f)”.
remove()
Удаляет файл с SD карты.
Синтаксис
SD.remove(filename)
Параметры
filename: имя файла, который необходимо удалить, может включать каталоги (отделенные прямыми слешами, /).
Возвращаемое значение
true, если файл удален успешно; false, если нет. Если файл не существует, возвращаемый результат не определен.
rmdir()
Удаляет каталог с SD карты. Каталог должен быть пустым.
Синтаксис
SD.rmdir(filename)
Параметры
filename: имя каталога, который необходимо удалить, может включать подкаталоги (отделенные прямыми слешами, /).
Возвращаемое значение
true, если каталог удален успешно; false, если нет. Если каталог не существует, возвращаемый результат не определен.
Класс File
Класс File служит для чтения и записи отдельных файлов на SD карте.
name()
Возвращает имя файла.
Синтаксис
file.name()
Возвращаемое значение
Имя файла.
available()
Проверяет, доступно ли какое-либо количество байтов для чтения из файла.
available() наследуется из вспомогательного класса Stream.
Синтаксис
file.available()
Параметры
file: объект класса File (возвращается методом SD.open()).
Возвращаемое значение
Количество доступных байтов (int).
close()
Закрывает файл и гарантирует, что любые данные, записанные в него, физически сохранены на SD карту.
Синтаксис
file.close()
Параметры
file: объект класса File (возвращается методом SD.open()).
Возвращаемое значение
Нет.
flush()
Гарантирует, что любые байты, записанные в файл, физически сохраняются на SD карту. Этот метод выполняется автоматически при закрытии файла.
flush() наследуется из вспомогательного класса Stream.
Синтаксис
file.flush()
Параметры
file: объект класса File (возвращается методом SD.open()).
Возвращаемое значение
Нет.
peek()
Читает байт из файла без продвижения к следующему. То есть, успешный вызов peek() возвратит то же значение, что и следующий вызов read().
peek() наследуется из вспомогательного класса Stream.
Синтаксис
file.peek()
Параметры
file: объект класса File (возвращается методом SD.open()).
Возвращаемое значение
Следующий байт (или символ) или -1, если ничего недоступно.
position()
Выдает текущую позицию внутри файла (то есть, положение, с которого будет прочитан или записан следующий файл).
Синтаксис
file.position()
Параметры
file: объект класса File (возвращается методом SD.open()).
Возвращаемое значение
Позиция внутри файла (unsigned long).
print()
Печатает данные в файл, который должен быть открыт для записи. Числа печатаются как последовательность цифр, каждая ASCII символ (то есть число 123 посылается как три символа '1', '2', '3').
Синтаксис
file.print(data) file.print(data, BASE)
Параметры
file: объект класса File (возвращается методом SD.open()).
data: данные для печати (char, byte, int, long или string).
BASE (необязательно): основание для печати чисел: BIN для двоичных (основание 2), DEC для десятичных (основание 10), OCT для восьмеричных (основание 8), HEX для шестнадцатеричных (основание 16).
Возвращаемое значение
byte
print() возвратит количество записанных байтов, чтение этого значения необязательно.
println()
Печатает данные, а затем символ возврата каретки или новой строки в файл, который должен быть открыт для записи. Числа печатаются как последовательность цифр, каждая ASCII символ (то есть число 123 посылается как три символа '1', '2', '3').
Синтаксис
file.println() file.println(data) file.print(data, BASE)
Параметры
file: объект класса File (возвращается методом SD.open()).
data: данные для печати (char, byte, int, long или string).
BASE (необязательно): основание для печати чисел: BIN для двоичных (основание 2), DEC для десятичных (основание 10), OCT для восьмеричных (основание 8), HEX для шестнадцатеричных (основание 16).
Возвращаемое значение
byte
print() возвратит количество записанных байтов, чтение этого значения необязательно.
seek()
Ищет новую позицию в файле, которая должна быть между 0 и размером файла (включительно).
Синтаксис
file.seek(pos)
Параметры
file: объект класса File (возвращается методом SD.open()).
pos: позиция для поиска (unsigned long).
Возвращаемое значение
true, если успешно; false, если нет (boolean).
size()
Получить размер файла.
Синтаксис
file.size()
Параметры
file: объект класса File (возвращается методом SD.open()).
Возвращаемое значение
Размер файла в байтах (unsigned long).
read()
Прочитать из файла.
read() наследуется из вспомогательного класса Stream.
Синтаксис
file.read() file.read(buf, len)
Параметры
file: объект класса File (возвращается методом SD.open()).
buf: массив символов или байтов.
len: количество элементов в buf.
Возвращаемое значение
Следующий байт (или символ), или -1, если нет доступных.
write()
Записать данные в файл.
Синтаксис
file.write(data) file.write(buf, len)
Параметры
file: объект класса File (возвращается методом SD.open()).
data: byte, char или строка (char *) для записи.
buf: массив символов или байтов.
len: количество элементов в buf.
Возвращаемое значение
byte
write() возвратит количество записанных байтов, чтение этого значения необязательно.
isDirectory()
Каталоги (или папки) – это специальные типы файлов, данная функция сообщает, является ли текущий файл каталогом или нет.
Синтаксис
file.isDirectory()
Параметры
file: объект класса File (возвращается методом SD.open()).
Возвращаемое значение
boolean
Пример
#include File root; void setup() { Serial.begin(9600); pinMode(10, OUTPUT); SD.begin(10); root = SD.open(“/”); printDirectory(root, 0); Serial.println(“done!”); } void loop() { // Ничего не делаем после завершения настройки. } void printDirectory(File dir, int numTabs) { while(true) { File entry = dir.openNextFile(); if (!entry) { // больше нет файлов //Serial.println(“**nomorefiles**”); break; } for (uint8_t i = 0; i < numTabs; i++) { Serial.print(' '); } Serial.print(entry.name()); if (entry.isDirectory()) { Serial.println("/"); printDirectory(entry, numTabs+1); } else { // у файлов есть размеры, у каталогов - нет Serial.print(" "); Serial.println(entry.size(), DEC); } } }openNextFile()
Возвращает следующий файл или каталог в каталоге.
Синтаксис
file.openNextFile()
Параметры
file: объект класса File, который является каталогом.
Возвращаемое значение
char: следующий файл или каталог.
Пример
#include File root; void setup() { Serial.begin(9600); pinMode(10, OUTPUT); SD.begin(10); root = SD.open(“/”); printDirectory(root, 0); delay(2000); Serial.println(); Serial.println(“Rewinding, and repeating below:” ); Serial.println(); delay(2000); root.rewindDirectory(); printDirectory(root, 0); root.close(); } void loop() { // после настройки ничего не делаем. } void printDirectory(File dir, int numTabs) { while (true) { File entry = dir.openNextFile(); if (!entry) { if (numTabs == 0) Serial.println(“** Done **”); return; } for (uint8_t i = 0; i < numTabs; i++) Serial.print(' '); Serial.print(entry.name()); if (entry.isDirectory()) { Serial.println("/"); printDirectory(entry, numTabs + 1); } else { Serial.print(" "); Serial.println(entry.size(), DEC); } entry.close(); } }rewindDirectory()
rewindDirectory() вернет вас назад к первому файлу в каталоге, используется совместно с openNextFile().
Синтаксис
file.rewindDirectory()
Параметры
file: объект класса File.
Возвращаемое значение
Нет.
Пример
#include File root; void setup() { Serial.begin(9600); pinMode(10, OUTPUT); SD.begin(10); root = SD.open(“/”); printDirectory(root, 0); Serial.println(“done!”); } void loop() { // после завершения настройки ничего не делаем. } void printDirectory(File dir, int numTabs) { while(true) { File entry = dir.openNextFile(); if (! entry) { // файлов больше нет // возвращаемся к первому файлу в каталоге dir.rewindDirectory(); break; } for (uint8_t i=0; i
Источник: https://radioprog.ru/post/334
Arduino: работаем с SD картами – Блог Ильи Житенёва (БЖ)
На днях мне пришёл заказанный модуль для работы с SD-картами.
В этом посте я расскажу, как усовершенствовать, сделанный нами в прошлом, датчик для измерения температуры, а именно – мы избавим себя от надобности копирования данных из консоли вывода в Excel для дальнейшего анализа, заставив Arduino сохранять данные на SD-карту в виде csv-файла.
Данные будут записываться в файл в два столбца – в первом будут единицы времени (или просто номер строки), а во втором значение напряжения на термисторе или ином датчике, которое, как Вы помните, пропорционально температуре.
Необходимые компоненты
Собираем схему
Описывать схему сборки измерителя температуры я не буду, если Вы забыли или не знаете как его собирать – обратитесь к посту, ссылка на который указана выше.
Схема подключения модуля SD-карт к Arduino
Рассмотрим схему подключения SD модуля. Каждый модуль имеет следующие контакты: GND, 5V, 3V (3.3V), CS, MOSI, SCLK (SCK), MISO, GND. Подключим некоторые из этих контактов к следующим контактам Arduino:
- GND – к земле с Arduino;
- 5V разъём к 5 вольтовому разъёму Arduino. (Аналогично 3.3V) Подключать оба разъёма одновременно – бессмысленно, я подключаю только 5V;
- CS – к 4 разъёму;
- MOSI – к 11 разъёму;
- SCLK (SCK) – к 13 разъёму;
- MISO – к 12 разъёму.
На этом наше подключение окончено. Для подключения можете использовать макетную плату – просто втыкаете туда SD модуль и в правильном порядке протягиваете провода от соответствующих дорожек к нужным разъёмам.
Подготавливаем SD-карту
SD модуль работает только с SD картами, отформатированными под файловую систему FAT16 или FAT32. Карту необходимо заранее отформатировать на компьютере. БУДЬТЕ ВНИМАТЕЛЬНЫ! При форматировании все данные, находящиеся на носителе, будут уничтожены! Не забудьте переписать их в другое место перед форматированием!
Программируем Arduino
// Подключаем библиотеку для работы с шиной SPI (необходима для работы библиотеки SD) #include // Подключаем библиотеку для работы с SD-картами #include File myFile; // Задаём начальное время (точку отсчёта) int time = 0; // Указываем номер аналогового разъёма для считывания данны int tempPin = 0; void setup() { // Открываем serial порт Serial.begin(9600); // Выдаём сообщение о том, что начинается инициализация SD-карты Serial.print(“Initializing SD card…”); pinMode(10, OUTPUT); // Проверяем готовность SD модуля. Если модуль не готов – выдаём сообщение if (!SD.begin(4)) { Serial.println(“initialization failed!”); return; } // Проверяем, существует ли на карте файл data.csv, если существует, то удаляем его. if(SD.exists(“data.csv”)) { SD.remove(“data.csv”); } // Выводим сообщение о том, что инициализация прошла успешно Serial.println(“initialization done.”); } void loop() { // Считываем данные (напряжение) с нулевого аналогового разъёма. int temp = analogRead(tempPin); // Увеличиваем значение времени (номер строки) на единицу. Если вы будете записывать данные раз в минуту, но хотите чтобы время записывалось в секундах – прибавляйте не единицу, а 60. time = time + 1; // Открываем файл data.csv для записи myFile = SD.open(“data.csv”, FILE_WRITE); // Если удалось открыть файл для записи, то записываем данные if (myFile) { // Выводим данные на экран Serial.print(time); Serial.print(“; “); Serial.println(temp); // Записываем время myFile.print(time); // Добавляем точку с запятой myFile.print(“;”); // Добавляем температуру и добавляем перенос строки myFile.println(temp); // закрываем файл myFile.close(); } else { // Выводим сооб щение о том, что открыть файл не удалось Serial.println(“error opening data.csv”); } // Повторяем считывание данных с датчика и запись на флэш-карту через одну секунду delay(1000); }<\p>
Загружаем наш скетч в Arduino, запускаем консоль (ctrl+shift+M) в среде Arduino и видим на экране каждую секунду две пары значений – номер строки (или же время) и значение напряжение, соответствующее данной температуре. Подождите, например, 10 секунд и отключите питание от Arduino. Извлеките карточку и вставьте её в компьютер. На карте у вас будет файл data.csv, открыв который в Excel вы увидите 2 столбика значений, что и в консоли Arduino. Теперь вы можете построить график или рассчитать среднее значение температуры в вашей комнате за какой-то промежуток времени.
На этом всё, задавайте свои вопросы мне в комментариях к этому посту, до скорых встреч!
Источник: https://zhitenev.ru/arduino-rabotaem-s-sd-kartami/
Урок 20. Подключение и работа с флеш картой на Arduino
В этом уроке мы научимся создавать, редактировать и удалять файлы на MicroSD карте.
Нам понадобится:
Для реализации проекта не требуется установка дополнительных библиотек. Библиотека для работы с адаптером карт MicroSD v1.0 входит в стандартный набор Arduino IDE > Эскиз > Include Library > SD.
Схема подключения:
Подключение адаптера карт MicroSD v1.0 к Arduino Uno осуществляется к аппаратным выводам SPI (4 вывода: CS, SCK, MOSI, MISO).
CS (Chip Select) | 10 |
SCK (Serial ClocK) | 13 |
MOSI (Master Out Slave In) | 11 |
MISO (Master In Slave Out) | 12 |
Vcc | 5V |
GND | GND |
Питание:
Питание адаптера подаётся на выводы Vcc и GND, напряжением 5В постоянного тока.
Базовые функции, для работы с файлами SD-карты:
// создание переменной myFile класса File библиотеки SD, которая будет служить “указателем” на файл File myFile; // переменная потребуется для открытия и закрытия файла, а так же для работы с открытым файлом
// открытие файла “iarduino.txt” для чтения и записи, начиная с конца файла: myFile = SD.open(“iarduino.txt”, FILE_WRITE); // если файла с именем “iarduino.
txt” – нет, то он будет создан.
// запись строки в файл >”iarduino.txt”: myFile.print(“начало строки, “); // запись строки в открытый файл “iarduino.txt”, без добавления символов перехода на новую строку. myFile.println(“продолжение строки.”); // запись строки в открытый файл “iarduino.txt”, с добавлением символов перехода на новую строку.
// закрытие файла “iarduino.
txt”: myFile.close();
// открытие файла “iarduino.txt” для чтения, начиная с начала файла: myFile = SD.open(“iarduino.txt”); // если файла с именем “iarduino.txt” – нет, то он не будет открыт.
// чтение строк из файла “iarduino.txt”: while(myFile.available()){ // если есть данные для чтения из открытого файла “iarduino.txt” Serial.write(myFile.
read()); // читаем очередной байт из файла и выводим его в последовательный порт. }
// удаление файла “iarduino.txt”: SD.remove(“iarduino.txt”); // функция возвращает результат удаления true/false
// создание файла “iarduino.txt”: myFile = SD.open(“iarduino.txt”, FILE_WRITE); // если файла с именем “iarduino.txt” – нет, то он будет создан. myFile.
close(); // закрываем файл “iarduino.txt” без записи данных.
// проверка существования файла “iarduino.txt”: if(SD.exists(“example.txt”)){…;} // условие будет выполнено, если файл “iarduino.txt” существует на SD-карте
// проверка открытия файла “iarduino.txt”: if(myFile){…;} // условие будет выполнено, если файл был успешно открыт: myFile = SD.open(…
)
// создание каталога “my_Dir” SD.mkdir(“my_Dir”); // функция возвращает результат создания true/false. Если указать “first_Dir/my_Dir”, то будет создано два каталога (каталог my_Dir в каталоге first_Dir)
// удаление каталога “my_Dir” SD.rmdir(“my_Dir”); // функция возвращает результат удаления true/false. Удаляемый каталог должен быть пустым
Создадим два скетча.
В первом будим создавать файл и записывать в него информацию, а во втором, удалим созданный файл.
Создание файла:
// подключение библиотек SPI и SD:
#include
#include
const uint8_t PIN_CS = 10; // указываем номер вывода arduino подключенного к выводу CS адаптера
File myFile; // создаём переменную myFile класса File, которая будет служить “указателем” на открытый файл
void setup(){ Serial.
begin(9600); // открываем последовательный порт на скорости 9600 бод while(!Serial){;} // ожидаем соединение последовательного порта
//используем ответ инициализации, для определения работоспособности карты и адаптера if(!SD.begin(PIN_CS)){ // инициализация SD карты с указанием номера вывода CS Serial.
println(“SD-card not found”); return; // ошибка инициализации. карта не обнаружена или не подключён (неправильно подключён) адаптер карт MicroSD }
//проверяем наличие файла “iarduino.txt” на SD-карте if(SD.exists(“iarduino.txt”)){ // если файл с именем “iarduino.txt” существует, то … Serial.println(“file exists”); }else{ // иначе … Serial.
println(“file doesn't exist”); }
//открываем файл “iarduino.txt” для чтения и записи, начиная с конца файла, и записываем в него строку myFile = SD.open(“iarduino.txt”, FILE_WRITE); // если файла с именем “iarduino.txt” – нет, то он будет создан. if(myFile){ // если файл доступен (открыт для записи), то … Serial.
println(“file is opened”); myFile.print(“The beginning of a line, “); // записываем первую часть строки в файл myFile.println(“The end of the line”); // записываем вторую часть строки в файл Serial.println(“data written to the file”); myFile.close(); // закрываем файл Serial.println(“file is closed”); }else{ // иначе … Serial.
println(“file is not opened”); }
//проверяем наличие файла “iarduino.txt” на SD-карте if(SD.exists(“iarduino.txt”)){ // если файл с именем “iarduino.txt” существует, то … Serial.println(“file exists”); }else{ // иначе … Serial.println(“file doesn't exist”); }
}
void loop(){
}
если подключить адаптер карт MicroSD v1.
0 к Arduino Uno, подключить Arduino Uno к ПК, загрузить скетч, вставить SD-карту и запустить Монитор последовательного порта, то в мониторе будут выведены следующие строки:
file doesn't exist (файл не обнаружен)file is opened (файл открыт) data written to the file (данные записаны в файл)file is closed (файл закрыт) file exists (файл обнаружен)
а на SD-карте появится файл “iarduino.txt” с одной строкой “The beginning of a line, The end of the line”.
Если загрузить скетч при вставленной в адаптер карт MicroSD v1.0 SD-картой, то на SD-карте появится файл “iarduino.txt” с двумя строками “The beginning of a line, The end of the line”, а первой строкой в мониторе последовательного порта будет “file exists” (файл обнаружен).
Дело в том, что функция setup() в обоих случаях выполняется дважды (сразу после загрузки скетча и после запуска монитора последовательного порта). Но в первом случае, после загрузки скетча, SD-карты не было в адаптере, следовательно, файл “iarduino.txt” был создан только после запуска монитора последовательного порта.
Удаление файла:
// подключение библиотек SPI и SD:
#include
#include
const uint8_t PIN_CS = 10; // указываем номер вывода arduino подключенного к выводу CS адаптера
void setup(){ Serial.
begin(9600); // открываем последовательный порт на скорости 9600 бод while(!Serial){;} // ожидаем соединение последовательного порта
//используем ответ инициализации, для определения работоспособности карты и адаптера if(!SD.begin(PIN_CS)){ // инициализация SD карты с указанием номера вывода CS Serial.
println(“SD-card not found”); return; // ошибка инициализации. карта не обнаружена или не подключён (неправильно подключён) адаптер карт MicroSD }
//проверяем наличие файла “iarduino.txt” на SD-карте if(SD.exists(“iarduino.txt”)){ // если файл с именем “iarduino.txt” существует, то … Serial.println(“file exists”);
// удаляем файл “iarduino.txt”: if(SD.remove(“iarduino.txt”)){ // функция возвращает результат удаления true/false Serial.
println(“file deleted”); }else{ Serial.println(“file is not deleted”); } }else{ // иначе … Serial.println(“file doesn't exist”); }
//проверяем наличие файла “iarduino.txt” на SD-карте if(SD.exists(“iarduino.txt”)){ // если файл с именем “iarduino.txt” существует, то … Serial.println(“file exists”); }else{ // иначе … Serial.
println(“file doesn't exist”); }
}
void loop(){
}
если подключить адаптер карт MicroSD v1.0 к Arduino Uno, подключить Arduino Uno к ПК, загрузить скетч, вставить SD-карту и запустить Монитор последовательного порта, то в мониторе будут выведены следующие строки:
file exists (файл обнаружен) file deleted (файл удалён) file doesn't exist (файл не обнаружен)
а файл “iarduino.txt” будет удалён с SD-карты.
Если загрузить скетч при вставленной в адаптер карт MicroSD v1.0 SD-картой, то файл “iarduino.txt” будет удалён с SD-карты, но в мониторе последовательного порта будут две строки “file doesn't exist” (файл не обнаружен).
Дело в том, что функция setup() в обоих случаях выполняется дважды (сразу после загрузки скетча и после запуска монитора последовательного порта). Но в первом случае, после загрузки скетча, SD-карты не было в адаптере, следовательно, файл “iarduino.txt” был удалён только после запуска монитора последовательного порта.
Источник: https://lesson.iarduino.ru/page/urok-20-podklyuchenie-i-rabota-s-flesh-kartoy-na-arduino/
Подключение и использование SD карты c Arduino
SD модуль
Постоянная память, доступная пользователю на самой «навороченной» плате Arduino Mega всего 4 килобайта. Arduino Nano имеет всего 1 килобайт памяти. Этого хватит для запоминания нескольких переменных.
А что если возникает задача, в которой необходимо хранить большие объёмы данных? Например, историю изменения температуры или телеметрию квадрокоптера? Идеальное решение проблемы — подключение к контроллеру SD карты.
Вы получаете практически неограниченный объём для хранения любой информации. SD карту можно подключить к Arduino напрямую, припаяв провода прямо к контактам карты. Однако, проще и удобнее воспользоваться специальным модулем для работы с SD картой.
В статье рассказано о подключении такого модуля к различным платам Arduino и работе с самой SD картой. Заказать модуль у проверенного мной продавца вы можете здесь.
Модуль располагает двухрядной гребёнкой штырьковых контактов. Однако, для подключения используются всего 6 контактов. Работа с модулем осуществляется по интерфейсу SPI. Вы могли заметить на платах Arduino небольшой разъём, состоящий из 6 штырьков на лицевой части платы. Это и есть SPI разъём.
Правильное его название — ICSP. Он есть на большинстве плат. Для подключения к этому разъёму удобно использовать провода мама-мама. На некоторых моделях (Mega2560, Nano, Uno) SPI пины продублированы на цифровых пинах платы.
В таблице ниже приведено соответствие SPI контактам цифровых выводов:
Плата Arduino | MOSI | MISO | SCK |
Nano, Uno | 11 | 12 | 13 |
Mega2560 | 51 | 50 | 52 |
Leonardo | ICSP-4 | ICSP-1 | ICSP-3 |
В Arduino Leonardo пины SPI разъёма не дублируются на цифровые пины и подключить модуль можно только к SPI разъёму по следующей схеме:
ICSP разъём Arduino
Итак, выводы модуля подключаем к выводам платы в соответствии с таблицей. MOSI модуля к MOSI платы и т.д. Вывод модуля CS можно подключить к любому свободному цифровому выводу платы. Для удобства, подключаем его к 10 цифровому выводу.
Именно этот вывод используется в стандартных примерах и нам не придётся править программу перед загрузкой в плату. SD модуль оборудован стабилизатором напряжения, поэтому, для питания модуля можно использовать как напряжение 5В, так и 3,3В. Мы рекомендуем использовать 5В.
Внимание — не рекомендуется подключать к плате одновременно 3,3 и 5В!
При подключении модуля к Arduino Nano с помощью проводов мама-мама даже макетная плата не понадобится
Установите в модуль SD карту, отформатированную в файловую систему FAT32 или FAT16 и загрузите в плату следующий скетч:
* SD карта подключается так: ; //Ждём инициализации серийного порта. Нужно для Leonardo Serial.print(“Initializing SD card…”); // Магия. Этот вывод должен быть настроен как выход. // Иначе, некоторые функции могут не работать. Serial.println(“initialization failed!”); Serial.println(“initialization done.”); if (SD.exists(“example.txt”)) { Serial.println(“example.txt exists.”); Serial.println(“example.txt doesn't exist.”); //Откроем новый файл и сразу же закроем его: Serial.println(“Creating example.txt…”); myFile = SD.open(“example.txt”, FILE_WRITE); //Проверяем, создан ли файл: if (SD.exists(“example.txt”)) { Serial.println(“example.txt exists.”); Serial.println(“example.txt doesn't exist.”); Serial.println(“Removing example.txt…”); SD.remove(“example.txt”); if (SD.exists(“example.txt”)){ Serial.println(“example.txt exists.”); Serial.println(“example.txt doesn't exist.”); //Тут ничего не происходит |
Этот скетч проверяет, создан ли файл example.txt на карте памяти. Если не создан — создаёт его.
Другой скетч. Пример записи и чтения данных с карты:
* SD карта подключается так:// Open serial communications and wait for port to open: ; //Ждём инициализации серийного порта. Нужно для Leonardo Serial.print(“Initializing SD card…”); // Магия. Этот вывод должен быть настроен как выход. // Иначе, некоторые функции могут не работать. Serial.println(“initialization failed!”); Serial.println(“initialization done.”); // Открываем файл для записи. Только один файл // может быть открыт одновременно // вы можете закрыть файл, что бы открыть другой. myFile = SD.open(“test.txt”, FILE_WRITE); // Если файл открылся, пишем в него: Serial.print(“Writing to test.txt…”); myFile.println(“testing 1, 2, 3.”); // если файл не открылся, сообщает об ошибке: Serial.println(“error opening test.txt”); // открываем файл только для чтения myFile = SD.open(“test.txt”); Serial.println(“test.txt:”); // читаем файл посимвольно до конца: while (myFile.available()) { Serial.write(myFile.read()); // если файл не открылся, сообщает об ошибке: Serial.println(“error opening test.txt”);//Тут ничего не происходит |
Скетч довольно понятный сам по себе и не требует подробных объяснений. Всё не намного сложнее, чем работа с серийным портом.
Оба эти скетча доступны среди стандартных примеров среды разработки Arduino IDE (Файл->Примеры->SD). В стандартных примерах есть и другие скетчи, раскрывающие некоторые приёмы работы с SD картой.
Вот список стандартных примеров с описанием:
Datalogger: Пример сохранения значений с 3х аналоговых датчиков, подключённых к Arduino
DumpFile: Чтение файла с SD карты и передача содержимого файла в серийный порт
Files: Создание и удаление файла на SD карте
listfiles: Выводит список файлов на SD карте
ReadWrite: Чтение и запись в файл
CardInfo: Выводит некоторую информацию о подключённой SD карте
Напоминаю, модуль у проверенного продавца вы можете заказать здесь. Полный список товаров, которые я заказал и протестировал здесь.
Источник: https://uscr.ru/podklyuchenie-i-ispolzovanie-sd-karty-c-arduino/
Подключаем SD карту памяти к Arduino
При постройке на базе Arduino разнообразных проектов, часто возникает необходимость записывать какие то данные в память.
Например имеется «умный дом» и нужно записывать показания различных датчиков или имеется летательный аппарат, который должен записывать координаты GPS в память.
Использовать для этих целей внутреннюю память Arduino не получится, её очень мало, но можно подключить внешнюю память, в качестве которой может выступать SD карта.
Модуль для SD карты может быть в формате SD…
… либо micro SD. Ничего сложно в модуле нет, несколько резисторов и стабилизатор напряжения AMS1117-3.3. SD карта питается от 3,3В, поэтому стабилизатор AMS1117-3.3 служит для понижения напряжения питания с 4,5 — 5В до 3,3,В.
Питание SD-модуля.
На некоторых SD модулях присутствуют контакты с двумя напряжениями (+5, +3,3). В таком случае, к контакту «+3,3» можно подключать стабилизированное напряжение 3,3В, которое будет напрямую поступать на карту памяти.
Если нет такого напряжения, тогда к контакту «+5» можно подавать напряжение от 4,5 до 5В, которое будет через стабилизатор преобразовываться в 3,3В и поступать на карту. Не рекомендуется к контакту «+3,3» подавать большее напряжение, это может привести к выходу со строя SD карточки.
На тех модулях где присутствует только контакт «VCC», к нему нужно подключать напряжение только от 4,5 до 5В.
Если использовать для питания SD модуля соответствующие контакты на плате Arduino UNO или Mega 2560 нужно понимать, что с контакта «+5» можно получить ток до 800 мА, а с контакта «+3,3» всего до 50 мА.
Сама же карта при записи данных может потреблять до 100 мА, поэтому если брать с ардуино питание 3,3 вольта, эти контакты могут не обеспечить нужный ток. В таком случае нужно использовать отдельный источник.
На плате Arduino DUE имеются так же контакты “3.3V” и “5V”, от которых можно питать различные модули и датчики. Максимально выходной ток на этих выводах 800 мА.
Логические уровни.
Помимо питания в 3,3 вольта, картам памяти требуется и такое же напряжение на логических уровнях. Поскольку мы будем подключать карту к Ардуино, напрямую их логические уровни соединять нельзя.
Почему? В Arduino используется микроконтроллер Atmega, который питается от 5 вольт, соответственно его логические уровни тоже 5 вольт (от какого напряжения питается контроллер, такое напряжение присутствует у него на логических уровнях). Это значит что логическая единица равна 5 вольт. Логические же уровни SD карты 3, 3 вольта, поскольку питание у карты такое же.
Для подключение Arduino и SD модуля нужно согласовать их уровни. Для согласования уровней могут использоваться резисторы или специальные микросхемы, иногда могут использоваться транзисторы.
В моём случае, модуль под карту microSD содержит преобразователь уровней на микросхеме LVC125A.
Внимание! Платформа Arduino DUE работает с логическими уровнями 3,3В и для работы с SD картой не требуется согласование уровней. Подключать SD карту к данной платформе нужно напрямую к SPI интерфейсу, минуя резисторы, транзисторы и микросхемы, которые принимают участие в согласовании уровней.
Подключение к Arduino.
Подключать SD модуль к Arduino будем по SPI интерфейсу. Для этого нам понадобятся выводы SCK, MISO, MOSI и CS.В начале подключу модуль в формате SD к своему китайскому алалогу Arduino UNO.Каждый вывод на модуле представлен двумя параллельными пинами, можно подключать к любому.
Для SPI-интерфейса у ардуино имеются специально отведённые пины, у UNO, Pro mini и Nano они одинаковые, у MEGA другие:
Пины на UNO, Nano, Pro mini | Пины на MEGA | SPI выводы |
10 | 53 | CS |
11 | 51 | MOSI |
12 | 50 | MISO |
13 | 52 | SCK |
Вывод CS можно закрепить за любым свободным пином, но тогда это изменение нужно внести в скетч. Традиционно используют пины, указанные в таблице.
На платах UNO, Nano и MEGA пины SPI-интерфейса продублированы в виде отдельного 6-контактного разъёма ISCP, можно подключаться и к нему.На плате Arduino DUE это единственные контакты SPI, к ним и нужно подключать модуль.
Подключим SD-модуль к Arduino UNO по следующей схеме. SD карту нужно отформатировать на компьютере в формате FAT16 или FAT32.
Пример 1
Библиотека “SD” и образцы скетчей, для работы с картой памяти, включены в состав Arduino IDE.
Откроем скетч “CardInfo“: “Файл” – “Образцы” – “SD” – “CardInfo”.
Данный скетч попробует опознать карту и если она исправна, правильно подключена и правильно отформатирована,то выдаст по ней информацию. По-умолчанию контакты SPI интерфейса сконфигурированы для Arduino UNO, для MEGA нужно будет менять номера пинов SCK, MISO и MOSI.
Обратим внимание на строку “const int chipSelect = 4;“, по-умолчанию пин CS в скетче закреплён за 4 пином на плате ардуино. Поскольку вывод CS я подключил к 10 пину, четвёрку сменю на 10.
Загружаем скетч, открываем монитор последовательного порта.
В моём случае наблюдаем надпись “…initialization failed“, это значит что возникла ошибка при инициализации карты.
В подобном случае нужно проверить правильна ли вставлена карта, правильна ли SD модуль подключен к Arduino, соответствует ли номер CS пина в скетче, с номером пина на плате.
В моём случае я забыл сменить в скетче номер пина CS на 10, меняем и пробуем вновь залить скетч.
Теперь всё в порядке, инициализация карты прошла успешна и нам выдалась информация по ней: Тип карты – SD, Файловая система на ней – FAT32, Объём – 967 Мбайт.
Пример 2
Давайте теперь попробуем создать на SD карте текстовый файл, записать в него какую то информацию, а затем прочитать эту информацию на компьютере. Откроем скетч “ReadWrite“, из того же стандартного набора скетчей, откуда загружали скетч “CardInfo”.
В строке “if (!SD.begin(10)) {” нужно что бы был правильно указан номер пина, на котором у вас подключен вывод CS. Загружаем скетч и проверяем его работу, открыв монитор последовательного порта.
Здесь мы видим что карта удачно инициализировалась, записался на карту файл “test.txt“, в который записались данные “testing 1, 2, 3“. Каждый раз как мы будем вызывать монитор последовательного порта, в файл “test.
txt” будут дописываться новые строки.
Что бы в этом убедится, откроем карту памяти на компьютере. На ней будет созданный файл с соответствующим содержанием.
Пример 3
С помощью скетча “ReadWrite” можно не только записывать данные в файл, но и считывать данные из файла.
Создадим через компьютер на карте памяти текстовый файл. В примере назвал его “radiolis.txt“. Библиотека для работы с SD картами не чувствительна к регистру, поэтому имя файла “radiolis.txt” и “RADIOLIS.PP.UA” это одно и то же. В созданный файл поместим какую то текстовую информацию, в данном примере я вписал имя своего сайта.
В скетче нужно указать, какой файл следует открыть для чтения с него информации. По-умолчанию в скетче открывался файл “test.txt”, вместо него вписываем имя файла (radiolis.txt), который нужно открыть. Вновь загружаем скетч.
Открываем монитор последовательного порта и видим что содержимое файла “radiolis.txt” содержит текстовую информацию “radiolis.pp.ua“.
Пример 4
Давайте теперь поработаем с файлами на карте памяти через Arduino. Для этого загрузим скетч “listfiles“, с того же стандартного набора, входящего в библиотеку для работы с SD картами.
Запускаем монитор последовательного порта и видим список всех файлов, которые находятся на SD карте, в данном примере это “test.txt” и “radiolis.txt“. Цифры напротив файла это их объём.
Если на карте памяти имеются папки, то они так же будут отображаться со своим содержимым. В примере добавил с компьютера папку “primer“, а в неё поместил текстовый файл “primer_1.txt“, как видим всё отобразилось.
Источник: http://radiolis.pp.ua/arduino/47-sd-card-arduino
SD card модуль подключить к Ардуино
Опубликовано 14.07.2013 12:57:00
Иногда в проектах требуется сохранить большое количество информации. В данной статье мы рассмотрим один из вариантов решения данной задачи – SD card модуль. Разберем стандартные примеры-основы, а в конце перейдем к считыванию показаний с модуля датчика температуры и влажности DHT11 и их записи на карту.
Компоненты для повторения (купить в Китае):
Arduino UNO, либо Arduino Nano, либо Arduino Mega
SD card модуль
Соединительные провода (перемычки)
SD card модуль найдет свое применение в проектах где вам недостаточно объема EEPROM (энергонезависимая память), либо необходимо сохранять данные получаемые с различных датчиков на внешний носитель для последующей обработки.
Подключение сигнальных линий и земли к Arduino производится следующим образом:
SD Card модуль | Arduino на базе 328 |
CS | D4 |
MOSI | D11 |
MISO | D12 |
SCK | D13 |
GND | GND |
Касательно питания, на плате есть разъемы для подключения напряжения на 5 вольт и и 3.3
Непосредственно сама SD карта питается от 3.3 вольт. Плюсом данного модуля является установленный стабилизатор на необходимые 3.3 вольта. Так что если у вас под рукой нет 3.3вольт, то подавайте питание на разъем 5 вольт и все будет работать. На иллюстрации модуль запитан как раз таки от +5V.
Приведем простой пример работы с этим модулем в среде Arduino, с использованием стандартной библиотеки SD.h.
Создадим на SD карте файл с небольшим текстом и попробуем скопировать его в другой, посредством ардуино. Важно помнить, что одновременно может быть открыт только 1 файл.
//Тестировалось на Arduino IDE 1.0.1
#include File originalFile; // Файл который будет скопирован
File copiedFile; // Файл – копия
char* ORIGINAL_FILE_NAME = “1.txt”; // Название копируемого файла
char* COPIED_FILE_NAME = “2.txt”; // Название файла копии
char fileText[255]; // Хранилище для текста содержащегося в копируемом файле void setup()
{
Serial.begin(9600);
// SPI SS пин должен быть OUTPUT
pinMode(10, OUTPUT);
// Инициализируем СД карту
Serial.print(“Initializing SD card…”);
if (!SD.begin(4)) {
Serial.println(“initialization failed!”);
return;
}
Serial.println(“initialization done.”);
// Открываем первый файл
originalFile = SD.open(ORIGINAL_FILE_NAME);
if (originalFile) {
Serial.println(ORIGINAL_FILE_NAME);
// Считываем текст из 1 файла
int i = 0;
while (originalFile.available()) {
char c = originalFile.read();
fileText[i++] = c;
Serial.write(c);
}
fileText[i] = 0;
// Закрываем файл
originalFile.close();
} else {
// Если произошла ошибка открытия файла, выводим сообщение
Serial.print(“error opening “);
Serial.println(ORIGINAL_FILE_NAME);
}
// Открываем (или создаем, если его нет) файл копии
copiedFile = SD.open(COPIED_FILE_NAME, FILE_WRITE); // Записываем в него считанный текст
if (copiedFile) {
Serial.print(“Copying…”);
copiedFile.println(fileText);
// Закрываем файл
copiedFile.close();
Serial.println(“done.”);
} else {
// Если произошла ошибка открытия файла, выводим сообщение
Serial.print(“error opening “);
Serial.println(COPIED_FILE_NAME);
}
}
// Весь код был выполнен в функции setup
void loop()
{
}
Теперь перейдем к более сложному примеру, который может найти применение в реальной жизни, а именно подключение данных с датчика и запись их в текстовый файл. В качестве датчика используем наш любимый датчик температуры и влажности DHT11. Датчик присоединяется к цифровому пину 7.
SD card модуль подключение к Arduino
Ссылка на библиотеку, для работы с DHT11.
Пример кода SD card + DHT11
#include
#include // Добавляем библиотеку DHT11
dht11 DHT; // Объявление переменной класса dht11
#define DHT11_PIN 7 // Датчик DHT11 подключен к цифровому пину номер 7
File sensorDataFile; // Файл в который будут записаны показания с датчика
char* SENSOR_DATA_FILE_NAME = “1.
txt”; // Название файла
int chk; //переменная для отслеживания ошибок dht11 void setup()
{ Serial.begin(9600); // Инициализируем СД карту Serial.print(“Initializing SD card…”); if (!SD.begin(4)) { Serial.println(“initialization failed!”); return; } Serial.println(“initialization done.
“); // Открываем (или создаем, если его нет) файл для записи данных с датчика sensorDataFile = SD.open(SENSOR_DATA_FILE_NAME, FILE_WRITE); for (int i = 0; i < 10; i++) //делаем 10 замеров { chk = DHT.
read(DHT11_PIN); // Чтение данных switch (chk) { case DHTLIB_OK: if (sensorDataFile) { char msg[128]; sprintf(msg, “Current humidity = %d%% temperature = %dC”, DHT.humidity, DHT.temperature); Serial.println(msg); sensorDataFile.println(msg); } else { Serial.println(“File error, “); } break; case DHTLIB_ERROR_CHECKSUM: Serial.
println(“Checksum error, “); break; case DHTLIB_ERROR_TIMEOUT: Serial.println(“Time out error, “); break; default: Serial.println(“Unknown error, “); break; } delay(1000); } sensorDataFile.close(); Serial.println(“Finished.”);
} void loop()
{
}
P.S. Несмотря на то, что скорость записи на SD карту не так высока в сравнении с записью в EEPROM и тем более в обычную энергозависимую память контроллера, данный модуль бесспорно расширяет потенциал Arduino, позволяя автономно хранить огромные объемы данных, а также переносить их на обычной флешке.
Купить в России SD card модуль
В данный момент еще реализованы не все элементы нашего сообщества. Мы активно работаем над ним и в ближайшее время возможность комментирования статей будет добавлена.
Источник: http://zelectro.cc/SD_card_module_Arduino
Модуль SD карты и Arduino
Если в вашем проекте необходимо обеспечить загрузку аудио, видео, графики, записи любых данных, возникает вопрос внешней памяти.
В большинстве микроконтроллеров встроенная память очень ограничена. Например, даже чип на Arduino Mega (Atmega2560) предоставляет всего лишь 4 Кбайта EEPROM для хранения данных. Конечно, флеш памяти побольше – 256 кбайт, но при ее использовании возникают проблемы с записью. Самое банальное – можно нечаянно перезаписать саму программу, загруженную на плату.
При загрузке графических или музыкальных файлов вам наверняка понадобится минимум 1 мегабайт хранилища. А если загружается больше информации? В этом случае можно использовать те же средства, что и в современных видеокамерах, сматфонах, mp3 плеерах: карта памяти!
Карты памяти часто называют SD или microSD картами и они позволяют хранить гигабайты информации. Продаются карты памяти в любом магазине электроники, так что проблем с покупкой не будет. Кроме того, на большинстве компьютеров есть кард-ридеры, так что с передачей полученной информации проблем не будет.
Что необходимо знать при использовании SD карт с Arduino
Первое. Карты рассчитаны на 3.3 В. При записи данных сила тока может достигать больших значений: до 100 мА и даже больше! Это говорит о том, что надо обеспечить качественное питание 3.3 В для карты. Кроме того, надо иметь источник питания 3.3 В для питания логики.
SD карты очень чувствительны – использование резисторов и длинных проводников при подключении приводят к значительному падению скорости передачи данных. Так что используйте максимально короткие коннекторы и избегайте резисторов в цепи питания логики.
Вместо этого можно использовать преобразователи уровня на базе чипов HEF4050, 74LVX245 или 74AHC125.
Второе. Есть два режима: SPI и SDIO. SDIO отрабатывает быстрее, но реализовать его при работе с Arduino сложно. SPI режим гораздо проще наладить при работе с любым микроконтроллером. Для подключения в режиме SPI понадобится всего четыре пина (более детально мы рассмотрим этот вопрос дальше).
SD карты выпускаются в двух форм-факторах: microSD и SD. Подключение, программа, структура и т.п. Для них одинакова. Единственное отличие – размер. Micro SD карты значительно меньше по габаритам.
Третье. SD карты представляют из себя чип с отдельными секторами. То есть, определенной структуры, которую вы обязаны использовать нет. Это значит, что карту можно отформатировать под файловую систему Linux, GFAT (DOS) или Mac.
На ней вообще может отсутствовать файловая система! При этом 99% компьютеров, камер, MP-3 плееров, GPS-навигаторов для использования требуют формат файловой системы FAT16 или FAT32.
Загвоздка заключается в том, что в микроконтроллерах вроде Arduino выделяется относительно большой процент памяти при работе со сложными файловыми системами.
Форматирование SD карты
В принципе, вы можете использовать SD карту без файловой системы, но это не очень удобно. Для работы с Arduino лучше использовать формат FAT16 или FAT32. В основном это связано с наличием соответствующих библиотек. Некоторые поддерживают один формат, некоторые – другой. Библиотека Arduino SD поддерживает оба формата.
При покупке новой SE карты высока вероятность, что она уже будет форматирована под файловую систему FAT. Проблемы все равно могут появиться. Неизвестно, как именно ее форматировал производитель. Если карта старая, ее желательно тоже проверить.
Библиотека Arduino SD, которую мы будем использовать поддерживает оба формата: FAT16 и FAT32. Если у вас небольшая карта, например, 8-32 мегабайта, она может быть форматирована под FAT12, которая не поддерживается. Придется ее форматнуть под 16 или 32.
В общем, рекомендуем в любом случае отформатировать карту перед ее использованием.
Для форматирования можно использовать например эту программу: SD Card Formatter
На странице загрузки есть инструкция по использованию программы. Проблем у вас возникнуть не должно.
Ссылки для заказа оборудования, которое использовалось в проекте из Китая
- КУПИТЬ Arduino Uno R3;
- КУПИТЬ Breadboard;
- КУПИТЬ модуль модуля SD карты;
Подключение модуля SD-card к Arduino
После предварительной подготовки SD карты, можем приступить к подключению платы расширения microSD и Arduino. Плата расширения значительно облегчает подключение.
На ней установлен регулятор, который преобразовывает напряжение 3.3 – 6 В в 3.3 В (I2C). Есть регулятор уровня, который преобразует питание логики из 3.3-5 В в 3.3 В.
Это значит, что плату расширения можно использовать с микроконтроллерами 3.3 В и 5 В.
В нашем примере использован микроконтроллер Arduino. Если вы используете другой микроконтроллер, схема подключения и код могут отличаться.
Лучше всего подключать SD карту к пинам hardware SPI, потому-что при ее использовании происходит передача большого количества данных. На “классических платах Arduino (Duemilanove/Diecimila/Uno) это цифровой пин 13 (SCK), 12 (MISO) и 11 (MOSI). Вам также понадобится четвертый пин для цепи 'chip/slave select' (SS).
Традиционно используют 10 пин, но можно и другой. Обратите внимание, что если у вас плата Arduino Mega, пины будут отличаться! В этом случае используйте 50 (MISO), 51 (MOSI), 52 (SCK) и 53 (SS) для цепи CS. Опять таки, вы можете изменить пин SS (10 или 53).
Но для первого раза рекомендуем подключать именно так для корректной отработки кода, который будет приведен ниже.
- Подключите пин 5V к пину 5V на Arduino
- Подключите пин GND к пину GND на Arduino
- Подключите Пин CLK к пину 13 или 52
- Подключите DO к пину 12 или 50
- Подключите DI к пину 11 или 51
- Подключите CS к пину 10 или 53
Есть еще один коннектор – CD – это пин для инициализации SD карты. Он замыкается на землю, когда карта установлена. Если вы хотите его задействовать, подключите подтягивающий резистор (около 10 кОм) и дальше к другому пину. В данном примере рассматривать эту опцию мы не будем.
Все! Мы готовы отжигать!
Загрузка библиотеки и первый запуск SD карты
Передача данных на SD карту – это большой кусок кода, но к счастью для нас есть интегрированная в Arduino IDE библиотека под названием SD (название в точку, не правда ли? :)). Найти эту библиотеку можно в подменю Examples. В подменю Examples выберите скетч CardInfo.
С помощью этого скетча вы не сможете передавать данные, а просто получите ответ, опознана ли подключенная SD-карта. Очень полезный скетч, если необходимо узнать, поддерживается ли работа именно с вашей картой. Перед работой с новой картой обязательно проводите эту проверку!
В начале скетча проверьте переменную chipSelect. В данным примере мы подключаемся к 10 пину, соответственно переменная принимает значение 10.
Теперь устанавливаем SD карту в плату расширения и загружаем скетч.
Откройте окно серийного монитора в Arduino IDE, наберите какой-то символ и нажмите Send. Скорее всего у вас отобразится нечто подобное:
Обратите внимание, выдалась информация, что тип файловой системы – FAT16, размер карты (около 2 Гб, что в данном случае соответствует действительности) и т.п.
Если вам попалась плохая карта (в первую очередь, это карты от неизвестных производителей), отобразится примерно следующее:
В данном примере карта отвечает на запросы, но некорректно. Обратите внимание, рядом с Product ID выводится “N/A”, отсутствуют Manufacturer ID и OEM ID. Кроме того, карта возвращает ошибки SD errors. В общем, карта неработоспособна. Можно попробовать ее форматировать. Если после форматирования ошибки не исчезли, использовать ее не получится.
Попробуйте извлечь SD карту и вновь запустить программу. В окне серийного монитора появится следующее:
Это ошибки появляются, если не получилось даже инициализировать карту. Первая возможная причина: карта повреждена. Вторая: неправильное подключение модуля SD карты к Arduino.
Запись данных на SD карту через Arduino
В приведенном скетче продемонстрированы базовые возможности для записи данных на карту. По сути это основа для работы с модулем SD карты.
#include<\p>
File myFile;
void setup()
{
Serial.begin(9600);
Serial.print(“Initializing SD card…”);
// на Ethernet шилде CS соответствует 4 пину. По умолчанию он установлен в режим output
// обратите внимание, что если он не используется в качестве CS пина, SS пин на оборудовании
// (10 на большинстве плат Arduino, 53 на Arduino Mega) надо оставить в режиме output.
// иначе функции библиотеки SD library не будут работать.
pinMode(10, OUTPUT);
if (!SD.begin(10)) {
Serial.println(“initialization failed!”);
return;
}
Serial.println(“initialization done.”);
// открываем файл. Обратите внимание, что открывать несколько файлов параллельно нельзя.
// перед открытием нового файла, старый надо закрыть
myFile = SD.open(“test.txt”, FILE_WRITE);
// если удалось открыть файл, записываем в него:
if (myFile) {
Serial.print(“Writing to test.txt…”);
myFile.println(“testing 1, 2, 3.”);
// закрываем файл:
myFile.close();
Serial.println(“done.”);
} else {
// если файл не открылся, выводим сообщение об ошибке:
Serial.println(“error opening test.txt”);
}
}
void loop()
{
// после setup ничего не происходит
}
Запустив скетч на выполнение, вы увидите следующее:
После отработки скетча, можете открыть сформированный файл на персональном компьютере. Каждая строка соответствует одному циклу работы программы. То есть, данные добавляются, а не переписываются.
Стоит отметить несколько вещей:
- Можно одновременно открывать несколько файлов и записывать в тот, который вы выберете.
- Для записи строк, переменных и т.п. Используются функции print и println()
- Вы должны закрыть (close()) файл(ы) после завершения, чтобы данные точно записались!
- Вы можете открывать файлы из подпапок. Например, если вы хотите открыть файл, который находится по адрес /MyFiles/example.txt, вы можете вызвать SD.open(“/myfiles/example.txt”) и все отлично отработает.
Библиотека SD card не поддерживает 'длинные названия', так что имена файлов должны быть короткими! Например, IMAGE.JPG – отличное название, datalog.txt – тоже подходит. А вот что-то вроде “My GPS log file.text” не подойдет! Также учтите, названия не чувствительны к регистру. То есть, datalog.txt – это то же самое, что и DataLog.Txt или DATALOG.TXT
Считывание данных с SD карту через Arduino
Теперь разберемся как можно считывать информацию из файла, который хранится на карте. Процесс очень похож на запись. Будем использовать функцию SD.open() с указанием имени файла. Можно вызвать функцию available() (которая сообщит вам, есть ли на карте информация для считывания) и read() из файла, которая вернет следующий байт.
#include<\p>
File myFile;
void setup()
{
Serial.begin(9600);
Serial.print(“Initializing SD card…”);
// на Ethernet шилде CS соответствует 4 пину. По умолчанию он установлен в режим output
// обратите внимание, что если он не используется в качестве CS пина, SS пин на оборудовании
// (10 на большинстве плат Arduino, 53 на Arduino Mega) надо оставить в режиме output.
// иначе функции библиотеки SD library не будут работать.
pinMode(10, OUTPUT);
if (!SD.begin(10)) {
Serial.println(“initialization failed!”);
return;
}
Serial.println(“initialization done.”);
// открываем файл для считывания данных:
myFile = SD.open(“test.txt”);
if (myFile) {
Serial.println(“test.txt:”);
// считываем все данные из файла:
while (myFile.available()) {
Serial.write(myFile.read());
}
// закрываем файл:
myFile.close();
} else {
// если файл не открылся, отображаем сообщение об ошибке:
Serial.println(“error opening test.txt”);
}
}
void loop()
{
// после setup ничего не происходит
}
Некоторые важные примечания:
- Вы можете держать одновременно открытыми несколько файлов и считывать информацию из нужного вам.
- Read() возвращает байт за единицу времени. Функция не считывает всю строку!
- В конце надо использовать функцию close() для закрытия файлов, чтобы сократить объем используемой RAM памяти.
Рекурсивная запись/считывание информации из файлов
В этой части мы рассмотрим пример более “продвинутого” использования SD карты. Например, подождем, пока не будут прочитаны все файлы с SD карты или будет воспроизводить с бесконечным повтором музыкальный файл.
В последних версиях библиотеки SD library вы можете перемещаться по папкам и вызывать следующий доступный файл с помощью функции openNextFile().
Файлы открываются не в алфавитном порядке, а в соответствии со временем их создания!
Запустите пример скетча SD→listfiles.
Там вы обнаружите подпапку ANIM (в ней находятся файлы с анимацией). Числа после названия файла характеризуют размер файла в байтах. Очень полезная программа, если вы хотите проверить какие именно файлы вызываются с вашей карты.
Стоит отметить несколько вещей:
Другие полезные функции
Есть и другие полезные функции для работы с SD картой. Некоторые из них мы приведем ниже:
- Если вы хотите проверить наличие файла на носителе, используйте функцию SD.exists(“имя_файла.txt”), которая вернет значение true или false.
- Удалить файл можно с помощью функции SD.remove(“имя_файла.txt”). Но будьте аккуратны! Файл удалиться полностью. Никакой “корзины” или резервной копии для восстановления не останется.
- Создать подпапку можно с помощью функции SD.mkdir(“/имя_новой_папки”). Очень удобно для структуризации ваших данных на начальном уровне. Если папка с таким именем уже существует, ничего не произойдет. Не забывайте, что вы можете воспользоваться функцией SD.exists() перед созданием папки для проверки.
Несколько полезных функций для работы с файлами:
- Для перемещения указателя при считывании/записи файла, используется функция seek(). Например, запись функции в виде seek(0) переместит вас в начало файла.
- Функция position() позволит вам узнать, где именно вы находитесь в пределах файла на данный момент.
- Функция size() выведет вам информацию о размере файла в байтах.
- Узнать, является ли файл на карте директорией можно вызвав функцию isDirectory().
- Последовательная работа с файлами, которые находятся в папке реализуется с помощью вызова функции openNextFile().
- Возможно, вам понадобится имя файла. Например, если вы вызвали следующий файл в папке с помощью openNextFile(). В этом случае можно воспользоваться функцией name(), которая вернет массив символьных данных, которые можно отобразить непосредственно в серийном мониторе Arduino IDE с помощью Serial.print().
Загрузки
- Даташит на microSD карту: Transcend.
- Последняя версия библиотеки SD card library: Github.
Источник: http://arduino-diy.com/arduino-SD-karta