Arduino запись на USB флэшку или SD карту.
- Войдите на сайт для отправки комментариев
Ср, 13/04/2011 - 20:11
Можно ли как-то организовать логирование с Arduino на USB флэшку или SD карту? Если у кого есть пример кода, был бы очень признателен.
Да вроде всё есть http://www.arduino.cc/en/Reference/SD
Спасибо, я так понимаю там нужен ethernet шилд, для работы с SD докупать, было бы конечно интересно варианты напрямую как-нить припаять, или в идеале через USB
Искать нужно хоть немного поактивней ;)
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1206874649/8
О то что надо. Спасибо. Я к сожалению сам это не нашел.
В инете есть куча ссылок на подключение SD на русском, сейчас не могу скинуть ссылку потом позже добавлю.
http://habrahabr.ru/blogs/arduino/115176/ - вот как и обещал на русском.
Великолепно, это просто праздник какой-то. Спасибо за ссылку.
Гыы.. атака ботов)))
При работе с SD не забудте её форматнуть требуемым образом.
Вопрос про ресурс SD карты если она будет использоваться в качестве записи параметра каждую секунду.
По теории мы должны будем открыть файл на запись -> записать строку данных -> закрыть файл на запись. Ресурс карточки должен по теории быстро закончиться. Как можно обойти данное ограничение?
По теории мы должны будем открыть файл на запись -> записать строку данных -> закрыть файл на запись. Ресурс карточки должен по теории быстро закончиться. Как можно обойти данное ограничение?
писать напрямую, не используя файловую систему
Вопрос про ресурс SD карты если она будет использоваться в качестве записи параметра каждую секунду.
По теории мы должны будем открыть файл на запись -> записать строку данных -> закрыть файл на запись. Ресурс карточки должен по теории быстро закончиться. Как можно обойти данное ограничение?
А какой объем данных нужно писать?
объем данных строчку параметра - (например температура и время) каждую секунду в течении нескольких часов. И так несколько раз. Для начала хотелось бы построить график температуры при получении спирта. Для того, чтобы определить когда пойдут хвосты.
Вопрос про ресурс SD карты если она будет использоваться в качестве записи параметра каждую секунду.
По теории мы должны будем открыть файл на запись -> записать строку данных -> закрыть файл на запись. Ресурс карточки должен по теории быстро закончиться. Как можно обойти данное ограничение?
Очевидно, отказаться от открытия/закрытия файла каждую секунду. Открывать и закрывать файл, скажем, раз в 10 минут или час.
Насколько я помню, открытие/закрытие файла не влекут никаких фактических действий с ячейками памяти. Ошибаюсь?
Насколько я помню, открытие/закрытие файла не влекут никаких фактических действий с ячейками памяти. Ошибаюсь?
Что именно Вы подразумеваете под "ячейками памяти"?
Что именно Вы подразумеваете под "ячейками памяти"?
Конкретный адрес, куда будет писаться блок.
Конкретный адрес, куда будет писаться блок.
Адрес где?
Если речь идет о flash памяти, то, думаю, не лишним будет напомнить, как вообще работает запись на диск.
В файловой системе FAT существуют три области, которые затрагиваются при записи файла (в других файловых системах таких областей может быть другое количество): таблицы размещения файлов (FAT - собственно от них и пошло название ФС), каталог и область данных файла. Кроме того, необходимо помнить, что внешний накопитель - блочное устройство, т.е. обмен данными с ним возможен только блоками. В нашем случае - секторами по 512 байт.
- При создании файла происходит чтение из каталога и запись в каталог. При открытии существующего файла - чтение из каталога и из таблицы размещения файлов.
- При закрытии файла происходит запись "хвоста" файла в область данных, корректировка таблицы размещения файлов и каталога.
- При записи в файл - интереснее. Если файл пишется небольшими порциями, то данные накапливаются в буфере записи. По заполнении буфера его содержимое сбрасывается в область данных (операция записи), после чего читаются данные FAT, корректируются и записываются обратно.
Т.е. при однократном открытии в случае записи короткими фрагментами происходит только заполнение буфера (без физической записи), и изредка - последовательность: запись фрагмента файла, чтение фрагмента FAT, запись фрагмента FAT.
При последовательности открытие-запись закрытие для каждого маленького фрагмента происходит:
1. Чтение каталога (возможно - нескольких секторов, пока не найдем нужный файл).
2. Чтение FAT (возможно - нескольких секторов, в зависимости от длины текущего файла и степени его фрагментированности).
3. Чтение данных файла (одного сектора).
4. Корректировка данных внутри сектора.
5. Запись откорректированного сектора с данными файла обратно.
6. Чтение одного сектора FAT.
7. Корректировка сектора FAT.
8. Запись сектора FAT обратно.
9. Чтение сектора каталога.
10. Корректировка сектора каталога.
11. Запись сектора каталога обратно.
Т.е. всего не менее 8 операций чтения/записи сектора, из которых не менее 3 операций записи. К этому добавляются 2 операции чтения и 2 операции записи, когда переходим через границу сектора. И еще могут добавляться несколько операций чтения для поиска нужного фрагмента в каталоге либо в таблице размещения файлов.
Вот и смотрите: пусть мы пишем в единственный длинный файл порциями по 10 байтов, тогда:
- В случае единственного открытия/закрытия у нас приходится по 2 записи на сектор (512 байт) - в тело файла и FAT.
- В случае открытие-запись-закрытие у нас по 3 операции на каждые 10 байт, т.е. 52*3=156 плюс 2 дополнительные при заполнении сектора.
Итого: 158 операций записи против двух. Это с точки зрения исчерпания ресурса записи.
С точки зрения расхода времени - ситуация еще хуже: 52*8+3=419 против трех.
PS. Кстати, Ваше замечание относительно объема записи очень существенно, т.к. прямым образом влияет на приведенные расчеты.
Спасибо за подробный ответ.
Я понял так: Если открыть файл на запись и не закрывать его и писать в него данные раз в секунду то данные будут писаться в буфер. Когда буфер заполнится - то данные запишутся на флешку. (вроде это справедливо для компьютеров) Для Arduino не знаю.
Если данные накапливать в течении минуты в оперативке и затем писать в файл весь блок в 60 строк. Вроде проблема должна убраться.
И еще замечание. Если питание пропадет во время открытия файла и записи данных. То файл может быть попорчен. Как обычно проверяется это условие? Единственное что приходит на ум - это проверять напряжение питания на входе стабилизатора. Если оно больше 8 v то разрешать запись в файл.
Я понял так: Если открыть файл на запись и не закрывать его и писать в него данные раз в секунду то данные будут писаться в буфер. Когда буфер заполнится - то данные запишутся на флешку. (вроде это справедливо для компьютеров) Для Arduino не знаю.
По всем архитектурным признакам Ардуино и есть компьютер. (скажу больше: дажа тамагочи - компьютер)
Если же сравнивать с ПК, то у Ардуино катастрофически мало памяти, поэтому то, что можно позволить себе на ПК, например, хранить в памяти фрагменты каталога и таблицы размещения файлов, на многих моделях Ардуино не реально. Фактически Ардуино при работе с файлом вынуждена совершать гораздо больше работы - именно из-за недостатка памяти.
Ну а особенности блочных устройств - они нее зависят от того, Ардуино или ПК.
Если данные накапливать в течении минуты в оперативке и затем писать в файл весь блок в 60 строк. Вроде проблема должна убраться.
А проблемы и нет. А вот если Вы пойдете по предложенному только что пути - она, наоборот, появятся. Какой смысл хранить в крошечной памяти Ардуино две копии данных: ту, что ожидает записи в буфер, и ту, что уже находится в буфере и ожидает записи на флешку?
И еще замечание. Если питание пропадет во время открытия файла и записи данных. То файл может быть попорчен. Как обычно проверяется это условие? Единственное что приходит на ум - это проверять напряжение питания на входе стабилизатора. Если оно больше 8 v то разрешать запись в файл.
Чтобы делать конкретные оценки (как приведенные выше 8 В), нужны конкретные условия: потребляемый ток, емкость конденсаторов в питании, а также конкретные времена, которые необходимы, чтобы сбросить на флешку всю нужную информацию (которой довольно много - не менее 5 операций чтения/записи секторов, а в худшем случае эта величина, минимум, удваивается).
По теории мы должны будем открыть файл на запись -> записать строку данных -> закрыть файл на запись. Ресурс карточки должен по теории быстро закончиться. Как можно обойти данное ограничение?
писать напрямую, не используя файловую систему
Сейчас бьюсь над этим вопросом и не пойму как это сделать. Кто подскажет, как это можно реализовать?
писать напрямую, не используя файловую систему
Сейчас бьюсь над этим вопросом и не пойму как это сделать. Кто подскажет, как это можно реализовать?
Варианта, минимум, три:
1. Изучать стандарты и дэйташиты для понимания того, как это можно реализовать.
2. Искать в И-нете статьи, где было бы собрано главное по этому вопросу.
3. Переделать существующие SD или SDfat.
Всем доброго дня! Я такую штуку для тестя сделал. Использовал pro mini и блютуз модуль hc-05. А на смартфоне Virtuino поставил, там ведется лог в файл и строится график онлайн. Намного удобнее SD карт.
Вот так выглядит:
писать напрямую, не используя файловую систему
Сейчас бьюсь над этим вопросом и не пойму как это сделать. Кто подскажет, как это можно реализовать?
Варианта, минимум, три:
1. Изучать стандарты и дэйташиты для понимания того, как это можно реализовать.
2. Искать в И-нете статьи, где было бы собрано главное по этому вопросу.
3. Переделать существующие SD или SDfat.
уже понял, что без файловой системы это не вариант