" title="Написать письмо">Написать письмо
Донаты на карту ВТБ:
2200 4002 2461 6363

Статьи по дате (многие всегда актуальны)

Статистика

Пользователи : 1
Статьи : 2358
Просмотры материалов : 8976341
 
Arduino: работа с microSD (29.01.2026). Печать E-mail
2026 - Январь
29.01.2026 00:00
Save & Share
После того, как RAM подорожала в 2-4 раза, - начало дорожать всё, что её содержит. Наверно, ноутбуки теперь - как автомобили (утильсбор же ещё на 20% подняли с 2026): стали роскошью, а не техническим средством улучшения качества жизни. Итак, еле-еле удалось урвать ноутбучную память DDR3L 4ГБ 1600МГц за 631руб - а вместе с ней: microSD-карту 256МБ попугай-едишн за 111руб и модуль чтения microSD за 33руб.

Естественно, на алиэкспрессе, - а не у магазинов-перекупов в РФ: за 1340руб и 184руб минимум бы получилось - они вообще с катушек слетели по ценообразованию. А сколько сейчас поддельных флешек, SD-карт и прочих носителей на маркетплейсах стало. При попытке найти цену 256МБ: десятки страниц подделок по "256ГБ", десятки объявлений подряд с подделками (среди которых скромно размещаются объявления с реальными объёмами и соответствующими ценами).

Итак, всё куплено - можно записать и считать данные. Но заранее знал, что будет трудно, - вышло труднее; и все опыты проходили примерно вот в таком стиле эмоций.


Модули работы с microSD не имеют ни фирмы, ни марки, ни модели - но точно поддерживают карты до 2ГБ, а также называются почему-то как модули для SD (имея в себе разъём именно microSD). MicroSD-карты малого объёма - вероятность подделки объёма ничтожная. Если учесть скорость процессора Arduino Nano 16МГц: скорость записи по интерфейсу SPI разъёма ICSP составит не более 2МБ/с - нет смысла заморачиваться с классом скорости носителя. И вот именно когда вскрылось, что управление осуществляется по SPI, - пришло понимание ещё до прихода модуля: всплыли в памяти "MOSI", "MISO" - будет жопа, как была ранее.

Как выглядела жопа:
- на модуле 1x6pin расположены в 1 ряд, на платформе - 2x3pin ICSP. Разъём на платформе - создан с вполне добрым умыслом и сильными мозгами: дублирование боковых контактов именно вверх - подошло именно сейчас, когда на платформе с датчиком пульса (продолжающей обрастать всяким хламом) начинаются проблемы с мешающимися проводами. Одновременно существует 2 варианта распиновки ICSP, даже если платформа совершенно одинаковая, - необходимо прозванивать все пины разъёма: с целью найти коротыш с 5V платформы;
- существует миниатюрный модуль microSD за ту же цену. Но ранее это было неизвестно - была куплена огромная дура в 4 раза больше. К тому же, в миниатюрном модуле железка для карты выступает перед модулем (удобно вставлять в корпуса), а на дуре - наоборот, утоплена в текстолит;
- не видел ни 1 модуля SD, имеющего разъём ICSP. Из этого следует, что покупка кабеля IDC 2x3pin 2.54мм мама-мама (для соединения без пайки и создания разъёмного соединения), - ровно наполовину невозможна. В итоге, был куплен кабель 1м за 100руб на алиэкспрессе: с целью разрезать на 5см и 95см - и напаиваться к модулю: с интересом, выдержит ли почти метр длины, - а потом перепаяться на короткий огрызок;
- присоединение 6 проводов вручную - корректно возможно только в случае, если провода разных цветов. Место, где можно найти такое разнообразие, - только потрошение БП ПК. В свою очередь, провода БП очень толстые - мало гибкости. В свою очередь, отрезаемая длина от БП не может превысить условных 30-50см - если потребуется метровая длина, будет весёлое соединение огрызков друг с другом пайкой и термоусадками (также, метровый кабель с 6 проводами будет толстым, и потребуется больше кусочков термоусадки для их фиксации). Также длина как минимум 1 провода точно будет выбрана неверно, об этом пойдёт речь ниже;
- о длине и толщине проводов. Дело в том, что SPI позволяет подключить к себе несколько устройств (к платформе параллельно присоединяются), - очень похоже на I2C. А в нём очень жёсткие требования к уменьшению сечения провода, требуется вычисляемый по формулам талмудного даташита обвес, требуется подключение обвеса прямо в конкретные места, нужен I2C-сканер - даже если устройство подключается всего одно, возня ещё та;
- на разъёме ICSP есть RST - но нет CS с модуля SD. Создаётся иллюзия, что CS не нужен, - но он участвует с определением ID подсоединяемого устройства по SPI (даже если оно одно). Подключается к любому цифровому каналу (с оглядкой на D0 и D1: не универсальные - могут пойти глюки), прописывается в исходниках. В итоге, провод CS от модуля должен быть сильно длиннее, чем остальные 5.



Итак, когда всё было получено и спаяно - выглядело примерно так.



Теперь остаётся только программировать (представьте постоянную беготню SD-карты между модулем SD и кард-ридером - мою беготню):
- настройка модуля: pinMode(iCS_pin, OUTPUT). Хотя предпочитаю сразу DDR и PORT: VCC - 1 и 1, CS - 1 и 1 - понятно. MISO, MOSI, SCK - напишу позже;
- подключение сразу готового объекта SD по работе с картами: #include "SD.h". Вот отсюда и пошло, наверно, "модуль SD";
- проверка наличия карты: if (!SD.begin(iCS_pin)). Нет карты, не та файловая система, неправильно спаяли - false. FAT32 работает - необязательно FAT16 подавать;
- проверка типа карты, если хочется: #include "SPI.h" Sd2Card oCard; oCard.init(SPI_HALF_SPEED, 2); oCard.type(). Вернёт SD_CARD_TYPE_SD1 (1) в случае SD-карты Secure Digital (поколения 1), SD_CARD_TYPE_SD1 (2) в случае обычной SD-карты (поколения 1.1), SD_CARD_TYPE_SDHC (3) в случае карты Secure Digital High Capacity (поколения 2). Смущает то, что библиотека SPI ничего не знает о поколении 3 (SDXC, 2009) и поколении 4 (SDUC, 2018). Попугайная карта возвращает 2, что соответствует цене и номиналу объёма;
- открыть файл для манипуляций: File File_SD = SD.open("1___1.txt", FILE_READ/FILE_APPEND/FILE_WRITE). За 1 раз можно открывать 1 файл. Не умеет работать с русскоязычными файлами и пробелами. Не умеет создавать файлы с именем больше 8 символов. Был замечен баг: FILE_WRITE не затирает файл - и работает как FILE_APPEND;
- манипулировать: File_SD.readln() и File_SD.println() построчно, File_SD.read() и File_SD.print() посимвольно. Можно использовать SD.seek() и SD.peek(). Вообще, описание библиотеки крайне полезно для изучения: там же работа с файлами и директориями, преобразование данных в разные системы счисления;
- манипулировать бинарно: File_SD.read(), File_SD.write() - недостаточно для бинарной записи. double dNumber = 5: при write(dNumber) - записывает 1 байт с банальным чаром 05. Надо: File_SD.write((uint8_t*)&dNumber, sizeof(dNumber)). При этом, прикол (как же они зае...): double в Arduino Nano - 4-байтный, равный float - и по точности, и по бинарным записываемым числам: float 7 = double 7 = E0-40 (забыл, с какой стороны 4 нуля ещё). А если 2 поставить - перетипирует в int и запишет 07-00;
- закрыть: File_SD.close();
- если использовать объект oCard от SPI дальше - можно, например, получить весь список файлов на карте, тип её файловой системы и т.д.
- отмечается высокая нагрузка на платформу Arduino Nano по памяти. Один инклуд SD.h - жрёт 17% памяти и 38% динамической памяти. А тестовый код с Serial - уже 37% и 45% получилось.

Сколько жрёт мА при записи - потом напишу. Надо остыть. Особенно если учесть, что меня сбила машина, пока я был в трамвае. Нет времени как в фильмах: ни на покричать, ни отпрыгнуть - только глаза успеваешь округлить, и в тебя бочиной влетает автомобиль. Потом машинист даёт по тормозам, люди складываются по аналогии в фильме "Метро" 2013 года - но китайская куртка скользкая, и все проскальзывали по ней, не унося мою тушку за собой. Ну, мы ж люди умные: людей высадили в сугробы - надо подождать, пока толпа из трамвая проделает в них тропу, и только потом идти.


(добавлено 30.01.2026) Замеры по GND: ~4.5мА в состоянии покоя, постоянно меняющиеся 11-22мА (преимущественно 13мА) в состоянии записи в while (true).

Очень странно: значения PORTD, DDRD, PORTB, DDRB - не сказываются на работоспособности, не играют никакой роли. Предполагается, что во время SD.begin(2)) - всё само настраивается (потому что проверил на A0: настроечные регистры - работоспособны). А значит pinMode для CS - не требуется при единичном экземпляре устройства в SPI.

(добавлено 09.02.2026) Пришёл кабель IDC. Легко режется, гибкий, хорошо лудится и разделяется на отдельные проводки. В продаже на али появился и за 83руб с бесплатной доставкой - ещё и переплатил в итоге. Имеет красную направляющую - если подкрасить разъём ICSP, точно не ошибёшься при подсоединении.  Похоже, нельзя путать подсоединение: иначе на Reset пойдут 5В без подстроечного резистора.

(добавлено 14.02.2026) Торопился в пайке и допустил ошибку: не припаял CS. К удивлению, всё заработало, - теперь сомнения вообще в необходимости CS в случае единичного устройства в SPI.
Обновлено ( 14.02.2026 11:12 )
 
 

Последние новости


©2008-2026. All Rights Reserved. Разработчик - " title="Сергей Белов">Сергей Белов. Материалы сайта предоставляются по принципу "как есть". Автор не несет никакой ответственности и не гарантирует отсутствие неправильных сведений и ошибок. Вся ответственность за использование материалов лежит полностью на читателях. Размещение материалов данного сайта на иных сайтах запрещено без указания активной ссылки на данный сайт-первоисточник (ГК РФ: ст.1259 п.1 + ст.1274 п.1-3).

Много статей не имеет срока устаревания. Есть смысл смотреть и 2011, и даже 2008 год. Политика сайта: написать статью, а потом обновлять ее много лет.
Рекламодателям! Перестаньте спамить мне на почту с предложениями о размещении рекламы на этом сайте. Я никогда спамером/рекламщиком не был и не буду!
Top.Mail.Ru