Урок 20. Подключение и работа с флеш картой на Arduino

В этом уроке мы научимся создавать, редактировать и удалять файлы на MicroSD карте.

Нам понадобится:

Для реализации проекта не требуется установка дополнительных библиотек. Библиотека для работы с адаптером карт MicroSD входит в стандартный набор Arduino IDE > Эскиз > Include Library > SD.

Схема подключения:

Подключение адаптера карт MicroSD к Piranha Uno осуществляется к аппаратным выводам SPI (4 вывода: CS, SCK, MOSI, MISO).

Адаптер карт MicroSD Piranha Uno
CS (Chip Select) 10
SCK (Serial ClocK) 13
MOSI (Master Out Slave In) 11
MISO (Master In Slave Out) 12
Vcc 5V
GND GND

Питание:

Питание адаптера подаётся на выводы Vcc и GND, напряжением 5В постоянного тока.

Базовые функции, для работы с файлами SD-карты:

// создание переменной myFile класса File библиотеки SD, которая будет служить "указателем" на файл
   File myFile;                                   // переменная потребуется для открытия и закрытия файла, а так же для работы с открытым файлом
// открытие файла "iarduino.txt" для чтения и записи, начиная с конца файла:
   myFile = SD.open("iarduino.txt", FILE_WRITE);  // если файла с именем "iarduino.txt" - нет, то он будет создан.
// запись строки в файл >"iarduino.txt":
   myFile.print("начало строки, ");               // запись строки в открытый файл "iarduino.txt", без добавления символов перехода на новую строку.
   myFile.println("продолжение строки.");         // запись строки в открытый файл "iarduino.txt", с  добавлением символов перехода на новую строку.
// закрытие файла "iarduino.txt":
   myFile.close();
// открытие файла "iarduino.txt" для чтения, начиная с начала файла:
   myFile = SD.open("iarduino.txt");              // если файла с именем "iarduino.txt" - нет, то он не будет открыт.
// чтение строк из файла "iarduino.txt":
   while(myFile.available()){                     // если есть данные для чтения из открытого файла "iarduino.txt"
      Serial.write(myFile.read());                // читаем очередной байт из файла и выводим его в последовательный порт.
   }
// удаление файла "iarduino.txt":
   SD.remove("iarduino.txt");                     // функция возвращает результат удаления true/false
// создание файла "iarduino.txt":
   myFile = SD.open("iarduino.txt", FILE_WRITE);  // если файла с именем "iarduino.txt" - нет, то он будет создан.
   myFile.close();                                // закрываем файл "iarduino.txt" без записи данных.
// проверка существования файла "iarduino.txt":
   if(SD.exists("example.txt")){...;}             // условие будет выполнено, если файл "iarduino.txt" существует на SD-карте
// проверка открытия файла "iarduino.txt":
   if(myFile){...;}                               // условие будет выполнено, если файл был успешно открыт: myFile = SD.open(...)
// создание каталога "my_Dir"
   SD.mkdir("my_Dir");                             // функция возвращает результат создания true/false. Если указать "first_Dir/my_Dir", то будет создано два каталога (каталог my_Dir в каталоге first_Dir)
// удаление каталога "my_Dir"
   SD.rmdir("my_Dir");                             // функция возвращает результат удаления true/false. Удаляемый каталог должен быть пустым

Создадим два скетча. В первом будим создавать файл и записывать в него информацию, а во втором, удалим созданный файл.

Создание файла:

// подключение библиотек SPI и SD:
#include <SPI.h>
#include <SD.h>
const uint8_t PIN_CS = 10;                         // указываем номер вывода arduino подключенного к выводу CS адаптера
File myFile;                                       // создаём переменную myFile класса File, которая будет служить "указателем" на открытый файл
void setup(){
  Serial.begin(9600);                              // открываем последовательный порт на скорости 9600 бод
  while(!Serial){;}                                // ожидаем соединение последовательного порта
//используем ответ инициализации, для определения работоспособности карты и адаптера
  if(!SD.begin(PIN_CS)){                           // инициализация SD карты с указанием номера вывода CS
    Serial.println("SD-card not found"); return;   // ошибка инициализации. карта не обнаружена или не подключён (неправильно подключён) адаптер карт MicroSD
  }
//проверяем наличие файла "iarduino.txt" на SD-карте
  if(SD.exists("iarduino.txt")){                   // если файл с именем "iarduino.txt" существует, то ...
    Serial.println("file exists");
  }else{                                           // иначе ...
    Serial.println("file doesn't exist");
  }
//открываем файл "iarduino.txt" для чтения и записи, начиная с конца файла, и записываем в него строку
  myFile = SD.open("iarduino.txt", FILE_WRITE);    // если файла с именем "iarduino.txt" - нет, то он будет создан.
  if(myFile){                                      // если файл доступен (открыт для записи), то ...
    Serial.println("file is opened");
    myFile.print("The beginning of a line, ");     // записываем первую часть строки в файл
    myFile.println("The end of the line");         // записываем вторую часть строки в файл
    Serial.println("data written to the file");
    myFile.close();                                // закрываем файл
    Serial.println("file is closed");
  }else{                                           // иначе ...
    Serial.println("file is not opened");
  }
//проверяем наличие файла "iarduino.txt" на SD-карте
  if(SD.exists("iarduino.txt")){                   // если файл с именем "iarduino.txt" существует, то ...
    Serial.println("file exists");
  }else{                                           // иначе ...
    Serial.println("file doesn't exist");
  }
}
void loop(){
}

если подключить адаптер карт MicroSD к Piranha Uno, подключить Piranha Uno к ПК, загрузить скетч, вставить SD-карту и запустить Монитор последовательного порта, то в мониторе будут выведены следующие строки:

file doesn't exist (файл не обнаружен)
file is opened (файл открыт)
data written to the file (данные записаны в файл)
file is closed (файл закрыт)
file exists (файл обнаружен)

а на SD-карте появится файл "iarduino.txt" с одной строкой "The beginning of a line, The end of the line".

Если загрузить скетч при вставленной в адаптер карт MicroSD SD-картой, то на SD-карте появится файл "iarduino.txt" с двумя строками "The beginning of a line, The end of the line", а первой строкой в мониторе последовательного порта будет "file exists" (файл обнаружен).

Дело в том, что функция setup() в обоих случаях выполняется дважды (сразу после загрузки скетча и после запуска монитора последовательного порта). Но в первом случае, после загрузки скетча, SD-карты не было в адаптере, следовательно, файл "iarduino.txt" был создан только после запуска монитора последовательного порта.

Удаление файла:

// подключение библиотек SPI и SD:
#include <SPI.h>
#include <SD.h>
const uint8_t PIN_CS = 10;                         // указываем номер вывода arduino подключенного к выводу CS адаптера
void setup(){
  Serial.begin(9600);                              // открываем последовательный порт на скорости 9600 бод
  while(!Serial){;}                                // ожидаем соединение последовательного порта
//используем ответ инициализации, для определения работоспособности карты и адаптера
  if(!SD.begin(PIN_CS)){                           // инициализация SD карты с указанием номера вывода CS
    Serial.println("SD-card not found"); return;   // ошибка инициализации. карта не обнаружена или не подключён (неправильно подключён) адаптер карт MicroSD
  }
//проверяем наличие файла "iarduino.txt" на SD-карте
  if(SD.exists("iarduino.txt")){                   // если файл с именем "iarduino.txt" существует, то ...
    Serial.println("file exists");
//  удаляем файл "iarduino.txt":
    if(SD.remove("iarduino.txt")){                 // функция возвращает результат удаления true/false
      Serial.println("file deleted");
    }else{
      Serial.println("file is not deleted");
    }
  }else{                                           // иначе ...
    Serial.println("file doesn't exist");
  }
//проверяем наличие файла "iarduino.txt" на SD-карте
  if(SD.exists("iarduino.txt")){                   // если файл с именем "iarduino.txt" существует, то ...
    Serial.println("file exists");
  }else{                                           // иначе ...
    Serial.println("file doesn't exist");
  }
}
void loop(){
}

если подключить Trema-модуль адаптер карт MicroSD к Arduino Uno, подключить Arduino Uno к ПК, загрузить скетч, вставить SD-карту и запустить Монитор последовательного порта, то в мониторе будут выведены следующие строки:

file exists (файл обнаружен)
file deleted (файл удалён)
file doesn't exist (файл не обнаружен)

а файл "iarduino.txt" будет удалён с SD-карты.

Если загрузить скетч при вставленной в адаптер карт MicroSD SD-картой, то файл "iarduino.txt" будет удалён с SD-карты, но в мониторе последовательного порта будут две строки "file doesn't exist" (файл не обнаружен).

Дело в том, что функция setup() в обоих случаях выполняется дважды (сразу после загрузки скетча и после запуска монитора последовательного порта). Но в первом случае, после загрузки скетча, SD-карты не было в адаптере, следовательно, файл "iarduino.txt" был удалён только после запуска монитора последовательного порта.


Обсуждение