Как очистить память ардуино


arduino-uno — Как стереть память Arduino Uno?

Самое главное, что может пойти не так, если вы отложите Arduino на пару недель, забудьте, какой эскиз (код) загружен на него, затем вернитесь к нему, подключите оборудование (например, переключатель, Светодиод или двигатель) и неожиданно загораться /включаться, потому что предыдущий код адресовал контакт, к которому он был подключен.


Решение 1. Сначала загрузите новый код.

Простая и безопасная техника заключается в загрузке нового кода, над которым вы работаете сегодня до . Вы подключаете любое оборудование. Теперь вы знаете, что делает код, какие контакты он использует, а затем затем подключите оборудование (желательно сначала отключить Arduino, отключив его).

Затем, когда вы снова подключаете питание, он запускает эскиз, который вы загрузили, вы подключили свое оборудование, и все должно быть хорошо.


Решение 2. Загрузите эскиз «ничего не делать».

Вы можете загрузить этот короткий эскиз:

int main () { } 

Он ничего не делает. Все контакты останутся в виде входов, поэтому вы можете безопасно присоединить свое оборудование, а затем начать кодирование своего нового проекта.


Безопасность в первую очередь

Хорошим правилом является не подключать и не отключать оборудование (например, светодиоды, переключатели, двигатели) с поданной мощностью. Если вы отвлекаетесь и подключаетесь к неправильному гнезду на плате, вы можете немедленно повредить либо то, что вы подключены, либо Arduino, либо и то, и другое.

При выключенном питании вы можете в последний момент проверить, что все подключено в нужном месте, правильные полярности и т. д.

Также убедитесь, что у вас нет статического электричества на вашем теле, особенно если вы носите перемычку или что-то пушистое или сидите на ковре.

Лично я всегда добираюсь и прикасаюсь к какой-то металлической части рядом с собой, чтобы дойти до Ардуино. Примером может служить металлический корпус ПК, разъем для наушников или что-то в этом роде.

Если после подключения питания к Arduino (например, с помощью USB-кабеля) вы сразу не видите индикатор питания, немедленно отключите питание! Возможно, вы что-то закрыли, и чем меньше времени вы делаете, тем лучше.

Как стереть память о Arduino Uno?

Главное, что может пойти не так, если вы отложите Arduino на пару недель, забудете, какой эскиз (код) загружен на него, а затем вернитесь к работе, подключите аппаратное обеспечение (например, переключатель, светодиод или двигатель). ) и он неожиданно загорится / включится, потому что предыдущий код адресован контакту, к которому он подключен.


Решение 1. Сначала загрузите новый код.

Простой и безопасный способ - загрузить новый код, над которым вы работаете сегодня, перед тем, как подключать какое-либо оборудование. Теперь вы знаете, что делает код, какие выводы он использует, а затем подключаете оборудование (предпочтительно поворачивая Arduino. сначала отключи его)

Затем при повторном подключении питания запускается загруженный эскиз, у вас подключено оборудование, и все должно быть в порядке.


Решение 2. Загрузите эскиз «ничего не делать».

Вы можете загрузить этот короткий набросок:

int main () { }

Это "ничего не делает". Все контакты останутся входными данными, так что вы можете безопасно подключить свое оборудование и начать кодировать новый проект.


Безопасность прежде всего

Хорошее правило - не подключать и не отключать аппаратное обеспечение (например, светодиоды, переключатели, двигатели) при включенном питании. Если вы отвлечетесь и подключитесь к неправильной розетке на плате, вы можете немедленно повредить то, что вы подключили, или Arduino, или оба.

Выключив питание, вы можете в последнюю минуту проверить, все ли правильно подключено, правильная полярность и т. Д.

Также убедитесь, что на вашем теле нет статического электричества, особенно если вы носите джемпер или что-то пушистое или сидите на ковре.

Лично я всегда протягиваю руку и прикасаюсь к какой-то металлической части поблизости, чтобы «заземлить» себя, прежде чем дотянуться до Arduino. Примером является металлический корпус ПК, разъем для наушников или что-то в этом роде.

Если после подключения питания к Arduino (например, через USB-кабель) вы не сразу увидите, что загорелся индикатор питания, немедленно отключите питание! Возможно, вы что-то замкнули, и чем меньше времени вы это делаете, тем лучше.

Arduino - ошибки и частые вопросы


Итак, разобрались со средой разработки, теперь можно загрузить первую прошивку. Можно загрузить пустую прошивку, чтобы просто убедиться, что все драйвера установились и платы вообще прошиваются. Если вы не читали гайд для новичков, обязательно его прочитайте!

Выбираем плату согласно своей плате. Если у вас Nano, то в новых версиях IDE нужно выбрать процессор 328p Old Bootloader. Далее выбираем порт, отличный от COM1 (т.к. это системный) и нажимаем кнопку загрузить. Если появилась надпись “Загрузка завершена” – значит всё в порядке и можно прошивать другие скетчи. В любом случае на вашем пути встретятся другие два варианта событий, происходящих после нажатия на кнопку “Загрузка” – это ошибка компиляции и ошибка загрузки. Вот их давайте рассмотрим более подробно

Ошибки компиляции


Возникает на этапе сборки и компиляции прошивки. Ошибки компиляции вызваны проблемами в коде прошивки, то есть проблема сугубо софтварная. Слева от кнопки “загрузить” есть кнопка с галочкой – проверка. Во время проверки производится компиляция прошивки и выявляются ошибки, если таковые имеются. Ардуино в этом случае может быть вообще не подключена к компьютеру.

  • В некоторых случаях ошибка возникает при наличии кириллицы (русских букв) в пути к папке со скетчем. Решение: завести для скетчей отдельную папочку в корне диска с английским названием.
  • В чёрном окошке в самом низу Arduino IDE можно прочитать полный текст ошибки и понять, куда копать
  • В скачанных с интернета готовых скетчах часто возникает ошибка с описанием <название файла>.h no such file or directory. Это означает, что в скетче используется библиотека <название файла>, и нужно положить её в Program Files/Arduino/libraries/. Ко всем моим проектам всегда идёт папочка с использованными библиотеками, которые нужно установить. Также библиотеки всегда можно поискать в гугле по <название файла>.
  • При использовании каких-то особых библиотек, методов или функций, ошибкой может стать неправильно выбранная плата в “Инструменты/плата“. Пример: прошивки с библиотекой Mouse.h или Keyboard.h компилируются только для Leonardo и Micro.
  • Если прошивку пишете вы, то любые синтаксические ошибки в коде будут подсвечены, а снизу в чёрном окошке можно прочитать более детальное описание, в чём собственно косяк. Обычно указывается строка, в которой сделана ошибка, также эта строка подсвечивается красным.
  • Иногда причиной ошибки бывает слишком старая, или слишком новая версия Arduino IDE. Читайте комментарии разработчика скетча
  • Ошибка недостаточно свободного места возникает по вполне понятным причинам. Если в проекте используется плата Nano на процессоре 328p, а вы сэкономили три рубля и купили на 168 процессоре – скупой платит дважды. Оптимизация: статическая память – память, занимаемая кодом (циклы, функции). Динамическая память занята переменными.

Ошибки загрузки


Возникают на этапе, когда прошивка собрана, скомпилирована, в ней нет критических ошибок, и производится загрузка в плату по кабелю. Ошибка может возникать как по причине неисправностей железа, так и из-за настроек программы и драйверов.

  • USB кабель, которым подключается Arduino, должен быть Data-кабелем, а не кабелем только для зарядки. Нужным нам кабелем подключаются к компьютеру плееры и смартфоны.
  • Причиной ошибки загрузки являются не установленные/криво установленные драйвера Ch440, если у вас китайская NANO.
  • Также будет ошибка avrdude: ser_open(): can’t open device, если не выбран COM порт, к которому подключена Arduino. Если кроме COM1 других портов нет – читай два пункта выше, либо попробуй другой USB порт, или вообще другой компьютер.
  • Большинство проблем при загрузке, вызванных “зависанием” ардуины или загрузчика, лечатся полным отключением ардуины от питания. Потом вставляем USB и по новой прошиваем.
  • Причиной ошибки загрузки может быть неправильно выбранная плата в “Инструменты/Плата”, а также неправильно выбранный процессор в “Инструменты/Процессор”. Также в свежих версиях IDE нужно выбирать ATmega328P (Old Bootloader) для китайских плат NANO.
  • Если у вас открыт монитор COM порта в другом окне Arduino IDE или плата общается через СОМ порт с другой программой (Ambibox, HWmonitor, SerialPortPlotter и т.д.), то вы получите ошибку загрузки, потому что порт занят. Отключитесь от порта или закройте другие окна и программы.
  • Если у вас задействованы пины RX или TX – отключите от них всё! По этим пинам Arduino общается с компьютером, в том числе для загрузки прошивки.
  • Если в описании ошибки встречается bootloader is not responding и not in sync, а все предыдущие пункты этого списка проверены – с вероятностью 95% сдох загрузчик. Второй неприятный исход – загрузчик “слетел”, и его можно прошить заново.

Предупреждения


Помимо ошибок, по причине которых проект вообще не загрузится в плату и не будет работать, есть ещё предупреждения, которые выводятся оранжевым текстом в чёрной области лога ошибок. Предупреждения могут появиться даже тогда, когда выше лога ошибок появилась надпись “Загрузка завершена“. Это означает, что в прошивке нет несовместимых с жизнью ошибок, она скомпилировалась и загрузилась в плату. Что же тогда означают предупреждения? Чаще всего можно увидеть такие:

  • # Pragma message……. – сообщения с директивой Pragma обычно выводят библиотеки, сообщая о своей версии или каких-то настройках
  • Недостаточно памяти, программа может работать нестабильно – Чуть выше этого предупреждения обычно идёт информация о задействованной памяти. Память устройства можно добивать до 99%, ничего страшного не случится. Это флэш память и во время работы она не изменяется. А вот динамическую память желательно забивать не более 85-90%, иначе реально могут быть непонятные глюки в работе, так как память постоянно “бурлит” во время работы. НО. Это зависит от скетча и в первую очередь от количества локальных переменных. Можно написать такой код, который будет стабильно работать при 99% занятой SRAM памяти. Так что ещё раз: это всего лишь предупреждение, а не ошибка.

FAQ


Завершая раздел Введение в Arduino поговорим о вопросах, которые очень часто возникают у новичков:

  • Ардуину можно прошить только один раз? Нет, несколько десятков тысяч раз, всё упирается в ресурс flash памяти. А он довольно большой.
  • Как стереть/нужно ли стирать старую прошивку при загрузке новой? Память автоматически очищается при прошивке, старая прошивка автоматически удаляется.
  • Можно ли записать две прошивки, чтобы они работали вместе? Нет, при прошивке удаляются абсолютно все старые данные. Из двух прошивок нужно сделать одну, причём так, чтобы не было конфликтов.
  • Можно ли “вытащить” прошивку с уже прошитой Ардуины? Теоретически можно, но только в виде нечитаемого машинного кода, в который преобразуется прошивка на С++ при компиляции, т.е. вам это НИКАК не поможет, если вы не имеете диплом по низкоуровневому программированию. 
    • Зачем это нужно? Например есть у нас прошитый девайс, и мы хотим его “клонировать”. В этом случае да, есть вариант сделать дамп прошивки и загрузить его в другую плату на таком же микроконтроллере.
    • Если есть желание почитать код – увы, прошивка считывается в виде бинарного машинного кода, превратить который обратно в читаемый Си-подобный код обычному человеку не под силу
    • Вытащить прошивку, выражаясь более научно – сделать дамп прошивки, можно при помощи ISP программатора, об этом можно почитать здесь
    • Снять дамп прошивки можно только в том случае, если разработчик не ограничил такую возможность, например записав лок-биты, запрещающие считывание Flash памяти, или вообще отключив SPI шину. Если же разработчик – вы, и есть желание максимально защитить своё устройство от копирования – гуглите про лок-биты и отключение SPI

Важные страницы


Работа с энергонезависимой памятью в Arduino (EEPROM)

Микроконтроллеры Atmega328, работающие в Arduino UNO и NANO имеют на борту 1024 байт EEPROM – энергонезависимой памяти, в которой можно сохранять какие-либо данные, которые будут доступны после отключения питания.

Это может пригодиться для хранения каких-нибудь данных или значений.

Для работы с данной памятью в составе Arduino IDE уже есть удобная библиотека EEPROM (\hardware\libraries\EEPROM\).

 

byte EEPROM.read(address)

Описание:

Считывает байт из энергонезависимой памяти EEPROM. Если байт до этого никогда не перезаписывался – вернёт значение 255.

Параметры:

address: порядковый номер ячейки памяти для чтения — от 0 до 511 (int)

Возвращаемое значение:

Байт, хранимый в ячейке памяти.

Пример (File-Examples-EEPROM-eeprom_read):

/* * Чтение EEPROM * * Считывает значения всех байтов энергонезависимой памяти * EEPROM и выводит их в COM-порт */
 #include <EEPROM.h>
 // начальный адрес памяти EEPROM
 int address = 0;
 byte value;
 void setup()
 {
  Serial.begin(9600);
 }
 void loop()
 {
  // считываем значение по текущему адресу EEPROM
  value = EEPROM.read(address);
  Serial.print(address);
  Serial.print("\t");
  Serial.print(value, DEC);
  Serial.println();
  // устанавливаем следующую ячейку памяти
  address = address + 1;
  // EEPROM содержит всего 512 байт: от 0 до 511, поэтому
  // если адрес достиг 512, то снова переходим на 0
  if (address == 512)
    address = 0;
  delay(500);
 }
 

 

void EEPROM.write(address, value)

Описание:

Записывает байт в энергонезависимую память

Параметры:

address: порядковый номер ячейки памяти для записи — от 0 до 511 (int)
value: байт для записи – от 0 до 255 (byte)

Возвращаемое значение:

ничего

Примечание:

Документация (datasheet) на микроконтроллеры Atmega8/168 говорит, что возможное количество циклов перезаписи данных в памяти ограничено 100000 раз (Write/Erase Cycles). Это следует учитывать при использовании данной памяти.
Так же документация указывает, что время, требуемое для завершения цикла записи составляет 3.3 ms. Если в это время попытаться что-либо считать/записать в EEPROM, то такая попытка окончится неудачей :(
Однако, данная задержка уже учитывается библиотекой EEPROM, поэтому в дополнительном вызове delay() нет необходимости.

Пример (File-Examples-EEPROM-eeprom_write):

/*   * EEPROM Write   *   * Сохраняет в энергонезависимой памяти EEPROM значения,   * считанные с аналогового входа analog input 0.   * Данные значения останутся в памяти и после отключения питания   * от платы и в будущем могут быть доступны для   * другого скетча.  */
 #include <EEPROM.h>
 
 // текущее значение адреса EEPROM
 int addr = 0;
 
 void setup()
 {
 }
 
 void loop()
 {
  // деление на 4 необходимо, чтобы перевести значение от
  // 0-1023 к одному байту, т.к. EEPROM может хранить только
  // значения от 0 до 255.
  int val = analogRead(0) / 4;
  // записываем значение в энергонезависимую память
  EEPROM.write(addr, val);
  // устанавливаем следующую ячейку памяти.
  // т.к. EEPROM содержит всего 512 ячеек – при достижении
  // конца памяти – возвращаемся на начало :)
  addr = addr + 1;
  if (addr == 512)
    addr = 0;
  delay(100);
 }
 
 

В примере eeprom_clear (File-Examples-EEPROM-eeprom_clear)
показано, как произвести очистку памяти – просто заполнить её нулями:

// записываем 0 во все 512 байт памяти EEPROM
 for (int i = 0; i < 512; i++)
  EEPROM.write(i, 0);
 

 

Пример. EEPROM — чтение/запись int
#include <EEPROM.h>
 //Эта функция запишет 2 байта типа integer в eeprom по адресам address и address + 1
 void EEPROMWriteInt(int p_address, int p_value)
 {
  byte lowByte = ((p_value >> 0) & 0xFF);
  byte highByte = ((p_value >> 8) & 0xFF);
  EEPROM.write(p_address, lowByte);
  EEPROM.write(p_address + 1, highByte);
 }
 
 //Эта функция прочитает 2 байта типа integer из eeprom с адресов address и address + 1
 unsigned int EEPROMReadInt(int p_address)
 {
  byte lowByte = EEPROM.read(p_address);
  byte highByte = EEPROM.read(p_address + 1);
  return ((lowByte << 0) & 0xFF) + ((highByte << 8) & 0xFF00);
 }
void setup() {  Serial.begin(9600);  EEPROMWriteInt(0, 0xABCD);  Serial.print("Read the following int at the eeprom address 0: ");  Serial.println(EEPROMReadInt(0), HEX); }
void loop() { }

Память в Arduino | Аппаратная платформа Arduino

В микроконтроллере ATmega168, используемом на платформах Arduino, существует три вида памяти:

  • Флеш-память: используется для хранения скетчей.
  • ОЗУ (Статическая оперативная память с произвольным доступом): используется для хранения и работы переменных. 
  • EEPROM (энергонезависимая память): используется для хранения постоянной информации.

Флеш-память и EEPROM являются энергонезависимыми видами памяти (данные сохраняются при отключении питания). ОЗУ является энергозависимой памятью.

Микроконтроллер ATmega168 имеет:

  • 16 Кб флеш-памяти (2 Кб используется для хранения загрузчика)
  • 1024 байта ОЗУ
  • 512 байт EEPROM

Необходимо обратить внимание на малый объем ОЗУ, т.к. большое число строк в скетче может полностью ее израсходовать. Например, следующая объявление:

char message[] = "I support the Cape Wind project.";

занимает 32 байта из общего объема ОЗУ (каждый знак занимает один байт). При наличии большого объема текста или таблиц для вывода на дисплей возможно полностью использовать допустимые 1024 байта ОЗУ.

При отсутствии свободного места в ОЗУ могут произойти сбои программы, например, она может записаться, но не работать. Для определения данного состояния требуется превратить в комментарии или укоротить строки скетча (без изменения кода). Если после этого программа работает корректно, то на ее выполнение был затрачен весь объем ОЗУ. Существует несколько путей решения данной проблемы:

  • При работе скетча с программой на компьютере можно перебросить часть данных или расчетов на компьютер для снижения нагрузки на Arduino.
  • При наличии таблиц поиска или других больших массивов можно использовать минимальный тип данных для хранения значений. Например, тип данных int занимает два байта, а byte - только один (но может хранить небольшой диапазон значений).
  • Неизменяемые строки и данные во время работы скетча можно хранить во флеш-памяти. Для этого необходимо использовать ключ PROGMEM.

Для использования EEPROM обратитесь к библиотеке EEPROM.

Как удалить библиотеку из среды arduino?

в графическом интерфейсе Arduino в windows, если я нажму на Sketch --> Import Library, в нижней части меню есть раздел под названием "вклад".

к сожалению, я ошибся и добавил библиотеку, которую я не хотел в этот список.

как я могу удалить его из этого списка?

на странице справки упоминается только, что "если эскиз больше не нуждается в библиотеке, просто удалите его операторы #include из верхней части кода", но он не упоминает как удалить библиотеку из списка внесенных библиотек.

50