Подключение модуля microSD к Arduino
Карта памяти по SPI
Модуль microSD к Arduino Uno и Nano по SPI: MOSI на D11, MISO на D12, SCK на D13, CS на D10, питание 5 В. Модуль со стабилизатором и делителями сам согласует уровни.
Схема подключения модуля microSD к Arduino
| Модуль microSD | Arduino Uno |
|---|---|
| CS | D10 |
| MISO | D12 |
| MOSI | D11 |
| SCK | D13 |
| VCC | 5V |
| GND | GND |
Схема из примера «Arduino Uno: журнал на карту SD».
Выводы Модуль microSD
| Вывод | Назначение |
|---|---|
| CS | выбор карты |
| MISO | данные от карты |
| MOSI | данные к карте |
| SCK | тактовый сигнал |
| VCC | питание |
| GND | общий провод |
Код для Arduino
#include <SPI.h>
#include <SD.h>
// Карта SD на аппаратном SPI: 11, 12, 13 и выбор на 10.
//
// Три отличия от ESP32, о которые спотыкаются при переносе.
//
// **Выводы шины другие** и не выбираются: у Uno это 11 и 13, MISO на
// 12. На ESP32 те же роли на 23, 19 и 18.
//
// **Имена файлов только короткие**, восемь знаков плюс три на
// расширение. Библиотека для AVR длинных не знает: SD.open("data.log")
// откроет не то, что вы думаете, а SD.open("измерения.txt") не откроет
// ничего. Только латиница и только 8.3.
//
// **Памяти впритык.** Библиотека держит буфер сектора — 512 байт, ещё
// четверть оперативной памяти платы. Вместе с экраном OLED они на Uno
// уже не помещаются.
//
// На карте в модели уже лежит README.TXT — с него и начнём.
const int CS = 10;
void setup() {
Serial.begin(9600);
delay(200);
if (!SD.begin(CS)) {
Serial.println(F("карта не найдена: проверьте CS, MISO и питание"));
return;
}
Serial.println(F("карта на месте"));
// Что на ней лежит.
File root = SD.open("/");
for (File f = root.openNextFile(); f; f = root.openNextFile()) {
Serial.print(F(" "));
Serial.print(f.name());
Serial.print(F(" "));
Serial.print(f.size());
Serial.println(F(" байт"));
f.close();
}
// Читаем готовый файл.
File readme = SD.open("README.TXT");
if (readme) {
while (readme.available()) Serial.write(readme.read());
readme.close();
}
}
void loop() {
// Дописываем строку в журнал. Файл открывается и закрывается на
// каждую запись намеренно: карту вынимают без предупреждения, а
// закрытый файл переживёт это, незакрытый — нет.
File log = SD.open("LOG.TXT", FILE_WRITE);
if (log) {
log.print(millis() / 1000);
log.println(F(" c работы"));
log.close();
Serial.println(F("строка записана в LOG.TXT"));
} else {
Serial.println(F("не открылся LOG.TXT"));
}
delay(5000);
}
Скетч можно править и запускать в симуляторе без платы и установки среды.
Что учесть на Arduino
- Библиотека SD расходует около 500 байт ОЗУ на буфер, на Uno с 2 КБ памяти это существенно.
- Имена файлов — в формате 8.3 (
DATA.TXT): длинные имена библиотека SD не поддерживает.
Частые ошибки при подключении к Arduino
- Голый адаптер microSD без делителей напрямую на 5-вольтовые выводы: карта рассчитана на 3,3 В и может выйти из строя.
- Передать в
SD.begin()другой номер вывода, чем тот, на который подключен CS: карта не откликается. SD.begin()возвращает false — карта в exFAT (карты от 64 ГБ). Форматируйте в FAT32.- Файл пустой — не вызван
file.close()илиflush(): данные остались в буфере. - Питание просаживается при записи — карта берёт до 100 мА импульсами. Конденсатор 10–100 мкФ у модуля помогает.
- Вывод CS другого SPI-устройства не поднят в HIGH — два устройства отвечают одновременно.
Ещё по теме
Другие детали для Arduino
HC-SR04DHT22 (AM2302)BME280DS3231SSD1306 OLED 0,96″LCD 1602 с I2CMAX7219TM1637Модуль релеKY-040Клавиатура 4×4HX711ФоторезисторRGB-светодиодСервопривод SG9074HC595Шаговый двигательКнопкаПотенциометрПьезопищалкаСветодиодПолзунковый переключательHC-SR501TTP223Датчик влажности почвыMQ-2LM35Джойстик KY-023DHT11HTU21D