Увеличение памяти ардуино с помощью sd карты
На стадии завершения проекта столкнулся с нехваткой памяти программ, не хватает буквальо 1-2 кб. Можно ли часть программы как то пристроить во внутреннюю еепром или во внешнюю I2C ?
Может быть есть какие то тонкости их использования в плане экономии места?
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Например выкинуть DallasTemperature.h и сделать просто на Wire (примеры есть и не сложнее чем с либой) в районе 1-1,5К освободите. Та же судьба с DS1307.h, тоже 1К примерно. Остальные не знаю, не работал с ними.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Я в аглицкой мове не силен, а как ее оттуда запускать?
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
при компиляции компилятор прописывает всю либу или только те функции, которые используются ?
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Как уже говорили, избався от и , они откровенно лишние. И ещё доработай напильником остальные библиотеки, там обычно есть что выкинуть в конкретной задаче.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Избавился от ненужного, попилил лишнее, добавил функционал и опять уперся в память. такие мысли:
В отличии от УНО, нана программируется по последовательному порту, а в память живет порядка 2 кб загрузчика. У УНЫ я так понял на программирование свой процессор, который шьет по СПЙ.
1) Взять уну, выдрать из нее мегу, проводками соединить ножки СПЙ и питания и шить как уно. Не будет ли различий для компилятора ? У уно меньше ножек портов чем у нано, не будет ли проблем ?
2) Если Ардуино ИДЕ генерит где то хекс файл - зашить его с помощью любого спй программатора , хоть понипрогом.
Как обойти ограничение по память в ИДЕ в этом случае ? или просто указывать плату Уно и не париться ?
Поменять камень - не предлагать, т.к. уже разведена и собрана плата с обвязкой. в следующий раз сразу мегу поставлю.
Сегодня речь пойдет об использовании SD и micro SD карт в Arduino. Мы разберемся как можно подключить SD карты к Ардуино, как записывать и считывать информацию. Использование дополнительной памяти может быть очень полезно во многих проектах. Если вы не знаете что такое SPI, I2C и аналоговые выводы, то советую вам посмотреть прошлые уроки и разобраться с этими интерфейсами связи Ардуино.
Подключить SD карту к Arduino напрямую не получится, так как она не поддерживает нужный протокол связи. Но мы можем использовать дополнительные модули или шилды для этого. К счастью, стоят они очень дешево и доступны в разных вариантах.
Схема подключения:
Подключение адаптера карт MicroSD к Piranha Uno осуществляется к аппаратным выводам SPI (4 вывода: CS, SCK, MOSI, MISO).
Адаптер карт MicroSD | Piranha Uno |
---|---|
CS (Chip Select) | 10 |
SCK (Serial ClocK) | 13 |
MOSI (Master Out Slave In) | 11 |
MISO (Master In Slave Out) | 12 |
Vcc | 5V |
GND | GND |
Варианты прошивки Ардуино
Вызов setup и loop при загрузке
В самом коде имеются несколько основных функций, на их примере можно рассмотреть работу микроконтроллера.
Команда void setup() – в ней записываются данные, которые микроконтроллер выполняет в момент загрузки, а после может про них забыть. В этой функции указываются номера пинов, к которым подключается устройство, подключаются и инициализируются библиотеки, устанавливается скорость работы с последовательным портом.
Функция void loop – в нее помещаются команды, которые должны выполняться, пока включена плата. Микроконтроллер начнет выполнять программы, начиная с первой, и когда дойдет до конца, сразу вернется в начало, чтобы повторить эту же последовательность бесконечное число раз.
Что происходит, когда мы жмем кнопку «Загрузить»
Плата Ардуино – это микроконтроллер AVR (Atmega8/168/328 или Atmega1280/2560), который прошивается загрузчиком. В микроконтроллер записывается программа, называемая прошивкой, которая позволяет получать сигналы с датчиков, обрабатывать нажатия кнопок, общаться с различными устройствами через интерфейсы, управлять исполнительными процессами.
Обычно прошивка записывается в кристалл микроконтроллера при помощи специальных устройств, называемых программаторами. Для разных микроконтроллеров существуют различные программаторы – от специализированных до универсальных. Важным отличием Ардуино от других контроллеров является возможность залить прошивку через обычный USB кабель. Это достигается при помощи специальной программы – загрузчика (Bootloader). Для прошивки не требуются лишние провода, не нужно подключать дополнительные устройства или нажимать что-то на плате. Также при работе через загрузчик нельзя добраться до опасных настроек, которые выведут из строя Ардуино.
При подключении платы Ардуино к источнику питания, внутри него начинается активная деятельность микропрограмм. При запуске микроконтроллера управление получает загрузчик. Первые 2 секунды он проверяет, поступил ли новый код от пользователя. Кроме того загрузчик подает импульсы на пин, к которому подключен светодиод, и он начинает мигать. Это означает, что загрузчик установлен и работает исправно. Когда подается скетч, загрузчик записывает его во флеш-память микроконтроллера. Затем эта программа подается на выполнение. Если данные не поступили, загрузчик запускает предыдущую программу. Во время выполнения программы внутри Ардуино выполняется ряд операций по инициализации и настройке среды окружения, и только после этого начинается выполнение кода.
Базовые функции, для работы с файлами SD-карты:
Создадим два скетча. В первом будим создавать файл и записывать в него информацию, а во втором, удалим созданный файл.
Нам понадобится:
-
х 1шт. х 1шт.
- 6 проводной шлейф ПАПА-МАМА для подключения х 1шт.
Для реализации проекта не требуется установка дополнительных библиотек. Библиотека для работы с адаптером карт MicroSD входит в стандартный набор Arduino IDE > Эскиз > Include Library > SD.
Загрузка скетча в плату Ардуино
Давайте сначала разберемся с тем, что происходит внутри ардуино, когда мы решаем изменить внутреннюю программу, управляющую им.
Прошивка Arduino через Arduino
Для того чтобы прошить одну плату с помощью другой, нужно взять 2 Ардуино, провода и USB. В первую очередь нужно настроить плату, которая будет выступать в качестве программатора. Ее нужно подключить к компьютеру, открыть среду разработки Arduino IDE и найти в примерах специальный скетч ArduinoISP. Нужно выбрать этот пример и прошить плату.
Теперь можно подключать вторую плату, которую нужно прошить, к первой. После этого нужно зайти в меню Инструменты и выставить там прошиваемую плату и тип программатора.
Можно начать прошивать устройство. Как только прошивка будет открыта или написана, нужно перейти в меню Скетч >> загрузить через программатор. Для заливания прошивки не подходит стандартная кнопка загрузки, так как в этом случае прошивка будет загружена на первую плату, на которой уже имеется прошивка.
Заключение
В этой статье мы рассмотрели различные аспекты загрузки скетчей в Arduino Uno и Nano. Прошивка плат на базе микроконтроллеров ATmega328 и ATmega256, как правило, не сложна и может выполняться одним нажатием кнопки в Arduino IDE. За эту простоту мы должны благодарить встроенную программу-загрузчик, выполняющую за нас все основные действия на низком уровне.
Еще одним вариантом перепрошивки контроллера является использование другой платы адуино или специальных программаторов, использующих микросхемы CP2102 CH340, FTDI и другие. Этот метод требует дополнительных усилий и затрат, но позволяет гибко изменять параметры прошивки. Какой из двух вариантов выбрать – решать вам. Для новичков, безусловно, первым шагом станет использование Arduino IDE, благо, ее создатели сделали все, чтобы упростить этот процесс.
Столкнулся с проблемой нехватки flash-памяти - не хватает места для хранения скетча. Оптимизировал код как можно, а надо еще много всего добавить.
Есть ли внешнии модули, которые увеличивают flash-память? Или можно как-нибудь увеличить место для хранения скетча?
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Замена микроконтроллера вам нужна, если действительно оптимизировали.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
кстати ,вопрос к тем кто сюда заглянет : можно ли в среде ардуино настроить PROGMEM на работу с внешней энергонезаисимой памятью,по шине I2C или SPI?или как то по другому нативно расширить адресное пространство(не RAM,о примере ардуино на 512КБ ,знаком)
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Progmem наврядли можно прям вот так с полтычка, иначе давно бы уже все еепромы по i2c в полный рост пользовали. А вот какой-нить драйвер можно, наверное, накатать. Только медленный он будет. Или с доп. буфером, как для SD-карты мутить.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
EEPROM использовать вообще не проблема. А вот если скетч не влазит - оптимизация, или замена контроллера.
Вообще чистый СИ очень сильно снижает вес программы. Но, как сказал mixail844 , нужно определиться что там у вас за код, и что в нем используется. То что можно подгрузить - на флешку, а код перевести (хотя бы частично) в чистый СИ.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
zzzzza , и RAM и PROGMEM находятся внутри адресного пространства процессора, а I2C или SPI - нет. Защищенного режима у AVR подобно как в 386+ тоже нет, значит программно прозрачная эмуляция тоже невозможна. Т.е. хранить константы где-то снаружи по I2C или SPI можно (написав для их добывания свои функции), а исполнять код из них - нет.
Могу порекомендовать Мегу 2560 - у нее и flash памяти побольше и при необходимости можно организовать внешнюю память в общем адресном пространстве.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Либо переходить на STM или ESP - вот там пямяти на много больше.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Спасибо за ответы!
Очень много места занимает все то, что связано с дисплеем. Как подключаешь эту библиотеку, сразу минус 30-40 процентов памяти. И каждый вызов дисплейных функцей тоже немало места занимает. Как смог все вынес в функции, чтобы лишний раз их не вызывать.
Думал о меге, но у нее размер большой. Сейчас думаю между STM и Iskra JS. Больше в пользу Iskra JS, так как побаиваюсь, что памяти STM тоже может не хватить в будущем. Но придется переписывать все на JavaScript. Отсюда вопрос для тех кто сталкивался с микроконтроллерами с AVR процессорами, на которых установлен интерпретатор JavaScript: можно ли как-то писать код на Arduino Wiring?
Возможно, можно снести интерпретатор, но тогда придется писать на чистом СИ, а это, как я думаю, придется переписывать библиотеки, да и явно море проблем будет.
В этом уроке мы научимся создавать, редактировать и удалять файлы на MicroSD карте.
Создание файла:
если подключить адаптер карт MicroSD к Piranha Uno, подключить Piranha Uno к ПК, загрузить скетч, вставить SD-карту и запустить Монитор последовательного порта, то в мониторе будут выведены следующие строки:
file doesn't exist (файл не обнаружен)
file is opened (файл открыт)
data written to the file (данные записаны в файл)
file is closed (файл закрыт)
file exists (файл обнаружен)
а на SD-карте появится файл "iarduino.txt" с одной строкой "The beginning of a line, The end of the line".
Если загрузить скетч при вставленной в адаптер карт MicroSD SD-картой, то на SD-карте появится файл "iarduino.txt" с двумя строками "The beginning of a line, The end of the line", а первой строкой в мониторе последовательного порта будет "file exists" (файл обнаружен ) .
Дело в том, что функция setup() в обоих случаях выполняется дважды (сразу после загрузки скетча и после запуска монитора последовательного порта). Но в первом случае, после загрузки скетча, SD-карты не было в адаптере, следовательно, файл "iarduino.txt" был создан только после запуска монитора последовательного порта .
Удаление файла:
если подключить Trema-модуль адаптер карт MicroSD к Arduino Uno, подключить Arduino Uno к ПК, загрузить скетч, вставить SD-карту и запустить Монитор последовательного порта, то в мониторе будут выведены следующие строки:
file exists (файл обнаружен)
file deleted (файл удалён)
file doesn't exist (файл не обнаружен)
а файл "iarduino.txt" будет удалён с SD-карты.
Если загрузить скетч при вставленной в адаптер карт MicroSD SD-картой, то файл "iarduino.txt" будет удалён с SD-карты, но в мониторе последовательного порта будут две строки "file doesn't exist" (файл не обнаружен).
Дело в том, что функция setup() в обоих случаях выполняется дважды (сразу после загрузки скетча и после запуска монитора последовательного порта). Но в первом случае, после загрузки скетча, SD-карты не было в адаптере, следовательно, файл "iarduino.txt" был удалён только после запуска монитора последовательного порта.
Прошивка с помощью Arduino IDE
Прошить плату при помощи среды разработки Arduino IDE можно в несколько шагов. В первую очередь нужно скачать и установить саму программу Arduino IDE. Также дополнительно нужно скачать и установить драйвер CH341. Плату Ардуино нужно подключить к компьютеру и подождать несколько минут, пока Windows ее опознает и запомнит.
После этого нужно загрузить программу Arduino IDE и выбрать нужную плату: Инструменты – Плата. Также нужно выбрать порт, к которому она подключена: Инструменты – Порт. Готовая прошивка открывается двойным кликом, чтобы ее загрузить на плату, нужно нажать кнопку «Загрузить» вверху панели инструментов.
В некоторых ситуациях может возникнуть ошибка из-за наличия кириллицы (русских букв) в пути к папке с кодами. Для этого файл со скетчами лучше создать и сохранить в корне диска с английским наименованием.
В этом уроке используется:
Отличный набор для начинающих: | Купить |
Arduino Uno: | Купить |
Инфракрасный датчик расстояния: | Купить |
Плата расширения для считывания micro SD карт c SPI интерфейсом: | Купить |
Шилд для Arduino Uno: | Купить |
Карты micro SD: | Купить |
Датчики освещенности: | Купить |
Датчик температуры I2C: | Купить |
Запись и считывание SD карты на Arduino
Для работы с картами памяти в Arduino есть библиотека SD.h. Она по умолчанию доступна в Arduino IDE. С ней мы и будем работать. Для начала напишем простую программу, которая будет записывать обычную строку на SD карту. Теперь посмотрим на скетч:
Отлично! У меня все работает так как и было задумано. Теперь я хочу немного доработать этот скетч. Давайте закинем текстовый файл на карту памяти с каким-нибудь значением и попробуем считать это на Arduino. Например я создам текстовый файл в котором будет всего одно число. Это число я буду использовать в качестве задержки между записью нашей строки на эту же карту памяти. Немного доработаем предыдущий скетч.
Давайте теперь сделаем что-то более сложное и полезное. Добавим несколько датчиков и будем записывать их показания на карту памяти. Я подключу пару инфракрасных дальномеров, датчик температуры и фото резистор для определения уровня освещенности. Вот так все будет выглядеть:
Запись на SD карту Arduino
Подробно скетч моего регистратора показаний я расписывать не буду, потому что мы все это уже разбирали подробно в этом и прошлых уроках. В этом скетче сочетаются навыки из уроков по аналоговым входам, I2C и SPI интерфейсам и подтягивающим резисторам. Вы можете найти все это в разделе сайта уроки по Arduino. Вот скетч:
На сегодня все. В следующий раз мы разберемся с подключением RFID метками. Надеюсь вам все было понятно.
1 комментарий
А нужно ли останавливать непрерывную запись в файл как-нибудь? Не испортится ли карта памяти при отключении непрерывно записываемых данных? Как отключать эту запись?
Загрузка скетча или прошивка контроллера Ардуино – основная операция, с которой рано или поздно сталкивается любой ардуинщик. Именно возможность быстро и без лишних проблем загрузить в память контроллера управляющую программу и стала одной из основных причин успеха платформы Arduino. В этой статье мы узнаем, как прошиваются Arduino Uno, Nano, Mega и другие платы на основе Atmega с использованием Arduino IDE, программатора или другой платы Ардуино.
Обзор возможных вариантов загрузки скетча
Кратко весь алгоритм можно записать следующим образом: Написание кода >> компиляция >> загрузка в микроконтроллер. При загрузке скетча используется Bootloader (Загрузчик). Он представляет собой небольшую программу, которая загружается в микроконтроллер на Ардуино. С помощью этой программы можно загружать скетч, не используя дополнительные аппаратные средства. При работе загрузчика на плате будет мигать светодиод.
1. Загрузка в Arduino IDE. Самый простой и удобный вариант загрузки кода. Все, что нужно сделать – это написать или найти нужный скетч и загрузить его.
- Ускоренная загрузка скетча в Arduino IDE. С помощью этого метода можно увеличить скорость загрузки в микроконтроллер в два раза. Для этого нужно лишь зайти в Настройки и снять галочку с пункта Проверка кода. Пропуская шаг проверки, будет уменьшено количество байтов, которые передаются во время загрузки. При этом все равно некоторые из видов проверок будут осуществлены, но они не занимают долгого времени. Отключать проверку кода не рекомендуется, если Ардуино помещается в какой-либо ответственный проект (например, в спутник). Также можно провести проверку, если подключение производится через очень длинный USB кабель (порядка 10 метров).
Уменьшение времени загрузки при помощи отключения проверки работает с любой платой Ардуино, которая использует USB соединение. Все эти микроконтроллеры используют загрузчик avrdude. Платы, которые используют загрузчик Catarina, не нуждаются в отключении проверки кода, так как этот загрузчик работает быстрее.
- Загрузка скетча в Ардуино через Bluetooth. Этот способ используется, когда нужно обойтись без физического соединения Ардуино и компьютера – например, в силовых цепях или радиочастотных цепях. Для реализации загрузки потребуется Bluetooth-модуль, который оснащен платой-адаптером для Ардуино. Этот модуль нужно подключить к компьютеру через переходник USB-UART-TTL. Работа с модулем осуществляется с помощью AT-команд.
- Загрузка при помощи Андроид-устройства. Для осуществления такого типа загрузки кода понадобятся провода USB-A – USB-B и USB-Host (OTG-кабель), Ардуино и устройство на базе Андроид с поддержкой режима host. На Андроид-устройство нужно установить программу ArduinoDroid или ArduinoCommander из Google Play. Все устройства нужно соединить при помощи кабелей, после этого можно включать Ардуино и загружать на него код. Нужно запустить установленную программу. При включении начнется обновление IDE, на что понадобится некоторое время.
Сначала работа будет рассмотрена на примере программы ArduinoCommander. После ее запуска нужно нажать USB-Device. Затем нужно наддать Autodetect, чтобы Андроид-устройство выполнило поиск Ардуино и отобразило его на экране. Как только Ардуино появится на экране, нужно на него нажать. Чтобы перейти в меню, нужно щелкнуть в нижнем правом углу. В этом меню можно загрузить скетч с SD-карты.
ArduinoDroid представляет собой среду разработки, компилятор и загрузчик одновременно. Начать компиляцию скетча нужно нажав на кнопку Lightning-Button. После завершения компиляции нужно нажать на кнопку загрузки. Загрузка занимает несколько секунд. По окончании загрузки ардуино запустит на выполнение новый код.
- Программирование при помощи Raspberry Pi. Можно загружать скетчи двумя способами – при помощи Arduino IDE и при помощи пакета arduino-mk. Пакет позволяет собирать и загружать скетчи Ардуино из командной строки.
Подключение sd карт к Arduino
Модуль и шилд для считывания sd карт подключается по интерфейсу SPI. Шилд просто вставляется в Arduino Uno сверху. А плата подключается к пинам D10 -> CS, D11 -> MOSI, D12 -> MISO, D13 -> SCLK, 5V -> VIN (если на плате есть стабилизатор, если нет то 3,3V), GND -> GND. Вот наглядная схема:
Подключение sd Arduino
Обратите внимание на напряжение питания платы. Если на плате есть стабилизатор питания, то можете подавать на нее 5 В. Если же стабилизатора нет, то необходимо подвести 3.3 В. В остальном все так же как мы разбирали в уроке по SPI интерфейсу. Теперь перейдем к программной части.
Питание:
Питание адаптера подаётся на выводы Vcc и GND, напряжением 5В постоянного тока.
Загрузка скетча в Arduino IDE
Прошивка с помощью программатора
Одни из самых простых способов прошивки платы – при помощи программатора. Заливка будет производиться в несколько этапов.
В первую очередь нужно подключить программатор к плате и к компьютеру. Если программатор не опознается компьютером, нужно скачать и установить драйверы.
После этого нужно выбрать плату, для которой нужно прошить загрузчик. Это делается в меню Сервис >> Плата.
Затем нужно выбрать программатор, к которому подключен контроллер. В данном случае используется USBasp.
Последний шаг – нажать на «записать загрузчик» в меню Сервис.
После этого начнется загрузка. Завершение произойдет примерно через 10 секунд.
Структура памяти Ардуино, где располагается скетч и данные
На микроконтроллере Ардуино имеется 3 вида памяти – флеш-память, которая используется для хранения скетчей, ОЗУ для хранения переменных и EEPROM для хранения постоянной информации. Из этих типов памяти флеш-память и EEPROM являются энергонезависимыми, то есть информация сохраняется при выключении питания. ОЗУ используется только для хранения данных, которые имеют отношение к исполняемой программе.
Микроконтроллер ATmega168, который используется на части плат Ардуино, имеет 16 Кб флеш-памяти, 1024 байта для ОЗУ и 512 байт EEPROM. Важно обратить внимание на малый объем ОЗУ. Большие программы могут полностью ее израсходовать, что приведет к сбою в программе. По этой причине нужно следить за тем, сколько строк занимает программа, и по возможности удалять лишнее. Уменьшить объем кода можно несколькими способами:
На объем памяти не влияют размер имени переменных и комментарии. Компилятор устроен таким образом, что не включает эти данные в скомпилированный скетч.
Для измерения объема занимаемой памяти ОЗУ используется скетч из библиотеки MemoryFree. В ней имеется специальная функция freeMemory, которая возвращает объем доступной памяти. Также эта библиотека широко используется для диагностики проблем, которые связаны с нехваткой памяти.
Оптимизация флеш-памяти. Как только будет окончена процедура компиляции, в окне появится информация о занимаемой памяти кодом. Если скетч занимает большую часть памяти, нужно произвести оптимизацию использования флеш-памяти:
- Использование констант. Аналогично как и для ОЗУ задавать неизменяющиеся значения константами.
- Удалить ненужные Serial.println. Эта команда используется, когда нужно увидеть значения переменных в разных местах программы, нередко эта информация просто не нужна. При этом команды занимают место в памяти, поэтому, убедившись в корректной работе программы, некоторые строки можно удалить.
- Отказ от загрузчика – можно программировать микроконтроллер через контакты ICSP на плате с использованием аппаратных программаторов.
Флеш память является безопасным и удобным способом хранения данных, но некоторые факторы ограничивают ее использование. Для флеш-памяти характерна запись данных блоками по 64 байта. Также флеш-память гарантирует сохранность информации для 100000циклов записи, после чего информация искажается. Во флеш-памяти имеется загрузчик, который нельзя удалять или искажать. Это может привести к разрушению самой платы.
EEPROM память используется для хранения всех данных, которые потребуются после отключения питания. Для записи информации в EEPROM нужно использовать специальную библиотеку EEPROM.h, которая входит в число стандартных библиотек в Arduino IDE. Чтение и запись информации в EEPROM происходит медленно, порядка 3 мс. Также гарантируется надежность хранения данных для 100000 циклов записи, потому лучше не выполнять запись в цикле.
Читайте также: