Модуль MicroSD-карты для Arduino: обзор и подключение

Когда данных становится больше, чем умещается в памяти самого Arduino, встаёт вопрос: куда писать логи, показания датчиков, конфиги или, скажем, WAV-файлы для плеера. Стандартный ответ — карта памяти. Не какая-нибудь специальная, а обычная microSD из старого телефона, вставленная в модуль за 150 рублей. Именно этот модуль — со слотом под карту, стабилизатором и преобразователем уровня — и разберём.
Что это за модуль
Сверху — слот microSD, снизу два ряда выводов с шагом 2,54 мм — их удобно втыкать в макетку или паять в гребёнку. На плате могут стоять две микросхемы, и именно они отличают готовый модуль от «голого» слота:
- AMS1117-3.3 — линейный стабилизатор, который из 5 В питания Arduino делает 3,3 В. Карта microSD выше 3,6 В не переносит, поэтому питать её напрямую от 5 В нельзя.
- 74LVC125A — буфер-преобразователь логического уровня: SPI-сигналы 5-вольтовой Arduino проходят через него и на карту уже приходят «трёхвольтовыми».
У модуля шесть выводов: GND — общий провод; VCC — питание, обычно 4,5–5,5 В (в версиях без стабилизатора — 3,3 В); CS — выбор чипа, которым Arduino указывает, что обращается именно к этому модулю (пин активен в низком уровне); MOSI — вход модуля, данные от Arduino; MISO — выход модуля, данные к Arduino; SCK — тактирование шины.
Характеристики (из описания производителя/продавца)
| Параметр | Значение |
|---|---|
| Поддерживаемые карты | microSD (до 2 ГБ), microSDHC (до 32 ГБ) |
| Файловая система | FAT16, FAT32 |
| Интерфейс | SPI (MISO, MOSI, SCK, CS) |
| Питание модуля | 4,5–5,5 В (версии без стабилизатора — 3,3 В) |
| Логика SPI | 5 В или 3,3 В (через буфер 74LVC125A) |
| Потребляемый ток | от 0,2 мА (покой) до 200 мА (пик записи) |
| Габариты платы | около 45 × 24 × 9 мм |
Схема подключения к Arduino UNO
На UNO шина SPI сидит на конкретных выводах, их перепутать нельзя: MOSI — Digital 11, MISO — Digital 12, SCK — Digital 13. Выбор чипа (CS) можно вешать на любой цифровой пин, по традиции берут D4 — так не конфликтуют с Ethernet-шилдами, у которых CS на D10.
| Вывод модуля | Arduino UNO |
|---|---|
| VCC | 5V |
| GND | GND |
| CS | D4 |
| MOSI | D11 |
| MISO | D12 |
| SCK | D13 |
У Arduino Mega своя распиновка SPI: MOSI — 51, MISO — 50, SCK — 52, CS — любой цифровой, обычно 53. Скорость обмена задаёт библиотека сама, вручную тактировать не нужно.
Подключение к ESP32
У ESP32 логика 3,3 В, и это меняет расклад. Модуль с буфером и стабилизатором при 5 В на VCC будет выдавать 5-вольтовые уровни туда, куда ESP32 их не ждёт, — для её пинов максимум 3,6 В. Поэтому для ESP32 берут либо «упрощённый» модуль без стабилизатора и буфера, либо обычный модуль, но питают VCC от 3V3: стабилизатору на вход 3,3 В работать не всегда комфортно, зато буфер 74LVC125A как раз нормально пропускает 3,3-вольтовые уровни. Типовая распиновка:
| Вывод модуля | ESP32 |
|---|---|
| VCC | 3V3 |
| GND | GND |
| CS | GPIO 5 |
| MOSI | GPIO 23 |
| MISO | GPIO 19 |
| SCK | GPIO 18 |
Код: пишем и читаем лог
В Arduino IDE есть штатная библиотека SD — ничего дополнительно ставить не надо. Пример ниже инициализирует карту, добавляет строку в log.txt с таймером и выводит содержимое файла в Serial Monitor:
#include <SPI.h>
#include <SD.h>
const int chipSelect = 4; // пин CS (у Mega обычно 53)
void setup() {
Serial.begin(9600);
// SD.begin() возвращает false, если не воткнута SD-карта
// или CS в скетче не совпадает с реальным пином
if (!SD.begin(chipSelect)) {
Serial.println("ошибка: карта не инициализируется");
return;
}
Serial.println("карта найдена");
// дописываем строку в log.txt
File logFile = SD.open("log.txt", FILE_WRITE);
if (logFile) {
logFile.print("t=");
logFile.println(millis());
logFile.close(); // без close() данные не попадут на карту
Serial.println("log.txt дополнен");
} else {
Serial.println("ошибка открытия log.txt");
}
// читаем файл обратно и печатаем в Serial
File readBack = SD.open("log.txt");
if (readBack) {
while (readBack.available()) {
Serial.write(readBack.read());
}
readBack.close();
}
}
void loop() {
// вся работа сделана в setup(), loop оставляем пустым
}
Для ESP32 в скетче меняется только CS: SD.begin(5). Если подключаете модуль к другим пинам, сначала настраивают шину: SPI.begin(18, 19, 23, 5), затем SD.begin(5, SPI).
Подготовка карты
- Форматируйте в FAT16 или FAT32. Для карт до 2 ГБ подходит обычный FAT, для 4–32 ГБ — FAT32. Windows с картами 64 ГБ и больше даст только exFAT — такие карты библиотека SD не прочтёт, берите SDHC максимум на 32 ГБ.
- Имена файлов в FAT старого образца: 8 символов имени + 3 на расширение. «TEMPLOG.TXT» — нормально, «temperature_log.txt» — нет.
Частые ошибки
«initialization failed» на рабочем модуле. Первая подозреваемая — формат карты. exFAT и NTFS библиотека SD не понимает, нужна FAT32. Вторая — несоответствие пина CS между платой и скетчем.
Маркировка CS. У дешёвых модулей контакт может называться SS, SD_CS или просто «4». Суть одна — это выбор чипа, но номер в скетче должен совпадать с тем пином, куда реально воткнут провод.
SD и Ethernet-модуль на одной SPI-шине. Оба делят MISO/MOSI/SCK, и если у одного из них CS «висит в воздухе» или остался в активном состоянии, шина конфликтует. CS у каждого SPI-устройства — отдельный пин, ничего не оставляют неподключённым.
Карта на 64 ГБ и больше. SDXC-карты отформатированы в exFAT и в 16-разрядный адрес не влезают. Библиотека SD их просто не увидит.
Запись не видна. Данные из logFile.write() до close() лежат в буфере Arduino, а не на карте. При пропадании питания незакрытый файл чаще всего повреждается — записал строку, сразу закрыл файл.
ESP32 и 5 В на VCC. Если подать 5 В на модуль с буфером высокого уровня, логика 5 В уйдёт прямо в GPIO ESP32 — пин может сгореть. Для ESP32 питание строго 3,3 В и согласование уровней.
Что ещё есть на сайте
Если интересна работа с данными на других носителях — посмотрите обзор модуля часов реального времени DS3231: в логгерах он часто живёт в паре с SD-модулем, чтобы к каждой строке лога прикладывать точное время. А если нужен практический пример на другом модуле — читайте обзор ультразвукового дальномера HC-SR04.
Информация собрана из открытых источников и паспортов производителей и не является истиной в последней инстанции. Характеристики, распиновку и совместимость проверяйте по документации конкретной партии модуля перед покупкой и подключением.