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

Обзор модуля 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 карт, SPI

Модуль 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 карт

Форматирование

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

Форматирование micro SD карты

Подключение модуля 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.

Подключение модуля micro SD карт к 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) {}

Скачать скетч

Если все правильно сделано в открытом окне «Мониторинг порта» можно увидеть информацию о карте

Мониторинг порта micro SD карты

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

Мониторинг порта micro SD карты

Чтение и запись данных
После удачной инициализации 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 в окне «Мониторинг порта», можно увидеть следующие данные.

Мониторинг порта micro SD карты

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

Мониторинг порта micro SD карты

Подключение модуля micro SD карт к arduino

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

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

Читайте также:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *