Использование библиотеки SD для Arduino для получения информации об SD карте через последовательный порт

Добавлено 2 апреля 2018 в 04:55

Данный пример показывает, как с помощью Arduino прочитать информацию об SD карте. Пример возвращает тип, свободное место и другую информацию с помощью библиотеки SD, посылая эту информацию через последовательный порт.

Необходимые комплектующие

  • плата Arduino или Genuino;
  • плата расширения Ethernet Shield (или другая плата со слотом SD);
  • форматированная SD карта.

Схема

Плата расширения Ethernet Shield
Плата расширения Ethernet Shield

Плата Arduino или Genuino должна быть подключена к плате расширения Ethernet Shield, а также к компьютеру с помощью USB кабеля.

Схема

Подключение платы расширения Ethernet Shield к плате Arduino
Подключение платы расширения Ethernet Shield к плате Arduino

Код

Код ниже настроен для работы с платой расширение Ethernet Shield, на которой установлен SD слот. В setup(), вызове SD.begin(), обозначении вывода 4 в качестве вывода SC. Этот вывод зависит от типа платы расширения, которую вы используете.

В коде используются недокументированные вспомогательные библиотеки для отправки информации об SD карте. Данная информация включает в себя форматирование (FAT16 или FAT32) и файловую структуру, а также количество свободного и используемого пространства карты.

/*
  Тест SD карты

  Схема:
    SD карта подключена к шине SPI следующим образом:
 ** MOSI - вывод 11 на Arduino Uno/Duemilanove/Diecimila
 ** MISO - вывод 12 на Arduino Uno/Duemilanove/Diecimila
 ** CLK - вывод 13 на Arduino Uno/Duemilanove/Diecimila
 ** CS - зависит от вашей платы расширения или модуля SD карты.
        Здесь, как и в других примерах Arduino, используется вывод 4.

*/
// Подключить библиотеку SD:
#include <SPI.h>
#include <SD.h>

// Задать переменные, использующие функции вспомогательной библиотеки SD:
Sd2Card card;
SdVolume volume;
SdFile root;

// Измените это в соответствии с вашей платой расширения или модулем;
// Arduino Ethernet shield: вывод 4
// Adafruit SD shields и модули: вывод 10
// Sparkfun SD shield: вывод 8
// MKRZero SD: SDCARD_SS_PIN
const int chipSelect = 4;

void setup() {
  // Открть последовательный порт и ждать выполнения его открытия:
  Serial.begin(9600);
  while (!Serial) 
  {
    ; // ждать подключения последовательного порта. Необходимо только для USB порта
  }


  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?");
    while (1);
  } 
  else 
  {
    Serial.println("Wiring is correct and a card is present.");
  }

  // напечатать тип карты
  Serial.println();
  Serial.print("Card 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");
  }

  // Теперь мы попробуем открыть "том"/"раздел" - он должен быть FAT16 или FAT32
  if (!volume.init(card)) 
  {
    Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
    while (1);
  }

  Serial.print("Clusters:          ");
  Serial.println(volume.clusterCount());
  Serial.print("Blocks x Cluster:  ");
  Serial.println(volume.blocksPerCluster());

  Serial.print("Total Blocks:      ");
  Serial.println(volume.blocksPerCluster() * volume.clusterCount());
  Serial.println();

  // напечатать тип и размер первого тома FAT-типа
  uint32_t volumesize;
  Serial.print("Volume type is:    FAT");
  Serial.println(volume.fatType(), DEC);

  volumesize = volume.blocksPerCluster();    // кластеры это коллекции блоков
  volumesize *= volume.clusterCount();       // у нас будет много кластеров
  volumesize /= 2;                           // блоки SD карты всегда равны 512 байт (2 блока равны 1KB)
  Serial.print("Volume size (Kb):  ");
  Serial.println(volumesize);
  Serial.print("Volume size (Mb):  ");
  volumesize /= 1024;
  Serial.println(volumesize);
  Serial.print("Volume size (Gb):  ");
  Serial.println((float)volumesize / 1024.0);

  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) 
{
}

Обратите внимание: размер кластера определяется пользователем во время форматирования и имеет некоторые значения по умолчанию, которые по каким-либо причинам могут быть изменены пользователем. В приведенном выше скетче мы используем размер блока по умолчанию, который равен 512 байт. Это значение не является размером кластера: оно рассчитывается как количество блоков на кластер. Более подробную информацию о размерах кластеров вы можете найти в этой статье.

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

Теги

ArduinoSD картаПрограммирование

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.