Подключение sd карты к ардуино
SD и microSD карты могут существенно расширить возможности проектов ардуино, работающих с большими объемами данных: регистраторов данных, метеостанций, систем умного дома. Платы arduino оснащены сравнительно небольшой внутренней памятью, всего до 4 килобайт, включая и флэш-память, и EEPROM.
Этой памяти не хватит для записи больших объемов данных, тем более, если плата будет постоянно выключаться или выключаться. Подключение SD карты ардуино в качестве внешнего накопителя позволяет многократно увеличить место для хранения любой информации. Съемные накопители SD стоят дешево, легко подключаются и удобны в использовании.
О правильном подключении SD карты к Arduino и пойдет речь в статье.
Описание модуля для SD карты памяти
Работа с памятью SD в ардуино не представляет особых трудностей. Самым простым способом является подключение готового модуля и использование стандартной библиотеки. С этого варианта мы и начнем.
Использование готового модуля обладает различными преимуществами. Это довольно простое и удобное средство для работы с большим объемом данных. Он не требует особых навыков в подключении, все разъемы подписаны прямо на плате. За удобство приходится платить, но стоимость модуля относительно не велика, его легко можно найти по доступным ценам в российских и зарубежных интернет-магазинах.
Универсальный модуль представляет собой обыкновенную плату, на которой помещены слот для карты, резисторы и регулятор напряжений. Он обладает следующими техническими характеристиками:
- Диапазон рабочих напряжений 4,5-5 В;
- Поддержка SD карты до 2 Гб;
- Ток 80 мА;
- Файловая система FAT 16.
Модуль SD-карты реализует такие функции как хранение, чтение и запись информации на карту, которая требуется для нормального функционирования прибора на базе микроконтроллера.
Естественно, у недорогих модулей карт памяти есть и недостатки. Например, самые дешевые и распространенные модели поддерживают только карты до 4Гб и почти все модули позволяют хранить на SD карте файлы объемом до двух гигабайт – это ограничение используемой в большинстве моделей файловой системы FAT.
Еще одним недостатком карт памяти является относительно долгое время записи, однако существуют пути работы с ней, позволяющие увеличить ее скорость работы. Для этого используется механизм кэширования, когда данные сначала копятся в оперативной памяти, а потом сбрасываются за раз на карту памяти.
Платы Arduino для работы с SD
Для работы с SD card существует несколько различных плат:
- Arduino Ethernet – эта плата оснащена специальным модулем для вывода данных. Для выхода CS используется контакт 4. Для правильной работы нужно применять команду SD.begin(4).
- Adafruit Micro-SD – это отладочная плата, которая используется при работе с Micro-SD картами.
- Sparkfun SD – закрепляется сверху Ардуино, для выхода CS использует 8 контакт. В новой версии платы есть соединение с 3.3 В и встроен шестиразрядный инвертор.
Подключение SD и microSD к ардуино
Существует два вида карт — microSD и SD. Они одинаковы по подключению, структуре и программе, различаются же только размером. Перед работой советуется отформатировать карту SD.
Обычно новые карты уже отформатированы и готовы к работе, но если используется старая карта, то лучше провести форматирование в файловой системе Arduino. Для проведения процедуры на компьютере должна быть установлена библиотека SD, желательно FAT16.
Для форматирования на Windows нужно щелкнуть на иконке карты и нажать «Format».
Для подключения карты используется 6 контактов, взаимодействие производится по интерфейсу SPI. Она выглядит на плате как разъем на лицевой поверхности с шестью штырями.
Чтобы подключить карту, нужны сам контроллер, модуль карты и 6 проводов. Помимо SPI существует режим SDIO, но он сложен в реализации и слабо совместим с Ардуино.
SPI легко налаживается для работы со всеми микроконтроллерами, поэтому советуется использовать именно его.
Подключение цифровых выводов производится так: для платы Arduino Nano или Uno контакт MOSI подключается к D11, MISO к D12,SCK к D13, CS к 4, VCC на +5 В,.GND к GND.
На плате имеются разъемы для подключения к 3,3 и 5 вольтам. Питание самой карты составляет 3,3 вольт, поэтому проще применять микроконтроллер с таким же питанием, в ином случае нужен преобразователей уровней напряжения.
На самых распространенных платах ардуино такой выход есть.
При подключении SD карты нужно учитывать соответствие SPI контактов для разных тип плат Arduino:
Плата | Пин MOSI | Пин MISO | Пин SCK |
Arduino Nano, Uno | 11 | 12 | 13 |
Arduino Mega2560 | 51 | 50 | 52 |
Библиотека ардуино для работы с SD и microSD
Для удобства работы с внешними накопителями данных в среде Arduino IDE доступны уже готовые библиотеки. Ничего дополнительно скачивать или устанавливать в большинстве случаев не понадобится.
Для подключения библиотеки в скетче нужно использовать инструкцию include:
#include
#include
Библиотека SPI нужна для правильной работы устройств, подключаемых по SPI.
Библиотечные функции нужно для считывания и записи данных на карту. Библиотека может поддерживать SD и SDHC карты.
Имена записываются в формате 8.3, то есть 8 знаков для названия, 3 для расширения. Путь к файлу записывается с помощью слэшей «/».
Встроенные примеры библиотеки SD
В Arduino IDE встроены готовые примеры для быстрого изучение функций бибилотеки:
- Card Info – это извлечение информации, хранящейся в SD карте. С ее помощью можно узнать, в какую файловую систему отформатирована карта, наличие свободного места, какие данные записаны.
- Yun Datalogger – позволяет записывать лог-данные с трех сенсоров на карту.
- Datalogger – регистрирует и созраняет данные, полученные с датчика на карту.
- Dump File – считывание данные с карты, передает их в серийный порт.
- Files – создает и удаляет данные. Существует функция file.write(), которая помещает записанные данные в буфер. Перемещение информации на карту происходит при вызове функций flush() или close(), поэтому важно закрывать его после каждого открытия файла, иначе данные будут потеряны.
- Read Write – записывает и считывает файлы с карты.
Функции библиотеки SD
Ардуино-библиотека SD содержит различные функции, с помощью которыми можно управлять данными. Функции класса SD:
- begin() – функция инициализирует библиотеку, присваивает контакт для сигнала.
- exists() – призвана проверить, имеется ли на карте необходимая информация.
- mkdir() – позволяет создать нужную папку на карте памяти.
- rmdir() – с помощью этой функции можно удалить папку. Важно, чтобы удаляемая папка была пустой.
- open() – позволяет открыть файл, который нужен для записи или чтения. Если нужный файл отсутствует на карте, то он будет создан.
- remove() – удаляет любой файл.
В ответ на все эти функции должно прийти одно из значений – true, в случае удачного завершения операции и false при неудаче.
Создание, редактирование и удаление файлов
Для работы с файлами в ардуино существует класс File. В него входят функции, которые предназначены для записи и чтения информации с карты:
- available() – проверяет наличие в файле байт, которые доступны для чтения. В ответ приходит количество места, которое доступно для чтения.
- close() – закрывает файл, перед эти проверяет, сохранены ли данные на карту.
- flush() – функция позволяет убедиться, что данные записаны на карту.
- name() – возвращает указатель на имя.
- peek() – считывает байты данных, при этом не перемещает указатель на следующий символ.
- position() – находит текущее положение указателя в файле.
- print() – выводит данные в отдельный файл.
- println() – печатает данные в файл до места, где появляется символ перевода каретки и пустая строка.
- seek() – меняет положение текущей позиции в файле.
- size() – выводит информацию о размере данных.
- read() – считывает информацию.
- write() – производит запись в файл.
- isDirectory() – с помощью этого метода происходит проверка, является ли файл директорией, то есть каталогом или папкой.
- openNextFile() – выводит имя последующего файла.
- rewindDirectory() – возвращает к первому файлу в директории.
Для корректной работы платы нужно проследить, чтобы был сконфигурирован SS выход.
Скетч примера работы с SD библиотекой ардуино
Ниже приведен скетч, демонстрирующий пример работы с модулем карты памяти.
/* Регистратор данных с использованием SD карт Пример сохранения данных с аналоговых портов на SD карте. Данные будут сохраняться в файле в виде набора строк с разделителем полей в виде символа “,” Схема подключения: * Аналоговые сенсоры подключаются к аналоговым пинам * Модуль SD карты подключен в SPI по стандартной схеме: ** MOSI – пин 11 ** MISO – пин12 ** CLK – пин 13 ** CS – pin 4 */ #include
#include const int PIN_CHIP_SELECT = 4; void setup() { Serial.begin(9600); Serial.print(“Initializing SD card…”); // Этот пин обязательно должен быть определен как OUTPUT pinMode(10, OUTPUT); // Пытаемся проинициализировать модуль if (!SD.begin(PIN_CHIP_SELECT)) { Serial.println(“Card failed, or not present”); // Если что-то пошло не так, завершаем работу: return; } Serial.println(“card initialized.”);
} void loop() { // Строка с данными, которые мы поместим в файл: String logStringData = “”; // Считываем данные с портов и записываем в строку for (int i = 0; i < 5; i++) { int sensor = analogRead(i); logStringData += String(sensor); if (i < 4) { logStringData += ","; } } // Открываем файл, но помним, что одновременно можно работать только с одним файлом. // Если файла с таким именем не будет, ардуино создаст его. File dataFile = SD.open("datalog.csv", FILE_WRITE); // Если все хорошо, то записываем строку: if (dataFile) { dataFile.println(logStringData); dataFile.close(); // Публикуем в мониторе порта для отладки Serial.println(logStringData); } else { // Сообщаем об ошибке, если все плохо Serial.println("error opening datalog.csv"); }
}
Создание файла и выбор названия для arduino SD card
Создание файла — одна из самых распространенных задач, возникающих при работе с SD картами в ардуино. Как мы убедились в предыдущем скетче, для создания файла достаточно просто открыт его. Если мы захотим проверить, есть ли такой файл, можно использовать функцию exists():
- SD.exists(«datalog.csv»);
Функция возвращает TRUE, если файл существует.
Популярной практикой при создании проектов — регистраторов данных является разбивка больших файлов на более мелкие, которые удобнее обновлять и открывать на компьютере.
Например, вместо одного очень большого файла datalog.csv на SD карте можно иметь несколько маленьких, добавляя к концу номер по порядку: datalog01.csv, datalog02.csv и т.д.
Вот пример скетча, который поможет вам выполнить эту работу:
char filename[] = “datalog00.CSV”; // Первоначальное название for (uint8_t i = 0; i < 100; i++) { filename[6] = i / 10 + '0'; filename[7] = i % 10 + '0'; if (! SD.exists(filename)) { // Проверяем наличие logfile = SD.open(filename, FILE_WRITE); break; // Дальше продолжать смысла нет } }
Заключение
Источник: https://ArduinoMaster.ru/datchiki-arduino/podklyuchenie-sd-karty-k-arduino/
Урок 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/
Модуль для тех, кому паять резисторы не с руки, а работать с MicroSD картами на Arduino всё же хочется
- AliExpress
- Радиотовары
- Хобби
С целью избавиться от этой самодельной страхоты, был заказан отдельный модуль. Он позволяет подключать MicroSD-карту по протоколу SPI к Ардуино. Товар был доставлен в Украину за 36 дней, заказывал во время акции, цены указаны со скидкой и текущая… Приехало, завёрнутое в пупырку:
запаяно в плотном пакете:
Первое впечатление: устройство слишком большое!
можно было бы разместить элементы с обратной стороны платы — уменьшить размеры раза в два.
Вставленная карточка выпирает, кажется, на 0.2мм:
Имеется удобный механизм, благодаря которому карточка выщелкивается, аки крышка в телевизоре «Берёзка» — стандартная фишка любого нормального разъема SD-карт.
Толщина ~4мм, если не считать штыревые контакты:
припаяли бы элементы с обратной стороны — получили бы 5мм. По-моему, в самоделках для компактности лучше +1мм к толщине, чем +25мм в длину платы. Для сравнения:
зелёная плата слева используется для тех же целей, снизу — GPS-модуль.
Ну да ладно, для изучения пойдёт, а кому надо — сам плату от ЛУТит.
Заявлено «SDHC(high-speed card)», вероятно, это означает поддержку карт 32 ГБ =)
Конкретно для этого модуля схему не нашел, но принцип работы, думаю, такой — www.pighixxx.com/test/wp-content/uploads/2014/10/200.png
LVC125A — docs-europe.electrocomponents.com/webdocs/12e1/0900766b812e1075.pdf Заявленные характеристики: напряжение работы: 1.65-3.6В, напряжение на входе: до 5.5В,
AMS1117-3.3 — www.ams-semitech.com/attachments/File/AMS1117_20120314.pdf
Завяленные характеристики: выходной ток до 1А, входное напряжение: 4.8 — 10.3В, выходное напряжение: 3.234 — 3.366В, греется до 125 градусов по Цельсию, при монтаже выдерживает нагрев до 300,
имхо, 4.8В многовато для нижнего предела.
Для проверки скорости были использованы две карты памяти: SanDisk на 2ГБ, шедшая в комплекте со старым смартфоном
И SanDisk Ultra Class 10 на 16ГБ
отформатированы они обе были под FAT32, с размером кластера 16КБ.
Они поочерёдно размещались то в подключенный модуль, то в GPS-логгер, где производились тесты записи и чтения. Код теста скорости — gist.github.com/ircphp/5df3ec8319fc5de1b3e877e261e5eada
W/R, Kbps Модуль Страхотень 2GB: 860/179 859/179 16GB: 893/180 924/180Склоняюсь ко мнению, что скорость ограничивается быстродействием самой Ардуино. Следовательно, лучше собрать устройство для работы с SD-картой самому на делителях, не потому что так может быть дешевле и быстрее, а главным образом, потому что можно сделать компактнее. Да, на плате имеется мощный линейный стабилизатор (хоть я и не уверен в его качестве), но можно обойтись и без него, запитавшись от другого устройства. С другой стороны, эта плата поможет, если нужен мощный линейник на 3.3, а взять его негде. Аккуратно подпаяться можно, например, сюда:Стресс-тест до потери пульса устраивать не хотелось, ограничился сопротивлением 5 Ом — 600 мА:
напряжение при этом падало до 3.14В:
на этом же мультиметре без нагрузки показывает 3.2В. Нагрелся стабилизатор не сильно, градусов до тридцатипяти. Когда на входе 4.56В и ниже, напряжение на выходе начинает постепенно опускаться. В общем, смутные сомнения в душе моей. Может, с другим микроконтроллером данный модуль и даст какие-то преимущества, но в моём случае никаких преимуществ, по сравнению с тем, что есть, к сожалению, я не увидел. Кстати, среди Ардуин, для нормальной работы с SD-картами, подходит микроконтроллер не ниже Atmega328. Atmega168 работает на сторонней библиотеке только с файловой системой FAT16; эту библиотеку я тоже использовал, на Atmega328, в надежде сэкономить память, однако иногда терялись файлы — решил использовать стандартную. Ставить данный модуль в GPS-логгер пока не буду, собираюсь заменить пятивольтную версию Atmega328 на трёхвольтную. Спасибо за внимание. Удачи в самоделках.
С наступающими праздниками!
Планирую купить +20 Добавить в избранное Обзор понравился +17 +29
Источник: https://mysku.ru/blog/aliexpress/40415.html
Библиотека 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
Подключаем 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
MicroSD шилд — модуль микро-сиди карты для ардуино
При конструировании той или иной системы на основе аппаратной платформы Arduino может возникнуть задача сохранения данных для последующего анализа.
Осуществить такую операцию можно при помощи SD или microSD карты и соответствующего модуля. Шилд для microSD карты был приобретен на Али всего за 1 доллар с доставкой.
Рассматриваемое устройство продается под брендом RobotDyn [1]. Поставляется данный шилд в обычном антистатическом пакете.
Модуль имеет габаритные размеры 40 х 25 мм, массу 4,3 г, без microSD карты. На плате располагаются два светодиода зеленый – индикатор питания, синий загорается при работе с microSD картой.
На плате имеются четыре отверстия, диаметром 3 мм, что позволяет надежно закрепить модуль.
Рассматриваемый шилд имеет восемь выводов. Они имеют следующее назначение
- 5V – питание 5В,
- 3.3V – питание 3,3 В (данный контакт специфичен именно для шилда от RobotDyn),
- GND – общий, четыре контакта интерфейса SPI:
- CLK – SCK, D0 – MISO, D1 – MOSI, CS – выбор устройства,
- а также опциональный CD – обнаружение карты (может быть не подключен, данный контакт специфичен именно для шилда от RobotDyn).
Контакты интерфейса SPI [2-7] в случае использования платы Arduino UNO следует подключать к следующим выводам CS – D4, D0(MOSI) – D11, D1(MISO) – D12, CLK(SCK) – D13. Следует иметь в виду, что порт для подключения CS в различных проектах может отличаться [8-11].
В режиме ожидания модуль потребляет около 23 мкА при напряжении питания 5 В, при кратковременном обращении к карте ток возрастает до 1,8 мА, если осуществляется непрерывная запись на карту, то ток возрастает до 11 мА. При напряжении питания 3,3 В устройство не заработало.
Полезное: Устройства вывода информации для Arduino
Задача подключения microSD карты является стандартной и для ее решения можно использовать библиотеку SD, которая прилагается к среде разработки Arduino IDE. В папке этой библиотеки имеется целый ряд примеров, раскрывающих различные нюансы взаимодействия с microSD картой. Самая простая программа CardInfo просто выводит информацию о установленной в разъем карте.
На рисунке выше результат работы CardInfo в случае отформатированной карты. Программа ReadWrite производит создание на microSD карте текстового файла и запись информации в него.
После работы ReadWrite программа CardInfo покажет, что на microSD карте появился файл TEST.TXT.
Программа Datalogger позволяет записывать данные с 0, 1 и 2 аналоговых портов в файл на microSD карте. Также эти данные передаются через последовательный порт. В качестве датчика в данном случае использован переменный резистор сопротивлением 10 кОм.
После работы Datalogger программа CardInfo покажет, что на microSD карте к файлу TEST.TXT. добавился файл DATALOGGER.TXT.
В общем, данный модуль позволяет очень серьезно расширить потенциальные возможности устройств на платформе Arduino, радикально решив проблему с «амнезией» при перерыве в электропитании, позволяя сохранять для последующего анализа данные о срабатывании датчиков на какой-либо мобильной платформе или работе датчиков умного дома.
Полезные ссылки
- robotdyn.ru/catalog/modules/memory/microsd_card_module.html
- arduinomaster.ru/datchiki-arduino/podklyuchenie-spi-arduino/
- avrbeginners.net/architecture/spi/spi.html
- robocraft.ru/blog/arduino/518.html
- arduino.ru/Reference/Library/SPI
- www.arduino.cc/en/Reference/SPI
- soltau.ru/index.
php/arduino/item/382-interfejs-spi-i-arduino
- robotclass.ru/tutorials/arduin-read-write-micro-sd-card/
- all-arduino.ru/arduino-urok-15-sd-karta/
- arduinoplus.ru/podkluchaem-sd-kartu-k-nashemu-arduino/
- arduinomaster.ru/datchiki-arduino/podklyuchenie-sd-karty-k-arduino/
Специально для сайта 2 Схемы.
ру — Denev.
1– 5,00Загрузка…
НАЖМИТЕ ТУТ И ОТКРОЙТЕ КОММЕНТАРИИ
Источник: https://2shemi.ru/microsd-shild-modul-mikro-sidi-karty-dlya-arduino/