Модуль карты памяти (arduino micro sd card) используется для сохранения данных от датчиков при создании сложных проектов, поскольку собственная энергонезависимая память микроконтроллера — eeprom позволяет использовать только 4 Кбайт памяти на Arduino Mega. В этой статье рассмотрим, как правильно читать и записывать информацию в файл памяти модуля SD карты Ардуино с помощью микроконтроллера Ардуино.
СОДЕРЖАНИЕ
Необходимые компоненты:
Дополнительные материалы на эту тему:
Некоторые производители предлагают SD card shield с двумя контактами питания — 5 и 3,3 вольт (см. картинку ниже). В этом случае к выводу 3.3V должно быть подключено стабилизированное напряжение 3,3 вольта. Если такого контакта нет, то 5 вольт от микроконтроллера должны быть подключены к контакту ‘5V’. Для работы с модулем рекомендуется использовать файловую систему FAT16 или FAT32 на карте microSD.
Arduino SD card распиновка, характеристики

micro SD Arduino характеристики
- Напряжение питания: 5 В или 3.3 В
- Потребляемый ток: от 0.2 мА до 200 мА
- Поддержка карт: micro SD, micro SDHC
- Интерфейс: SPI
- Габариты: 42мм х 24мм х 12мм
Модуль подключается к Arduino через интерфейс SPI, для этого вам понадобятся контакты SCK, MISO, MOSI и CS. Платы Arduino Uno и Nano имеют выделенные контакты для шины SPI, плата Mega 2560 имеет порты SPI на других контактах. Вы можете использовать любой свободный пин Ардуино для контакта CS и указать изменение в программе. По умолчанию используются контакты микроконтроллеров, перечисленных в таблице ниже.
Как подключить модуль SD карты к Ардуино

| SD card shield | Arduino Uno | Arduino Nano | Arduino Mega |
| GND | GND | GND | GND |
| VCC | 5V | 5V | 5V |
| MOSI | 11 | 11 | 51 |
| MISO | 12 | 12 | 50 |
| SCK | 13 | 13 | 52 |
| SC | 4 | 4 | 53 |
Чтобы проверить подключение micro sd модуля к плате Arduino Uno и флэш-памяти, используйте стандартный скетч библиотеки SD.h — CardInfo (пример кода показан ниже). После загрузки программы в микроконтроллер откройте монитор последовательного порта Arduino IDE, и вы увидите информацию о файловой системе карты, доступном объеме памяти и список файлов с датой их создания, находящихся на карте micro sd.
Скетч для проверки карты памяти micro SD
#include "SPI.h"
#include "SD.h"
Sd2Card card;
SdVolume volume;
SdFile root;
const int chipSelect = 4;
void setup() {
Serial.begin(9600);
pinMode(SS, OUTPUT);
while (!card.init(SPI_HALF_SPEED, chipSelect)) {
Serial.println("initialization failed");
}
Serial.print("\nCard type: ");
switch(card.type()) {
case SD_CARD_TYPE_SD1:
Serial.println("SD1");
break;
case SD_CARD_TYPE_SD2:
Serial.println("SD2");
break;
case SD_CARD_TYPE_SDHC:
Serial.println("SDHC");
break;
default:
Serial.println("Unknown");
}
if (!volume.init(card)) {
Serial.println("Could not find FAT16/FAT32 partition");
return;
}
uint32_t volumesize;
Serial.print("\nVolume type is FAT");
Serial.println(volume.fatType(), DEC);
Serial.println();
volumesize = volume.blocksPerCluster();
volumesize *= volume.clusterCount();
volumesize *= 512;
Serial.print("Volume size (Kbytes): ");
volumesize /= 1024;
Serial.println(volumesize);
Serial.print("Volume size (Mbytes): ");
volumesize /= 1024;
Serial.println(volumesize);
Serial.println("\nFiles found on card (name, date and size in bytes): ");
root.openRoot(volume);
root.ls(LS_R | LS_DATE | LS_SIZE);
}
void loop() {
}
Следующий пример позволяет открыть файл test.txt с карты памяти для его записи (если файла с таким именем нет, он будет создан) и записать в файл строку текста «test 1, 2, 3». Затем файл закрывается, чтобы сохранились все данные. Далее вся информация из сохраненного файла передается в COM-порт Arduino IDE. Загрузите следующую программу для записи информации на SD-карту и откройте монитор последовательного порта.
Скетч для Ардуино записи на SD карту данных
#include "SPI.h"
#include "SD.h"
File myFile;
const int chipSelect = 4;
void setup() {
Serial.begin(9600);
pinMode(SS, OUTPUT);
while (!SD.begin(SPI_HALF_SPEED, chipSelect)) {
Serial.println("initialization failed");
}
myFile = SD.open("test.txt", FILE_WRITE);
if (myFile) {
Serial.println("Writing to test.txt");
myFile.println("testing 1, 2, 3");
myFile.close();
}
else { Serial.println("error opening test.txt"); }
myFile = SD.open("test.txt");
if (myFile) {
Serial.println("\ntest.txt:");
while (myFile.available()) {
Serial.write(myFile.read());
}
myFile.close();
}
else { Serial.println("error opening test.txt"); }
}
void loop() {
}

Следующий код позволяет вывести на монитор порта информацию о размере файла test.txt из предыдущего примера и всей информации, которая была в него записана. Обратите внимание, что имя файла на SD-карте не должно содержать более 8 символов (латинских букв), не включая расширение файла. Библиотека SD.h не чувствительна к регистру в имени файла, то есть «TEST.txt» и «test.txt» — это один и тот же файл.
Скетч для Ардуино чтения с SD карты данных
#include "SPI.h"
#include "SD.h"
File myFile;
const int chipSelect = 4;
void setup() {
Serial.begin(9600);
pinMode(SS, OUTPUT);
while (!SD.begin(SPI_HALF_SPEED, chipSelect)) {
Serial.println("initialization failed");
}
myFile = SD.open("test.txt");
if (myFile) {
Serial.print(myFile.size());
Serial.println(" Kb");
Serial.println("\ntest.txt:");
while (myFile.available()) {
Serial.write(myFile.read());
}
myFile.close();
}
else { Serial.println("error opening test.txt"); }
}
void loop() {
}
Команды библиотеки SD.h для работы с micro sd
available() – проверяет наличие в файле байт, доступные для чтения;
size() – выводит информацию о размере данных;
read() – считывает информацию;
write() – производит запись в файл;
close() – закрывает файл, проверяя сохранены ли данные на sd карту;
flush() – позволяет убедиться, записаны ли данные на карту памяти;
name() – возвращает указатель на имя;
peek() – считывает байты данных, не перемещая указатель;
position() – показывает текущее положение указателя в файле;
seek() – меняет положение текущей позиции в файле;
print() – выводит данные в отдельный файл;
println() – печатает данные в файл до места, где появляется пустая строка;
isDirectory() – проверка, является ли файл директорией (папкой);
openNextFile() – выводит имя следующего файла на карте;
rewindDirectory() – возвращает к первому файлу в папке;
Заключение. Перед началом работы с модулем карты памяти необходимо установить библиотеки SD.h и SPI.h, которые вы можете скачать с нашего сайта. Этот модуль будет полезен в проектах, где необходимо периодически сохранять информацию. Например, если вы хотите ежедневно сохранять информацию с датчика температуры DHT22 или данные с датчика давления bmp180 (GY-68) на карте памяти для Ардуино.
