Обзор модуля 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 карты имеет шесть контактов, назначение каждого можно ознакомится ниже:
► 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 в модуль и подключить ее к Arduino, необходимо отформатировать карту в FAT16 или FAT32.
Если вы работаете в Windows 10, щелкните правой кнопкой мыши значок карты и выберите параметр «Форматировать…». В новом окне, выбираем файловую систему FAT или FAT16 и нажимаем «Начать»
Подключение модуля 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.
Теперь можно загрузить скетч, чтобы прочитать информацию о карте. Программа доступна из библиотеки примеров в IDE Arduino. Перейдите в Файл -> Примеры -> SD -> CardInfo. Программа откроется в новом окне.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
/* Тестировалось на 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) {} |
Если все правильно сделано в открытом окне «Мониторинг порта» можно увидеть информацию о карте
Если ничего не появляется, скорее всего, вы неправильно соединили провода.
Чтение и запись данных
После удачной инициализации SD-карты, можно переходить к записи и чтения данных из файла. Скопируйте скетч в среду разработки IDE Arduino и загрузите его в контроллер.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
/* Тестировалось на 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.
1 2 |
#include <SPI.h> #include <SD.h> |
Следующее, что мы делаем, это указываем вывод Arduino, к которому подключен вывод «CS» модуля SD-карты. Вывод CS — единственный, который можно изменить, по сравнению с выводами интерфейса SPI, так как мы используем аппаратный интерфейс SPI, и эти выводы уже добавлены в библиотеке SPI. Далее мы создаем myFile , который позже будет использоваться для хранения данных на SD-карте.
1 2 |
const int chipSelect = 10; File myFile; |
В «setup()«, запускаем последовательную связь «Serial.begin(9600)«, для отображения результатов. Теперь, инициализируем SD-карту функций «SD.begin()«, и если инициализация прошла успешно, оператор «if» становится истинным и печатается сообщение об удачной инициализации, иначе инициализация не удалась и программа останавливается.
1 2 3 4 5 6 7 |
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» открывает файл в режиме чтения-записи.
1 |
myFile = SD.open("test.txt", FILE_WRITE); |
После открытия файла печатается сообщение «Writing to test.txt…» в окне «Мониторинг порта» , а затем с помощью функции «myFile.println()» запишем в файл текст «test 1, 2, 3.«. После этого нам нужно воспользоватся функцией «close()«, чтобы гарантировать, что данные, записанные в файл, сохранены.
1 2 3 4 5 6 7 8 |
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()«, для чтения всех символов в файле. В конце нам нужно закрыть файл.
1 2 3 4 5 6 7 8 9 10 |
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()«, которая выполняется постоянно.
1 2 3 |
void loop() { } |
Теперь после загрузки скетча в Arduino в окне «Мониторинг порта», можно увидеть следующие данные.
При повторном открытие окна «Мониторинг порта», данные будуи добавляться в файл без перезаписи.
Купить на Aliexpress
Контроллер Arduino UNO R3 на CH340G
Контроллер Arduino UNO R3 на Atmega16U2
Комплект проводов DuPont, 2,54 мм, 20 см
Модуль SD кары, SPI
Купить в Самаре и области
Контроллер Arduino UNO R3 на CH340G
Контроллер Arduino UNO R3 на Atmega16U2
Провода DuPont, 2,54 мм, 20 см
Модуль SD кары, SPI
Данный модуль не работает совместно с другими модулями по SPI, вызывая ошибки при приеме и передаче данных. Требует доработки паяльником.