Загрузчик ардуино и прошивка через arduino ide и программатор

Содержание

Загружаем первый скетч в Arduino

  Загрузка первого скетча, это состояние восторга не покидает продолжительное время. Описать то что ты испытываешь в момент удачи очень сложно, особенно если ты не когда ранее не имел дела с программируемой радиоэлектроникой. В голове крутятся мысли, идеи, и хочется скорее узнать на что же ещё способен этот кусок текстолита и набор радиодеталей ! Если вы прошли этап Arduino uno R3 CH340G подключение и настройка.  к компьютеру, мы можем приступить к следующим действиям.

Первый скетч совсем не обязательно искать на просторах интернета или писать самому. Arduino IDE обладает набором предустановленных библиотек и примеров, которые вы можете использовать в своих проектах при дальнейшей работе с контроллером.  Для начала откроем Arduino IDE и переходим на вкладку Файл в верхнем меню окна, далее наводим указатель мыши на пункт Примеры.  Примеров скетчей много, но я предлагаю остановить выбор на скетче Blink в категории примеров Basics. Скетч очень простой и не требует каких либо дополнительных элементов для своей демонстрации.  

 

 Выбрав данный пример у нас открывается новое окно среды разработки Arduino с готовым для загрузки кодом прошивки контроллера. Выглядит это так.

   Давайте немного разберём что несёт в себе этот скетч. С 1 по 23 сточку мы видим текст серого цвета. Этот текст несёт информационный характер и описывает пользователю некоторые параметры работы данного скетча, также автор этого скетча может оставить контактную информацию о себе. Эти строчки закомментированы и при прошивке контроллера они не загружаются в него. Закомментировать текст можно двумя способами. Первый способ будет удобен если нужно скрыть от загрузчика несколько строк, в таком случае используется знак /* в начале комментариев, */ в конце комментариев, как в первой и двадцать третьей строке. Второй способ больше подходит для описания части кода или какой либо функции, для этого используется // текст или код попавший за двойной слеш // в пределах одной строки будет скрыт от загрузки в контроллер, что мы можем наблюдать в остальной части кода. Кстати, если вы в дальнейшем планируете писать скетчи сами то, считается хорошим тоном оставлять описание параметров работы скетча и комментариев к функциям. Из описания которое оставил нам автор понятно следующее, что этот скетч заставляет встроенный в плату контроллера светодиод и привязанный к 13 цифровому пину, моргать с частотой в 1000 миллисекунд. 

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

 После нажатия кнопки начинается процесс компиляции кода и проверки его на наличие ошибок. Если загрузка кода проходит удачно, то об этом нас информирует строка состояния загрузки.

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

  Для большего понимания работы этого скетча, давайте немного отредактируем код и посмотрим что изменилось. Переходим на 34 строку кода и изменим время паузы,   delay(1000); изменим на  delay(10000); .

 В результате этих манипуляций программа работы нашего контроллера изменилась. И сейчас светодиод на контроллере загорается не на 1 секунду как это было при загрузке исходного кода, а на 10 секунд. Сейчас мы программно указали в 33 строчке включить светодиод и этот светодиод будет гореть до тех пор пока относительно него не поступит другой команды. Поэтому в 34 строчке мы ставим паузу в  10 секунд а в 35 строчке гасим светодиод. Должно получится что то вроде ниже представленного изображения.

  Как мне кажется представленной информации достаточно для начала работы с контроллером и мне остаётся только пожелать вам успехов и огромных результатов в ваших начинаниях.

Чтобы комментировать войдите или зарегистрируйтесь !

4Причина 4 Сбой загрузчика

Если ничего из перечисленного не помогло, попробуем ещё один вариант: перезапишем загрузчик платы (bootloader).

Загрузчик – это специальная управляющая программа для Arduino, которая исполняется при включении устройства и которая задаёт режим работы платы: либо переходит к исполнению программы из памяти Arduino, либо к процедуре программирования компьютером. Загрузчики для всех поддерживаемых плат Arduino хранятся в папке c IDE в поддиректории \hardware\arduino\avr\ и представляют собой бинарные hex-файлы.

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

Схема подключения программатора к Arduino

После подключения программатора в среде программирования Ардуино в меню Инструменты Программатор указываем тип нашего программатора. Например, USBasp. Теперь в том же меню Инструменты выбираем пункт Записать Загрузчик. Этот процесс не занимает много времени.

Если операция прошла успешно, IDE сообщит об этом. А плата Ардуино радостно замигает светодиодом на 13-ом выводе, т.к. в неё, кроме загрузчика, записан скетч по умолчанию – скетч мигания светодиодом Blink.

Если же после всех проделанных манипуляций плата не оживает, возможно, вы и правда сожгли микросхему. Мои соболезнования.

Синтаксические ошибки

Перечислим наиболее часто встречающиеся варианты ошибок компиляции Arduino/Genuino:

  • Ошибка a function-definition is not allowed here before ‘{‘ token. Эта ошибка означает, что вы забыли закрыть фигурную строку. Проверьте все функции и внутренние блоки кода. Для каждой открывающей скобки должна найтись и закрывающая. Arduino IDE поможет вам – щелкните открывающий знак “{“ и программа подсветит закрывающий.
  • Ошибка expected initializer before ‘}’ token. Возникает в обратной ситуации: когда вы забыли открыть или нечаянно стерли открывающую фигурную скобку. Иногда такая ошибка возникает, если есть несколько закрывающих скобок без открывающей. В любом случае нужно внимательно просмотреть код и привести скобки в порядок.
  • Ошибка ‘что-то там’ was not declared in this scope. Означает, что ардуино обнаружила в коде слова, не являющиеся служебными и не объявленные как переменные. Как правило, ошибка возникает, если вы действительно забыли продекларировать переменные или методы. Также возможно, что вы случайно написали лишние символы или стерли знак комментария, после чего ваши мысли ардуино стал воспринимать как команды.
  • Ошибка undefined reference to `loop’. Возникает, если вы случайно удалили или переименовали функцию loop. Ардуино не сможет запустить скетч без команду, указанных в этом блоке. Если вы напортачили с функцией setup, то ошибка будет выглядеть соответственно: undefined reference to `setup’. Выход в обоих случаях один – вернуть loop или setup на свое место в скетче.

Почему IDE Arduino не запускается после обновления Java на Mac?

Последнее обновление Java от Apple пытается использовать 64-битные версии родных библиотек, тогда как RXTX-библиотека Arduino идет в 32-битной версии. Таким образом, если вы запустите Arduino, то получите примерно такую ошибку:

Uncaught exception in main method java.lang.UnsatisfiedLinkError Applicationsarduino-0016Arduino 16.appContentsResourcesJavalibrxtxSerial.jnilib no suitable image found. Did find Applicationsarduino-0016Arduino 16.appContentsResourcesJavalibrxtxSerial.jnilib no matching architecture in universal wrapper

Чтобы исправить это, кликните по приложению Arduino (например, по Arduino 16.app) в Finder, а затем выберите меню File и кликните по пункту Get Info. Теперь поставьте галочку рядом с пунктом Open in 32 Bit Mode. Теперь IDE Arduino должна запуститься нормально.

Варианты прошивки Ардуино

Прошивка с помощью Arduino IDE

Прошить плату при помощи среды разработки Arduino IDE можно в несколько шагов. В первую очередь нужно скачать и установить саму программу Arduino IDE. Также дополнительно нужно скачать и установить драйвер CH341. Плату Ардуино нужно подключить к компьютеру и подождать несколько минут, пока Windows ее опознает и запомнит.

После этого нужно загрузить программу Arduino IDE и выбрать нужную плату: Инструменты – Плата. Также нужно выбрать порт, к которому она подключена: Инструменты – Порт. Готовая прошивка открывается двойным кликом, чтобы ее загрузить на плату, нужно нажать кнопку «Загрузить» вверху панели инструментов.

В некоторых ситуациях может возникнуть ошибка из-за наличия кириллицы (русских букв) в пути к папке с кодами. Для этого файл со скетчами лучше создать и сохранить в корне диска с английским наименованием.

Прошивка с помощью программатора

Одни из самых простых способов прошивки платы – при помощи программатора. Заливка будет производиться в несколько этапов.

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

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

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

Последний шаг – нажать на «записать загрузчик» в меню Сервис.

После этого начнется загрузка. Завершение произойдет примерно через 10 секунд.

Прошивка Arduino через Arduino

Для того чтобы прошить одну плату с помощью другой, нужно взять 2 Ардуино, провода и USB. В первую очередь нужно настроить плату, которая будет выступать в качестве программатора. Ее нужно подключить к компьютеру, открыть  среду разработки Arduino IDE и найти в примерах специальный скетч ArduinoISP. Нужно выбрать этот пример и прошить плату.

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

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

Ошибка запуска (Launch4j Error)

Arduino IDE необходимо некоторое время для того чтобы запуститься и если после ее запуска вы на что-нибудь кликаете, то возникает ошибка Launch4J error как показано на представленном рисунке. Launch4j – это инструмент, который используется для упаковки (wrapping) приложений Java в программной среде Windows, который позволяет им исполняться как обычным программам Windows.

Arduino IDE написана на JAVA и эта ошибка возникает из-за несовместимости библиотеки Java Run Time Environment (JRE), поставляемой вместе с Arduino IDE.

Решение

Часто решить эту проблему удается простым выключением Bluetooth или WiFi на вашем компьютере. Если это не помогает, то более сложным вариантом решения данной проблемы является замена библиотеки JRE в Arduino IDE на ее последнюю версию.

Ошибки библиотек

Если произошла ошибка при компиляции скетча Ардуино, но не выводилось ни одно из вышеописанных сообщений, то можете смело искать баг в библиотеках МК. Это наиболее неприятное занятие для большинства программистов, ведь приходится лазить в чужом коде, но без этого никак.

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

Исправляем ошибку avrdude: stk500_getsync(): not in sync: resp=0x00 в китайской Arduino Mega 2560

Войдите , пожалуйста. Хабр Geektimes Тостер Мой круг Фрилансим. Войти Регистрация. Загрузка контроллеров без использования консоли Arduino IDE Компьютерное железо Введение При работе с контроллерами распределенной системы довольно часто приходится перезагружать контроллеры. Использование консоли Arduino IDE для перезагрузки заказчиком не очень удобно, поскольку для каждого типа контроллеров необходимо настраивать или проверять тип платы и номера СОМ портов, эту работу должен выполнять персонал, знакомый с IDE, да и не каждый заказчик желает знать, что система построена на контроллерах Arduino.

Последовательный порт уже используется (Serial Port Already in Use)

Одна из самых простых проблем для решения. Она обычно происходит когда вы пытаетесь загрузить код программы в плату Arduino в то время когда открыто окно монитора последовательной связи (serial monitor) (но эта проблема в последних версиях Arduino IDE уже устранена) или вы пытаетесь его открыть во время обмена информацией между Arduino IDE и платой Arduino, или вы пытаетесь в это время использовать этот же самый COM порт для связи с другим устройством. То есть данная проблема возникает тогда, когда вы пытаетесь использовать последовательный порт одновременно для двух вещей.

Решение

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

Ошибка exit status 1 при компиляции для плат uno, mega и nano

И самое частое сообщение, для пользователей уно, которое выскакивает в среде разработки – exit 1. И оно же самое дискомфортное для отладки приложения, ведь тут необходимо учесть чуть ли не ядро системы, чтобы понять, где же кроется злополучный баг.

В документации указано, что это сообщение указывает на то, что не запускается ide Аrduino в нужной конфигурации, но на деле есть ещё десяток случаев, при которых вы увидите данное сообщение. Однако, действительно, не забывайте проверять разрядность системы, IDE и просматривать, какие библиотеки вам доступны для обращения на текущий момент.

Что можно сделать, если у Arduino возникают конфликты с Cygwin (на Windows)?

Если на вашей машине установлен Cygwin, то при попытке скомпилировать скетч вам может выдать следующую ошибку:

6 main ? (3512) C\Dev\arduino-0006\tools\avr\bin\avr-gcc.exe *** fatal error - C\Dev\arduino-0006\tools\avr\bin\avr-gcc.exe *** system shared memory version mismatch detected - 0x75BE00840x75BE009C.

This problem is probably due to using incompatible versions of the cygwin DLL.

Search for cygwin1.dll using the Windows Start->FindSearch facility and delete all but the most recent version. The most recent version *should* reside in x\cygwin\bin, where 'x' is the drive on which you have installed the cygwin distribution. Rebooting is also suggested if you are unable to find another cygwin DLL.

Если выдало, то перед использованием Arduino убедитесь, что у вас не запущен Cygwin. Если это не помогает, можно попробовать удалить cygwin.dll из папки Arduino и заменить его на сygwin.dll, находящийся в папке Cygwin (возможно, по маршруту c:\cygwin\bin).

За подсказку спасибо karlcswanson.

Основные ошибки

Ошибка: «avrdude: stk500_recv(): programmer is not responding»

Смотрим какая у нас плата? Какой порт используем? Сообщаем ардуино о правильной плате и порте. Возможно, что используете Nano, а указана Mega. Возможно, что указали неверный порт. Всё это приводит к сообщению: «programmer is not responding».

Решение:

В Arduino IDE в меню «Сервис» выбираем плату. В меню «Сервис → Последовательный порт» выбираем порт.

Ошибка: «a function-definition is not allowed here before ‘{‘ token»

Забыли в коде программы (скетча) закрыть фигурную скобку }.

Решение:

Обычно в Ардуино IDE строка с ошибкой подсвечивается.

Ошибка: «No such file or directory  /  exit status 1»

Подключаемая библиотека отсутствует в папке libraries.

Решение:

Скачать нужную библиотеку и скопировать её в папку программы — как пример — C:\Program Files\Arduino\libraries. В случае наличия библиотеки — заменить файлы в папке.

Ошибка: «expected initializer before ‘}’ token  /  expected ‘;’ before ‘}’ token»

Забыли открыть фигурную скобку {, если видим «initializer before». Ошибка «expected ‘;’ before ‘}’ token» — забыли поставить точку с запятой в конце командной строки.

Решение:

Обычно в Ардуино IDE строка с ошибкой подсвечивается.

Ошибка: «… was not declared in this scope»

Arduino IDE видит в коде выражения или символы, которые не являются служебными или не были объявлены переменными.

Решение:

Проверить код на использование неизвестных выражений или лишних символов.

Плата не синхронизируется

В этом случае ваш компьютер видит подключенную к нему плату Arduino, но вы не сможете загрузить в нее код программы и вы при попытке загрузке в нее программы вместо привычного сообщения «done uploading» увидите сообщение об ошибке: “avrdude: stk500_getsync(): not in sync: resp=0x00”.

Решение

Ошибка синхронизации resp = 0x00 является общим ответом (ошибкой) на все проблемы, связанные с некорректной работой микроконтроллера Atmega (или вообще его неработоспособным состоянием), являющегося «сердцем» платы Arduino. Соответственно, причин этой ошибки может быть достаточно много. Мы рекомендуем вам выполнить следующую последовательность шагов чтобы попробовать устранить эту проблему:

  1. Убедитесь в том, что ничего не подключено к цифровым контактам 0 и 1 платы Arduino (включая шилды).
  2. Убедитесь в том, что в настройках Arduino IDE вы выбрали правильный тип платы и правильный COM порт.
  3. Пару раз нажмите кнопку сброса на плате Arduino и попробуйте после этого загрузить в нее код программы.
  4. Если не помогло, то отключите и заново подсоедините плату Arduino к компьютеру.
  5. Закройте и снова запустите Arduino IDE.

Если ничего из перечисленного не помогло, то попробуйте подключить к своему компьютеру другую плату Arduino или же подключите вашу плату Arduino к другому компьютеру. Если вы обнаружите, что проблема в компьютере, то переустановите Arduino IDE. Иногда бывает и так, что Arduino IDE из Windows работает с глюками, а из другой операционной системы на этом же компьютере работает без проблем. Также встречаются энтузиасты, которые устанавливают Arduino IDE в операционную систему от платы Raspberry Pi, то есть работают с Arduino IDE на компьютере, который состоит из платы Raspberry Pi и монитора – они говорят, что в этом случае Arduino IDE работает гораздо лучше чем из под Windows. Также, если не хотите менять компьютер или операционную систему на нем, вместо Arduino IDE можно попробовать использовать аналогичные инструменты — оболочку PlatformIO или Arduino Web Editor (официальный онлайн инструмент, его не нужно устанавливать).

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

Код программы не начинает исполняться при нажатии кнопки сброса (Reset)

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

Решение

Описанная проблема может возникать по достаточно большому количеству причин.

Если плата «висит» и ничего не делает, вы сначала должны убедиться в том, что вы в это же самое время не передаете ей никаких данных с компьютера по последовательному порту. При включении питания загрузчик платы первые несколько секунд проверяет не передаются ли плате по последовательному порту какие либо данные (например, не производится ли попытка загрузки в плату нового скетча). Если никакого нового скетча не поступает, то спустя несколько секунд загрузчик начинает исполнять последний скетч, загруженный в плату. Если же ваша программа периодически передает данные по последовательному порту плате, то загрузчик попросту не перейдет к исполнению последнего загруженного в плату скетча.

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

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

Почему мой скетч загрузился нормально, но не работает?

Вы выбрали неправильный пункт в меню Инструменты > Плата (Tools > Board). Убедитесь, что выбранная плата соответствует той, что вы пользуетесь в данный момент.

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

Кроме того, скетч может быть слишком велик для платы. Когда вы загружаете скетч, Arduino 0004 проверяет, не слишком ли он велик для ATmega8, однако его расчеты основываются на том, что загрузчик занимает в программной flash-памяти микроконтроллера (она составляет 8 Кб) всего 1 Кб. Однако на ваше устройство, возможно, записана старая версия загрузчика, объем которой составляет не 1 кб, а 2 Кб. Таким образом, если размер вашего скетча слишком велик, загрузится лишь его часть, но загрузчик об этом знать не будет, поэтому плата войдет в «мертвую петлю» – будет постоянно сбрасываться, тормозить, сбрасываться и т.д.

5. Загрузка первого скетча

Среда настроена, плата подключена. Пора прошивать платформу.

Arduino IDE содержит большой список готовых примеров, в которых можно быстро подсмотреть решение какой-либо задачи.

  1. Откройте распространенный пример — «Blink»:
    Файл
    Примеры
    01.Basics
    Blink.
  2. Откроется окно с демонстрационным примером.
  3. Немного модифицируйте код, чтобы увидеть разницу с заводским миганием светодиода. Замените строчки:
      delay(1000);

    на:

      delay(100);

    Полная версия кода:

    blink.ino
    void setup() {
      // initialize digital pin LED_BUILTIN as an output
      pinMode(LED_BUILTIN, OUTPUT);
    }
     
    void loop() {
      // turn the LED on (HIGH is the voltage level)
      digitalWrite(LED_BUILTIN, HIGH);
      // wait for a second  
      delay(100);
      // turn the LED off by making the voltage LOW                    
      digitalWrite(LED_BUILTIN, LOW);
      // wait for a second
      delay(100);
    }
  4. Нажмите на иконку «Компиляция» для проверки кода на ошибки.
  5. Нажмите на иконку «Загрузка» для заливки на плату.
  6. После прошивки платформы светодиод «L» начнёт загораться и гаснуть каждые 100 миллисекунд — в 10 раз быстрее исходной версии. Это значит, что ваш тестовый код успешно загрузился и заработал. Теперь смело переходите к экспериментам на Arduino.

Структура памяти Ардуино, где располагается скетч и данные

На микроконтроллере Ардуино имеется 3 вида памяти – флеш-память, которая используется для хранения скетчей, ОЗУ для хранения переменных и EEPROM для хранения постоянной информации. Из этих типов памяти флеш-память и EEPROM являются энергонезависимыми, то есть информация сохраняется при выключении питания. ОЗУ используется только для хранения данных, которые имеют отношение к исполняемой программе.

Микроконтроллер ATmega168, который используется на части плат Ардуино, имеет 16 Кб флеш-памяти, 1024 байта для ОЗУ и 512 байт EEPROM

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

Уменьшить объем кода можно несколькими способами:

По этой причине нужно следить за тем, сколько строк занимает программа, и по возможности удалять лишнее. Уменьшить объем кода можно несколькими способами:

  • Можно отправить часть информации на компьютер.
  • Для таблиц и других крупных массивов использовать минимальный тип данных для хранения.
  • Данные, которые остаются неизменными, можно объявить константами при помощи слова const перед объявлением переменной.
  • Меньше использовать рекурсию. При ее вызове в памяти, называемой стеком, выделяется фрагмент, в котором хранятся различные данные. Если часто вызывать рекурсию, стеки будут занимать большой объем памяти и могут израсходовать ее.
  • Неизменяемые строки можно сохранять во флеш-памяти во время работы программы. Для этого используется функция PROGMEM.

На объем памяти не влияют размер имени переменных и комментарии. Компилятор устроен таким образом, что не включает эти данные в скомпилированный скетч.

Для измерения объема занимаемой памяти ОЗУ используется скетч из библиотеки MemoryFree. В ней имеется специальная функция free­Memory, которая возвращает объем доступной памяти. Также эта библиотека широко используется для диагностики проблем, которые связаны с нехваткой памяти.

Оптимизация флеш-памяти. Как только будет окончена процедура компиляции, в окне появится информация о занимаемой памяти кодом. Если скетч занимает большую часть памяти, нужно произвести оптимизацию использования флеш-памяти:

  • Использование констант. Аналогично как и для ОЗУ задавать неизменяющиеся значения константами.
  • Удалить ненужные Serial.println. Эта команда используется, когда нужно увидеть значения переменных в разных местах программы, нередко эта информация просто не нужна. При этом команды занимают место в памяти, поэтому, убедившись в корректной работе программы, некоторые строки можно удалить.
  • Отказ от загрузчика – можно программировать микроконтроллер через контакты ICSP на плате с использованием аппаратных программаторов.

Флеш память является безопасным и удобным способом хранения данных, но некоторые факторы ограничивают ее использование. Для флеш-памяти характерна запись данных блоками по 64 байта. Также флеш-память гарантирует сохранность информации для 100000циклов записи, после чего информация искажается. Во флеш-памяти имеется загрузчик, который нельзя удалять или искажать. Это может привести к разрушению самой платы.

EEPROM память используется для хранения всех данных, которые потребуются после отключения питания. Для записи информации в EEPROM нужно использовать специальную библиотеку EEPROM.h, которая входит в число стандартных библиотек в Arduino IDE. Чтение и запись информации в EEPROM происходит медленно, порядка 3 мс. Также гарантируется надежность хранения данных для 100000 циклов записи, потому лучше не выполнять запись в цикле.

Ошибка компиляции для Arduino Nano, Uno, Mega

Ошибка: avrdude: stk500_recv(): programmer is not responding

Что делать в этом случае? Первым делом обратите внимание какую плату вы используете и к какому порту она подключена (смотри на скриншоте в правом нижнем углу). Необходимо сообщить Arduino IDE, какая плата используется и к какому порту она подключена

Если вы загружаете скетч в Ардуино Nano V3, но при этом в настройках указана плата Uno или Mega 2560, то вы увидите ошибку, как на скриншоте ниже.


Ошибка Ардуино: programmer is not responding

Такая же ошибка будет возникать, если вы не укажите порт к которому подключена плата (это может быть любой COM-порт, кроме COM1). В обоих случаях вы получите сообщение — плата не отвечает (programmer is not responding). Для исправления ошибки надо на панели инструментов Arduino IDE в меню «Сервис» выбрать нужную плату и там же, через «Сервис» → «Последовательный порт» выбрать порт «COM7».

Ошибка: a function-definition is not allowed here before ‘{‘ token

Это значит, что в скетче вы забыли где-то закрыть фигурную скобку. Синтаксические ошибки IDE тоже распространены и связаны они просто с невнимательностью. Такие проблемы легко решаются, так как Arduino IDE даст вам подсказку, стараясь отметить номер строки, где обнаружена ошибка. На скриншоте видно, что строка с ошибкой подсвечена, а в нижнем левом углу приложения указан номер строки.


Ошибка: a function-definition is not allowed here before ‘{‘ token

Ошибка: expected initializer before ‘}’ token   expected ‘;’ before ‘}’ token

Сообщение expected initializer before ‘}’ token говорит о том, что вы, наоборот где-то забыли открыть фигурную скобку. Arduino IDE даст вам подсказку, но если скетч довольно большой, то вам придется набраться терпения, чтобы найти неточность в коде. Ошибка при компиляции программы: expected ‘;’ before ‘}’ token говорит о том, что вы забыли поставить точку с запятой в конце командной строки.

Ошибка: ‘ ‘ was not declared in this scope

Что за ошибка? Arduino IDE обнаружила в скетче слова, не являющиеся служебными или не были объявлены, как переменные. Например, вы забыли продекларировать переменную или задали переменную ‘DATA’, а затем по невнимательности используете ‘DAT’, которая не была продекларирована. Ошибка was not declared in this scope возникает при появлении в скетче случайных или лишних символов.


Ошибка Ардуино: was not declared in this scope

Например, на скриншоте выделено, что программист забыл продекларировать переменную ‘x’, а также неправильно написал функцию ‘analogRead’. Такая ошибка может возникнуть, если вы забудете поставить комментарий, написали функцию с ошибкой и т.д. Все ошибки также будут подсвечены, а при нескольких ошибках в скетче, сначала будет предложено исправить первую ошибку, расположенную выше.

Ошибка: No such file or directory exit status 1

Данная ошибка возникает, если вы подключаете в скетче библиотеку, которую не установили в папку libraries. Например, не установлена библиотека ИК приемника Ардуино: fatal error: IRremote.h: No such file or directory. Как исправить ошибку? Скачайте нужную библиотеку и распакуйте архив в папку C:\Program Files\Arduino\libraries. Если библиотека установлена, то попробуйте скачать и заменить библиотеку на новую.


exit status 1 Ошибка компиляции для платы Arduino Nano

Почему моя плата не отображается в меню Инструменты > Порт (Tools > Serial Port)?

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

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

Проверьте, не запущены ли у вас программы, сканирующие все UART-порты – вроде синхронизирующих приложений для КПК, драйверов Bluetooth-USB (например, BlueSoleil), виртуальных эмуляторов и т.д.

На Windows причина может быть в том, что в названии COM-порта присутствует слишком большая цифра. Как пишет пользователь zeveland:

«Небольшая подсказка для тех, у кого не получается загрузить скетч на USB-плату с большим номером COM-порта. Попробуйте снизить номер COM-порта, назначенного для FTDI-чипа. У меня много виртуальных COM-портов, настроенных на Bluetooth-устройства, поэтому плате был присвоен порт COM17. В итоге IDE Arduino не сумела найти плату, поэтому я удалил все виртуальные порты в «Панели управления» (на XP) и снизил номер для FTDI-чипа до COM2. Далее осталось лишь перенастроить Arduino на новый порт».

Почему при попытке скомпилировать программу мне выдает ошибку java.lang.StackOverflowError?

Среда разработки Arduino делает некоторую предварительную обработку скетча, манипулируя кодом при помощи регулярных выражений. И порой во время этой обработки натыкается на строки, которые сбивают ее с толку. То есть, если вы увидите ошибку вроде…

java.lang.StackOverflowError
at java.util.Vector.addElement(Unknown Source)
at java.util.Stack.push(Unknown Source)
at com.oroinc.text.regex.Perl5Matcher._pushState(Perl5Matcher.java)

…или…

at com.oroinc.text.regex.Perl5Matcher._match(Perl5Matcher.java)
at com.oroinc.text.regex.Perl5Matcher._match(Perl5Matcher.java)
at com.oroinc.text.regex.Perl5Matcher._match(Perl5Matcher.java)
at com.oroinc.text.regex.Perl5Matcher._match(Perl5Matcher.java)
at com.oroinc.text.regex.Perl5Matcher._match(Perl5Matcher.java)
at com.oroinc.text.regex.Perl5Matcher._match(Perl5Matcher.java)
at com.oroinc.text.regex.Perl5Matcher._match(Perl5Matcher.java)

…то случилось именно это. Следовательно, вам надо поискать в коде строки с «двойными кавычками», ‘одинарными кавычками’, \обратными слэшами\, \\комментариями и т.д. К примеру, проблемы могут возникнуть из-за пропущенных кавычек и строк вроде ‘ \» ‘ (используйте вместо этого ‘ » ‘).

Как мне уменьшить размер скетча?

Одно из главных преимуществ микроконтроллера ATmega168, которым оснащена плата Arduino, в том, что он очень дешев. Однако он может работать лишь с 16 Кб программного кода, что не очень много (причем 2 Кб из «общей кассы» отходят загрузчику).

Если вы в своем скетче используете вычисления с плавающей точкой, попробуйте переписать его под целочисленные выражения – это должно сэкономить вам около 2 Кб flash-памяти. Также удалите в верхней части скетча все директивы #include, относящиеся к библиотекам, которые вы не используете.

Еще один вариант – попробуйте сделать вашу программу «полаконичней». Поищите способ решить ту же задачу, но более коротким путем.

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

Заключение

В этой статье мы рассмотрели различные аспекты загрузки скетчей в Arduino Uno и Nano. Прошивка плат на базе микроконтроллеров ATmega328 и ATmega256, как правило, не сложна и может выполняться одним нажатием кнопки в Arduino IDE. За эту простоту мы должны благодарить встроенную программу-загрузчик, выполняющую за нас все основные действия на низком уровне.

Еще одним вариантом перепрошивки контроллера является использование другой платы адуино или специальных программаторов, использующих микросхемы CP2102 CH340, FTDI и другие. Этот метод требует дополнительных усилий и затрат, но позволяет гибко изменять параметры прошивки. Какой из двух вариантов выбрать – решать вам. Для новичков, безусловно, первым шагом станет использование Arduino IDE, благо, ее создатели сделали все, чтобы упростить этот процесс.