Запись бинарных данных на SD карту Arduino Due Текст научной статьи по специальности «Компьютерные и информационные науки»
Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Михайлов В.Г.
Дан краткий обзор микроконтроллеров семейства Arduino, их характеристик и областей применения. Отмечена важность записи параметров исследуемого объекта для отладки систем управления на микроконтроллерах Arduino. Единственной возможностью регистрации параметров в семействе Arduino является запись на SD-карту в текстовом режиме с использованием функций print(), write(). Рассмотрены проблемы, связанные с записью бинарных данных на SD-карту на микроконтроллере Arduino Due . Проведен анализ способов записи бинарных данных на SD-карту Arduino Due, возникающих проблем с неочисткой памяти от предыдущей программы , приводящей к возможности дублирования данных на SD-карте , наличие ошибочной точки зрения об ограничении объемов записи данных и необходимости использования устаревших SD-карт . Рассмотрены пути устранения отмеченных недостатков. Проведена оценка быстродействия различных подходов записи информации на SD-карту . На основании проведенных исследований предложен подход уплотнения записываемой информации за счет преобразования бинарных данных побайтно в символьный массив в коде ASCI без увеличения их объема и записи блоками по 240 байт. Это позволяет максимально использовать возможности стандартной функции write() Arduino и специфику организации памяти SD-карт и увеличить быстродействие более чем в 1100 раз по сравнению с записью в символьном виде по одному байту. Отмечено, что использование предлагаемых на форумах решений исключения дублирования данных из-за неочистки памяти не обеспечивает полноты их устранения. Для Arduino Due для очистки памяти необходимо использования специального программатора или установка новой программы загрузки.
Похожие темы научных работ по компьютерным и информационным наукам , автор научной работы — Михайлов В.Г.
Текст научной работы на тему «Запись бинарных данных на SD карту Arduino Due»
ЗАПИСЬ БИНАРНЫХ ДАННЫХ НА SD КАРТУ ARDUINO DUE
ООО «Мидивисана», г. Минск
Дан краткий обзор микроконтроллеров семейства Arduino, их характеристик и областей применения. Отмечена важность записи параметров исследуемого объекта для отладки систем управления на микроконтроллерах Arduino. Единственной возможностью регистрации параметров в семействе Arduino является запись на SD-карту в текстовом режиме с использованием функций print(), write(). Рассмотрены проблемы, связанные с записью бинарных данных на SD-карту на микроконтроллере Arduino Due. Проведен анализ способов записи бинарных данных на SD-карту Arduino Due, возникающих проблем с неочисткой памяти от предыдущей программы, приводящей к возможности дублирования данных на SD-карте, наличие ошибочной точки зрения об ограничении объемов записи данных и необходимости использования устаревших SD-карт. Рассмотрены пути устранения отмеченных недостатков. Проведена оценка быстродействия различных подходов записи информации на SD-карту. На основании проведенных исследований предложен подход уплотнения записываемой информации за счет преобразования бинарных данных побайтно в символьный массив в коде ASCI без увеличения их объема и записи блоками по 240 байт. Это позволяет максимально использовать возможности стандартной функции write() Arduino и специфику организации памяти SD-карт и увеличить быстродействие более чем в 1100раз по сравнению с записью в символьном виде по одному байту.
Отмечено, что использование предлагаемых на форумах решений исключения дублирования данных из-за неочистки памяти не обеспечивает полноты их устранения. Для Arduino Due для очистки памяти необходимо использования специального программатора или установка новой программы загрузки.
Ключевые слова: микроконтроллер Arduino Due, SD-карта, запись бинарных данных, программа.
Сейчас все более широко для задач автоматизации различных объектов применяются микроконтроллеры (МК) семейства АМшпо [1, 2]. В следствии их производства в КНР, они имеют низкую стоимость (15-25 $), благодаря чему они получают все более широкое применение.
Линейка микроконтроллеров АМшпо включает 8-ми, 32-ти разрядные модули. Они име-
ют малые габариты и малое потребление тока. И широко используются в различных системах управления игрушек, роботов, квадрокоп-теров, систем умного дома и других устройств. Имеют неплохие перспективы для использования и в других областях. Наиболее производительным является Arduino Due, представляющий собой 32-ти разрядный микроконтроллер с тактовой частотой 84 МГц, показанный на рисунок.
Общий вид Arduino Due с SD-модулем и схема их соединения
Он имеет габариты 53х103х15 мм, масса -35 г. В Arduino Due имеется 12 аналоговых входов АЦП и два аналоговых выхода 12-битного цифро-аналогового преобразователя. Необходимо также отметить, что плата Arduino Due имеет еще 54 цифровых вывода, которые могут работать в качестве входа или выхода сигналов, а также выводить 8-битные аналоговые значения в виде ШИМ-сигнала. Программирование модулей Arduino осуществляется с помощью языка C, С++ в среде Windows, Linux, Perl. Имеются большое количество различных датчиков и устройств для Arduino и бесплатных библиотек для них. Вместе с тем следует, отметить, что программные средства написаны в основном под 8-ми битные микроконтроллеры. Это не в полной мере пока позволяет использовать возможности 32-ти разрядного Arduino Due.
Кроме того для Arduino Due нет стандартного устройства (SD Shield), устанавливаемого сверху на плату. Из-за чего приходится использовать более простое устройство SD-карты с подключением проводами. Следует также отметить, что на Arduino Due не работает очистка памяти от предыдущей программы, что приводит к ее запуску и возможно дублирование данных в одноименных файлах.
Важную роль в процессе отладки систем управления на микроконтроллерах играет регистрация параметров исследуемого объекта, которую можно осуществить путем записи их на SD-карту. Однако запись бинарных данных на SD-карту [3-9] на микроконтроллерах представляет определенные трудности из-за ограниченных возможностей стандартной библиотеки SD, более рассчитанной на использование старых карт объемом 2, 4 Гб класса 2-4 и запись текстовой информации. А сейчас все больше распространены SD-карты (10 класс) стандарта SDHC и SDXC объемом соответственно до 32 Гб и более 64 Гб.
В Arduino запись на SD-карту в текстовом режиме производится с использованием функций print(), write() [3-8]. Максимальная длина записываемой строки соответственно 127, 255 байт. В тоже время многие регистрируемые параметры имеют бинарный вид (int 2 байта на 8-ми и 4 байта на 32 битных МК и float, long - 4 байта. Низкая скорость записи на SD-карту существенно ограничивает производи-
тельность системы управления. Если их (например, float) преобразовать в текстовый формат, то 4 байта float будут в среднем соответствовать 11-12 байтам текста с разделителем. И если необходимо произвести запись блока из 4 параметров, то реально в текстовом режиме можно записать блок кратный только 5-ти. В тоже время при использовании бинарных данных кратность могла быть равна 15-ти (при записи блока 240 байт).
Для управления быстродействующими объектами, такими как БЛА, квадрокоптеры важную роль играет быстродействие системы управления, зависящее, как от тактовой частоты микроконтроллера, его разрядности, так и времени записи на SD-карту. По данным работы [3], чтобы считать 6 байт из 3-х осевого акселерометра, библиотека гироскопа посылает адрес читаемого регистра и затем ждет. Шина I2C большинства гироскопов и акселерометров/магнетометров работает на частоте 100 КГц. В то же время сами сенсоры могут отдавать данные, например, 5000 раз в секунду. При такой частоте опроса сенсоров на 8-битном МК с рабочей частотой 16 МГц (Arduino Uno, Mega и другие) времени на обработку данных сенсоров, поступающих на огромной скорости практически не остается. При большой частоте опроса гироскопа или акселерометра Arduino можно использовать только как транслятор сигналов от сенсора через UART (аппаратно-последовательный порт) на внешний компьютер. Рассчитывать на выполнение каких-либо 32-ти битных вычислений, включая численное интегрирование и фильтрацию сигнала с датчиков ускорений гироскопа MPU6050 для определения угла наклона на самой Arduino (16 МГц, 8-ми битной) в такой ситуации не приходится. Поэтому возникла необходимость поиска путей повышения скорости записи на SD-карту, чтобы последняя не тормозила процесс управления быстродействующим объектом. Исходя из соображений быстродействия в своих исследованиях ориентировался на Arduino Due (84 МГц). Учитывалась тенденция, что в ближайшем будущем полностью произойдет переход на 32-разрядные микропроцессоры, чья большая вычислительная мощность позволит создавать новые интересные устройства, платы типа Arduino Due станут еще более востребованными.
С учетом всего этого в работе было акцентировано внимание на исследование путей записи бинарных данных на SD и возможности повышения производительности процесса записи, представляющих существенный практический интерес.
1. Особенности записи данных на SD-карты для МК Arduino
Особенностью записей на большинство SD-картах на МК, не использующих файловую систему, является специфическая организация их структуры хранения данных, при которой в начале ищется свободный блок (512 Кб либо 1024 Кб), в него вносятся данные и затем перезаписывается весь этот блок. С учетом этого целесообразно готовить и записывать данные на SD-карту блоком 512 Кб, а не по одному байту. Также следует учитывать, что используемые в Arduino функции write(), print() могут записывать информацию только в символьном виде. Функции write() может записать символьную строку объемом только 255 байт, а print() -127 байт в коде ASCI. Это связано с использование в функции size_t write (const uint8_t *buf, size_t size) переменной uint8_t *buf (8-ми битного числа). Исходя из этого вытекает, что информацию целесообразно записывать с помощью функции write() блоком максимальным близким к 255 байт. Запись по одному байту, как предлагается в работах [7-10] нерациональна и непроизводительна. Она не обеспечивает требуемое минимальное время регистрации данных и управления быстродействующим объектом, например, квадрокоптером -26 ms. И тем более 4-х, 6-ти, 8-ми параметров. Поэтому рассмотрим возможные пути уплотнения информации и повышения быстродействия записи на SD-карте, тем более что большинство регистрируемых параметров носят бинарный характер, а символьную информацию или режим можно закодировать в цифровом виде.
2. Запись информации в символьном виде
Для записи информации в символьном виде
на один параметр (float, long) требуется 11-12 символов с разделителем. Отсюда получается, в строке 255 байт можно записать только 5 блоков по 4 параметра (4х11-12 = 220-240 символов). Наиболее худшим вариантом является запись по одному байту, что снижает производительность более чем в 1100 раз, т. к. для каждого символа требуется вначале найти блок,
изменить его, а затем перезаписать. Это не позволяет использовать такой подход при регистрации данных и управления квадрокопте-ром, БЛА, роботом, станками.
3. Запись информации в бинарном виде
Бинарные данные (float, long, int) на 32-разрядном Arduino Due занимают 4 байта. Более целесообразным представляется для них использовать запись в символьный массив с преобразованием бинарных данных путем считывания побайтно в коде ASCI, при котором float, long, int будет занимать те же 4 байта, а четыре параметра 16 байт. Благодаря чему можно сократить объем информации в 3 раза по сравнению с символьным видом. Дополнительно можно уплотнить запись, если записывать информацию блоками, максимально приближаясь к объему символьной строки 255 байт. Для float (long, int) это 240 байт. Преобразование можно реализовать с помощью разработанной функции zfl_bs (см. исходный текст программы).
При заполнении символьной строки до максимально возможного (240 байт), она записывается на SD-карту с помощью стандартной функции write() и цикл повторяется.
Для удобства преобразования данные организованы в виде структуры struct. Это позволяет облегчить их обработку, преобразование через ссылочный механизм, не увеличивая объема информации.
Записанный на SD-карте массив в дальнейшем может быть считан с помощью функции языка C fread() и занесен в структуру. И далее при необходимости соответствующий образом обработан и использован. Например, использован в качестве исходных данных и сравнения при моделировании на Matlab/Simulink. И таким образом может быть проверена и отлажена система управления реальным объектом.
Программа реализации считывания 4-х параметров, записи их на SD-карту приведена ниже.
Алгоритм программы следующий: считы-ваются данные с датчиков (в данном случае имитатора), их параметры заносятся в структуру, преобразуются и записываются в символьный массив блоками по 16 байт. При заполнении массива 240 байт производится запись на SD-карту и цикл повторяется. При достижении определенного объема файла, он