Содержание статьи
Содержание

Главная / Arduino для начинающих / Модуль SD карты и Arduino

Модуль SD карты и Arduino

Если в вашем проекте необходимо обеспечить загрузку аудио, видео, графики, записи любых данных, возникает вопрос внешней памяти. В большинстве микроконтроллеров встроенная память очень ограничена. Например, даже чип на Arduino Mega (Atmega2560) предоставляет всего лишь 4 Кбайта EEPROM для хранения данных. Конечно, флеш памяти побольше - 256 кбайт, но при ее использовании возникают проблемы с записью. Самое банальное - можно нечаянно перезаписать саму программу, загруженную на плату.

Модуль SD-card для Arduino

При загрузке графических или музыкальных файлов вам наверняка понадобится минимум 1 мегабайт хранилища. А если загружается больше информации? В этом случае можно использовать те же средства, что и в современных видеокамерах, сматфонах, mp3 плеерах: карта памяти! Карты памяти часто называют SD или microSD картами и они позволяют хранить гигабайты информации. Продаются карты памяти в любом магазине электроники, так что проблем с покупкой не будет. Кроме того, на большинстве компьютеров есть кард-ридеры, так что с передачей полученной информации проблем не будет.

Mini-SD карта

Что необходимо знать при использовании 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

На странице загрузки есть инструкция по использованию программы. Проблем у вас возникнуть не должно.

Подключение модуля 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). Но для первого раза рекомендуем подключать именно так для корректной отработки кода, который будет приведен ниже.

Есть еще один коннектор - CD - это пин для инициализации SD карты. Он замыкается на землю, когда карта установлена. Если вы хотите его задействовать, подключите подтягивающий резистор (около 10 кОм) и дальше к другому пину. В данном примере рассматривать эту опцию мы не будем.

Подключение mini-SD карты к Arduino

Все! Мы готовы отжигать!

Загрузка библиотеки и первый запуск SD карты

Передача данных на SD карту - это большой кусок кода, но к счастью для нас есть интегрированная в Arduino IDE библиотека под названием SD (название в точку, не правда ли? :)). Найти эту библиотеку можно в подменю Examples. В подменю Examples выберите скетч CardInfo.

Скетч CardInfo в меню Arduino IDE

С помощью этого скетча вы не сможете передавать данные, а просто получите ответ, опознана ли подключенная SD-карта. Очень полезный скетч, если необходимо узнать, поддерживается ли работа именно с вашей картой. Перед работой с новой картой обязательно проводите эту проверку!

В начале скетча проверьте переменную chipSelect. В данным примере мы подключаемся к 10 пину, соответственно переменная принимает значение 10.

Меняем функцию chipSelect в CardInfo

Теперь устанавливаем SD карту в плату расширения и загружаем скетч.

Откройте окно серийного монитора в Arduino IDE, наберите какой-то символ и нажмите Send. Скорее всего у вас отобразится нечто подобное:

Форматированная SD-карта - информация в серийном мониторе

Обратите внимание, выдалась информация, что тип файловой системы - FAT16, размер карты (около 2 Гб, что в данном случае соответствует действительности) и т.п.

Если вам попалась плохая карта (в первую очередь, это карты от неизвестных производителей), отобразится примерно следующее:

Некачественная SD-карта - информация в серийном мониторе

В данном примере карта отвечает на запросы, но некорректно. Обратите внимание, рядом с Product ID выводится "N/A", отсутствуют Manufacturer ID и OEM ID. Кроме того, карта возвращает ошибки SD errors. В общем, карта неработоспособна. Можно попробовать ее форматировать. Если после форматирования ошибки не исчезли, использовать ее не получится.

Попробуйте извлечь SD карту и вновь запустить программу. В окне серийного монитора появится следующее:

Нерабочая SD-карта - информация в серийном мониторе

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

Запись данных на SD карту через Arduino

В приведенном скетче продемонстрированы базовые возможности для записи данных на карту. По сути это основа для работы с модулем SD карты.

#include

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 ничего не происходит

}

Запустив скетч на выполнение, вы увидите следующее:

Удачтная запись на SD-карту - серийный монитор

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

Пример записанных на SD-карту данных на ПК

Стоит отметить несколько вещей:

Библиотека SD card не поддерживает 'длинные названия', так что имена файлов должны быть короткими! Например, IMAGE.JPG - отличное название, datalog.txt - тоже подходит. А вот что-то вроде "My GPS log file.text" не подойдет! Также учтите, названия не чувствительны к регистру. То есть, datalog.txt - это то же самое, что и DataLog.Txt или DATALOG.TXT

Считывание данных с SD карту через Arduino

Теперь разберемся как можно считывать информацию из файла, который хранится на карте. Процесс очень похож на запись. Будем использовать функцию SD.open() с указанием имени файла. Можно вызвать функцию available() (которая сообщит вам, есть ли на карте информация для считывания) и read() из файла, которая вернет следующий байт.

#include

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 ничего не происходит

}

Некоторые важные примечания:

Рекурсивная запись/считывание информации из файлов

В этой части мы рассмотрим пример более "продвинутого" использования SD карты. Например, подождем, пока не будут прочитаны все файлы с SD карты или будет воспроизводить с бесконечным повтором музыкальный файл. В последних версиях библиотеки SD library вы можете перемещаться по папкам и вызывать следующий доступный файл с помощью функции openNextFile(). Файлы открываются не в алфавитном порядке, а в соответствии со временем их создания!

Запустите пример скетча SD→listfiles.

Там вы обнаружите подпапку ANIM (в ней находятся файлы с анимацией). Числа после названия файла характеризуют размер файла в байтах. Очень полезная программа, если вы хотите проверить какие именно файлы вызываются с вашей карты.

Пример записанных на SD-карту данных на ПК

Стоит отметить несколько вещей:

Другие полезные функции

Есть и другие полезные функции для работы с SD картой. Некоторые из них мы приведем ниже:

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

Загрузки