Как найти ошибку в коде ардуино

Отладка программы является жизненно важным элементом при ее разработке. Программы для плат Arduino не являются в этом плане исключением. Процедура программирования плат Arduino достаточно проста, чего нельзя сказать о способах отладки программ, доступных для данной платформы. Одна из причин этого заключается в том, что платформа Arduino не располагает специализированными инструментами отладки программ, хотя в новой Arduino IDE pro такой инструмент все же появился.

Как производить отладку программ для Arduino

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

Также отладку программ для плат Arduino удобно производить в симуляторе UnoArduSim.

Собственные средства отладки в Arduino IDE

В Arduino IDE есть ряд собственных инструментов, которые можно использовать для отладки программ – это компилятор, монитор последовательного порта (Serial Monitor) и последовательный плоттер (построитель графиков в реальном времени по данным из последовательного порта). А в Arduino IDE Pro уже доступен свой собственный отладчик. Давайте рассмотрим эти инструменты более подробно.

Компилятор

Пример сообщений, выдаваемых компилятором Arduino IDE

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

Использование правильного синтаксиса имеет важное значение для обеспечения компиляции вашего кода программы. При сбое компиляции Arduino IDE отобразит выявленные проблемы в нижней части экрана. Однако сообщения об ошибках, предоставляемые компилятором Arduino IDE, не всегда достаточно информативны и полезны, как этого бы хотелось. Если вы понимаете смысл выдаваемого компилятором сообщения об ошибке, устраните выявленную проблему в коде программы. Если не понимаете – придется использовать другие средства отладки.

Монитор последовательного порта

Пример отладки программы с помощью монитора последовательного порта в Arduino IDE

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

Вы можете выводить в окно монитора последовательного порта следующие данные, которые могут пригодиться для отладки программы:

  • значения входных контактов (обычно это данные, считываемые с каких либо датчиков);
  • значения переменных в программе. По изменению их значений вы можете, например, делать выводы о том, исполняются или нет условные операторы (‘if’) в вашей программе;
  • значения выходных контактов (например, значения ШИМ перед подачей их непосредственно на контакт).

Средства отладки в Arduino IDE Pro

Внешнй вид интерфейса Arduino IDE Pro

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

К средствам отладки в Arduino IDE Pro относятся:

  • отступы в коде (что облегчает визуальное восприятие кода программы);
  • складывание блока;
  • автоматически закрывающиеся скобки;
  • поиск и замена регулярных выражений;
  • переключение комментариев.

Другими дополнительными функциями Arduino IDE Pro являются отладка в реальном времени, автозаполнение, адаптивный интерфейс и более быстрое время компиляции.

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

Visual Micro

Внешний вид интерфейса Visual Micro

Visual Micro – это плагин для Microsoft Visual Studio, который позволяет разрабатывать кросс-платформенные приложения Arduino. Любой код, написанный на Visual Micro и соответствующий спецификациям Arduino, будет одобрен. Поскольку Visual Micro позволяет изменять общий код и библиотеки, он идеально подходит для случаев, когда написание и отладка кода программа производится несколькими участниками (командой разработчиков). Код с нескольких платформ может быть разработан и интегрирован с программным кодом в процессе компиляции. Visual Micro также обеспечивает отладку GDB и отладку фрагментов кода программы, работающих с последовательными портами связи, технологиями Bluetooth и WiFi.

DebugWire

Внешний вид интерфейса DebugWire

DebugWire – это протокол, разработанный компаний Atmel и позволяющий производить отладку программ, написанных для микроконтроллеров серий ATTiny (ATTiny 13, 85 и др.) и ATmega (ATmega 32/48/88/168/328), без использования интерфейса JTAG, используя только контакт сброса (Reset pin). Компания Atmel не выкладывает документацию протокола debugWIRE в открытый доступ, однако ряд энтузиастов перепроектировали его большие разделы и смогли создать несколько базовых отладчиков на его основе. Протокол DebugWire обеспечивает полный доступ на чтение и запись ко всей памяти микроконтроллеров AVR, а также полный контроль над процессом выполнения программы. Он поддерживает следующие инструменты отладки программ:

  • пошаговое выполнение программы (по одной строчке в коде программы);
  • выполнение программы до позиции курсора;
  • пошаговый выход;
  • прерывание работы программы.

Atmel Studio

Внешний вид интерфейса Atmel Studio

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

Atmel Studio обладает высокой адаптивностью и поддерживает чертежи .into, а также исходные коды C++. Также она обладает отличными возможностями отладки с помощью debugWIRE или JTAG.

На нашем сайте вы можете прочитать статьи про программирование микроконтроллеров AVR с помощью программатора USBASP и Atmel Studio 7.0 и русификацию программы Atmel Studio 7.0.

Загрузка…

2 055 просмотров

Отладка программы является жизненно важным элементом при ее разработке. Программы для плат Arduino не являются в этом плане исключением. Процедура программирования плат Arduino достаточно проста, чего нельзя сказать о способах отладки программ, доступных для данной платформы. Одна из причин этого заключается в том, что платформа Arduino не располагает специализированными инструментами отладки программ, хотя в новой Arduino IDE pro такой инструмент все же появился.

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

Также отладку программ для плат Arduino удобно производить в симуляторе UnoArduSim.

Собственные средства отладки в Arduino IDE

В Arduino IDE есть ряд собственных инструментов, которые можно использовать для отладки программ – это компилятор, монитор последовательного порта (Serial Monitor) и последовательный плоттер (построитель графиков в реальном времени по данным из последовательного порта). А в Arduino IDE Pro уже доступен свой собственный отладчик. Давайте рассмотрим эти инструменты более подробно.

Компилятор

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

Использование правильного синтаксиса имеет важное значение для обеспечения компиляции вашего кода программы. При сбое компиляции Arduino IDE отобразит выявленные проблемы в нижней части экрана. Однако сообщения об ошибках, предоставляемые компилятором Arduino IDE, не всегда достаточно информативны и полезны, как этого бы хотелось. Если вы понимаете смысл выдаваемого компилятором сообщения об ошибке, устраните выявленную проблему в коде программы. Если не понимаете – придется использовать другие средства отладки.

Монитор последовательного порта

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

Вы можете выводить в окно монитора последовательного порта следующие данные, которые могут пригодиться для отладки программы:

  • значения входных контактов (обычно это данные, считываемые с каких либо датчиков);
  • значения переменных в программе. По изменению их значений вы можете, например, делать выводы о том, исполняются или нет условные операторы (‘if’) в вашей программе;
  • значения выходных контактов (например, значения ШИМ перед подачей их непосредственно на контакт).

Средства отладки в Arduino IDE Pro

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

К средствам отладки в Arduino IDE Pro относятся:

  • отступы в коде (что облегчает визуальное восприятие кода программы);
  • складывание блока;
  • автоматически закрывающиеся скобки;
  • поиск и замена регулярных выражений;
  • переключение комментариев.

Другими дополнительными функциями Arduino IDE Pro являются отладка в реальном времени, автозаполнение, адаптивный интерфейс и более быстрое время компиляции.

Внешние инструменты отладки программ для плат Arduino

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

Visual Micro

Visual Micro – это плагин для Microsoft Visual Studio, который позволяет разрабатывать кросс-платформенные приложения Arduino. Любой код, написанный на Visual Micro и соответствующий спецификациям Arduino, будет одобрен. Поскольку Visual Micro позволяет изменять общий код и библиотеки, он идеально подходит для случаев, когда написание и отладка кода программа производится несколькими участниками (командой разработчиков). Код с нескольких платформ может быть разработан и интегрирован с программным кодом в процессе компиляции. Visual Micro также обеспечивает отладку GDB и отладку фрагментов кода программы, работающих с последовательными портами связи, технологиями Bluetooth и WiFi.

DebugWire

DebugWire – это протокол, разработанный компаний Atmel и позволяющий производить отладку программ, написанных для микроконтроллеров серий ATTiny (ATTiny 13, 85 и др.) и ATmega (ATmega 32/48/88/168/328), без использования интерфейса JTAG, используя только контакт сброса (Reset pin). Компания Atmel не выкладывает документацию протокола debugWIRE в открытый доступ, однако ряд энтузиастов перепроектировали его большие разделы и смогли создать несколько базовых отладчиков на его основе. Протокол DebugWire обеспечивает полный доступ на чтение и запись ко всей памяти микроконтроллеров AVR, а также полный контроль над процессом выполнения программы. Он поддерживает следующие инструменты отладки программ:

  • пошаговое выполнение программы (по одной строчке в коде программы);
  • выполнение программы до позиции курсора;
  • пошаговый выход;
  • прерывание работы программы.

Atmel Studio

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

Atmel Studio обладает высокой адаптивностью и поддерживает чертежи .into, а также исходные коды C++. Также она обладает отличными возможностями отладки с помощью debugWIRE или JTAG.

Источник

Arduino.ru

Пошаговая отладка

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

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

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

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

Arduino IDE — упрощенная любительская система начального уровня.

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

А как то руссифицировать эту Atmel Studio возможно?

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

А как то руссифицировать эту Atmel Studio возможно?

Описание с Торента по руссификации:

Чтобы в Atmel Studio6 появился русский язык необходимо установить Microsoft Visual Studio 2010 RUS. После установки MVS 2010 rus, в ATmel Studio6 появится выбор русского языка.

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

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

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

можно в коде ардуино понавставлять вывод нужного в Сериал.

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

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

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

Дак выводите промежуточные результаты вычислений. В чем проблема?

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

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

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

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

Atmel Studio не работает со скетчами ардуино (только с чистым Си и Ассемблером). Но можно установить дополнительный плагин Visual Micro, который это позволяет (платный, есть триал).

Источник

Отладка скетчей Arduino

Библиотека Simple Dumping Monitor для Arduino-совместимых контроллеров на базе микроконтроллеров ATmega позволяет выводить дампы регистров, таймеров и памяти RAM, Flash и EEPROM, а также дамп таблицы векторов прерываний.

Библиотекой версии 0.21 поддерживаются микроконтроллеры:

  • ATmega48P/88P/168P/328P — платы Arduino
  • ATmega640/1280/1281/2560/2561 — платы Arduino MEGA
  • ATmega16U4/32U4 — платы Arduino Leonardo
  • ATmega164A/PA/324A/PA/644A/PA/1284/P — платы Sanguino/Daiduino

Начиная с версии 0.6 в библиотеку добавлены функции простого символьного отладчика.

В скомпилированном виде библиотека занимает около 11 Кб памяти (около 15 Кб — Arduino Mega). Требования к ОЗУ (RAM) не превышают 1 Кбайт (277 байт для примера dumpmon.pde, 377 байт для примера dumpmonDebug.pde).

Для использования библиотеки, нужно скачать файл с архивом. В архиве находится папка DumpMon, которую нужно распаковать в директорий libraries директория с библиотеками Arduino IDE. В результате должно получиться libraries/DumpMon .

В папке DumpMon/Examples находится скетч-пример dumpmonDebug.pde, который демонстрирует использование библиотеки для отладки скетча.

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

  • ? — вывод подсказки.
  • W — вывод значений наблюдаемых переменных.
  • S — перевод отладчика в режим пошагового выполнения.
  • N — выполнить программу до следующей точки останова.
  • G — выполнение программы в обычном режиме.
  • A — повторить предыдущую команду.
  • С — продолжить вывод дампа (для команды W — повторить вывод).

Команды и адреса можно вводить как в нижнем, так и в верхнем регистрах. Значения переменных и адресов выводятся в шестнадцатиричном формате.

Для использования отладчика библиотеки Simple Dumping Monitor, необходимо добавить в функцию setup() скетча вызов функции инициализации библиотеки, а также добавить переменные для наблюдения в список наблюдаемых переменных.

Функция dumpmonSetup() принимает два параметра:

  • Скорость обмена последовательного порта USART в бодах (бит/сек.).
  • Начальный режим отладчика (по умолчанию — пошаговый, что соответствует значению STEP_MODE ).

Поскольку по умолчанию используется пошаговый режим отладчика, то после сброса скетч будет выполнен до первого вызова функции breakpoint() . Для того, чтобы после сброса скетч работал как обычно, не останавливаясь на точках прерывания, функцию dumpmonSetup() следует вызвать с аргументом GO_MODE :

По умолчанию библиотека использует последовательный порт Serial ( USART0 ). Для использования другого последовательного порта микроконтроллеров ATmega1280/2560 ( Serial1 , Serial2 или Serial3 ) следует добавить в вызов функции dumpmonSetup() ссылку на данный порт:

Источник

Монитор порта, отладка

Как мы с вами знаем из урока “Что умеет микроконтроллер“, у многих микроконтроллеров есть интерфейс UART, позволяющий передавать и принимать различные данные. У интерфейса есть два вывода на плате – пины TX и RX. На большинстве Arduino-плат к этим пинам подключен USB-UART преобразователь (расположен на плате), при помощи которого плата может определяться компьютером при подключении USB кабеля и обмениваться с ним информацией. На компьютере создаётся виртуальный COM порт (последовательный порт), к которому можно подключиться при помощи программ-терминалов и принимать-отправлять текстовые данные. Таким же образом кстати работают некоторые принтеры и большинство станков с ЧПУ.

В самой Arduino IDE есть встроенная “консоль” – монитор порта, кнопка с иконкой лупы в правом верхнем углу программы. Нажав на эту кнопку мы откроем сам монитор порта, в котором будут настройки:

Если с отправкой, автопрокруткой, отметками времени и кнопкой очистить вывод всё и так понятно, то конец строки и скорость мы рассмотрим подробнее:

  • Конец строки: тут есть несколько вариантов на выбор, чуть позже вы поймёте, на что они влияют. Лучше поставить нет конца строки, так как это позволит избежать непонятных ошибок на первых этапах знакомства с платформой.
    • Нет конца строки – никаких дополнительных символов в конце введённых символов после нажатия на кнопку отправка или клавишу Enter.
    • NL – символ переноса строки в конце отправленных данных.
    • CR – символ возврата каретки в конце отправленных данных.
    • NL+CR – и то и то.
  • Скорость – тут на выбор нам даётся целый список скоростей, т.к. общение по Serial может осуществляться на разных скоростях, измеряемых в бод (baud), и если скорости приёма и отправки не совпадают – данные будут получены некорректно. По умолчанию скорость стоит 9600, её и оставим.

Объект Serial

Начнём знакомство с одним из самых полезных инструментов Arduino-разработчика – Serial, который идёт в комплекте со стандартными библиотеками. Serial позволяет как просто принимать и отправлять данные через последовательный порт, так и наследует из класса Stream кучу интересных возможностей и фишек, давайте сразу их все рассмотрим, а потом перейдём к конкретным примерам.

Запустить связь по Serial на скорости speed (измеряется в baud, бит в секунду). Скорость можно поставить любую, но есть несколько “стандартных” значений. Список скоростей для монитора порта Arduino IDE:

  • 300
  • 1200
  • 2400
  • 4800
  • 9600 чаще всего используется, можно назвать стандартной
  • 19200
  • 38400
  • 57600
  • 115200 тоже часто встречается
  • 230400
  • 250000
  • 500000
  • 1000000
  • 2000000 – максимальная скорость, не работает на некоторых китайских платах

Источник

На данной странице находится максимально подробный гайд по началу работы с Arduino, в котором можно найти ответы на все вопросы касательно установки, подключения и загрузки прошивки, а также по работе с моими проектами. Внимательно изучите гайд, прежде чем писать мне на почту или в нашу группу ВК, если у вас что-то не получается, тут есть ответы на все вопросы. Также прилагаю список уроков на этом сайте, где можно найти ещё больше базовой информации:

  • Начало работы
  • Работа с Arduino IDE
  • Первая прошивка, ошибки, FAQ
  • Питание платы

Arduino  IDE


Arduino IDE – программа для написания и загрузки прошивки в плату, скачать можно с официального сайта вот здесь. Внимание! Перевод языка страницы в браузере ломает кнопки! На данный момент называется Legacy IDE (1.8.X), так как вышла новая IDE v2. Новичкам рекомендуется начать с версии 1.8.X.

Перед загрузкой вам предложат пожертвовать на развитие проекта, можно отказаться и нажать JUST DOWNLOAD (только скачать). Либо открываем прямую ссылку на загрузку версии 1.8.19 и сразу качаем файл.

Для работы рекомендуется компьютер с Winodws 7 или выше, либо Linux/MacOS

  • Если у вас Windows XP, придётся установить версию 1.6.13, более свежие версии будут очень сильно тормозить или не будут работать вообще. Есть ещё одна проблема: некоторые библиотеки не будут работать на старых версиях Arduino IDE, также не будет работать поддержка плат семейства esp8266, поэтому крайне рекомендуется обновить свой компьютер до Windows 7 или выше
  • Установка на Linux из системного репозитория – читать тут
  • Установка на MacOS – читать тут

Arduino Windows app
Не рекомендуется устанавливать Arduino Windows app из магазина приложений Windows, так как с ней бывают проблемы

Другие версии
Не устанавливайте старые версии IDE, если нет на то весомых причин, а также beta и hourly-билды

Java


Для старых версий Arduino IDE, а также для некоторых других программ, понадобится пакет Java JRE. Скачать можно с официального сайта для своей операционной системы.

Установка


Arduino IDE устанавливается как обычная программа, запускам и жмём далее далее далее…

Драйвер


Во время установки Arduino IDE программа попросит разрешения установить драйвера от неизвестного производителя, нужно согласиться на установку всего предложенного.

Обновление


Перед установкой новой версии нужно удалить старую. Ни в коем случае не удаляйте папку установленной IDE из Program Files, удалять нужно через “Установка и удаление программ“, либо запустив файл uninstall.exe из папки с установленной программой. Иначе установщик откажется устанавливать новую программу, так как в системе остались следы от старой. Решение этой проблемы описано в видео ниже. Вкратце о том, как удалить IDE вручную:

Удаление остатков IDE

Удаляем папки:

  • Папка с программой
    • C:Program Files (x86)Arduino (64-битная версия Windows)
    • C:Program FilesArduino (32-битная версия Windows)
  • Папка со скетчами и библиотеками
    • ДокументыArduino
  • Папка с настройками и дополнительными “ядрами” плат
    • C:Пользователи (или Users)Ваш_пользовательAppDataLocalArduino15

Удаляем следы из реестра:

  • Открыть редактор системного реестра:
    • Windows 10: Пуск/regedit
    • Предыдущие: Пуск/Выполнить/regedit
    • Инструкция для всех Windows
  • В открывшемся окне: Правка/Найти…
    • В окне поиска пишем arduinouninstall
    • Поиск
  • Удаляем найденный параметр (см. скриншот ниже)
  • На всякий случай Правка/Найти далее
  • Удаляем и так далее, пока не удалим все найденные параметры с arduinouninstall
  • После этого можно запускать установщик и устанавливать новую программу

Другие проблемы


  • Если перестала запускаться Arduino IDE – удаляем файлик preferences.txt из C:Пользователи (или Users)Ваш_пользовательAppDataLocalArduino15

Портативная версия


Вместо полной установки программы можно скачать архив с уже “установленной”, на странице загрузки он называется Windows ZIP file. Вот прямая ссылка на 1.8.19. Распаковав архив, получим портативную версию Arduino IDE, которую можно скинуть на флешку и использовать на любом компьютере без установки программы. Но понадобится установить драйвер CH341 для китайских плат, а также драйверы из папки с программой Arduino IDE (подробнее в следующем уроке). Возможно понадобится установить Java.

Работа на смартфоне


Писать и загружать прошивку через смартфон тоже можно, понадобится смартфон на Android и приложение ArduinoDroid. Также для тренировки и удобного редактирования скетчей можно использовать CppDroid, но загружать в плату она не умеет.

Первое подключение

Осмотр платы


Перед подключением к компьютеру рекомендуется провести визуальный осмотр платы на предмет дефектов пайки компонентов. Что можно встретить (в порядке фотографий):

  • Замкнутые пины (вроде бы паяются китайцами вручную)
  • Неприпаянная нога компонента
  • “Торчащие” вверх или под углом компоненты типа резисторов и конденсаторов, припаянные только с одной стороны
  • Компоненты со смещением
  • “Сопля” между ногами компонента

blank

blank

Плату с обнаруженным дефектом не рекомендуется подключать к компьютеру! Всё можно исправить паяльником, если не умеете сами – попросите того, кто умеет.

Реакция на подключение питания


Как понять, что плата работает корректно? На примере Nano/Uno:

  • При подключении USB загорается и горит светодиод PWR
  • Если плата новая и на ней прошит загрузчик (он обязан быть прошит) – однократно мигает светодиод L
  • Примечание: светодиоды могут быть любого цвета
  • На новой плате прошито “мигание светодиодом”, поэтому светодиод L продолжит мигать один или два раза в секунду в зависимости от версии загрузчика
  • При нажатии на кнопку сброса (RESET, единственная кнопка на плате) должен однократно мигнуть светодиод L, сигнализируя о завершении работы загрузчика.

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

Драйвер USB контроллера

CH341


В своих проектах я использую “Ардуино-совместимые” китайские платы, у которой для подключения по USB используется контроллер CH340/CH341. Чтобы он распознавался компьютером, нужно установить драйвер.

Windows

Скачать драйвер можно по ссылке:

  • FTP сайта
  • Яндекс.Диск
  • Сайт driverslab

Запускаем и в появившемся окошке нажимаем INSTALL. Готово!

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

  • C/Program Files/Arduino/drivers (для 32-х разрядной системы)
  • C/Program Files (x86)/Arduino/drivers (для 64-х разрядной системы).

Запустить файл

  • dpinst-x86.exe (для 32-х разрядной системы)
  • dpinst-amd64.exe (для 64-х разрядной системы)

blank

Linux Mint

В Linux уже встроен необходимый драйвер, но Arduino IDE может отказаться с ним работать: Linux определяет ардуинку как устройство ttyUSB*, обычно это ttyUSB0 (это можно узнать командой dmesg в терминале), то есть в системе появляется интерфейс /dev/ttyUSB0. Чтобы с ним работать, нужны права доступа. Читать и писать на устройство /dev/ttyUSB0 имеет пользователь root и пользователи группы dialout. Работы с правами суперпользователя лучше избегать, поэтому следует занести своего пользователя в группу dialout. Это можно сделать следующей командой (обратите внимание, команда whoami в обратных кавычках)

sudo usermod -a -G dialout `whoami`

После этого нужно перелогиниться. Дальше запускаем Arduino IDE и в меню «Инструменты/Порт» ставим галочку напротив /dev/ttyUSB0.

Linux Arch

Вся информация по работе с IDE на данной ОСи есть вот в этой статье

FT232


На оригинальных Arduino Nano стоит USB контроллер производства FTDI – FT232, драйвер для всех версий ОС можно скачать с официального сайта (прямая ссылка на инсталлятор для Windows). Некоторые очень редкие китайцы паяют на свои Наны поддельные FTDI контроллеры, которые буквально выходят из строя после некоторых обновлений Windows. Если вам достался такой экземпляр (я никогда не даю ссылки на такие поделки) – подробности по ситуации читайте здесь. Как восстановить контроллер и сделать рабочий драйвер – читайте здесь.

CP2102


На некоторые Arduino-совместимые платы китайцы ставят контроллер USB CP2102. Драйвер на него в большинстве случаев уже есть в системе (на Linux точно есть), если не работает – скачать можно с официального сайта.

  • Прямая ссылка на драйвер для Windows всех версий
  • Прямая ссылка на драйвер для Mac OS

На Windows установка производится следующим образом: достаём из архива и

Настройка и прошивка

Подключение платы


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

  • Неисправен USB кабель
  • Неисправен USB порт компьютера
  • Неисправен USB порт Arduino
  • Попробуйте другой компьютер, чтобы исключить часть проблем из списка
  • Попробуйте другую плату (желательно новую), чтобы исключить часть проблем из списка
  • На плате Arduino сгорел входной диод по линии USB из-за короткого замыкания, устроенного пользователем при сборке схемы
  • Плата Arduino сгорела полностью из-за неправильного подключения пользователем внешнего питания или короткого замыкания

Компьютер издаст характерный сигнал подключения нового оборудования, а при первом подключении появится окошко “Установка нового оборудования”. Если этого не произошло:

  • См. предыдущий список неисправностей
  • Кабель должен быть data-кабелем, а не “зарядным”
  • Кабель желательно втыкать напрямую в компьютер, а не через USB-хаб
  • Не установлены драйверы Arduino (во время установки IDE или из папки с программой), вернитесь к установке.

В списке портов (Arduino IDE/Инструменты/Порт) появится новый порт, обычно COM3. Если этого не произошло:

  • См. предыдущий список неисправностей
  • Некорректно установлен драйвер на USB контроллер Arduino
    • Переверните плату и найдите “узкую” микросхему. Если на ней написано CH341 – ставим драйвер по инструкции выше
    • Если написано FT232R – опять же инструкция выше
    • Если ничего не написано – открываем “Диспетчер устройств”, смотрим блок “Другие устройства”. Если при подключении платы к компьютеру там появляется FT232R USB UART – смотрим инструкцию выше
  • Если список портов вообще неактивен – драйвер Arduino установлен некорректно, вернитесь к установке
  • Возникла системная ошибка, обратитесь к знакомому компьютерщику или экзорцисту

Выбор и настройка платы (Arduino NANO)


  • Выбираем соответствующую плату в ИнструментыПлата Большинство моих проектов сделаны на Arduino Nano. Если вы используете Nano:
    •  В микроконтроллер китайских плат зашит “старый” загрузчик, поэтому выбираем ИнструментыПроцессорATmega328p (Old Bootloader). Если вам по какой-то причине пришлют платы с новым загрузчиком – прошивка не загрузится (будет минутная загрузка и ошибка), можно попробовать сменить пункт Процессор на ATmega328p
  • Теперь выбираем порт, к которому подключена плата. COM1 – в большинстве случаев системный порт, у вас должен появиться ещё один (обычно COM3)

Загрузка прошивки


“Загрузка” прошивки происходит в два этапа – компиляция и непосредственно загрузка в микроконтроллер. Компиляция – проверка кода на наличие ошибок, её можно запустить, нажав кнопку с символом галочки в верхнем меню программы. Компилировать код можно даже не подключая плату к компьютеру! При нажатии на кнопку с символом стрелочки начнётся компиляция, а затем загрузка скомпилированного кода в плату.

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

Примечание: данный код является универсальным для всех Arduino-совместимых плат

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
  digitalWrite(LED_BUILTIN, 0);
  delay(300);
  digitalWrite(LED_BUILTIN, 1);
  delay(300);
}

ESP8266 (Wemos, NodeMCU)


ESP8266  – микроконтроллер с WiFi на борту, на его базе сделаны платы Wemos D1 mini, NodeMCU и другие.

  • Читайте вводный урок по esp8266.
  • На популярных платах Wemos и NodeMCU стоит бортовой USB и CH340 или CP2102 (обычно это указано на странице товара).
  • Установка драйверов описана выше на этой странице.

Для работы с esp8266 нужно добавить поддержку плат в Arduino IDE:

  • Arduino IDE/Файл/Настройки/
  • В окошко “Дополнительные ссылки…” Вставить
  • http://arduino.esp8266.com/stable/package_esp8266com_index.json
  • Нажать ОК
  • Arduino IDE/Инструменты/Плата/Менеджер плат… Начать вводить в поиске “esp”. Выбрать и установить ESP8266 boards
    • Рекомендуемая версия – 2.7.4, на более высоких пока что наблюдаются проблемы с совместимостью
  • В списке плат Инструменты/Плата/ появится семейство плат на esp8266. Выбираем плату
    • NodeMCU – NodeMCU 1.0
    • Wemos Mini – LOLIN Wemos D1 R2 & mini
    • Или другую согласно своей конфигурации
  • Выбираем порт, к которому подключена плата
  • На четвёртом скриншоте ниже показаны настройки платы по умолчанию, изменены только выделенные красным (плата и порт)

Заметка для NodeMCU. Перед началом загрузки нужно ввести плату в режим прошивки. Подключить к компьютеру, выбрать появившийся порт для загрузки. Зажать кнопку Flash. Кликнуть по кнопке Reset. Отпустить кнопку Flash. И только после этого нажать стрелочку в программе для загрузки прошивки.

ESP32


ESP32  – мощный микроконтроллер с WiFi на борту

  • На плате стоит бортовой USB и CH340 или CP2102 (обычно это указано на странице товара).
  • Установка драйверов описана выше на этой странице.

Для работы с ESP32 нужно добавить поддержку плат в Arduino IDE:

  • Arduino IDE/Файл/Настройки/
  • В окошко “Дополнительные ссылки…” Вставить
  • https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
  • Нажать ОК
  • Arduino IDE/Инструменты/Плата/Менеджер плат… Начать вводить в поиске “esp”. Выбрать и установить esp32
  • В списке плат Инструменты/Плата/ появится семейство плат на esp32. Выбираем плату согласно купленной модификации
  • Выбираем порт, к которому подключена плата

У некоторых плат не работает автоматический запуск в режиме прошивки, поэтому в самом начале процесса загрузки прошивки нужно зажать кнопку Flash (BOOT) на плате

Digispark


Digispark – плата на базе ATtiny85.

  • Читайте вводный урок по Digispark.
  • Подключение к ПК по USB (реализован программно)
  • Нужно установить специальный драйвер, скачать можно на официальном GitHub проекта (в разделе Релизы, вот прямая ссылка на архив), либо с моего FTP. Драйвера есть для Win, MacOS и Linux.
  • Пользователям Linux читать здесь

Для работы с Digispark нужно добавить поддержку плат в Arduino IDE:

  • Arduino IDE/Файл/Настройки/
  • В окошко “Дополнительные ссылки…” Вставить
    • http://digistump.com/package_digistump_index.json
    • или https://raw.githubusercontent.com/digistump/arduino-boards-index/master/package_digistump_index.json
  • Нажать ОК
  • Arduino IDE/Инструменты/Плата/Менеджер плат… Начать вводить в поиске “Digispark”. Выбрать и установить Digistump AVR Boards
  • В списке плат Arduino IDE/Инструменты/Плата/ появится семейство плат Digispark. Выбираем Digispark (Default – 16.5mhz)

Прошивка загружается следующим образом: ПЛАТУ НЕ ПОДКЛЮЧАЕМ, ПОРТ НЕ ВЫБИРАЕМ, нажимаем загрузка, ждём компиляции. Появится надпись “подключите плату”. Втыкаем плату в USB и прошивка загружается.

LGT8F328


LGT8F328 – китайский клон ATmega328

  • Читайте вводный урок по lgt8f328.
  • Может понадобиться драйвер (прямая ссылка на архив)

Для работы с LGT8F328 нужно добавить поддержку плат в Arduino IDE:

  • Запустить Arduino IDE, перейти в Файл/Настройки/
  • В окошко “Дополнительные ссылки…” Вставить
  • https://raw.githubusercontent.com/dbuezas/lgt8fx/master/package_lgt8fx_index.json
  • Нажать ОК
  • Перейти в Инструменты/Плата/Менеджер плат… Начать вводить в поиске “lgt8”. Выбрать и установить LGT8fx Boards
  • Теперь в списке плат Инструменты/Плата/ появится семейство плат Logic Green… Выбираем свою плату

“Голые” МК


Для начала рекомендуется изучить вот эти два урока: первый и второй. У проектов на базе голого микроконтроллера есть два варианта:

  • Если проект основан на ATmega328 (Arduino Nano/Mini) и на плате есть источник тактирования на 16 МГц (резонатор), то микроконтроллер можно просто перепаять с Arduino и загружать прошивку через внешний USB-TTL переходник, как на Arduino Pro Mini. Либо загрузить прошивку, и потом перепаивать – всё будет работать.
    • Если источника тактирования нет – так делать нельзя! Сначала нужно настроить МК на внутреннее тактирование, подключив ISP программатор к плате Arduino и выбрав внутренний источник тактирования в настройках ядра. Подробнее читайте в уроке.
  • Если используется новый микроконтроллер (или припаянный китайцами) – он по умолчанию настроен на внутреннее тактирование и его можно паять на плату в любом случае. Загрузить прошивку можно только при помощи ISP программатора. Также можно прошить загрузчик и в дальнейшем загружать прошивку через USB-TTL преобразователь.

Установка библиотек


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

Менеджер библиотек


Большинство Ардуино-библиотек можно установить автоматически из встроенного в программу менеджера библиотек:

  • Скетч/Подключить библиотеку/Управлять библиотеками…
  • Комбинация клавиш Ctrl+Shift+I

Нужную библиотеку можно найти в поиске по названию и нажать Установка, библиотека будет автоматически установлена в папку с библиотеками. Arduino IDE проверяет обновления библиотек при запуске и предложит обновиться, если найдёт обновления.

Скачивание с GitHub


Не все существующие библиотеки есть в менеджере библиотек и скачать их можно только с GitHub. Есть два способа: скачать весь репозиторий и скачать релиз. Весь репозиторий со всеми “лишними” служебными файлами можно скачать одним архивом вот так, нажав Code/Download ZIP

Если у библиотеки есть релизы – справа будет отмечен последний (свежий) релиз. Нажимаем на него:

И в новом окне нажимаем Source code (zip) – начнётся загрузка архива. Скачивание релиза более предпочтительно, так как содержит только файлы библиотеки.

blank

В обоих случаях библиотека скачается как .zip архив.

Автоматическая установка


Скачанный .zip архив можно установить в автоматическом режиме через Скетч/Подключить библиотеку/Добавить .ZIP библиотеку… В открывшемся окне выбрать скачанный архив, библиотека будет установлена по указанному в настройках пути.

Ручная установка


Для начала нужно распаковать архив (стандартный архиватор Windows или WinRAR). Чтобы Arduino IDE смогла использовать библиотеку, нам нужно положить её туда, где программа будет её искать. Таких мест три (на примере Windows):

  • Документы/Arduino/libraries/
  • Папка с программой/libraries/
    • C/Program Files/Arduino/libraries/ (Windows 32)
    • C/Program Files (x86)/Arduino/libraries/ (Windows 64)
    • В портативной версии IDE желательно держать библиотеки в Папка с программой/libraries

Рекомендуется держать все библиотеки в одном месте, чтобы не было путаницы. Лично я устанавливаю все библиотеки в папку с программой (в Program Files), но для этого могут потребоваться права администратора (зависит от версии и настроек Windows). Если у вас возникли с этим проблемы – устанавливайте в Документы/Arduino/libraries/. На скриншотах показана установка скачанной с GitHub библиотеки в папку с программой и в документы. Ставить нужно в одно место, я просто показываю оба варианта.

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


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

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

Частые ошибки в коде, приводящие к ошибке компиляции

  • …no such file or directory – компилятор не может найти файл, который используется в коде. Чаще всего это библиотека, которую не установили или установили неправильно
  • expected ‘,’ or ‘;’ – пропущена запятая или точка запятой на предыдущей строке
  • stray ‘320’ in program – русские символы в коде
  • expected unqualified-id before numeric constant – имя переменной не может начинаться с цифры
  • … was not declared in this scope – переменная или функция используется, но не объявлена. Компилятор не может её найти
  • redefinition of … – повторное объявление функции или переменной
  • storage size of … isn’t known – массив задан без указания размера

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


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

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

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


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

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

Частые вопросы


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

▶Проекты AlexGyver◀


ВНИМАТЕЛЬНО ЧИТАЙ ИНСТРУКЦИЮ
Если это твой первый опыт работы с Arduino — внимательно изучи каждый пункт инструкции выше, здесь всё написано!!!

Все мои проекты имеют одинаковую структуру и устанавливаются/прошиваются одинаково, поэтому вот финальная общая инструкция:

1. Установить Arduino IDE и драйверы, как написано в гайде выше. Если это ваш первый раз – желательно не подключать ничего к новой плате, а загрузить пробную прошивку из гайда и убедиться, что всё загружается и работает. Если после сборки схемы прошивка перестанет загружаться – увы, схема собрана с ошибками и плата уже могла сгореть. Но она работала, мы это проверили =)

  • Если проект основан не на стандартной Arduino плате, а например на esp8266, ESP32, Digispark, lgt8f328 – устанавливаем поддержку этих плат, как описано выше.

2. Скачать архив со страницы проекта. Ссылка всегда одна, она ведёт на прямую загрузку архива с хранилища GitHub. Когда проект обновляется (об этом может быть написано на странице проекта), ссылка на архив остаётся той же, но в нём будут уже какие-то изменённые файлы, добавлены новые версии прошивки и т.д. Все обновления указаны на странице проекта.

3. Распаковать архив. Архив имеет формат .zip, для его распаковки можно использовать встроенные инструменты операционной системы, либо популярный WinRAR. Если не распаковать архив – прошивка откроется неправильно. Я не отличаюсь буйной фантазией и всегда называю папки одинаково, вот что может быть в архиве проекта:

  • firmware – прошивки для Arduino
  • software – программы для ПК
  • libraries – библиотеки
  • schemes – схемы
  • PCB – gerber файлы печатных плат
  • docs – всякие документы
  • Android – исходники приложения
  • 3Dprint – модели для печати
  • processing – программа на Processing

Извлечение WinRAR

Извлечение Windows

Распакованная папка

4. Установить библиотеки. К прошивкам моих проектов всегда идут библиотеки, необходимые для работы кода. Библиотеки в проектах часто пересекаются, но рекомендуется ставить именно идущую в комплекте с проектом версию, так как более старые или новые могут быть несовместимы.

Содержимое папки libraries из архива помещаем в

  • С/Program Files/Arduino/libraries/ (Windows x32)
  • C/Program Files (x86)/Arduino/libraries/ (Windows x64)

Установка в libraries

Если возникнут проблемы с доступом к этой папке (на Windows 10), то библиотеки можно положить в

  • Документы/Arduino/libraries/

Установка в документы

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

5. Открыть скетч (так называется файл с программой). При запуске файла скетча автоматически откроется Arduino IDE. Важно: если в папке со скетчем есть несколько файлов – запускаем любой с логотипом Arduino. Остальные файлы должны подтянуться автоматически и образовать вкладки в окне программы. Если запускать скетч прямо из архива – вкладки не откроются и скомпилировать/загрузить программу будет невозможно.

Вкладки в Arduino IDE

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

  • Для проектов на Arduino Nano выбираем Arduino Nano, а также ИнструментыПроцессорATmega328p (Old Bootloader). Если вам по какой-то причине пришлют платы с новым загрузчиком – прошивка не загрузится (будет минутная загрузка и ошибка), можно попробовать сменить пункт Процессор на ATmega328p
  • Для проектов на Wemos выбираем (LOLIN)Wemos D1 R2 & mini
  • Для проектов на NodeMCU выбираем NodeMCU 1.0
  • В некоторых проектах, например GyverLamp2 (второй версии) для прошивки в esp8266 нужно выбрать плату Generic esp8266, читайте особенности загрузки на странице проекта!
  • Для проектов на Digispark порт выбирать не надо, читай инструкцию выше

blank

blank

7. Настроить программу. Очень часто в начале кода моих программ можно встретить блок настроек. Настройки обычно имеют вид

#define SOME_SETTING 1  // 1 включено, 0 выключено

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

8. Загрузить прошивку. Нажимаем стрелочку в левом верхнем углу окна программы и прошивка загружается. Не загружается? Читаем гайд выше, там описаны все возможные причины.

Загружать прошивку желательно до подключения компонентов, чтобы убедиться в том, что плата рабочая. После сборки можно прошить ещё раз, плата должна спокойно прошиться. В проектах с мощными потребителями в цепи питания платы 5V (адресная светодиодная лента, сервоприводы, моторы и проч.) необходимо подать на схему внешнее питание 5V перед подключением Arduino к компьютеру, потому что USB не обеспечит нужный ток, если потребитель его потребует – это может привести к выгоранию защитного диода на плате Arduino.

9. Если что-то не работает – читай инструкцию, в ней описан каждый шаг и решение всех проблем. Также в самом начале есть видео, где всё показано ещё более подробно.

Заметка для тех, кто не читал инструкцию и получил какую-то ошибку. Вот список самых частых причин:

  • Не распаковал архив и запустил скетч прямо из него, получил ошибку компиляции в стиле not declared in this scope. РАСПАКУЙ АРХИВ
  • В логе ошибок встречается фраза no such file or directory – не установил библиотеки. УСТАНОВИ БИБЛИОТЕКИ
  • Происходит ошибка загрузки. ВЕРНИСЬ К ИНСТРУКЦИИ ПО НАСТРОЙКЕ IDE
  • На плате что-то греется и прошивка не грузится. ДОПУСТИЛ ОШИБКУ ПРИ СБОРКЕ, ВСЁ СГОРЕЛО
  • Установил старую или кривую версию Arduino IDE и получил непонятные ошибки – удали старую и УСТАНОВИ СВЕЖУЮ ВЕРСИЮ
  • Некоторые проекты будут работать только на тех платах, что показаны в видео и описаны на странице проекта. Под другие платы прошивка компилироваться не будет!

Как проверить, работает ли моя плата Arduino или нет?

Если у вас в руках доска, но вы не знаете, работает она или нет, как проверить, работает она или нет?

Примечание: после комментария @ Ricardo к моему последнему сообщению я публикую это!

Подключите плату к USB-порту компьютера и проверьте, светится ли зеленый светодиодный индикатор питания на плате. Стандартные платы Arduino (Uno, Duemilanove и Mega) имеют зеленый светодиодный индикатор питания, расположенный рядом с переключателем сброса.

Оранжевый светодиод рядом с центром платы (помеченный «Pin 13 LED» на изображении ниже) должен включаться и выключаться при включении платы (платы поставляются с завода, на котором предварительно установлено программное обеспечение, чтобы мигать светодиод, как простая проверка того, что плата работает).

введите описание изображения здесь

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

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

Онлайн-руководства по началу работы с Arduino доступны для Windows , Mac OS X и Linux .

Как проверить работоспособность китайской Ардуино?

Приобрел на алиэкспрессе вот такой девайс, на нем 2 светодиода (в оригинале, как я понял, 1), один ON горит постоянно, второй L мигает. Подключил платку к Arduino IDE, не смог выбрать порт, полез гуглить, оказалось, что нужно скачать драйвер для CH341SER (что это, я не знаю, потому как чип вроде Mega328). Скачал, установил, в IDE появился мой девайс:
27558963469c4e69a12738f0feab233e.png

Попытался загрузить скетч BLINK, не получилось, выдал ошибку:
ee1575c1140d46519fc2c3bab9a1b9ea.png

На этом я завис, что делать, не очень понятно. Во-первых, я подозреваю, нужно выбрать правильный тип из списка:
0fa5bb3f8c1548c497e6655535459c2b.png

Но что выбрать, непонятно. Прошу помощи — хочется уже запустить девайс и проверить его работоспособность.

Гайд для новичков Arduino

На данной странице находится максимально подробный гайд по началу работы с Arduino, в котором можно найти ответы на все вопросы касательно установки, подключения и загрузки прошивки, а также по работе с моими проектами. Внимательно изучите гайд, прежде чем писать мне на почту или в нашу группу ВК, если у вас что-то не получается, тут есть ответы на все вопросы. Также прилагаю список уроков на этом сайте, где можно найти ещё больше базовой информации:

  • Начало работы
  • Работа с Arduino IDE
  • Первая прошивка, ошибки, FAQ
  • Питание платы

Arduino IDE

Arduino IDE – программа для написания и загрузки прошивки в плату, скачать можно с официального сайта вот здесь (Внимание! Перевод языка страницы в браузере ломает кнопки!) . Перед загрузкой вам предложат пожертвовать на развитие проекта, можно отказаться и нажать JUST DOWNLOAD (только скачать). Либо открываем прямую ссылку на загрузку версии 1.8.13 и сразу качаем файл.

Для работы рекомендуется компьютер с Winodws 7 или выше, либо Linux/MacOS

  • Если у вас Windows XP, придётся установить версию 1.6.13 , более свежие версии будут очень сильно тормозить или не будут работать вообще. Есть ещё одна проблема: некоторые библиотеки не будут работать на старых версиях Arduino IDE, также не будет работать поддержка плат семейства esp8266, поэтому крайне рекомендуется обновить свой компьютер до Windows 7 или выше
  • Установка на Linux из системного репозитория – читать тут
  • Установка на MacOS – читать тут

Для старых версий Arduino IDE, а также для некоторых других программ, понадобится пакет Java JRE. Скачать можно с официального сайта для своей операционной системы.

Установка

Arduino IDE устанавливается как обычная программа, запускам и жмём далее далее далее…

Драйвер

Во время установки Arduino IDE программа попросит разрешения установить драйвера от неизвестного производителя, нужно согласиться на установку всего предложенного.

Обновление

Перед установкой новой версии нужно удалить старую. Ни в коем случае не удаляйте папку установленной IDE из Program Files, удалять нужно через “Установка и удаление программ“, либо запустив файл uninstall.exe из папки с установленной программой. Иначе установщик откажется устанавливать новую программу, так как в системе остались следы от старой. Решение этой проблемы описано в видео ниже. Вкратце о том, как удалить IDE вручную:

  • Папка с программой
    • C:Program Files (x86)Arduino (64-битная версия Windows)
    • C:Program FilesArduino (32-битная версия Windows)
    • ДокументыArduino
    • C:Пользователи (или Users)Ваш_пользовательAppDataLocalArduino15

    Удаляем следы из реестра:

    • Открыть редактор системного реестра:
      • Windows 10: Пуск/regedit
      • Предыдущие: Пуск/Выполнить/regedit
      • Инструкция для всех Windows
      • В окне поиска пишем arduinouninstall
      • Поиск

      Другие проблемы

      • Если перестала запускаться Arduino IDE – удаляем файлик preferences.txt из C:Пользователи (или Users)Ваш_пользовательAppDataLocalArduino15

      Портативная версия

      Вместо полной установки программы можно скачать архив с уже “установленной”, на странице загрузки он называется Windows ZIP file. Вот прямая ссылка на 1.8.13. Распаковав архив, получим портативную версию Arduino IDE, которую можно скинуть на флешку и использовать на любом компьютере без установки программы. Но понадобится установить драйвер CH341 для китайских плат, а также драйверы из папки с программой Arduino IDE (подробнее в следующем уроке). Возможно понадобится установить Java.

      Работа на смартфоне

      Писать и загружать прошивку через смартфон тоже можно, понадобится смартфон на Android и приложение ArduinoDroid . Также для тренировки и удобного редактирования скетчей можно использовать CppDroid , но загружать в плату она не умеет.

      Первое подключение

      Осмотр платы

      • Замкнутые пины (вроде бы паяются китайцами вручную)
      • Неприпаянная нога компонента
      • “Торчащие” вверх или под углом компоненты типа резисторов и конденсаторов, припаянные только с одной стороны
      • Компоненты со смещением
      • “Сопля” между ногами компонента

      blank

      blank

      Реакция на подключение питания

      • При подключении USB загорается и горит светодиод PWR
      • Если плата новая и на ней прошит загрузчик (он обязан быть прошит) – однократно мигает светодиод L
      • Примечание: светодиоды могут быть любого цвета
      • На новой плате прошито “мигание светодиодом”, поэтому светодиод L продолжит мигать один или два раза в секунду в зависимости от версии загрузчика
      • При нажатии на кнопку сброса (RESET , единственная кнопка на плате) должен однократно мигнуть светодиод L , сигнализируя о завершении работы загрузчика.

      Драйвер USB контроллера

      CH341

      В своих проектах я использую “Ардуино-совместимые” китайские платы, у которой для подключения по USB используется контроллер CH340/CH341. Чтобы он распознавался компьютером, нужно установить драйвер.

      Скачать драйвер можно по ссылке:

      • FTP сайта
      • Яндекс.Диск
      • Сайт driverslab

      Запускаем и в появившемся окошке нажимаем INSTALL. Готово!

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

      • C/Program Files/Arduino/drivers (для 32-х разрядной системы)
      • C/Program Files (x86)/Arduino/drivers (для 64-х разрядной системы).
      • dpinst-x86.exe (для 32-х разрядной системы)
      • dpinst-amd64.exe (для 64-х разрядной системы)

      blank

      Драйвер CH341 для Mac можно скачать по ссылке с моего сайта , либо со страницы источника . Если у вас будут какие-то проблемы с OSX Sierra и выше, читайте вот эту статью .

      В Linux уже встроен необходимый драйвер, но Arduino IDE может отказаться с ним работать: Linux определяет ардуинку как устройство ttyUSB*, обычно это ttyUSB0 (это можно узнать командой dmesg в терминале), то есть в системе появляется интерфейс /dev/ttyUSB0. Чтобы с ним работать, нужны права доступа. Читать и писать на устройство /dev/ttyUSB0 имеет пользователь root и пользователи группы dialout. Работы с правами суперпользователя лучше избегать, поэтому следует занести своего пользователя в группу dialout. Это можно сделать следующей командой (обратите внимание, команда whoami в обратных кавычках)

      sudo usermod -a -G dialout `whoami`

      После этого нужно перелогиниться. Дальше запускаем Arduino IDE и в меню «Инструменты/Порт» ставим галочку напротив /dev/ttyUSB0.

      Вся информация по работе с IDE на данной ОСи есть вот в этой статье

      FT232

      На оригинальных Arduino Nano стоит USB контроллер производства FTDI – FT232, драйвер для всех версий ОС можно скачать с официального сайта (прямая ссылка на инсталлятор для Windows) . Некоторые очень редкие китайцы паяют на свои Наны поддельные FTDI контроллеры, которые буквально выходят из строя после некоторых обновлений Windows. Если вам достался такой экземпляр (я никогда не даю ссылки на такие поделки) – подробности по ситуации читайте здесь . Как восстановить контроллер и сделать рабочий драйвер – читайте здесь .

      CP2102

      На некоторые Arduino-совместимые платы китайцы ставят контроллер USB CP2102. Драйвер на него в большинстве случаев уже есть в системе (на Linux точно есть), если не работает – скачать можно с официального сайта .

      • Прямая ссылка на драйвер для Windows всех версий
      • Прямая ссылка на драйвер для Mac OS

      На Windows установка производится следующим образом: достаём из архива и

      Настройка и прошивка

      Подключение платы

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

      • Неисправен USB кабель
      • Неисправен USB порт компьютера
      • Неисправен USB порт Arduino
      • Попробуйте другой компьютер, чтобы исключить часть проблем из списка
      • Попробуйте другую плату (желательно новую), чтобы исключить часть проблем из списка
      • На плате Arduino сгорел входной диод по линии USB из-за короткого замыкания, устроенного пользователем при сборке схемы
      • Плата Arduino сгорела полностью из-за неправильного подключения пользователем внешнего питания или короткого замыкания

      Компьютер издаст характерный сигнал подключения нового оборудования, а при первом подключении появится окошко “Установка нового оборудования”. Если этого не произошло:

      • См. предыдущий список неисправностей
      • Кабель должен быть data-кабелем, а не “зарядным”
      • Кабель желательно втыкать напрямую в компьютер, а не через USB-хаб
      • Не установлены драйверы Arduino (во время установки IDE или из папки с программой), вернитесь к установке.

      В списке портов (Arduino IDE/Инструменты/Порт) появится новый порт, обычно COM3. Если этого не произошло:

      • См. предыдущий список неисправностей
      • Некорректно установлен драйвер на USB контроллер Arduino
        • Переверните плату и найдите “узкую” микросхему. Если на ней написано CH341 – ставим драйвер по инструкции выше
        • Если написано FT232R – опять же инструкция выше
        • Если ничего не написано – открываем “Диспетчер устройств”, смотрим блок “Другие устройства”. Если при подключении платы к компьютеру там появляется FT232R USB UART – смотрим инструкцию выше

        Выбор и настройка платы (Arduino NANO)

        • Выбираем соответствующую плату в ИнструментыПлата Большинство моих проектов сделаны на Arduino Nano. Если вы используете Nano:
          • В микроконтроллер китайских плат зашит “старый” загрузчик, поэтому выбираем ИнструментыПроцессорATmega328p (Old Bootloader). Если вам по какой-то причине пришлют платы с новым загрузчиком – прошивка не загрузится (будет минутная загрузка и ошибка), можно попробовать сменить пункт Процессор на ATmega328p

          Загрузка прошивки

          “Загрузка” прошивки происходит в два этапа – компиляция и непосредственно загрузка в микроконтроллер. Компиляция – проверка кода на наличие ошибок, её можно запустить, нажав кнопку с символом галочки в верхнем меню программы. Компилировать код можно даже не подключая плату к компьютеру! При нажатии на кнопку с символом стрелочки начнётся компиляция, а затем загрузка скомпилированного кода в плату.

          Вставьте следующий код с полной заменой содержимого в IDE и загрузите его. Должен начать мигать светодиод L на плате, это означает что все программы настроены верно и можно переходить к работе!

          esp8266 (Wemos, NodeMCU)

          ESP8266 – микроконтроллер с WiFi на борту, на его базе сделаны платы Wemos D1 mini, NodeMCU и другие. Китайские платы Wemos и NodeMCU подключаются к компьютеру по USB при помощи бортового USB-TTL преобразователя, причём китайцы паяют CH340 или CP2102 (функционально не имеют отличий), обычно это даже указано на странице товара. Установка драйверов разобрана выше на этой странице.

          Также для работы с esp нужно добавить поддержку плат в Arduino IDE:

          • Запустить Arduino IDE, перейти в Файл/Настройки/
          • В окошко “Дополнительные ссылки…” Вставить http://arduino.esp8266.com/stable/package_esp8266com_index.json
          • Нажать ОК
          • Перейти в Инструменты/Плата/Менеджер плат… Начать вводить в поиске “esp”. Выбрать и установить ESP8266 boards
          • Теперь в списке плат Инструменты/Плата/ появится семейство плат на esp8266! Выбираем соответствующую своей плате конфигурацию.
          • Выбираем порт, к которому подключена плата
          • На четвёртом скриншоте ниже показаны настройки платы по умолчанию, изменены только выделенные красным (плата и порт)

          blank

          blank

          blank

          blank

          Для проверки работоспособности платы (например, Wemos Mini) выбираем стандартные настройки и загружаем тестовый “блинк”. Должен начать мигать светодиод на плате.

          Digispark

          Digispark – плата на базе ATtiny85, загрузка в которую может производиться через бортовой USB. Для работы с Digispark нужно добавить поддержку плат в Arduino IDE:

          • Запустить Arduino IDE, перейти в Файл/Настройки/
          • В окошко “Дополнительные ссылки…” Вставить
            • http://digistump.com/package_digistump_index.json
            • или https://raw.githubusercontent.com/digistump/arduino-boards-index/master/package_digistump_index.json

            “Голые” МК

            Для начала рекомендуется изучить вот эти два урока: первый и второй . У проектов на базе голого микроконтроллера есть два варианта:

            • Если проект основан на ATmega328 (Arduino Nano/Mini) и на плате есть источник тактирования на 16 МГц (резонатор), то микроконтроллер можно просто перепаять с Arduino и загружать прошивку через внешний USB-TTL переходник, как на Arduino Pro Mini. Либо загрузить прошивку, и потом перепаивать – всё будет работать.
              • Если источника тактирования нет – так делать нельзя! Сначала нужно настроить МК на внутреннее тактирование, подключив ISP программатор к плате Arduino и выбрав внутренний источник тактирования в настройках ядра. Подробнее читайте в уроке.

              Установка библиотек

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

              Менеджер библиотек

              Большинство Ардуино-библиотек можно установить автоматически из встроенного в программу менеджера библиотек:

              • Скетч/Подключить библиотеку/Управлять библиотеками…
              • Комбинация клавиш Ctrl+Shift+I

              Нужную библиотеку можно найти в поиске по названию и нажать Установка, библиотека будет автоматически установлена в папку с библиотеками. Arduino IDE проверяет обновления библиотек при запуске и предложит обновиться, если найдёт обновления.

              Скачивание с GitHub

              Не все существующие библиотеки есть в менеджере библиотек и скачать их можно только с GitHub. Есть два способа: скачать весь репозиторий и скачать релиз. Весь репозиторий со всеми “лишними” служебными файлами можно скачать одним архивом вот так, нажав Code/Download ZIP

              Если у библиотеки есть релизы – справа будет отмечен последний (свежий) релиз. Нажимаем на него:

              И в новом окне нажимаем Source code (zip) – начнётся загрузка архива. Скачивание релиза более предпочтительно, так как содержит только файлы библиотеки.

              blank

              В обоих случаях библиотека скачается как .zip архив.

              Автоматическая установка

              Скачанный .zip архив можно установить в автоматическом режиме через Скетч/Подключить библиотеку/Добавить .ZIP библиотеку… В открывшемся окне выбрать скачанный архив, библиотека будет установлена по указанному в настройках пути.

              Ручная установка

              Для начала нужно распаковать архив (стандартный архиватор Windows или WinRAR). Чтобы Arduino IDE смогла использовать библиотеку, нам нужно положить её туда, где программа будет её искать. Таких мест три (на примере Windows):

              • Документы/Arduino/libraries/
              • Папка с программой/libraries/
                • C/Program Files/Arduino/libraries/ (Windows 32)
                • C/Program Files (x86)/Arduino/libraries/ (Windows 64)
                • В портативной версии IDE желательно держать библиотеки в Папка с программой/libraries

                Рекомендуется держать все библиотеки в одном месте, чтобы не было путаницы. Лично я устанавливаю все библиотеки в папку с программой (в Program Files), но для этого могут потребоваться права администратора (зависит от версии и настроек Windows). Если у вас возникли с этим проблемы – устанавливайте в Документы/Arduino/libraries/. На скриншотах показана установка скачанной с GitHub библиотеки в папку с программой и в документы. Ставить нужно в одно место, я просто показываю оба варианта.

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

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

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

                Частые ошибки в коде, приводящие к ошибке компиляции

                • …no such file or directory – компилятор не может найти файл, который используется в коде. Чаще всего это библиотека, которую не установили или установили неправильно
                • expected ‘,’ or ‘;’ – пропущена запятая или точка запятой на предыдущей строке
                • stray ‘320’ in program – русские символы в коде
                • expected unqualified-id before numeric constant – имя переменной не может начинаться с цифры
                • … was not declared in this scope – переменная или функция используется, но не объявлена. Компилятор не может её найти
                • redefinition of … – повторное объявление функции или переменной
                • storage size of … isn’t known – массив задан без указания размера

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

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

                • Если неправильно выбран COM порт – прошивка не загрузится с ошибкой avrdude: ser_open(): can’t open device. Вернитесь к пункту “Выбор и настройка платы” этого урока и убедитесь в том, что выбор порта активен и при подключении платы появляется новый.
                • Большинство проблем при загрузке, вызванных “зависанием” ардуины или загрузчика, лечатся полным отключением Ардуины от питания. Потом вставляем USB и по новой прошиваем.
                • Причиной ошибки загрузки может быть неправильно выбранная плата в “Инструменты/Плата”, а также неправильно выбранный процессор в “Инструменты/Процессор”.
                  • Если это Arduino Nano – попробуйте оба, Old и не Old.

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

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

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

                  Частые вопросы

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

                    ▶Проекты AlexGyver◀

                    1. Установить Arduino IDE и драйверы, как написано в гайде. Если это ваш первый раз – желательно не подключать ничего к новой плате, а загрузить пробную прошивку из гайда и убедиться, что всё загружается и работает. Если после сборки схемы прошивка перестанет загружаться – увы, схема собрана с ошибками и плата уже могла сгореть. Но она работала, мы это проверили =)

                    • Если проект основан на esp8266 или Digispark – устанавливаем поддержку этих плат, как описано в гайде выше.

                    2. Скачать архив со страницы проекта. Ссылка всегда одна, она ведёт на прямую загрузку архива с хранилища GitHub. Когда проект обновляется (об этом может быть написано на странице проекта), ссылка на архив остаётся той же, но в нём будут уже какие-то изменённые файлы, добавлены новые версии прошивки и т.д. Все обновления указаны на странице проекта.

                    3. Распаковать архив. Архив имеет формат .zip, для его распаковки можно использовать встроенные инструменты операционной системы, либо популярный WinRAR. Если не распаковать архив – прошивка откроется неправильно. Я не отличаюсь буйной фантазией и всегда называю папки одинаково, вот что может быть в архиве проекта:

                    • firmware – прошивки для Arduino
                    • software – программы для ПК
                    • libraries – библиотеки
                    • schemes – схемы
                    • PCB – gerber файлы печатных плат
                    • docs – всякие документы
                    • Android – исходники приложения
                    • 3Dprint – модели для печати
                    • processing – программа на Processing

                    4. Установить библиотеки. К прошивкам моих проектов всегда идут библиотеки, необходимые для работы кода. Библиотеки в проектах часто пересекаются, но рекомендуется ставить именно идущую в комплекте с проектом версию, так как более старые или новые могут быть несовместимы.

                    Содержимое папки libraries из архива помещаем в

                    • С/Program Files/Arduino/libraries/ (Windows x32)
                    • C/Program Files (x86)/Arduino/libraries/ (Windows x64)

                    Если возникнут проблемы с доступом к этой папке (на Windows 10), то библиотеки можно положить в

                    • Документы/Arduino/libraries/

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

                    5. Открыть скетч (так называется файл с программой). При запуске файла скетча автоматически откроется Arduino IDE. Важно: если в папке со скетчем есть несколько файлов – запускаем любой с логотипом Arduino. Остальные файлы должны подтянуться автоматически и образовать вкладки в окне программы. Если запускать скетч прямо из архива – вкладки не откроются и скомпилировать/загрузить программу будет невозможно.

                    Вкладки в Arduino IDE

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

                    • Для проектов на Arduino Nano выбираем Arduino Nano, а также ИнструментыПроцессорATmega328p (Old Bootloader). Если вам по какой-то причине пришлют платы с новым загрузчиком – прошивка не загрузится (будет минутная загрузка и ошибка), можно попробовать сменить пункт Процессор на ATmega328p
                    • Для проектов на Wemos выбираем (LOLIN)Wemos D1 R2 & mini
                    • Для проектов на NodeMCU выбираем NodeMCU 1.0
                    • В некоторых проектах, например GyverLamp2 (второй версии) для прошивки в esp8266 нужно выбрать плату Generic esp8266, читайте особенности загрузки на странице проекта!
                    • Для проектов на Digispark порт выбирать не надо, читай инструкцию выше

                    blank

                    blank

                    7. Настроить программу. Очень часто в начале кода моих программ можно встретить блок настроек. Настройки обычно имеют вид

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

                    8. Загрузить прошивку. Нажимаем стрелочку в левом верхнем углу окна программы и прошивка загружается. Не загружается? Читаем гайд выше, там описаны все возможные причины.

                    Загружать прошивку желательно до подключения компонентов, чтобы убедиться в том, что плата рабочая. После сборки можно прошить ещё раз, плата должна спокойно прошиться. В проектах с мощными потребителями в цепи питания платы 5V (адресная светодиодная лента, сервоприводы, моторы и проч.) необходимо подать на схему внешнее питание 5V перед подключением Arduino к компьютеру, потому что USB не обеспечит нужный ток, если потребитель его потребует – это может привести к выгоранию защитного диода на плате Arduino.

                    9. Если что-то не работает – читай инструкцию, в ней описан каждый шаг и решение всех проблем. Также в самом начале есть видео, где всё показано ещё более подробно.

                    Заметка для тех, кто не читал инструкцию и получил какую-то ошибку. Вот список самых частых причин:

Предисловие

Как известно, среда Arduino (AVR) не содержит функции внутрисхемной отладки, что создаёт большие неудобства при поиске сложных ошибок и сопровождении проектов. Я хочу показать два способа, при помощи которых вы сможете отлаживать свои скетчи разного уровня сложности. Для первого способа вам понадобятся только программы, а для второго нужен недорогой (по сравнению с оригинальным отладчиком) адаптер, который вы можете либо собрать самостоятельно, либо купить готовый.
В общем, ничего нового для тех, кто пользуется отладчиками постоянно, но может быть полезным для пользователей Arduino (AVR).

Сборка при помощи Makefile

Прежде чем мы подойдём к описанию отладки в железе (во второй части) нам нужно немного потренироваться. Вероятно многие знают, что среда Arduino вызывает компилятор avr-gcc со всем окружением, автоматически настраивает параметры его вызова и запускает процесс сборки. Так вот, нам нужно повторить этот процесс явно. Делать это мы будем не вручную, хотя некоторые телодвижения всё-таки понадобятся. Нужно это для того, чтобы получить отладочный объектный файл в формате ELF. Среда Arduino подчищает за собой и у нас нет доступа ни к опциям компилятора, ни к результатам компиляции.

Это подводит нас к вопросу использования утилит для автоматической сборки avr-gcc проекта, а ещё точнее — скетча с библиотеками Arduino. Тут можно было бы погрустить, т.к. дело это не простое, но, как говорится, всё уже сделано до нас. Оказывается, на github уже есть всё необходимое именно для сборки скетчей с библиотеками Arduino. Проект называется Arduino-Makefile. Как не трудно догадаться из описания, этот проект содержит Makefile для автоматической сборки проектов на Arduino. Из перечисленных в описании особенностей мы обратим внимание только на некоторые.

Пакет Arduino-Makefile — это набор конфигурационных файлов, примеров и описаний. В нём нет утилит, которые всё это должны использовать. Нет также и среды разработки, т.е. сборка осуществляется через командную строку. Это означает, что вы можете прикрутить любую удобную для вас IDE, которая поддерживает сборку через Makefile. Я обычно использую Visual Studio.

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

Важно отметить, что поддерживаются файлы с различными расширениями (*.ino, *.pde, *.c и *.cpp). Дело в том, что одним из отладчиков у нас будет AVR Studio 4. При загрузке в неё отладочного файла исходники в дереве проектов будут расположены в разных папках: cpp-файлы в sources, а остальные в headers. Если мы оставим расширение для скетча (ino), то файл не попадёт в sources и на него не будет действовать подсветка синтаксиса. Смотреть на это невозможно. Поэтому возьмём на заметку, что расширение для скетчей при сборке для отладки в AVR Studio нужно поменять на стандартные (.c или .cpp).

Инструментарий

Мы выяснили, что можем собирать скетчи. Теперь посмотрим как будет организован сам процесс сборки и отладки. Я обещал показать два способа. У каждого из них есть свои плюсы и минусы. Сделаем их краткий обзор.

Способ 1. Создаём отладочный файл, загружаем его в Proteus, отлаживаем там же.

Достоинства:
— относительная простота отладки (с подключением монитора последовательного порта нужно будет только помучиться);
— доступ во внешний мир через последовательный порт;
— построение графиков (доступны виртуальные измерительные приборы);
— возможность моделировать схему в режиме реального времени;
— в отдельных окнах доступны регистры мк, области памяти, глобальные переменные и исходный код, конечно, в том числе его ассемблерный вариант.

Недостатки:
— платность Proteus;
— ограниченный набор периферии;
— сложные модели не могу учитывать всех особенностей оригинальных компонентов.

Способ 2. Создаём отладочный файл, загружаем его в AVR Studio 4, отлаживаем, используя специальный плагин Proteus VSM Viewer для AVR Studio 4.

По достоинствам и недостаткам почти то же, что и способе 1. Можно добавить, что AVR Studio показывает подробное дерево всех регистров моделируемого мк, вплоть до битов, что очень удобно. Из минусов стоит отметить, что отладка оптимизированного кода имеет свои особенности и не так просто понять как заставить отладчик останавливаться в нужных местах.

Способ 3. Создаём отладочный файл, загружаем его в AVR Studio 4, отлаживаем, используя программный эмулятор JTAG ICE mkII и специальный адаптер (HappyJTAG2).

 

Достоинства:
— это настоящая отладка в реальном «железе» с использованием JTAG ICE mkII отладчика (поддержка мк вплоть до ATmega2560);
— HappyJTAG 2.45 работает на Windows 7 x64, нужно только пропустить одно окошко, где просят всё-таки купить драйвера.

Недостатки:
— замечена нестабильная работа HappyJTAG2 с небольшими по объёму исходниками;
— нестабильная работа AVR Studio при выполнении отладочных действий;
— автор HappyJTAG2 давно забросил своё детище (видимо с приходом AVR Studio 5 и Atmel Studio);
— некоторые особенности подключения (COM4 или один из первых 4-х последовательных портов должен быть свободен или отсутствовать, т.к. AVR Studio перебирает COM1-COM4 в поиске отладчика). Именно свободен или отсутствовать, т.к. HappyJTAG2 работает, так скажем, «изнутри».

Как вы видите я показал три способа, но в настоящее время практически у меня заработали только два из них. Первый способ будет описан в этой статье. Второй способ, к сожалению, мне не удалось повторить. Нужно найти «совместимую» комбинацию Proteus и AVR Studio. На картинке использована последняя студия AVR Studio 4.19.730 и Proteus 7.7 SP2. Когда-то давно я использовал этот способ, но при наличии железного отладчика пользоваться им не имеет особого смысла. Третий способ я оставил для второй части. Там нужен будет адаптер и описание его подключения к платам Arduino, поддерживающим отладку по JTAG.

И что же для этой всей кухни нам понадобится? Для начала нужно забыть про убогое Arduino IDE, его можно использовать только для контрольных проверок при сборке скетчей. Далее, нам понадобятся:

— Arduino-Makefile — набор конфигурационных файлов для ручной сборки проектов на Arduino;
— какой-нибудь редактор с подсветкой синтаксиса C++ и умением выполнять внешние команды (Notepad++, VS20xx, Far, …);
— Proteus 7.x — известный симулятор смешанных (аналого-цифровых) схем;
— терминальная программа (PuTTY, ZOC Pro), которая будет аналогом монитора;
— программа, создающая нуль-модемные виртуальные последовательные порты (VSPD, …);
— Arduino IDE 1.6.x (нам нужны библиотеки и компилятор avr-gcc);
— WinAVR (нам нужны binutils из его комплекта, это набор unix команд для Windows);
— avr gcc 4.9.2 (компилятор посвежее, если не хотите использовать тот, что идёт в комплекте с Arduino IDE);
— AVR Studio 4.19.730 — последняя версия среды разработки от Atmel перед переходом на Visual Studio (понадобится только для второй части);
— HappyJTAG 2.45 (понадобится только для второй части).

Будем считать, что вы знаете как спросить у Google где достать всё это хозяйство. На всякий случай я приведу полезные ссылки в конце статьи. Некоторые комментарии по поводу инструментария.

Как известно, Proteus платный, но это не самое печальное. К сожалению, его библиотеки не на столько близки к реальному миру, как хотелось бы. К примеру, Ethernet shield W5100 вы промоделировать в нём не сможете (по крайней мере в версии 7.x). Поэтому, уважаемые последователи Arduino, идите истинным путём. Только отладка и только в железе спасут ваши души от неправильно поставленных вопросов. Proteus мы будем использовать как инструмент обучения, а в полевых условиях — только JTAG.

Отладка скетчей Arduino (AVR) в Proteus 7.x

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

Шаг 1. Скачиваем и устанавливаем среду разработки Arduino. Для определённости допустим, что она будет из серии 1.6.x. Здесь сразу сделаю несколько замечаний. Вообще, от Arduino нам нужны только библиотеки. Если не считать всего остального, то сама идея упрощённого вида программы очень даже хороша (если сравнить C# и C++ или, не дай боже, C++/CLI, то это небо и земля). Отсутствие же нормальных отладочных средств привело, прямо скажем, к безграмотному программированию. Вместо того, чтобы осознанно превращать задуманный алгоритм в программный код, пользователи Arduino вынуждены делать комбинации из магических заклинаний, выцеживать инфу через Serial.print() и только некоторые пытаются статически прочитать исходники библиотек. Тяжко на это всё смотреть.

Я отвлёкся, а вы, наверное, успели поставить среду по стандартным путям. Желательно, чтобы папка Arduino находилась в корне раздела (C:Arduino). Это связано с путями в makefile, которые не любят пробелы в «Program Files». Мы позже будем настраивать пути и для тех, у кого папка уже в «Program Files» придётся сделать одну сложную для пользователей Windows вещь — junction point на папку. Возможно, пробел можно экранировать, но я этого не пробовал.

Для определённости, допустим, что путь к среде такой: C:Program FilesArduino.

Шаг 2. Скачиваем и распаковываем Arduino-Makefile. Содержимое папки Arduino-Makefile-master распаковать в C:Arduino-Makefile. Хочу сразу отметить, что внутри есть файл README.md, который лучше посмотреть на github’е, где много чего описано. Также следует взять на заметку файл arduino-mk-vars.md, который содержит описание используемых в пользовательском (проектном) Makefile переменных.

Для работы утилиты make нужен комплект gnu bin utils, который входил в состав WinAVR в своё время. Я не знаю есть ли официальный сайт сборки этих самых утилит под Windows, но можно поступить следующим образом. Вам нужно будет скачать старый добрый WinAVR последней версии и вытащить из него папку utils, где находятся командные утилиты. Можно установить, скопировать папку и деинсталлировать WinAVR (потому что в его комплект входит старый компилятор avr-gcc, который нам не нужен).

Далее, к примеру, создать папку c:avr-gcc и скопировать utils в неё. После этого добавить в переменную PATH (через свойства Компьютера) путь C:avr-gccutilsbin:

set PATH=C:avr-gccutilsbin;%PATH%

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

Шаг 3. Сами знаете где берёте/покупаете Proteus [7.2 — 7.8]. Почему именно этой серии и такой интервал версий? Потому что я их пробовал и вроде бы на несложных проектах они вполне неплохи. Версии больше 7.8 не могли подгрузить объектный файл одного моего проекта в IAR, а ниже я не пробовал. Восьмёрка просто глючная пока, может быть потом кто-то напишет что-то и про неё. Здесь мы с вами возьмём конкретно Proteus 7.8 SP2.

Шаг 4. Используя статью, создаём junction point на папку с установленной средой Arduino, т.е. C:Arduino должна ссылаться на C:Program FilesArduino. Это нужно, чтобы не мудрить с поддержкой пробелов в makefile’ах. Т.о., не копируя папку с Arduino, мы получили её копию в нужном нам месте. Кто пользуется Far’ом может использовать комбинацию Alt+F6 на папке.

Изменяем настройки среды Arduino. Путь к папке со скетчами: C:Arduino-Makefileexamples. Если используете внешний редактор (Notepd++, …), то можете поставить галочку в настройках. При этом Arduino при активизации окна будет обновлять содержимое своего редактора автоматически. Выбираем плату Arduino Mega 2560 и процессор ATmega2560 (на самом деле не так важно что тут выбрать, главное определиться с используемым контроллером).

Пишем пример программы для тестирования сборки из среды Arduino, назовём её Example1 и сохраним в папке скетчей:

void setup()
{
DDRD |= ( 1 << DDD2 );
}

void loop()
{
PIND |= ( 1 << PIND2 );
}


Компилируем и проверяем, что сборка проходит. У меня в Arduino 1.6.7 компоновщик объектных файлов (ld.exe) вылетел с ошибкой, я заменил его на другой (можно, к примеру, из этой сборки).

Шаг 5. Копируем файл C:Arduino-MakefileexamplesWebServerMakefile в папку с нашим скетчем: C:Arduino-MakefileexamplesExample1. Исправляем его содержимое следующим образом:

Makefile

# Arduino Make file. Refer to https://github.com/sudar/Arduino-Makefile

# Suppress printing of Arduino-Makefile configuration.
#ARDUINO_QUIET = 1

# Directory where the Arduino IDE and/or core files are stored. Usually can be auto-detected as `AUTO_ARDUINO_DIR`.
ARDUINO_DIR = ../../../Arduino

# Directory where tools such as `avrdude`, `avr-g++`, `avr-gcc`, etc. are stored in the `bin/` subdirectory.
AVR_TOOLS_DIR = ../../../Arduino/hardware/tools/avr

# Directory where the `*.mk` files are stored.
# Usually can be auto-detected as parent of `Arduino.mk`.
ARDMK_DIR = ../../../Arduino-Makefile

# Device type as listed in `boards.txt` or `make show_boards`.
BOARD_TAG = mega

# Microcontroller model.
# Usually can be auto-detected as `build.mcu` from `boards.txt`
MCU = atmega2560

#CPU speed in Hz
#Usually can be auto-detected as `build.f_cpu` from `boards.txt`, except in
#some 1.5+ cores like attiny where there is a clock submenu.
#F_CPU = 16000000L

# What name you would like for generated target files.
# Defaults to the name of your current working directory, but with underscores (_) instead of spaces.
#TARGET = project

# Baudrate of the serial monitor.
# Defaults to `9600` if it can't find it in the sketch `Serial.begin()`
MONITOR_BAUDRATE = 9600

DEBUG = 1

DEBUG_FLAGS = -O1 -gdwarf-2 -gstrict-dwarf

include ../../Arduino.mk

Вставляем вначале нашего исходника строчку, подключающую явно Arduino.h (это делать необязательно, если есть зависимости от библиотек, указываемые в переменной ARDUINO_LIBS):

#include "Arduino.h"

void setup()
{
DDRD |= ( 1 << DDD2 );
}

void loop()
{
PIND |= ( 1 << PIND2 );
}


Не забываем сохранить исходник и Makefile. Далее, находясь в папке Example1, вводим команду make (при помощи консоли или в Far’е, или другим удобным способом), должна появиться большая портянка, похожая на ту, что выводится в Arduino IDE при включении вывода полной информации о процессе сборки. Это если всё было сделано правильно, если же что-то не получилось, то попытайтесь сначала самостоятельно понять что не так, а потом уж пишите комменты к статье.

Поскольку мы в Makefile закомментировали строку ARDUINO_QUIET = 1, то перед информацией о сборке идёт шапка со значениями переменных самого Makefile. Часть из них задана, а другие вычисляются по ходу выполнения. Это помогает находить ошибки при правке Makefile проекта.

Начало портянки

-------------------------
Arduino.mk Configuration:
- [AUTODETECTED] CURRENT_OS = WINDOWS
- [USER] ARDUINO_DIR = ../../../Arduino
Usage: egrep [OPTION]... PATTERN [FILE]...
Try `egrep --help' for more information.
- [USER] ARDMK_DIR = ../../../Arduino-Makefile
- [AUTODETECTED] ARDUINO_VERSION = 167
- [DEFAULT] ARCHITECTURE = avr
- [DEFAULT] ARDMK_VENDOR = arduino
- [DEFAULT] ARDUINO_SKETCHBOOK =
- [USER] AVR_TOOLS_DIR = ../../../Arduino/hardware/tools/avr
- [COMPUTED] ARDUINO_LIB_PATH = ../../../Arduino/libraries (from ARDUINO_DIR)
- [COMPUTED] ARDUINO_PLATFORM_LIB_PATH = ../../../Arduino/hardware/arduino/avr/libraries (from ARDUINO_DIR)
- [COMPUTED] ARDUINO_VAR_PATH = ../../../Arduino/hardware/arduino/avr/variants (from ARDUINO_DIR)
- [COMPUTED] BOARDS_TXT = ../../../Arduino/hardware/arduino/avr/boards.txt (from ARDUINO_DIR)
- [DEFAULT] USER_LIB_PATH = /libraries (in user sketchbook)
- [DEFAULT] PRE_BUILD_HOOK = pre-build-hook.sh
- [USER] BOARD_TAG = mega
- [COMPUTED] CORE = arduino (from build.core)
- [COMPUTED] VARIANT = mega (from build.variant)
- [COMPUTED] OBJDIR = build-mega (from BOARD_TAG)
- [COMPUTED] ARDUINO_CORE_PATH = ../../../Arduino/hardware/arduino/avr/cores/arduino (from ARDUINO_DIR, BOARD_TAG and boards.txt)
- [USER] MONITOR_BAUDRATE = 9600
- [DEFAULT] OPTIMIZATION_LEVEL = s
- [DEFAULT] MCU_FLAG_NAME = mmcu
- [DEFAULT] CFLAGS_STD =
- [DEFAULT] CXXFLAGS_STD =
- [AUTODETECTED] DEVICE_PATH =
- [DEFAULT] FORCE_MONITOR_PORT =
- [AUTODETECTED] Size utility: AVR-aware for enhanced output
- [COMPUTED] BOOTLOADER_PARENT = ../../../Arduino/hardware/arduino/avr/bootloaders (from ARDUINO_DIR)
- [COMPUTED] ARDMK_VERSION = 1.5
- [COMPUTED] CC_VERSION = 4.8.1 (avr-gcc)
-------------------------
mkdir -p build-mega

Будем считать, что всё прошло успешно, тогда у вас должна появиться папочка build-mega, в котором наш долгожданный Example1.elf — этот тот самый файл, ради которого всё действо затевалось. Этим файлом мы «прошьём мозги» виртуальному мк в Proteus и заживём… с ещё одной степенью свободы.

Шаг 6. Вернёмся к Proteus. Создаём новый проект (dsn-файл)

в папке с исходником

. Достанем из недр библиотек компонент — микроконтроллер ATmega2560 и вставим его куда он поместится, уж здоровый больно. Заполните свойства компонента по картинке. Устанавливать COMPIM пока не обязательно, он понадобиться для работы с монитором.

Затем входим в режим отладки DebugStart/Restart Debugging. Получите картинку, похожую на такую.

Ну, а дальше, всё зависит от полёта вашей фантазии. В окошке исходников будет доступен не только Example1.ino, но и другие зависимые исходники. Можно раскрыть ассемблерный код, регистры процессора, память и что-то там вроде ещё. Читайте доку на Proteus.

Шаг 7. Нужно настроить монитор. Писать лень, надеюсь сделаете это уже самостоятельно. Смысл, вкратце, такой. Создаёте два виртуальных последовательных порта, соединённых нуль-модемом (лучше с номерами больше COM4). Один прописываете в компоненте COMPIM Proteus, а второй в терминальной программе (PuTTY). Не забудьте поправить скорость и кодировку вывода в терминальной программе, по идее она должна совпадать с кодировкой исходных файлов, если захотите делать вывод в монитор по-русски.

Шаг 8. Если хотите использовать avr gcc 4.9.2, то нужно положить содержимое архива в корень диска и исправить путь в переменной AVR_TOOLS_DIR. Только там у меня не заработал avr-size, кажется. Можно поменять его на тот, что идёт в комплекте WinAVR (или Arduino).

Кстати, чтобы размер выводился в нормальном виде нужно добавить опцию в вызов avr-size (файл Arduino.mk):

avr_size = $(SIZE) $(SIZEFLAGS) --format=avr $(1)

Полезные ссылки:

1. Arduino IDE 1.6.x.
2. Arduino-Makefile.
3. WinAVR.
4. avr gcc 4.9.2.
5. Hard links и пр. в Windows.
6. PuTTY.
7. Notepad++.

  1. Здравствуйте, готовлю первый проект, который намерен использовать 24 часа в сутки, и важна стабильность кода. Кто хорошо разбирается в программировании, просто посмотрите код и скажите, всё ли корректно я сделал для стабильной работы? Буду очень благодарен.

    Вкратце, что делает программа — Через Ethernet Shild W5100 по MQTT передаёт данные на Брокер с датчика DHT22 и выводит их в порт.

    /*
      Скетч для вывода в Монитор порта температуры в Цельсиях и Влажности
      с датчика DHT22 и отправки их по MQTT в брокер и MajorDoMo.
    */

    #include <SPI.h>                 // Библиотека SPI шины
    #include <Ethernet.h>            // Ethernet библиотека
    #include <PubSubClient.h>        // Библиотека MQTT
    #include <DHT.h>                 // Библиотека для датчиков DHT11/22

    #define DHTPIN 2                 // Номер пина, к которому подсоединен датчик
    #define DHTTYPE DHT22            // Задаём тип DHT датчика
    DHT dht(DHTPIN, DHTTYPE);

    // Задаём mac и ip адреса в Локальной сети
    byte mac[]    = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
    IPAddress ip{192, 168, 1, 74};      //ip Адрес Ethernet Shild’a Arduino
    IPAddress server{192, 168, 1, 70};  //ip Адрес для MQTT Брокера

    // Шапка Функции Callback (обратный вызов)
    void callback(char* topic, byte* payload, unsigned int length);

    EthernetClient ethClient;                                 //Инициализируем Ethernet клиент
    PubSubClient client(server, 1883, callback, ethClient);   //Инициализируем MQTT клиент

    // Функция Callback
    void callback(char* topic, byte* payload, unsigned int length)
    {
      // Выделяем необходимое кол-во памяти для копии payload
      byte* p = (byte*)malloc(length);
      // Копирование payload в новый буфер
      memcpy(p, payload, length);
      client.publish(«home/data/status/sensor», p, length);
      // Освобождаем память
      free(p);
    }

    void setup()
    {
      // 1 бод равно 0.8 бит/сек
      // 1 бит/сек равно 1.25 бод
      Serial.begin(9600);             // Задаём скорость порта в БОД’ах.
      Serial.println(«DHT22 test!»);  // Тестовое сообщ. при откр. Монитора порта

      dht.begin();

      Ethernet.begin(mac, ip);        // Инициализируем mac, ip

    }

    void loop() {

      int h = dht.readHumidity();     // Переменная типа int для Влажности
      int t = dht.readTemperature();  // Переменная типа int для Температуры

      // Преобразуем переменные для отправки в MQTT в Брокер
      static char char_temp[7];      // Переменная для перевода из int в char
      dtostrf(t, 3, 0, char_temp);    // Перевод из int в char

      static char char_hum[7];
      dtostrf(h, 3, 0, char_hum);

      if (client.connect(«DHTClient»))  //Если DHTClient подкл., то выполняется код…
      {
        if (isnan(t) || isnan(h))     // Проверка удачно ли прошло считывание с DHT22
        {
          Serial.println(«Failed to read from DHT22»);  // Не удалось прочитать DHT22
        } else {
          // Отправка данных в Монитор порта при удачной проверке
          Serial.print(«Humidity: «);
          Serial.print(h);
          Serial.print(» %t«);
          Serial.print(«Temperature: «);
          Serial.print(t);
          Serial.println(» *C»);

          //Отправка данных по MQTT в Брокер
          client.publish(«home/data/status/sensor/temp», char_temp);  //Температура
          client.publish(«home/data/status/sensor/hum», char_hum);    //Влажность
          delay(5000);              // Отправка данных в Брокер раз в 5 секунд
        }

      } else {
        client.disconnect();      // иначе отключиться
      }
    }

    И ещё…, компилятор выдаёт такое сообщение, по смыслу вроде нечего серьёзного, правильно ли я понимаю?)):

    C:UsersLinuxDocumentsArduinoMQTT_DHT22MQTT_DHT22.ino:29:6: warning: unused parameter ‘topic’ [Wunusedparameter]

    void callback(char* topic, byte* payload, unsigned int length)

          ^

    Скетч использует 18 474 байт (57%) памяти устройства. Всего доступно 32 256 байт.
    Глобальные переменные используют 778 байт (37%) динамической памяти, оставляя 1 270 байт для локальных переменных. Максимум: 2 048 байт.

  2. Первое, при переменных:

    int h = dht.readHumidity();     // Переменная типа int для Влажности
      int t = dht.readTemperature();  // Переменная типа int для Температуры

    условие бессмыслено:

    if (isnan(t) || isnan(h))     // Проверка удачно ли прошло считывание с DHT22

    Целое число не может быть NaN’ом. Да и проверку (при типе float, если, конечно, датчик может вернуть NaN) нужно делать сразу после получения данных, потому что все остальные операции теряют смысл.
    Второе — зачем выделять память, копировать данные и освобождать память в функции, можно воспользоваться «оригиналом» payload:

    // Функция Callback
    void callback(char* topic, byte* payload, unsigned int length)
    {
      // Выделяем необходимое кол-во памяти для копии payload
      byte* p = (byte*)malloc(length);
      // Копирование payload в новый буфер
      memcpy(p, payload, length);
      client.publish(«home/data/status/sensor», p, length);
      // Освобождаем память
      free(p);
    }

    Для callback’ов это нормально — сигнатура функций «ответчиков» может быть избыточна.

    Это поверхностный взгляд на код…

  3. Если парит warning про неиспользованный параметр — пользуйте вот это:

    #define UNUSED(expr) do { (void)(expr); } while (0)

    Внутри callback пишете:

    void callback(char* topic, byte* payload, unsigned int length)
    {
       UNUSED(topic);
      …
    }

    и всё — нет варнинга, код при этом не раздувается ни на байт, т.к. оптимизатор благополучно вырежет бессмысленную конструкцию, а анализатор не будет ругаться на unused variable, т.к. она как бы «используется» ;)

  4. По самому коду:

    1. Что будет, если в функцию callback в параметре length придёт 0? В принципе, оно безопасно отработается memcpy, но я такие вещи привык разбирать ручками, паранойя :eek:

    2. Все строки типа

    Serial.println(«DHT22 test!»);

    обернуть в макрос F — сэкономите немало оперативы. Надо, чтобы каждая строка была обёрнута в этот макрос, вот так:

    Serial.println(F(«DHT22 test!»));

    3. Не увидел большого смысла в работе с памятью внутри callback — имхо можно всё напрямую передавать:

    void callback(char* topic, byte* payload, unsigned int length)
    {
      client.publish(«home/data/status/sensor», payload, length);
    }

  5. Даже не думал, что можно так оптимизировать код, спасибо за помощь, наконец-таки понял что делал этот бесполезный код в функции callback. Кстати, касаемо условия connect/disconnect в программе — правильно додумал поставить?)):

    if (client.connect(«DHTClient»))
    {
    ……….
    } else {
    client.disconnect();
    }

  6. Нет, неправильно поставили, перевожу на русский: «если клиент законнектился, то выполнить это, иначе — отконнектиться.». У вас client.dicsonnect выполняется только в том случае, если коннект неуспешен, что — неверно. Переместите строчку client.disconnect перед закрывающей скобкой блока if{ }.

  7. Не совсем уверен, что понял правильно. Вот так?

    void loop() {

      int h = dht.readHumidity();      // Переменная типа int для Влажности
      int t = dht.readTemperature();   // Переменная типа int для Температуры

      // Преобразуем переменные для отправки по MQTT в Брокер.
      // В обоих случаях используем с запасом массив символов из 7 элементов (char_temp[7]).
      static char char_temp[7];        // Переменная для перевода из int в char
      dtostrf(t, 3, 0, char_temp);     // Перевод из int в char

      static char char_hum[7];
      dtostrf(h, 3, 0, char_hum);

      client.disconnect();
      if (client.connect(«DHTClient»))  // Если DHTClient подкл., то выполняется код…
      {
        // Отправка данных в Монитор порта.
        Serial.print(F(«Humidity: «));  // Обёртываем в макрос F() для экономии ОЗУ
        Serial.print(h);
        Serial.print(F(» %t«));
        Serial.print(F(«Temperature: «));
        Serial.print(t);
        Serial.println(F(» *C»));

        //Отправка данных по MQTT в Брокер
        client.publish(«home/data/status/sensor/temp», char_temp);  //Температура
        client.publish(«home/data/status/sensor/hum», char_hum);    //Влажность
        delay(5000);              // Отправка данных в Брокер раз в 5 секунд
      }
    }

  8. Вот так:

    void loop() {

      int h = dht.readHumidity();      // Переменная типа int для Влажности
      int t = dht.readTemperature();   // Переменная типа int для Температуры

      // Преобразуем переменные для отправки по MQTT в Брокер.
      // В обоих случаях используем с запасом массив символов из 7 элементов (char_temp[7]).
      static char char_temp[7];        // Переменная для перевода из int в char
      dtostrf(t, 3, 0, char_temp);     // Перевод из int в char

      static char char_hum[7];
      dtostrf(h, 3, 0, char_hum);

      if (client.connect(«DHTClient»))  // Если DHTClient подкл., то выполняется код…
      {
        // Отправка данных в Монитор порта.
        Serial.print(F(«Humidity: «));  // Обёртываем в макрос F() для экономии ОЗУ
        Serial.print(h);
        Serial.print(F(» %t«));
        Serial.print(F(«Temperature: «));
        Serial.print(t);
        Serial.println(F(» *C»));

        //Отправка данных по MQTT в Брокер
        client.publish(«home/data/status/sensor/temp», char_temp);  //Температура
        client.publish(«home/data/status/sensor/hum», char_hum);    //Влажность
       client.disconnect();
        delay(5000);              // Отправка данных в Брокер раз в 5 секунд
      }
    }

    Ещё: dtostrf — очень тяжёлая функция, хотя, если вас устраивает — пущай будет. Но я бы поюзал itoa — всё равно у вас тип переменных h и t — int.

  9. Тут явная ошибочка, т.к. Брокер ругается на ошибку и данные не отправляются.

     

    if (client.connect(«DHTClient»))  // Если DHTClient подкл., то выполняется код…
      {
        // Отправка данных в Монитор порта.
        Serial.print(F(«Humidity: «));  // Обёртываем в макрос F() для экономии ОЗУ
        Serial.print(h);
        Serial.print(F(» %t«));
        Serial.print(F(«Temperature: «));
        Serial.print(t);
        Serial.println(F(» *C»));

        //Отправка данных по MQTT в Брокер
        client.publish(«home/data/status/sensor/temp», char_temp);  //Температура
        client.publish(«home/data/status/sensor/hum», char_hum);    //Влажность
        client.disconnect(); // ОШИБКА!
        delay(5000);              // Отправка данных в Брокер раз в 5 секунд
      }

    Так не правильнее будет:

     

    if (client.connect(«DHTClient»))  // Если DHTClient подкл., то выполняется код…
      {
        // Отправка данных в Монитор порта.
        Serial.print(F(«Humidity: «));  // Обёртываем в макрос F() для экономии ОЗУ
        Serial.print(h);
        Serial.print(F(» %t«));
        Serial.print(F(«Temperature: «));
        Serial.print(t);
        Serial.println(F(» *C»));

        //Отправка данных по MQTT в Брокер
        client.publish(«home/data/status/sensor/temp», char_temp);  //Температура
        client.publish(«home/data/status/sensor/hum», char_hum);    //Влажность
        delay(5000);              // Отправка данных в Брокер раз в 5 секунд
      } else {
        КАКАЯ НИБУДЬ ФУНКЦИЯ ЕСТЬ, НА ПОДОБИИ client.REconnect();
        ДЛЯ ПЕРЕПОДКЛЮЧЕНИЯ? ИСКАЛ В ИНЕТЕ, НЕ НАШЁЛ.
        СМЫСЛ БЫ БЫЛ: ЕСЛИ КЛИЕНТ ПОДКЛЮЧИЛСЯ ОТПРАВЛЯЕМ ДАННЫЕ,
        ИНАЧЕ ПОПЫТКА ПЕРЕПОДКЛЮЧИТСЯ!
      }

    Спасибо, что подсказали, что существует такая функция преобразования для int как itoa, экономит память чуток)

  10. Значит, метод publish не отсылает данные сразу, видимо. Строго говоря, я уже писал, как я бы сделал: просто проверял, законнекчен ли клиент. Если да — делал бы publish, если нет — коннектился бы. Потому как каждый раз дёргать connect/disconnect — тяжёлые операции.

  11. Особо не знал как это правильно реализовать, за основу взял стандартный пример из Arduino IDE. Сделал переподключение через отдельную функцию, надеюсь, что правильно додумался всё сделать, что бы не дёргать connect / disconnect, вот весь код:

    /*
      Скетч для вывода в Монитор порта теспературы в Цельсиях и Влажности
      с датчика DHT22 и отправки их по MQTT в брокер и MajorDoMo.
    */

    #include <SPI.h>                 // Библиотека SPI шины
    #include <Ethernet.h>            // Ethernet библиотека
    #include <PubSubClient.h>        // Библиотека MQTT
    #include <DHT.h>                 // Библиотека для датчиков DHT11/22

    #define DHTPIN 2                 // Номер пина, к которому подсоединен датчик
    #define DHTTYPE DHT22            // Задаём тип DHT датчика
    DHT dht(DHTPIN, DHTTYPE);

    #define UNUSED(expr) do { (void)(expr); } while (0) /*Безсмысленный цикл для callback
                                                          убирающий предупреждение
                                                          с компилятора*/

    // Задаём mac и ip адреса в Локальной сети
    byte mac[]    = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
    IPAddress ip{192, 168, 1, 74};      //ip Адрес Ethernet Shild’a Arduino
    IPAddress server{192, 168, 1, 70};  //ip Адрес для MQTT Брокера

    // Шапка Функции Callback для объявления и Инициализации PubSubClient
    void callback(char* topic, byte* payload, unsigned int length);

    EthernetClient ethClient;                                 // Инициализируем Ethernet клиент
    PubSubClient client(server, 1883, callback, ethClient);   // Инициализируем MQTT клиент

    // Функция Callback
    void callback(char* topic, byte* payload, unsigned int length)
    {
      //Используем идентификатор UNUSED для устранения Warning’а при компиляции
      UNUSED(topic);
      client.publish(«home/data/status/sensor», payload, length);
    }

    void setup()
    {
      // 1 бод равно 0.8 бит/сек
      // 1 бит/сек равно 1.25 бод
      Serial.begin(9600);                  // Задаём скорость порта в БОД’ах.
      Serial.println(F(«DHT22 test!»));    // Тестовое сообщ. при откр. Монитора порта

      dht.begin();                    // Инициализируем dht
      Ethernet.begin(mac, ip);        // Инициализируем mac, ip
    }

    void reconnect() {
      // Повторяем, пока не переподключимся
      while (!client.connected()) {         // Логическое НЕ «!» — Если клиент не подкл….
        // Попытка подключиться
        if (client.connect(«DHTClient»)) {  // Если DHTClient клиент подключен…
          Serial.println(F(«connected!»));     // Выводим сообщ., что подключено!
        } else {
          Serial.print(F(«failed connected — «)); // Ощибка соединения
          Serial.println(F(«Jdem 5 seconds»));    // Ждём 5 секунд
          delay(5000);
        }
      }
    }

    void loop() {

      if (!client.connect(«DHTClient»)) {   //Если DHTClient клиент не подключен…
        reconnect();                        //Запускаем функцию перезепуска
      }
      client.loop();

      int h = dht.readHumidity();      // Переменная типа int для Влажности
      int t = dht.readTemperature();   // Переменная типа int для Температуры

      // Преобразуем переменные для отправки по MQTT в Брокер.
      // В обоих случаях используем с запасом массив символов из 7 элементов (char_temp[7]).
      static char char_temp[7];        // Переменная для перевода из int в char
      itoa(t, char_temp, 10);          // Перевод из int в char

      static char char_hum[7];
      itoa(h, char_hum, 10);

      // Отправка данных в Монитор порта.
      Serial.print(F(«Humidity: «));        // Обёртываем в макрос F() для экономии ОЗУ
      Serial.print(h);
      Serial.print(F(» %t«));
      Serial.print(F(«Temperature: «));
      Serial.print(t);
      Serial.println(F(» *C»));

      //Отправка данных по MQTT в Брокер
      client.publish(«home/data/status/sensor/temp», char_temp);  //Температура
      client.publish(«home/data/status/sensor/hum», char_hum);    //Влажность
      delay(2000);              // Отправка данных в Брокер раз в 2 секунды
    }

    И кстати, что делает — client.loop(); Информацию не нашёл. Так же хотелось бы знать, чем отличается client.connected() от client.connect() ?
    Если есть у кого ссылки с описанием методов, скиньте пожалуйста, заранее спасибо за помощь в освоении программирования))

  12. Первая — проверяет, законнекчен ли клиент. Вторая — коннектится.

  13. А по коду, что скажете?) Правильно сделал?
    P.S. Диагностировал и отслеживал через Отладочный терминал mosquitto, disconnect’ов появляющихся самих по себе нет, вроде всё стабильно работает)

  14. Да пойдёт код, пойдёт. Если память нигде не жмёт — можно и не париться с оптимизацией дальше ;)

  15. Специально учился на одном датчике как более оптимально организовать обмен данными по протоколу MQTT. Цель достигнута, благодаря Вашей помощи! Теперь нацелен сделать управление восемью реле по протоколу MQTT с обратной связью. Использую систему домашней автоматизации MajorDoMo, там возможность организации двусторонней связи почти по любому протоколу. Цель: управление по MQTT реле с возможностью считывания состояния реле и запоминания состояния реле при отключении питания на Arduino. Потом объединить в один код Управление реле и DHT22. Касаемо сохранения состояния Реле — EEPROM, а вот с чего начать код на Arduino и как, пока не знаю. У Вас есть идеи через что это организовать?))

  16. А чего там организовывать? Есть класс EEPROM для записи/чтения из EEPROM, его и юзайте: как пришла команда на переключение реле, переключаете его и сохраняете текущий статус реле в EEPROM. При старте МК в setup — вычитываете все статусы реле из EEPROM и выставляете их, вот и всё.

Проверка на корректность кода…

Offline

Зарегистрирован: 26.06.2016

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

Вкратце, что делает программа — Через Ethernet Shild W5100 по MQTT передаёт данные на Брокер с датчика DHT22 и выводит их в порт.

Код:

/*
  Скетч для вывода в Монитор порта теспературы в Цельсиях и Влажности
  с датчика DHT22 и отправки их по MQTT в брокер и MajorDoMo.
*/

#include <SPI.h>                 // Библиотека SPI шины
#include <Ethernet.h>            // Ethernet библиотека
#include <PubSubClient.h>        // Библиотека MQTT
#include <DHT.h>                 // Библиотека для датчиков DHT11/22

#define DHTPIN 2                 // Номер пина, к которому подсоединен датчик
#define DHTTYPE DHT22            // Задаём тип DHT датчика
DHT dht(DHTPIN, DHTTYPE);


// Задаём mac и ip адреса в Локальной сети
byte mac[]    = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
IPAddress ip{192, 168, 1, 74};      //ip Адрес Ethernet Shild'a Arduino
IPAddress server{192, 168, 1, 70};  //ip Адрес для MQTT Брокера

// Шапка Функции Callback (обратный вызов)
void callback(char* topic, byte* payload, unsigned int length);

EthernetClient ethClient;                                 //Инициализируем Ethernet клиент
PubSubClient client(server, 1883, callback, ethClient);   //Инициализируем MQTT клиент


// Функция Callback
void callback(char* topic, byte* payload, unsigned int length)
{
  // Выделяем необходимое кол-во памяти для копии payload
  byte* p = (byte*)malloc(length);
  // Копирование payload в новый буфер
  memcpy(p, payload, length);
  client.publish("home/data/status/sensor", p, length);
  // Освобождаем память
  free(p);
}


void setup()
{
  // 1 бод равно 0.8 бит/сек
  // 1 бит/сек равно 1.25 бод
  Serial.begin(9600);             // Задаём скорость порта в БОД'ах.
  Serial.println("DHT22 test!");  // Тестовое сообщ. при откр. Монитора порта

  dht.begin();

  Ethernet.begin(mac, ip);        // Инициализируем mac, ip


}


void loop() {

  int h = dht.readHumidity();     // Переменная типа int для Влажности
  int t = dht.readTemperature();  // Переменная типа int для Температуры

  // Преобразуем переменные для отправки в MQTT в Брокер
  static char char_temp[7];      // Переменная для перевода из int в char
  dtostrf(t, 3, 0, char_temp);    // Перевод из int в char

  static char char_hum[7];
  dtostrf(h, 3, 0, char_hum);

  if (client.connect("DHTClient"))  //Если DHTClient подкл., то выполняется код...
  {
    if (isnan(t) || isnan(h))     // Проверка удачно ли прошло считывание с DHT22
    {
      Serial.println("Failed to read from DHT22");  // Не удалось прочитать DHT22
    } else {
      // Отправка данных в Монитор порта при удачной проверке
      Serial.print("Humidity: ");
      Serial.print(h);
      Serial.print(" %t");
      Serial.print("Temperature: ");
      Serial.print(t);
      Serial.println(" *C");

      //Отправка данных по MQTT в Брокер
      client.publish("home/data/status/sensor/temp", char_temp);  //Температура
      client.publish("home/data/status/sensor/hum", char_hum);    //Влажность
      delay(5000);              // Отправка данных в Брокер раз в 5 секунд
    }

  } else {
    client.disconnect();      // иначе отключиться
  }
}

И ещё…, компилятор выдаёт такое сообщение, по смыслу вроде нечего серьёзного, правильно ли я понимаю?)):

C:UsersLinuxDocumentsArduinoMQTT_DHT22MQTT_DHT22.ino:29:6: warning: unused parameter 'topic' [-Wunused-parameter]

 void callback(char* topic, byte* payload, unsigned int length)

      ^

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

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

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

Но и здесь не избежать множества проблем, с которыми знаком каждый программист, и одна из самых неприятных – ошибка компиляции для платы Аrduino nano, с которой вам придется столкнуться не раз. Что же эта строчка означает, какие у неё причины появления, и главное – как быстро решить данную проблему?

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

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

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

Мы узнали, к чему приводит данный процесс, давайте разберёмся, как он происходит:

Как можно увидеть, процесс не так прост, как его рисуют, и на любом этапе может возникнуть какая-то ошибка, которая приведет к остановке компиляции. Проблема в том, что, в отличие от первых трех этапов, баги на последнем – зачастую неявные, но всё ещё не связанные с алгоритмом и логикой программы. Соответственно, их исправление и зачистка занимают значительно больше времени.

А вот синтаксические ошибки – самая частая причина, почему на exit status 1 происходит ошибка компиляции для платы Аrduino nano. Зачастую процесс дебагинга в этом случае предельно простой.

Вам высвечивают ошибку и строчку, а также подсказку от оператора EXCEPTION, что конкретно не понравилось парсеру. Будь то запятая или не закрытые скобки функции, проблема загрузки в плату Аrduino возникнет в любом случае.

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

Не стоит этого страшиться – этот процесс вполне нормален. Все претензии выводятся на английском, например, часто можно увидеть такое: was not declared in this scope. Что это за ошибка arduino – на самом деле ответ уже скрыт в сообщении. Функция или переменная просто не были задекларированы в области видимости.

Ошибки компиляции плат Arduino uno

Другая частая оплошность пользователя, которая порождает вопросы вроде, что делать, если Аrduino не видит порт, заключается в том, что вы попросту забываете настроить среду разработки. IDE Ардуино создана под все виды плат, но, как мы указывали, на каждом контроллере помещается лишь ограниченное количество библиотек, и их наполнение может быть различным.

Соответственно, если в меню среды вы выбрали компиляцию не под тот МК, то вполне вероятно, что вызываемая вами функция или метод просто не будет найдена в постоянной памяти, вернув ошибку. Стандартно, в настройках указана плата Ардуино уно, поэтому не забывайте её менять. И обратная ситуация может стать причиной, по которой возникает проблема загрузки в плату на Аrduino uno.

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

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

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

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

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

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

Ошибки компилятора Ардуино

Ранее упоминался финальный стек действий, при прогонке кода через компилятор, и в этот момент могут произойти наиболее страшные ошибки – баги самого IDE. Здесь конкретного решения быть не может. Вам никто не запрещает залезть в ядро системы и проверить там всё самостоятельно, но куда эффективнее будет откатиться до предыдущей версии программы или, наоборот, обновиться.

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

Ошибка: «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.

Решение:

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

Решение:

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

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

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

Решение:

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

Arduino IDE: почему не компилируются скетчи (и как этого избежать)

image

Поскольку я интенсивно занимаюсь разработкой в Arduino IDE, то этот вопрос меня неподдельно волновал. Почему скетч, написанный в одной версии среды разработки отказывается компилироваться в соседних версиях? Этим же вопросом меня заваливали пользователи системы Arduino Mega Server. Почему АМС компилируется в 1.6.5 и отказывается компилироваться в 1.6.4, 1.6.7 и 1.6.8?

И вот недавно, в процессе портирования Arduino Mega Server на новый контроллер Genuino 101, мне удалось разгадать эту великую загадку. И в этой статье я поделюсь с вами этим сакральным знанием и ваши скетчи после этого всегда будут успешно компилироваться. Итак…

Логика вещей

По логике вещей, код, который успешно компилируется в какой-либо версии среды разработки, например, 1.6.5, обязан компилироваться в соседних версиях IDE, ведь эти версии отличаются только в третьем знаке и представляют собой почти одно и то же, с небольшими модификациями. Но этого не происходит. Почему?

Внутренняя кухня

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

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

Но сколько-нибудь развитый проект на Ардуино уже не умещается в «20 строк» и неизбежно пользуется менее распространёнными функциями из библиотек (которые более подвержены модификациям из версии в версию) и неизбежно приходят к необходимости модификации самих библиотек под свои специфические нужды проекта.

А один раз модифицировав системную библиотеку, вы становитесь её заложником и вынуждены «тащить» её за собой из версии в версию.

Теперь давайте разберёмся с тем, как формируются версии Arduino IDE. А формируются они по произволу (я подозреваю, что в конечном счёте, одного конкретного программиста, какого-нибудь Марио) выпускающей команды. И то, какая версия конкретной библиотеки будет включена в дистрибутив и в каком виде (с какими модификациями), остаётся на совести этого «Марио».

А теперь внимание, это очень важно! Выпускающая команда преследует только одну цель — чтобы дистрибутив одной версии был взаимно согласован и непротиворечив внутри себя. Их задача добиться того, чтобы все стандартные примеры работали корректно. И это всё! Задача совместимости между версиями вообще не ставится.

И поскольку 99% процентов пользователей компилирует проекты в «20 строк» этот подход прекрасно «прокатывает» на практике. А то, что сколько-нибудь серьёзные проекты не компилируются, это проблемы этих проектов. Слава Богу, теперь понятен механизм возникновения проблемы и теперь стало понятно, как с этим бороться.

Конкретный пример

image

Вспомним портирование АМС на Genuino 101 (работает начиная с версии 1.6.7 и выше). Тут команда Ардуино припасла для нас очередной прикол (молодцы ребята, не дают нам расслабляться).

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

Наша библиотека: version=1.0.4 (не нравится компилятору)
Библиотека из IDE 1.6.7: version=1.0.4 (нравится компилятору)

Наша библиотека: 31 файл (не нравится компилятору)
Библиотека из IDE 1.6.7: 31 файл (нравится компилятору)

Наша библиотека: 123 КБ (не нравится компилятору)
Библиотека из IDE 1.6.7: 123 КБ (нравится компилятору)

Другими словами, Марио «засунул» в IDE 1.6.7 Ethernet библиотеку с одним и тем же номером версии, что и в IDE 1.6.5, одним и тем же количеством файлов и с одним и тем же размером, но с РАЗНЫМ СОДЕРЖИМЫМ и забыл нас об этом предупредить. А это самое «разное содержимое» как паук держится своими лапками за IDE и другие библиотеки более низкого уровня (тоже модифицированные в 1.6.7).

Браво, Марио! С таким подходом ничего не будет компилироваться, кроме стандартных примеров и скетчей в 20 строк.

Практическое решение (головоломок от Ардуино)

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

Источники:

https://arduinoplus. ru/oshibka-kompilacii-arduino-nano/

https://habr. com/ru/post/392931/

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

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

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

Но и здесь не избежать множества проблем, с которыми знаком каждый программист, и одна из самых неприятных – ошибка компиляции для платы Аrduino nano, с которой вам придется столкнуться не раз. Что же эта строчка означает, какие у неё причины появления, и главное – как быстро решить данную проблему?

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

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

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

Мы узнали, к чему приводит данный процесс, давайте разберёмся, как он происходит:

Как можно увидеть, процесс не так прост, как его рисуют, и на любом этапе может возникнуть какая-то ошибка, которая приведет к остановке компиляции. Проблема в том, что, в отличие от первых трех этапов, баги на последнем – зачастую неявные, но всё ещё не связанные с алгоритмом и логикой программы. Соответственно, их исправление и зачистка занимают значительно больше времени.

А вот синтаксические ошибки – самая частая причина, почему на exit status 1 происходит ошибка компиляции для платы Аrduino nano. Зачастую процесс дебагинга в этом случае предельно простой.

Вам высвечивают ошибку и строчку, а также подсказку от оператора EXCEPTION, что конкретно не понравилось парсеру. Будь то запятая или не закрытые скобки функции, проблема загрузки в плату Аrduino возникнет в любом случае.

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

Не стоит этого страшиться – этот процесс вполне нормален. Все претензии выводятся на английском, например, часто можно увидеть такое: was not declared in this scope. Что это за ошибка arduino – на самом деле ответ уже скрыт в сообщении. Функция или переменная просто не были задекларированы в области видимости.

Ошибки компиляции плат Arduino uno

Другая частая оплошность пользователя, которая порождает вопросы вроде, что делать, если Аrduino не видит порт, заключается в том, что вы попросту забываете настроить среду разработки. IDE Ардуино создана под все виды плат, но, как мы указывали, на каждом контроллере помещается лишь ограниченное количество библиотек, и их наполнение может быть различным.

Соответственно, если в меню среды вы выбрали компиляцию не под тот МК, то вполне вероятно, что вызываемая вами функция или метод просто не будет найдена в постоянной памяти, вернув ошибку. Стандартно, в настройках указана плата Ардуино уно, поэтому не забывайте её менять. И обратная ситуация может стать причиной, по которой возникает проблема загрузки в плату на Аrduino uno.

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

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

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

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

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

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

Ошибки компилятора Ардуино

Ранее упоминался финальный стек действий, при прогонке кода через компилятор, и в этот момент могут произойти наиболее страшные ошибки – баги самого IDE. Здесь конкретного решения быть не может. Вам никто не запрещает залезть в ядро системы и проверить там всё самостоятельно, но куда эффективнее будет откатиться до предыдущей версии программы или, наоборот, обновиться.

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

Ошибка: «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.

Решение:

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

Решение:

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

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

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

Решение:

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

Arduino IDE: почему не компилируются скетчи (и как этого избежать)

image

Поскольку я интенсивно занимаюсь разработкой в Arduino IDE, то этот вопрос меня неподдельно волновал. Почему скетч, написанный в одной версии среды разработки отказывается компилироваться в соседних версиях? Этим же вопросом меня заваливали пользователи системы Arduino Mega Server. Почему АМС компилируется в 1.6.5 и отказывается компилироваться в 1.6.4, 1.6.7 и 1.6.8?

И вот недавно, в процессе портирования Arduino Mega Server на новый контроллер Genuino 101, мне удалось разгадать эту великую загадку. И в этой статье я поделюсь с вами этим сакральным знанием и ваши скетчи после этого всегда будут успешно компилироваться. Итак…

Логика вещей

По логике вещей, код, который успешно компилируется в какой-либо версии среды разработки, например, 1.6.5, обязан компилироваться в соседних версиях IDE, ведь эти версии отличаются только в третьем знаке и представляют собой почти одно и то же, с небольшими модификациями. Но этого не происходит. Почему?

Внутренняя кухня

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

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

Но сколько-нибудь развитый проект на Ардуино уже не умещается в «20 строк» и неизбежно пользуется менее распространёнными функциями из библиотек (которые более подвержены модификациям из версии в версию) и неизбежно приходят к необходимости модификации самих библиотек под свои специфические нужды проекта.

А один раз модифицировав системную библиотеку, вы становитесь её заложником и вынуждены «тащить» её за собой из версии в версию.

Теперь давайте разберёмся с тем, как формируются версии Arduino IDE. А формируются они по произволу (я подозреваю, что в конечном счёте, одного конкретного программиста, какого-нибудь Марио) выпускающей команды. И то, какая версия конкретной библиотеки будет включена в дистрибутив и в каком виде (с какими модификациями), остаётся на совести этого «Марио».

А теперь внимание, это очень важно! Выпускающая команда преследует только одну цель — чтобы дистрибутив одной версии был взаимно согласован и непротиворечив внутри себя. Их задача добиться того, чтобы все стандартные примеры работали корректно. И это всё! Задача совместимости между версиями вообще не ставится.

И поскольку 99% процентов пользователей компилирует проекты в «20 строк» этот подход прекрасно «прокатывает» на практике. А то, что сколько-нибудь серьёзные проекты не компилируются, это проблемы этих проектов. Слава Богу, теперь понятен механизм возникновения проблемы и теперь стало понятно, как с этим бороться.

Конкретный пример

image

Вспомним портирование АМС на Genuino 101 (работает начиная с версии 1.6.7 и выше). Тут команда Ардуино припасла для нас очередной прикол (молодцы ребята, не дают нам расслабляться).

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

Наша библиотека: version=1.0.4 (не нравится компилятору)
Библиотека из IDE 1.6.7: version=1.0.4 (нравится компилятору)

Наша библиотека: 31 файл (не нравится компилятору)
Библиотека из IDE 1.6.7: 31 файл (нравится компилятору)

Наша библиотека: 123 КБ (не нравится компилятору)
Библиотека из IDE 1.6.7: 123 КБ (нравится компилятору)

Другими словами, Марио «засунул» в IDE 1.6.7 Ethernet библиотеку с одним и тем же номером версии, что и в IDE 1.6.5, одним и тем же количеством файлов и с одним и тем же размером, но с РАЗНЫМ СОДЕРЖИМЫМ и забыл нас об этом предупредить. А это самое «разное содержимое» как паук держится своими лапками за IDE и другие библиотеки более низкого уровня (тоже модифицированные в 1.6.7).

Браво, Марио! С таким подходом ничего не будет компилироваться, кроме стандартных примеров и скетчей в 20 строк.

Практическое решение (головоломок от Ардуино)

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

Источники:

https://arduinoplus. ru/oshibka-kompilacii-arduino-nano/

https://habr. com/ru/post/392931/

Первая прошивка


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

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

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

2. Компьютер издаст характерный сигнал подключения нового оборудования, а при первом подключении появится окошко “Установка нового оборудования”. Если этого не произошло:

  • См. предыдущий список неисправностей.
  • Кабель должен быть data-кабелем, а не “зарядным”.
  • Кабель желательно втыкать напрямую в компьютер, а не через USB-хаб.
  • Не установлены драйверы для Arduino.

3. В списке портов (Arduino IDE/Инструменты/Порт) появится новый порт, отличный от COM1. Если этого не произошло:

  • См. предыдущий список неисправностей.
  • Некорректно установлен драйвер CH341.
  • Если список портов вообще неактивен – драйвер Arduino установлен некорректно, вернитесь к установке
  • Возникла системная ошибка, обратитесь к знакомому компьютерщику

4. Выбираем свою плату. Если это Arduino Nano, выбираем в ИнструментыПлатаArduino Nano. Если другая – выбираем другую. Нажимаем стрелочку в левом верхнем углу (загрузить прошивку). Да, загружаем пустую прошивку.

  • [Для Arduino Nano] В микроконтроллер китайских нанок зашит “старый” загрузчик, поэтому выбираем ИнструментыПроцессорATmega328p (Old Bootloader). Некоторые китайцы зашивают в свои платы новый загрузчик, поэтому если прошивка не загрузилась (загрузка идёт минуту и вылетает ошибка avrdude: stk500_getsync()) – попробуйте сменить пункт Процессор на ATmega328p.

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

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


Возникает на этапе компиляции прошивки. Ошибки компиляции вызваны проблемами в коде прошивки.

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

Частые ошибки в коде, приводящие к ошибке компиляции


  • expected ‘,’ or ‘;’ – пропущена запятая или точка запятой на предыдущей строке
  • stray ‘320’ in program – русские символы в коде
  • expected unqualified-id before numeric constant – имя переменной не может начинаться с цифры
  • … was not declared in this scope – переменная или функция используется, но не объявлена. Компилятор не может её найти
  • redefinition of … – повторное объявление функции или переменной
  • storage size of … isn’t known – массив задан без указания размера

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


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

  • USB кабель, которым подключается Arduino, должен быть Data-кабелем, а не кабелем только для зарядки. Нужным нам кабелем подключаются к компьютеру плееры и смартфоны.
  • Причиной ошибки загрузки являются не установленные/криво установленные драйвера CH340, если у вас китайская 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… – это просто сообщения, оставленные разработчиком проекта или библиотеки. Чаще всего номер версии и прочая информация.
  • Недостаточно памяти, программа может работать нестабильно – Чуть выше этого предупреждения обычно идёт информация о задействованной памяти. Память устройства можно добивать до 99%, ничего страшного не случится. Это флэш память и во время работы она не изменяется. А вот динамическую память желательно забивать не более 85-90%, иначе реально могут быть непонятные глюки в работе, так как память постоянно “бурлит” во время работы. НО. Это зависит от скетча и в первую очередь от количества локальных переменных. Можно написать такой код, который будет стабильно работать при 99% занятой SRAM памяти. Так что ещё раз: это всего лишь предупреждение, а не ошибка.

FAQ


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

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

Видео


Полезные страницы


  • Набор GyverKIT – большой стартовый набор Arduino моей разработки, продаётся в России
  • Каталог ссылок на дешёвые Ардуины, датчики, модули и прочие железки с AliExpress у проверенных продавцов
  • Подборка библиотек для Arduino, самых интересных и полезных, официальных и не очень
  • Полная документация по языку Ардуино, все встроенные функции и макросы, все доступные типы данных
  • Сборник полезных алгоритмов для написания скетчей: структура кода, таймеры, фильтры, парсинг данных
  • Видео уроки по программированию Arduino с канала “Заметки Ардуинщика” – одни из самых подробных в рунете
  • Поддержать автора за работу над уроками
  • Обратная связь – сообщить об ошибке в уроке или предложить дополнение по тексту ([email protected])


13-12-2020, 16:31
6 комментариев

Даже опытные программисты-«ардуинщики» могут столкнуться с ошибками компиляции. Исправить их не сложно, а вот найти порой не так просто. Мы решили рассказать сегодня в деталях, какие системные ошибки чаще возникают на различных платах Ардуино, как их исправить и по возможности избежать. 

Для начала рассмотрим базовые, так называемые синтаксические ошибки. Они встречаются чаще всего у новичков, но и опытные электронщики с ними точно знакомы не понаслышке. Искать их обычно супер-просто – в Arduino IDE некорректный синтаксис выделяется построчно (таким образом значительно легче отыскать неточность в кодах). Обычно это: отсутствие скобки в конце команды, пропуск этой самой служебной команды или слова, нехватка важных функций, неправильное их написание и т.д.

Для быстрого поиска ошибки советуем рассмотреть строку-подсказку. Ничего не помогло? Тогда для вас наша подборка наиболее распространенных синтаксических ошибок:

С синтаксисом все понятно – вставляем пропущенные символы, убираем лишние знаки, возвращаем функции по умолчанию.
Напомним, в среде разработки Ардуино IDE можно заливать скетчи для различных микроконтроллеров. По умолчанию обычно указана плата Genuino Uno. Если вы работаете с Mega, следует выбрать именно эту платформу (меню «Сервис»), иначе вас ожидает неприятное предупреждение: “programmer is not responding”.

Ошибка компиляции для платы Arduino Uno чаще всего возникает из-за проблем, связанных с библиотеками, например, неправильно подключили, не то ПО инсталлировали. В этом случае вы увидите напоминание fatal error: … No such file or directory” (библиотека не перенесена в папку libraries) или redefinition of void setup”.


Обозначенная на скриншоте ERROR означает, что программирование завершилось некорректно (расшифровываем: внутренние проблемы с компилятором, не обновили версию IDE, сбой в библиотеке, неправильный выбор разрядности операционной системы и др.). 
Важно! Не забывайте использовать подсказки приложения – они очень помогают. Включаем тут: Файл -> Настройки -> «Показать подробный вывод во время компиляции».

Что делать, если произошла ошибка при загрузке скетча Arduino Nano. Тут могут быть те же причины, что мы описали выше. Особых отличий в компиляции плат нет, главное, их правильный выбор первоначально. Однако часто пользователи настраивают не те показатели скорости порта: 9600 вместо необходимых 57600 либо не имеют соответствующих драйверов на устройствах – все это нужно проверить и исправить!

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

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

2. Компьютер издаст характерный сигнал подключения нового оборудования, а при первом подключении появится окошко “Установка нового оборудования”. Если этого не произошло:

3. В списке портов (Arduino IDE/Инструменты/Порт) появится новый порт, обычно COM3. Если этого не произошло:

4. Выбираем свою плату. Если это Arduino Nano, выбираем в ИнструментыПлатаArduino Nano. Если другая – выбираем другую. Нажимаем стрелочку в левом верхнем углу (загрузить прошивку). Да, загружаем пустую прошивку.

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

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

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

Частые ошибки в коде, приводящие к ошибке компиляции

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

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

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

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

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

Видео

Arduino IDE: почему не компилируются скетчи (и как этого избежать)

image

Поскольку я интенсивно занимаюсь разработкой в Arduino IDE, то этот вопрос меня неподдельно волновал. Почему скетч, написанный в одной версии среды разработки отказывается компилироваться в соседних версиях? Этим же вопросом меня заваливали пользователи системы Arduino Mega Server. Почему АМС компилируется в 1.6.5 и отказывается компилироваться в 1.6.4, 1.6.7 и 1.6.8?

И вот недавно, в процессе портирования Arduino Mega Server на новый контроллер Genuino 101, мне удалось разгадать эту великую загадку. И в этой статье я поделюсь с вами этим сакральным знанием и ваши скетчи после этого всегда будут успешно компилироваться. Итак…

Логика вещей

По логике вещей, код, который успешно компилируется в какой-либо версии среды разработки, например, 1.6.5, обязан компилироваться в соседних версиях IDE, ведь эти версии отличаются только в третьем знаке и представляют собой почти одно и то же, с небольшими модификациями. Но этого не происходит. Почему?

Внутренняя кухня

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

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

Но сколько-нибудь развитый проект на Ардуино уже не умещается в «20 строк» и неизбежно пользуется менее распространёнными функциями из библиотек (которые более подвержены модификациям из версии в версию) и неизбежно приходят к необходимости модификации самих библиотек под свои специфические нужды проекта.

А один раз модифицировав системную библиотеку, вы становитесь её заложником и вынуждены «тащить» её за собой из версии в версию.

Теперь давайте разберёмся с тем, как формируются версии Arduino IDE. А формируются они по произволу (я подозреваю, что в конечном счёте, одного конкретного программиста, какого-нибудь Марио) выпускающей команды. И то, какая версия конкретной библиотеки будет включена в дистрибутив и в каком виде (с какими модификациями), остаётся на совести этого «Марио».

А теперь внимание, это очень важно! Выпускающая команда преследует только одну цель — чтобы дистрибутив одной версии был взаимно согласован и непротиворечив внутри себя. Их задача добиться того, чтобы все стандартные примеры работали корректно. И это всё! Задача совместимости между версиями вообще не ставится.

И поскольку 99% процентов пользователей компилирует проекты в «20 строк» этот подход прекрасно «прокатывает» на практике. А то, что сколько-нибудь серьёзные проекты не компилируются, это проблемы этих проектов. Слава Богу, теперь понятен механизм возникновения проблемы и теперь стало понятно, как с этим бороться.

Конкретный пример

image

Вспомним портирование АМС на Genuino 101 (работает начиная с версии 1.6.7 и выше). Тут команда Ардуино припасла для нас очередной прикол (молодцы ребята, не дают нам расслабляться).

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

Наша библиотека: version=1.0.4 (не нравится компилятору)
Библиотека из IDE 1.6.7: version=1.0.4 (нравится компилятору)

Наша библиотека: 31 файл (не нравится компилятору)
Библиотека из IDE 1.6.7: 31 файл (нравится компилятору)

Наша библиотека: 123 КБ (не нравится компилятору)
Библиотека из IDE 1.6.7: 123 КБ (нравится компилятору)

Другими словами, Марио «засунул» в IDE 1.6.7 Ethernet библиотеку с одним и тем же номером версии, что и в IDE 1.6.5, одним и тем же количеством файлов и с одним и тем же размером, но с РАЗНЫМ СОДЕРЖИМЫМ и забыл нас об этом предупредить. А это самое «разное содержимое» как паук держится своими лапками за IDE и другие библиотеки более низкого уровня (тоже модифицированные в 1.6.7).

Браво, Марио! С таким подходом ничего не будет компилироваться, кроме стандартных примеров и скетчей в 20 строк.

Практическое решение (головоломок от Ардуино)

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

Источники:

https://alexgyver. ru/lessons/first-flash/

https://habr. com/ru/post/392931/

Понравилась статья? Поделить с друзьями:
  • Как найти ошибку в коде xml
  • Как найти ошибку в коде windows
  • Как найти ошибку в коде visual studio
  • Как найти ошибку в коде vbs
  • Как найти ошибку в коде python