Подключение модуля Micro SD карты к Arduino

Время от времени вы столкнётесь с проектом Arduino, требующим большого объёма хранения данных — будь то запись показаний датчиков, сохранение файлов или хранение информации, превышающей возможности встроенной памяти Arduino.

Как же управлять всеми этими данными? Решение, вероятно, уже есть в вашей цифровой камере или телефоне: карты microSD. Они могут хранить гигабайты данных в пространстве меньше монеты, что делает их неотъемлемой частью нашей повседневной техники.

Модуль microSD карты упрощает подключение Arduino к microSD карте, делая хранение данных в вашем следующем проекте простой задачей. Давайте разберёмся, как это работает!

Обзор оборудования

Ключевые компоненты модуля microSD карты включают:

Стабилизатор напряжения 3.3V LDO

Стандартная microSD карта работает на напряжении 3,3V, что означает, что вы не можете подключить её напрямую к схемам, использующим логику 5V. Более того, любое напряжение выше 3,6V может навсегда повредить карту. Для защиты вашей карты модуль имеет встроенный стабилизатор напряжения со сверхнизким падением, который создаёт стабильный источник питания 3,3V, обеспечивая безопасность microSD карты во время работы.

Interfacing Micro SD Card Module with Arduino

Микросхема преобразователя логических уровней

Модуль также включает микросхему преобразователя логических уровней `74LVC125A `_. Эта микросхема работает как мост между вашим микроконтроллером (который обычно использует 5V) и microSD картой (которой нужно 3,3V). Преобразователь логических уровней обеспечивает правильное преобразование уровней напряжения, позволяя microSD карте и микроконтроллеру безопасно и эффективно обмениваться данными.

Interfacing Micro SD Card Module with Arduino

Разъём для microSD карты

На передней стороне модуля расположен разъём для microSD карты. С ним совместим любой тип карт памяти microSD. На модуле обычно указано правильное направление вставки карты, что упрощает начало работы.

Interfacing Micro SD Card Module with Arduino

Интерфейсы связи — SPI и SDIO

При использовании microSD карты в ваших проектах есть два основных способа подключения: SPI (Serial Peripheral Interface) и SDIO (Secure Digital Input Output). Каждый вариант имеет разные характеристики по скорости, сложности настройки и типичному применению.

SDIO значительно быстрее и используется в мобильных телефонах, цифровых камерах и других устройствах, требующих высокой производительности. Однако он также более сложен и часто требует подписания специальных соглашений с производителями, что делает его труднодоступным для любителей. Из-за этих сложностей код для интерфейса SDIO редко встречается в DIY-проектах.

SPI, с другой стороны, используется практически во всех модулях SD-карт для любительских проектов. Хотя он не так быстр, как SDIO, и использует больше вычислительных ресурсов, его легко настроить с любым микроконтроллером. Эта простота делает SPI популярным выбором для большинства из нас, работающих над DIY-проектами в электронике.

Распиновка модуля microSD карты

Модуль microSD карты имеет шесть выводов:

Interfacing Micro SD Card Module with Arduino

VCC подаёт питание на модуль и должен быть подключён к выводу 5V Arduino.

GND — это вывод заземления.

MISO (Master In Slave Out) — это выходной вывод SPI модуля microSD карты, который отправляет данные на Arduino.

MOSI (Master Out Slave In) — это входной вывод SPI модуля microSD карты, который принимает данные от Arduino.

SCK (Serial Clock) получает тактовые импульсы от ведущего устройства (вашего Arduino) для синхронизации передачи данных.

CS (Chip Select) — это управляющий вывод для активации модуля на шине SPI, позволяющий ему обмениваться данными при необходимости.

Подготовка microSD карты

Прежде чем вставить microSD карту в модуль и подключить его к Arduino, важно убедиться, что карта правильно отформатирована в FAT16 или FAT32.

Если вы используете новую SD-карту, она, вероятно, уже отформатирована с файловой системой FAT. Однако заводское форматирование может быть неидеальным, и вы можете столкнуться с проблемами. Если вы используете старую карту, которая уже использовалась, её определённо нужно переформатировать. В любом случае, рекомендуется отформатировать карту перед использованием в проекте.

Для лучших результатов попробуйте использовать официальную `утилиту форматирования SD-карт `_, разработанную SD Association. Этот специальный инструмент помогает предотвратить многие распространённые проблемы, вызванные неправильным форматированием. Просто скачайте утилиту на свой компьютер, запустите её, выберите букву диска вашей SD-карты и нажмите кнопку Format.

Interfacing Micro SD Card Module with Arduino

Схема подключения модуля microSD карты к Arduino

Теперь, когда ваша microSD карта готова, давайте подключим модуль microSD карты к Arduino!

Сначала подключите вывод VCC модуля к выводу 5V на Arduino, а вывод GND — к земле.

Далее настроим выводы для связи по SPI. Поскольку microSD карты требуют быстрой передачи данных, они лучше всего работают при подключении к аппаратным выводам SPI вашего микроконтроллера.

Помните, что разные платы Arduino имеют различное расположение выводов SPI, поэтому их нужно подключать правильно. Например, на платах Arduino UNO или Nano V3.0 выводы SPI: цифровой 13 (SCK), 12 (MISO), 11 (MOSI) и 10 (CS).

Вот краткая таблица соединений:

microSD Card ModuleArduino
VCC5V
GNDGND
MISO12
MOSI11
SCK13
CS10

На схеме ниже показано, как именно подключить модуль microSD карты к Arduino.

Interfacing Micro SD Card Module with Arduino

Вот и всё! Теперь вы готовы начать запись данных!

Код Arduino — тестирование модуля microSD карты с CardInfo

Работа с microSD картой может быть непростой, но, к счастью, в Arduino IDE есть полезная библиотека `SD `_, которая значительно упрощает чтение и запись на SD-карты.

Начнём с простого примера скетча CardInfo. Этот скетч не записывает ничего на карту. Вместо этого он проверяет, может ли Arduino распознать карту, и показывает основную информацию о ней. Запуск этого скетча очень полезен при тестировании новой microSD карты, так как он помогает определить, поддерживается ли карта вашим Arduino.

Чтобы найти пример скетча CardInfo, перейдите в File > Examples > SD > CardInfo в Arduino IDE.

Interfacing Micro SD Card Module with Arduino

Перед запуском скетча убедитесь, что chipSelect установлен правильно в начале кода. Поскольку в нашей схеме мы используем цифровой вывод #10, убедитесь, что значение установлено в 10.

Interfacing Micro SD Card Module with Arduino

Теперь вставьте SD-карту в модуль и загрузите скетч на Arduino. После загрузки откройте монитор последовательного порта, чтобы увидеть результаты. Вывод может различаться в зависимости от ситуации:

Сценарий 1: Успешная инициализация карты

Если всё работает правильно, вы увидите полезную информацию о вашей microSD карте. Например, вы можете узнать, что тип вашей карты — SDHC (SD High Capacity), она использует форматирование FAT32 и имеет 4 ГБ памяти.

Interfacing Micro SD Card Module with Arduino

Сценарий 2: Обнаружена повреждённая SD-карта

Если ваша карта повреждена, вы можете увидеть нечто подобное:

Interfacing Micro SD Card Module with Arduino

Карта ответила, но вся информация неверная. Отсутствует Manufacturer ID или OEM ID, а Product ID отображается как „N/A.“ Это означает, что карта возвращает ошибки SD.

Если это произошло, попробуйте переформатировать карту. Если это не поможет, возможно, вам потребуется новая карта.

Сценарий 3: Проблема с подключением или необратимое повреждение карты

Если есть проблема с подключением или карта необратимо повреждена, монитор последовательного порта сообщит, что SD-карту не удалось инициализировать.

Interfacing Micro SD Card Module with Arduino

Если это произошло, тщательно проверьте все соединения и попробуйте запустить скетч снова.

Сценарий 4: Неправильно отформатированная SD-карта

Если подключение правильное, но SD-карта отформатирована неправильно, вы получите соответствующее сообщение.

Interfacing Micro SD Card Module with Arduino

В этом случае переформатируйте карту и запустите скетч снова.

Код Arduino — чтение и запись данных

Предполагая, что предыдущий скетч отработал успешно, давайте попробуем следующий. Этот скетч покажет, как записать данные в файл, а затем проверить записанное, прочитав его обратно.

Попробуйте загрузить этот скетч, прежде чем мы разберём все подробности.

#include <SPI.h>
#include <SD.h>

File myFile;

// change this to match your SD shield or module;
const int chipSelect = 10;

void setup()
{
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }


  Serial.print("Initializing SD card...");

  if (!SD.begin()) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");

  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  myFile = SD.open("test.txt", FILE_WRITE);

  // if the file opened okay, write to it:
  if (myFile) {
    Serial.print("Writing to test.txt...");
    myFile.println("testing 1, 2, 3.");
    // close the file:
    myFile.close();
    Serial.println("done.");
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }

  // re-open the file for reading:
  myFile = SD.open("test.txt");
  if (myFile) {
    Serial.println("test.txt:");

    // read from the file until there's nothing else in it:
    while (myFile.available()) {
      Serial.write(myFile.read());
    }
    // close the file:
    myFile.close();
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
}

void loop()
{
  // nothing happens after setup
}

После загрузки кода вы увидите такой вывод в мониторе последовательного порта.

Interfacing Micro SD Card Module with Arduino

Если вы нажмёте кнопку сброса на Arduino и дадите скетчу выполниться снова, вы заметите, что новые данные добавляются в конец файла, а не заменяют то, что уже было записано.

Interfacing Micro SD Card Module with Arduino

Объяснение кода:

Скетч начинается с подключения библиотек SD и SPI, которые позволяют Arduino обмениваться данными с SD-картой через интерфейс SPI.

#include <SPI.h>
#include <SD.h>

Далее мы указываем, какой вывод Arduino подключён к выводу CS (Chip Select) модуля SD-карты. Поскольку скетч использует аппаратный SPI, нужно указать только вывод CS — остальные выводы SPI уже определены в библиотеке SPI.

const int chipSelect = 10;

Затем мы создаём объект файла myFile. Этот объект содержит функции, позволяющие обращаться к файлам на SD-карте и модифицировать их.

File myFile;

В функции setup() мы инициализируем последовательную связь и вызываем SD.begin() для инициализации SD-карты. Если карта успешно распознана, в мониторе последовательного порта появится «initialization done.». Если что-то пошло не так, вы увидите «initialization failed!» и программа остановится.

Serial.begin(9600);
  Serial.print("Initializing SD card...");
  if (!SD.begin()) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");

Затем скетч открывает файл с помощью функции open(). Эта функция либо открывает существующий файл, либо создаёт новый, если его нет. Функция принимает два параметра: имя файла и режим открытия.

Варианты режима файла включают FILE_READ, который открывает файл для чтения и помещает курсор в начало, и FILE_WRITE, который открывает файл для чтения и записи, помещая курсор в конец.

В этом примере мы создаём файл «test.txt» и открываем его в режиме чтения-записи.

myFile = SD.open("test.txt", FILE_WRITE);

После открытия файла мы записываем в него данные с помощью функции println(), которая работает аналогично функции для отправки данных в монитор последовательного порта. Вы также можете использовать функцию print(), если не хотите переводить курсор на новую строку.

Затем мы закрываем файл с помощью функции close(). Это гарантирует, что все данные будут сохранены на SD-карту.

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");
  }

Чтобы проверить, успешно ли прошла запись, мы считываем содержимое файла обратно. Мы снова открываем файл с помощью функции open(), на этот раз в режиме чтения. Поскольку «test.txt» уже существует, файл просто открывается.

Мы считываем содержимое файла с помощью функции myFile.read() и выводим его в монитор последовательного порта. Поскольку read() получает только один символ за раз, мы используем цикл while с myFile.available(), чтобы прочитать и отобразить все символы в файле.

Наконец, мы снова закрываем файл.

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");
  }

Поскольку этот скетч предназначен только для демонстрации чтения и записи файлов, весь код помещён в функцию setup(), которая выполняется только один раз. Поэтому функция loop() пуста — нет необходимости в повторном выполнении кода.

void loop()
{
}

Важные замечания

  • Вы можете использовать функции print() и println() для записи строк, переменных и прочего в файлы, точно так же, как при отправке информации в монитор последовательного порта.

  • Функция read() возвращает только один символ за раз. Она не читает целую строку сразу.

  • Когда вы закончили работу с файлом, всегда используйте функцию close(). Это гарантирует, что все данные будут окончательно сохранены и поможет освободить память Arduino.

  • Вы также можете работать с файлами внутри папок. Например, чтобы открыть файл в директории, используйте SD.open("/myfiles/example.txt"). Помните, что путь к файлу является относительным.

  • Библиотека SD поддерживает только короткие имена файлов, так как использует формат имён 8.3 `_. Это означает, что имена файлов должны быть краткими. Например, «``datalog.txt`» подходит, а «My sensor log file.text» слишком длинное и не будет работать правильно.

  • Также помните, что имена файлов не чувствительны к регистру. Поэтому «datalog.txt» — это то же самое, что «DataLog.Txt» или даже «DATALOG.TXT».

Полезные функции библиотеки SD

Функции объекта SD

Объект SD имеет несколько полезных функций. Вот некоторые из важных:

  • exists(filename): эта функция проверяет, существует ли файл на SD-карте. Возвращает true, если файл есть, и false, если нет.

  • remove(filename): эта функция позволяет удалить файл. Но будьте осторожны! После удаления файла таким способом его нельзя восстановить.

  • mkdir("/mynewdir"): эта функция создаёт новые папки. Она очень полезна, когда нужно организовать большое количество файлов в одном месте.

Функции объекта File

Также есть несколько полезных функций для работы с объектами File:

  • seek(): эта функция перемещает курсор в новое место в файле. Например, seek(0) перемещает курсор в самое начало файла.

  • position(): эта функция сообщает текущую позицию курсора в файле.

  • size(): эта функция возвращает размер файла в байтах.

  • isDirectory(): эта функция помогает определить, является ли объект файлом или папкой.

  • openNextFile(): эта функция позволяет просматривать все файлы в папке по одному.

  • name(): при просмотре файлов с помощью openNextFile() вы можете использовать эту функцию для получения имени каждого файла. Она возвращает указатель на массив символов в формате 8.3, который можно легко вывести с помощью Serial.print().