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 <SPI.h> #include <SD.h>
Библиотека 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 <SPI.h> #include <SD.h> 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; // Дальше продолжать смысла нет } }
Заключение
Как мы с вами убедились, подключить SD карту памяти к Ардуино и использовать ее в проекте не очень сложно. Для этого есть готовые библиотеки в Arduino IDE и самые разнообразные варианты модулей. Приобрести карту памяти можно в любом магазине электроники, они стоят недорого, при этом позволяют существенно расширить потенциал платы Ардуино. С использованием карт памяти можно собирать и сохранять для последующего анализа большие объемы данных. С помощью нашей статьи мы сможете наделить памятью свои исследовательские проекты, создать системы голосового оповещения для умного дома, создать простой wav-проигрыватель и многое другое.
Спасибо. Полезная информация.
Только вы пишете – “Имена записываются в формате 8.3”. Но впоследствии в скетчах используете формат 9.3
Ошибка в коде? Или допустимы имена файлов более 8 символов?