Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

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

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

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

Проверка/Оформление/Редактирование: Мякишев Е.А.


Извлечение информации о 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), файловая структура, а также количество свободного и занятого места.

  1. /*
  2.   Тест SD-карты
  3.  
  4.  Этот пример показывает, как использовать вспомогательные
  5.  библиотеки, на которых базируется библиотека SD, чтобы получить
  6.  информацию об SD-карте. Он может пригодиться, к примеру, если вы не
  7.  уверены, работает ли карта или нет.
  8.  
  9.  Цепь:
  10.   * SD-карта, подключенная к шине SPI следующим образом:
  11.  ** MOSI – к 11-ому контакту на Arduino Uno/Duemilanove/Diecimila
  12.  ** MISO - к 12-ому контакту на Arduino Uno/Duemilanove/Diecimila
  13.  ** CLK – к 13-ому контакту на Arduino Uno/Duemilanove/Diecimila
  14.  ** CS – зависит от модуля со слотом для SD-карты (4-ый контакт
  15.     используется здесь для совместимости с другими скетчами Arduino)
  16.  
  17.  Создан 28 марта 2011 года Лимор Фрид (Limor Fried),
  18.  модифицирован 9 апреля 2012 года Томом Иго (Tom Igoe).
  19.  
  20.  */
  21. // подключаем библиотеку SD:
  22. #include <SPI.h>
  23. #include <SD.h>
  24.  
  25. // задаем переменные, использующие функции вспомогательных библиотек:
  26. Sd2Card card;
  27. SdVolume volume;
  28. SdFile root;
  29.  
  30. // поменяйте эту цифру, чтобы она соответствовала вашему устройству;
  31. // модуль Arduino Ethernet Shield – 4-ый контакт
  32. // модули Adafruit – 10-ый контакт
  33. // модуль Sparkfun SD Shield – 8-ой контакт
  34. const int chipSelect = 4;
  35.  
  36. void setup() {
  37.   // запускаем последовательную коммуникацию и ждем открытия порта:
  38.   Serial.begin(9600);
  39.   while (!Serial) {
  40.     ; // ждем подключения последовательного порта (нужно только для плат со штатным USB-портом)
  41.   }
  42.  
  43.  
  44.   Serial.print("\nInitializing SD card...");  //  "\nИнициализация SD-карты..."
  45.  
  46.   // используем инициализационный код из вспомогательных библиотек,
  47.   // чтобы протестировать, работает ли карта:
  48.   if (!card.init(SPI_HALF_SPEED, chipSelect)) {
  49.     Serial.println("initialization failed. Things to check:");  //  "инициализация не удалась. Проверьте следующее:"
  50.     Serial.println("* is a card inserted?");  //  "* вставлена ли карта?"
  51.     Serial.println("* is your wiring correct?");  //  "* правильно ли все подключено?"
  52.     Serial.println("* did you change the chipSelect pin to match your shield or module?");  //  "* контакт в chipSelect соответствует используемому модулю?"
  53.     return;
  54.   } else {
  55.     Serial.println("Wiring is correct and a card is present.");  //  "Карта распознается и все подключено правильно."
  56.   }
  57.  
  58.   // показываем тип карты:
  59.   Serial.print("\nCard type: ");  //  "\nТип карты: "
  60.   switch (card.type()) {
  61.     case SD_CARD_TYPE_SD1:
  62.       Serial.println("SD1");
  63.       break;
  64.     case SD_CARD_TYPE_SD2:
  65.       Serial.println("SD2");
  66.       break;
  67.     case SD_CARD_TYPE_SDHC:
  68.       Serial.println("SDHC");
  69.       break;
  70.     default:
  71.       Serial.println("Unknown");  //  "Неизвестно"
  72.   }
  73.  
  74.   // теперь попытаемся открыть раздел – он должен быть в формате FAT16 или FAT32:
  75.   if (!volume.init(card)) {
  76.     Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");  //  "Не получается найти раздел FA16/FAT32.\nУбедитесь, что карта отформатирована"
  77.     return;
  78.   }
  79.  
  80.  
  81.   // показываем тип и размер первого FAT-раздела:
  82.   uint32_t volumesize;
  83.   Serial.print("\nVolume type is FAT");  //  "\nТип раздела - FAT"
  84.   Serial.println(volume.fatType(), DEC);
  85.   Serial.println();
  86.  
  87.   volumesize = volume.blocksPerCluster();    // кластеры – это совокупности блоков
  88.   volumesize *= volume.clusterCount();       // кластеров много
  89.   volumesize *= 512;                         // блоки SD-карты всегда состоят из 512 байтов
  90.   Serial.print("Volume size (bytes): ");  //  "Размер раздела (в байтах): "
  91.   Serial.println(volumesize);
  92.   Serial.print("Volume size (Kbytes): ");  //  "Размер раздела (в килобайтах): "
  93.   volumesize /= 1024;
  94.   Serial.println(volumesize);
  95.   Serial.print("Volume size (Mbytes): ");  //  "Размер раздела (в мегабайтах): "
  96.   volumesize /= 1024;
  97.   Serial.println(volumesize);
  98.  
  99.  
  100.   Serial.println("\nFiles found on the card (name, date and size in bytes): ");  //  "\nФайлы, найденные на карте (название, дата, размер в байтах): "
  101.   root.openRoot(volume);
  102.  
  103.   // перечисляем все файлы на карте (с указанием даты и размера):
  104.   root.ls(LS_R | LS_DATE | LS_SIZE);
  105. }
  106.  
  107.  
  108. void loop(void) {
  109.  
  110. }

См.также

  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.

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

  1. CardInfo