Обзор модуля micro SD карт, SPI

В этой статье расскажу о модуле Micro SD для arduino. Данный модуль позволяет подключить Flesh карту к arduino и использовать ее, для логирования показаний датчиков, хранения различных конфигурационных файлов, а так же для работа с различными мультимедийными файлами (графика, музыка или видео).
Технические параметры
► Поддержка карт: micro SD, micro SDHC
► Интерфейс: SPI
► Напряжение питания: 4.5-5.5 В или 3.3 В
► Напряжение интерфейса SPI: 5 В или 3.3 В
► Потребляемый ток: от 0.2 мА до 200 мА
► Поддерживаемые карты: Micro SD карты (< = 2 Г), Мicro SDHC карты (< = 32 Г)
► Габариты: 42мм х 24мм х 12мм
Общие сведения
Карта micro SD — это съемная карта памяти небольшого формата с габаритными 11 мм x 15 мм и толщиной в 1 мм. Рабочие напряжение карты 3.3 В, поэтому ее нельзя подключать напрямую к цепям Arduino у которых 5 вольтная логика (если напряжение превысит 3.6 В карты выйдет из строя). Поэтому на плате предусмотрена микросхемам 74LVC125A, которая преобразует 3.3 В логический сигнал с карты в 5 В Arduino и на оборот, если мы подаем 3.3 – 3.6 В. Так же, на модуле предусмотрен стабилизатор напряжения на 3.3 В «AMS1117».

Модуль micro SD карты имеет шесть контактов, назначение каждого можно ознакомится ниже:
► GND — питание модуля «земля»
► VCC — питание модуля «3.3 В — 5В»
► MISO (Master In Slave Out) — это выход SPI
► MOSI (Master Out Slave In) — это вход SPI
► SCK (Serial Clock) — Тактовые импульсы
► SS (Slave Select) — используется Arduino (Master) для включения и отключения определенных устройств на шине SPI.
Принципиальная схема модуля SD карт для Arduino

Форматирование
Прежде чем вставить карту micro SD в модуль и подключить ее к Arduino, необходимо отформатировать карту в FAT16 или FAT32.
Если вы работаете в Windows 10, щелкните правой кнопкой мыши значок карты и выберите параметр «Форматировать…». В новом окне, выбираем файловую систему FAT или FAT16 и нажимаем «Начать»

Подключение модуля Micro SD карты к Arduino
Необходимые детали:
► Arduino UNO R3 x 1 шт.
► Модуль micro SD карт, SPI x 1 шт.
► Провод DuPont, 2,54 мм, 20 см, F-M (Female — Male) x 1 шт.
► Кабель USB 2.0 A-B x 1 шт.
Подключение:
Несмотря на то, что карта microSD имеет 8 контактов, нам нужно только 6 контактов, для подключение по интерфейсу SPI. Подключаем два контакта питания VCC (к 5В Arduino) и GND
к GND Arduino (внутренний стабилизатор AMS1117 подаст 3.3 В на карту и на микросхему 74LVC125. Далее MISO, MOSI и SCK подключаем к 12, 11 и 13 выводы Arduino. Контакт CS подключается к выводу 4 Arduino.

Теперь можно загрузить скетч, чтобы прочитать информацию о карте. Программа доступна из библиотеки примеров в IDE Arduino. Перейдите в Файл -> Примеры -> SD -> CardInfo. Программа откроется в новом окне.
/*
Тестировалось на Arduino IDE 1.8.5
Дата тестирования 11.02.2019г.
*/
#include <SPI.h> // Подключаем библиотеку SPI
#include <SD.h> // Подключаем библиотеку SD
Sd2Card card; // Указываем переменные
SdVolume volume; // Указываем переменные
SdFile root; // Указываем переменные
const int chipSelect = 4;
void setup() {
Serial.begin(9600); // Скорость передачи 9600
while (!Serial) {;}
Serial.print("\nInitializing SD card...");
if (!card.init(SPI_HALF_SPEED, chipSelect)) {
Serial.println("initialization failed. Things to check:");
Serial.println("* is a card inserted?");
Serial.println("* is your wiring correct?");
Serial.println("* did you change the chipSelect pin to match your shield or module?");
return;
} else {
Serial.println("Wiring is correct and a card is present.");
}
// Печатаем тип карты
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.\nMake sure you've formatted the card");
return;
}
// выводим тип и размер первого тома типа FAT
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 (bytes): ");
Serial.println(volumesize);
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 the card (name, date and size in bytes): ");
root.openRoot(volume);
// Чтение всех файлов
root.ls(LS_R | LS_DATE | LS_SIZE);
}
void loop(void) {}
Если все правильно сделано в открытом окне «Мониторинг порта» можно увидеть информацию о карте

Если ничего не появляется, скорее всего, вы неправильно соединили провода.

Чтение и запись данных
После удачной инициализации SD-карты, можно переходить к записи и чтения данных из файла. Скопируйте скетч в среду разработки IDE Arduino и загрузите его в контроллер.
/*
Тестировалось на Arduino IDE 1.8.5
Дата тестирования 11.02.2019г.
*/
#include <SPI.h> // Подключаем библиотеку SPI
#include <SD.h> // Подключаем библиотеку SD
File myFile;
const int chipSelect = 4; // Указываем к какому выводу подключен CS
void setup()
{
Serial.begin(9600); // Открытие последовательную связь
while (!Serial) // Ожидание подключения последовательного порта
{
}
Serial.print("Initializing SD card..."); // Печатаем текст
if (!SD.begin()) {
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"); // Печатаем текст, если не удалось открыть файл
}
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()
{
}
Скетч начинается с подключения встроенных библиотек «SD» и «SPI», которые позволяют общаться с SD картой через интерфейс SPI.
#include <SPI.h>
#include <SD.h>
Следующее, что мы делаем, это указываем вывод Arduino, к которому подключен вывод «CS» модуля SD-карты. Вывод CS — единственный, который можно изменить, по сравнению с выводами интерфейса SPI, так как мы используем аппаратный интерфейс SPI, и эти выводы уже добавлены в библиотеке SPI. Далее мы создаем myFile , который позже будет использоваться для хранения данных на SD-карте.
const int chipSelect = 10;
File myFile;
В «setup()«, запускаем последовательную связь «Serial.begin(9600)«, для отображения результатов. Теперь, инициализируем SD-карту функций «SD.begin()«, и если инициализация прошла успешно, оператор «if» становится истинным и печатается сообщение об удачной инициализации, иначе инициализация не удалась и программа останавливается.
Serial.begin(9600);
Serial.print("Initializing SD card...");
if (!SD.begin()) {
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");
Затем функция «SD.open()» откроет файл с именем «test.txt». Если файла нет, он будет создан, параметром «FILE_WRITE» открывает файл в режиме чтения-записи.
myFile = SD.open("test.txt", FILE_WRITE);
После открытия файла печатается сообщение «Writing to test.txt…» в окне «Мониторинг порта» , а затем с помощью функции «myFile.println()» запишем в файл текст «test 1, 2, 3.«. После этого нам нужно воспользоватся функцией «close()«, чтобы гарантировать, что данные, записанные в файл, сохранены.
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");
}
Теперь для проверки попробуем прочитать тот же файл. Для этого воспользуемся функцией «SD.open()«, но так как файл «test.txt», уже создан, функция просто откроет файл. Затем с помощью функции «myFile.read()» мы прочитаем данные из файла и распечатаем их в окне «Мониторинг порта». Функцией «read()» мы можем прочитать один символ за один раз, так что поэтому используем «n» циклов и функцию «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()
{
}
Теперь после загрузки скетча в Arduino в окне «Мониторинг порта», можно увидеть следующие данные.

При повторном открытие окна «Мониторинг порта», данные будуи добавляться в файл без перезаписи.


Купить на Aliexpress
Контроллер Arduino UNO R3 на CH340G
Контроллер Arduino UNO R3 на Atmega16U2
Комплект проводов DuPont, 2,54 мм, 20 см
Модуль SD кары, SPI
Купить в Самаре и области
Контроллер Arduino UNO R3 на CH340G
Контроллер Arduino UNO R3 на Atmega16U2
Провода DuPont, 2,54 мм, 20 см
Модуль SD кары, SPI

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