Arduino:Примеры/Card Info

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Извлечение информации о SD-карте[1]

Этот пример показывает, как при помощи библиотеки SD извлечь информацию о SD-карте – о том, в какую файловую систему она отформатирована, о свободном месте и т.д. После извлечения эта информация будет показана через монитор порта. Более подробно о библиотеке SD можно прочесть тут.

Необходимое оборудование

  • Плата Arduino или Genuino
  • Ethernet-модуль Arduino (или другая плата с SD-слотом)
  • Отформатированная SD-карта

Цепь

EthernetShield Fritz.png

Плата Arduino/Genuino должна быть подключена к Ethernet-модулю и иметь USB-кабель, подключенный к компьютеру.

Схема

Ethernet Shield Sch.png

Код

Скетч ниже настроен для использования с Ethernet-модулем Arduino, который имеет встроенный SD-слот. В блоке setup() вызываем функцию SD.begin(), а затем в качестве CS-контакта делаем 4-ый контакт. Однако если вместо модуля Arduino Ethernet Shield будет использоваться другой модуль, вам нужно будет задействовать другой контакт (подробнее смотрите в самом скетче).

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

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

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

 Создан 28 марта 2011 года Лимор Фрид (Limor Fried),
 модифицирован 9 апреля 2012 года Томом Иго (Tom Igoe).

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

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

// поменяйте эту цифру, чтобы она соответствовала вашему устройству; 
// модуль Arduino Ethernet Shield – 4-ый контакт
// модули Adafruit – 10-ый контакт
// модуль Sparkfun SD Shield – 8-ой контакт
const int chipSelect = 4;

void setup() {
  // запускаем последовательную коммуникацию и ждем открытия порта:
  Serial.begin(9600);
  while (!Serial) {
    ; // ждем подключения последовательного порта (нужно только для плат со штатным USB-портом) 
  }


  Serial.print("\nInitializing SD card...");  //  "\nИнициализация SD-карты..."

  // используем инициализационный код из вспомогательных библиотек, 
  // чтобы протестировать, работает ли карта:
  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?");  //  "* контакт в chipSelect соответствует используемому модулю?"
    return;
  } else {
    Serial.println("Wiring is correct and a card is present.");  //  "Карта распознается и все подключено правильно."
  }

  // показываем тип карты:
  Serial.print("\nCard type: ");  //  "\nТип карты: "
  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");  //  "Не получается найти раздел FA16/FAT32.\nУбедитесь, что карта отформатирована"
    return;
  }


  // показываем тип и размер первого FAT-раздела:
  uint32_t volumesize;
  Serial.print("\nVolume type is FAT");  //  "\nТип раздела - FAT"
  Serial.println(volume.fatType(), DEC);
  Serial.println();

  volumesize = volume.blocksPerCluster();    // кластеры – это совокупности блоков
  volumesize *= volume.clusterCount();       // кластеров много
  volumesize *= 512;                         // блоки SD-карты всегда состоят из 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): ");  //  "\nФайлы, найденные на карте (название, дата, размер в байтах): "
  root.openRoot(volume);

  // перечисляем все файлы на карте (с указанием даты и размера):
  root.ls(LS_R | LS_DATE | LS_SIZE);
}


void loop(void) {

}

См.также

  1. SD library - Your reference for the SD Card library.
  2. Notes on using SD cards – What you need to know when you use SD cards
  3. Datalogger - How to log data from three analog sensors to an SD card.
  4. DumpFile - How to read a file from the SD card.
  5. Files - How to create and destroy an SD card file.
  6. Listfiles - How print out the files in a directory on a SD card.
  7. ReadWrite - How to read and write data to and from an SD card.

Внешние ссылки