Какую функцию надо запустить для проверки кода на ошибки arduino

Отладка программы является жизненно важным элементом при ее разработке. Программы для плат 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/

  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 и выставляете их, вот и всё.

Отладка программы является жизненно важным элементом при ее разработке. Программы для плат 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 954 просмотров

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

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)

      ^

speed

Существует простой способ в два раза увеличить скорость загрузки скомпилированного кода в микроконтроллер при использовании Arduino IDE.

Заходим в в Arduino IDE, снимаем галочку с пункта Проверка кода после загрузки и жмем . Вот и все что нужно сделать. Не верите? Откроем большой скетч, который занимает около 30 килобайт во флеш-памяти микроконтроллера. С выбранным пунктом проверки, загрузка файла занимает примерно 24 секунды. Сняв отметку, мы выполним это же действие примерно за 13 секунд.

Что при этом происходит? По умолчанию, Arduino IDE проверяет, что все было записано правильно:

Загрузка:

Arduino IDE: Эй

Микроконтроллер: О, привет

Arduino IDE: У меня есть для тебя немного нового кода

Микроконтроллер: Отлично! Отправляй его мне

Arduino IDE: Вот скомпилированный код... [30 килобайт]

Микроконтроллер: Получил. Спасибо!

Проверка:

Arduino IDE: Эй

Микроконтроллер: О, привет

Arduino IDE: Я не уверен, что ты получил все правильно. Перешли полученный код.

Микроконтроллер: Хорошо, вот он... [30 килобайт]

Arduino IDE: [Сравнивает байты в Arduino с оригинальными байтами кода]

             Выглядит нормально. Продолжай.

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

На самом деле, даже с выключенной проверкой, все равно будут произведены две другие проверки ошибок. Одна на уровне загрузчика — каждый блок данных загрузчика STK500 имеет, так называемый циклический избыточный код (Cyclic redundancy check, CRC), который представляет из себя алгоритм нахождения контрольной суммы, предназначенный для проверки целостности данных. Другая проверка происходит на уровне соединения между USB и последовательным интерфейсом микроконтроллера (каждый блок данных, переданных через USB имеет свой CRC). Если какое-то сообщение будет повреждено, оно выявляется и исправляется на этих уровнях. Маловероятно, что что ваш скетч будет записан неправильно в Arduino, после того, как вы нажмете .

Почему это важно?

Многие скетчи занимают несколько тысяч байт и, выключив проверку, вы сэкономите лишь несколько секунд при их загрузке. Но сколько раз вы загружаете скетч, когда вы работаете над проектом? 10 раз? 50? И над сколькими проектами вы могли бы работать? Некоторые, наверное, загрузили уже десятки тысяч скетчей. Теперь умножьте на казалось бы незначительную экономию при загрузке и вы получите внушительное количество сэкономленного времени. В любом случае, будет точно не хуже, если вы меньше времени будете тратить на наблюдение за миганием светодиодов на TX и RX.

Случаи, при которых проверка не помешает

Так выглядит ошибка при проверке в Arduino IDE

Так выглядит ошибка при проверке в Arduino IDE

В некоторых случаях вы, возможно, все же захотите проверить свой ​​код. Если вы собираетесь поместить Arduino в спутник или в какой-либо другой ответственный проект, вы можете спать спокойнее, зная, что загруженный в него код является корректным. Если вы подкючаетесь к Arduino при помощи 15-метрового USB-кабеля или у вас провод длиной 2 км при передаче через интерфейс RS485, вы, возможно, захотите произвести проверку после загрузки своего скетча. Хотя также маловероятно, что ошибка проскочет через проверку контрольных сумм, так что решайте сами делать проверку или нет.

На каких платах этот трюк работает?

Это работает с любой платой Arduino, которая использует соединение последовательное USB-соединение (Uno, Mega, Pro Mini, LilyPad Simple, Fio и т.д.). Эти все платы используют один и тот же загрузчик avrdude, в котором по умолчанию устанавливается флаг проверки.

Любые платы, использующие загрузчик Catarina (Leonardo, Micro и т.д.) или загрузчик Halfkay (платы Teensy) имеют гораздо более быстрее загрузчики, и для них преимущество в скорости неочевидно.

Еще раз повторюсь, что вероятность пропуска ошибки в процессе минимальна, а поэтому, вполне можно довериться компилятору и снять этот флажок!

Источник: Sparkfun


Вы можете пропустить чтение записи и оставить комментарий. Размещение ссылок запрещено.

Scratch 3 – программирование для детей на русском

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

Ardublock для Arduino – графический язык программирования

Ardublock — это графический язык программирования для Ардуино, предназначенный для начинающих. Эта среда достаточно проста в использовании, ее легко установить, она практически полностью переведена на русский язык. Визуально сконструированную программу,напоминающую блоки…

Скачать Arduino IDE бесплатно и на русском

На этой странице вы узнаете, как скачать программы и скетчи для работы с Ардуино. Мы поделимся с вами полезными ссылками на официальные ресурсы, последние стабильные версии Arduino IDE 1.8.7 на русском,…

Циклы FOR и WHILE в Arduino

Циклы с использованием операторов for и while являются одной из важнейших конструкций языка C++, лежащего в основе Ардуино. Они встречаются абсолютно в каждом скечте, даже если вы не подозреваете об этом….

Прерывания Arduino с помощью attachInterrupt

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

Вывод в монитор порта через Serial print, println, write

Serial.print() и Serial.println() – это основные функции Arduino для передачи информации от платы ардуино к компьютеру через последовательный порт. На самых популярных платах Arduino Uno, Mega, Nano нет встроенного дисплея, поэтому…

Условия if и else в Arduino

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

Arduino String – работа со строками в ардуино

Arduino String — основная библиотека для работы со строками в ардуино. С ее помощью существенно упрощается использование массивов символов и строк в скетче. Объект типа String содержит множество полезных функций для…

Tinkercad Arduino – лучший онлайн симулятор ардуино на русском

Можно ли заниматься ардуино проектами без самой платы Arduino? Оказывается, вполне. Благодаря многочисленным онлайн сервисам и программам, которые имеют свое название: эмулятор или симулятор Arduino. Самыми популярными представителями таких программ являются…

Функция Arduino Serial begin

Serial begin — крайне важная инструкция Arduino, она позволяет установить  контроллеру соединение с внешними устройствами. Чаще всего таким «внешним устройством» оказывается компьютер, к которому мы подключаем Arduino. Поэтому Serial begin интенсивней…

Глобальные переменные Arduino

Глобальная переменная в Arduino – это переменная, область видимости которой распространяется на всю программу, ее видно во всех модулях и функциях. В этой статье мы рассмотрим несколько примеров использования глобальных переменных,…

Управление реле ардуино: скетч

В этой статье приведены разные варианты управления реле в скетчах ардуино. Примеры тестировались на Arduino Uno, но они могут быть легко применимы для работы на других платах Arduino: Uno, Mega, Nano.
Простой…

Arduino define и const

Инструкция define в ардуино, как и в языке C++, нужна для того, чтобы упростить написание скетчей.  Мы можем один раз определить название какого-то фрагмента кода, а затем везде использовать только это…

Массивы Arduino

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

Функция digitalRead ()

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

Написал универсальный скетч для проверки работоспособности портов и EEPROM памяти. Ищутся добровольцы для проверки в железе и доработки тестовой программы. Мой код проверен на ATmega128A, ATmega8A при этом никаких правок в коде делать не нужно. Количество цифровых и аналоговых выводов определяется автоматически.

Что еще нужно сделать:

1. Проверка аппаратных прерываний, таймеров, прерываний по переполнению таймера.

2. Прошивка на асме для проверки RAM, Stack Pointer Register, Status Register, регистров R0-R25, X,Y,Z

Что уже было сделано: Мой код при запуске ничего не делает, он ждет команду по UART. В терминал нужно отправить одну английскую букву для запуска нужного теста. Когда какой то тест был запушен, чтобы его прервать нажмите кнопку ресет. Список комманд:

v — Выводит версию программы и краткое описание доступных тестов.

a — АЦП тест. Выводит значения всех аналоговых входов. Для этого вы подключаете переменный резистор поочередно к каждому аналоговому входу и смотрите как меняются значения.
i Inputs test. В этом тесте включена подтяжка всех входов (INPUT_PULLUP). Тест выводит значения всех входов с низким уровнем на них. Вы берете провод подключенный на землю и через резистор 1КОм по очереди качаетесь каждого входа, в терминале должна появиться только одна надпись LOW с номером вывода. Этот тест позволяет найти замкнутые между собой пины или дорожки с обрывом (а также выводы со сгоревшими внутренними PULLUP резисторами)
o — Outputs test. Устанавливает все порты как выход с 1 на них. Вы берете тестер или светодиод с резистором и проверяете наличие высокого уровня на каждом выходе.
b — Blink. Тест наплатного светодиода.
0 ZEROFILL встроенного EEPROM (тоесть заполнение нулями 0x00 во все ячейки). Тест закончится, когда будет выведено «Done» в консоль. После этого запустите комманду «e» для вывода содержимого EEPROM в консоль и проверьте нет ли бытых ячеек
1 0xFF заполнение встроенного EEPROM. Тест закончится, когда будет выведено «Done» в консоль. После этого запустите комманду «e» для вывода содержимого EEPROM в консоль и проверьте нет ли бытых ячеек
p — Тест ШИМ на наплатном светодиоде. Тест надо полностью переписать, текущая реализация мне не нравится.

e — Выводит все содержимое EEPROM в терминал.

Цифровые порты 0 и 1 не тестируются. Этот тест предполагает, что выводы 0 (RX) и передачи данных 1 (TX) данных в порядке, раз у вас получилось загрузить скетч.

Код состоит из двух файлов. Последняя версия всегда доступна по ссылке

Файл hwtest.ino

#define FIRST_PIN 2
#define PIN_LED  13

#define DELAY_ITERATION  200
#define DELAY_BW_TESTS  2000
#define DELAY_WARN  5000
#define ADC_NUMSAMPLES 8
int samples[ADC_NUMSAMPLES];

#include <EEPROM.h>

void setup() {
  Serial.begin(9600);
  pinMode(PIN_LED, OUTPUT);
}

void loop() {
  digitalWrite(PIN_LED, LOW);
  if (Serial.available() > 0) {

    switch (Serial.read()) {
      case 'v':
        Serial.println("Arduino hardware test v. 1.1b");
        Serial.println("a) ADC MANUAL test. Prints values from all analog pins");
        Serial.println("i) Inputs MANUAL test. Prints all inputs with LOW level on them");
        Serial.println("o) Outputs MANUAL test. Sets all ports to HIGH");
        Serial.println("b) Blink. Tests onboard led");
        Serial.println("0) Zerofill of built-in EEPROM");
        Serial.println("1) 0xFF fill of built-in EEPROM");
        Serial.println("p) Test PWM on on-board LED");
        Serial.println("");
        break;
      
      case 'a': //ADC test Tests all analog pins (A0-A7)
        while(true) {
          Serial.println("ADC test");
          readAnalogValue(A0);
          readAnalogValue(A1);
          readAnalogValue(A2);
          readAnalogValue(A3);
          readAnalogValue(A4);
          readAnalogValue(A5);
          
          #if(NUM_ANALOG_INPUTS == 8)
            readAnalogValue(A6);
            readAnalogValue(A7);  
          #endif
          digitalWrite(PIN_LED, LOW);
          delay(DELAY_BW_TESTS);          
        }
        break;

      case 'i': //Inputs test. Tests all inputs in digital mode
        while(true) {
          Serial.println("Inputs test. Pins in LOW state:");
          for(byte pin = FIRST_PIN; pin <= NUM_DIGITAL_PINS; pin++) {
            pinMode(pin, INPUT_PULLUP);
            if(!digitalRead(pin)) {          
        
              if(pin < 10) Serial.print(" PIN:  ");
              else Serial.print(" PIN: ");
              Serial.print(pin);
              Serial.println(" LOW"); //Should be no "LOW" messages if all pins is not connected to GND
            }
          }
          delay(DELAY_BW_TESTS);
          digitalWrite(PIN_LED, !digitalRead(PIN_LED)); //Toggle LED
        }
        break;

      case 'o': //Outputs test. Tests setting all ports to HIGH
          Serial.println("Outputs test. All set to HIGH");
          for(byte pin = FIRST_PIN; pin <= NUM_DIGITAL_PINS; pin++) {
            pinMode(pin, OUTPUT);
            digitalWrite(pin, HIGH);
          }
        break;
        
      case 'b': //Blink. Tests onboard led
        while(true) {
          Serial.println("Blink");
          digitalWrite(PIN_LED, HIGH);
          delay(1000);
          digitalWrite(PIN_LED, LOW);
          delay(1000);
        }
        break;
        
      case 'e':
        e2reader();
        break;
        
      case '0': //Zerofill of built-in EEPROM
        Serial.println("Zerofill of EEPROM in 5s");
        delay(DELAY_WARN);
        Serial.println("Started");
        for(int i=0; i<EEPROM.length(); i++) {
          EEPROM.write(i, 0);
        }        
        Serial.println("Done");
        break;

      case '1': //0xFF fill of built-in EEPROM
        Serial.println("0xFF Fill of EEPROM in 5s");
        delay(DELAY_WARN);
        Serial.println("Started");
        for(int i=0; i<EEPROM.length(); i++) {
          EEPROM.write(i, 255);
        }        
        Serial.println("Done");
        break;

      case 'p': //Test PWM on on-board LED
        while(true) {
          Serial.println("LED PWM control");
          // fade in from min to max in increments of 5 points:
          for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 5) {
            // sets the value (range from 0 to 255):
            analogWrite(PIN_LED, fadeValue);
            delay(40);
          }
        
          // fade out from max to min in increments of 5 points:
          for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 5) {
            analogWrite(PIN_LED, fadeValue);
            delay(40);
          }
        }
      break;
    }
  }
}

void readAnalogValue(int adcPin) {    
  int i;
  for (i=0; i<ADC_NUMSAMPLES; i++) {
   samples[i] = analogRead(adcPin);
   delay(60);
  }
 
  // average all the samples out
  int average=0;
  for (i=0; i<ADC_NUMSAMPLES; i++) {
     average += samples[i];
  }
  average /= ADC_NUMSAMPLES;

  Serial.print("ADC PIN: ");
  Serial.print(adcPin);
  Serial.print(" value: ");
  Serial.println(average);
  digitalWrite(PIN_LED, !digitalRead(PIN_LED)); //Toggle LED
}

Файл EEPROM.ino

#include <EEPROM.h>
 
void e2reader(){
  char buffer[16];
  char valuePrint[4];
  byte value;
  unsigned int address;
  uint8_t trailingSpace = 2;
 
  Serial.print("Dumping "); Serial.print(E2END + 1);
  Serial.println(" bytes from EEPROM.");
  Serial.print("baseAddr ");
  for(int x = 0; x < 2; x++){
    Serial.print(" ");
    for(int y = 0; y < 25; y++)
      Serial.print("=");
  }
 
  // E2END is a macro defined as the last EEPROM address
  // (1023 for ATMEGA328P)
  for(address = 0; address <= E2END; address++){
    // read a byte from the current address of the EEPROM
    value = EEPROM.read(address);
 
    // add space between two sets of 8 bytes
    if(address % 8 == 0)
      Serial.print("  ");
 
    // newline and address for every 16 bytes
    if(address % 16 == 0){
      //print the buffer
      if(address > 0 && address % 16 == 0)
        printASCII(buffer);
 
      sprintf(buffer, "n 0x%05X: ", address);
      Serial.print(buffer);
 
      //clear the buffer for the next data block
      memset (buffer, 32, 16);
    }
 
    // save the value in temporary storage
    buffer[address%16] = value;
 
    // print the formatted value
    sprintf(valuePrint, " %02X", value);
    Serial.print(valuePrint);
  }
 
  if(address % 16 > 0){
    if(address % 16 < 9)
      trailingSpace += 2;
 
    trailingSpace += (16 - address % 16) * 3;
  }
 
  for(int i = trailingSpace; i > 0; i--)
    Serial.print(" ");
 
  //last line of data and a new line
  printASCII(buffer);
  Serial.println();
}
 
void printASCII(char * buffer){
  for(int i = 0; i < 16; i++){
    if(i == 8)
      Serial.print(" ");
 
    if(buffer[i] > 31 and buffer[i] < 127){
      Serial.print(buffer[i]);
    }else{
      Serial.print(".");
    }
  }
}

Подключаем шаговый двигатель 28BYJ к Arduino.

В этом уроке нам понадобится:

Для реализации проекта нам необходимо установить библиотеки:

Сборка:

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

Так же на драйвере есть 4 управляющих пина, который нужно подключить соответственно к 8 Pin ,9 Pin,10 Pin,11 Pin Ардуины.

Скетч:

Подключаем шаговый двигатель 28BYJ к Arduino.

В этом уроке нам понадобится:

Для реализации проекта нам необходимо установить библиотеки:

Сборка:

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

Так же на драйвере есть 4 управляющих пина, который нужно подключить соответственно к 8 Pin ,9 Pin,10 Pin,11 Pin Ардуины.

Скетч:

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

Шаг 1. Что такое шаговый двигатель?

Шаговый двигатель состоит из двух основных частей: ротора и статора.

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

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

Шаг 2: Список деталей

Необходимые детали для проекта Ардуино шагового двигателя:

  • Шаговый двигатель (этот двигатель был взят от старого принтера)
  • Arduino
  • Изолированный медный провод
  • Проволочные резаки / стрипперы
  • Регулятор тока
  • транзистор
  • драйвер двигателя H-Bridge 1A
  • моторный шилд
  • паяльник
  • припой
  • инструменты
  • безопасные очки

Шаг 3: Присоединяем провода

Большинство шаговых двигателей имеют четыре провода, поэтому вам нужно будет обрезать четыре медных провода (обратите внимание, что цвет не коррелирует с чем-либо конкретным (обычно есть правило, что черный — это земля, но не сейчас). Различные цвета были использованы только для облегчения понимания. Эти выводы будут использоваться для управления, какая катушка в настоящее время активна в двигателе. Для этого проекта Ардуино шаговый двигатель был взят от старого принтера, поэтому пайка проводов была самым простым вариантом для этого проекта. В любом случае, вы можете безопасно установить соединение (пайка, штекер, клипы).

Шаг 4: Эскиз/скетч Arduino

Arduino уже имеет встроенную библиотеку для шаговых двигателей. Просто перейдите в меню:

Файл → Примеры → Шаговые → stepper_oneRevolution
File → Examples → Stepper → stepper_oneRevolution

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

То, что на самом деле делает библиотека Stepper — чередует сигналы HIGH и LOW для каждой катушки, как показано в анимации выше.

Шаг 5: Что такое мост H-bridge?

H-Bridge — схема, состоящая из 4 переключателей, которые могут безопасно управлять двигателем постоянного тока или шаговым двигателем. Эти переключатели могут быть реле или (чаще всего) транзисторами. Транзистор представляет собой твердотельный переключатель, который можно закрыть, посылая небольшой ток (сигнал) на один из его контактов.

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

H-Bridges может помочь вам предотвратить перегорания вашего Arduino моторами, которыми вы пользуетесь. Двигатели являются индукторами, а это означает, что они хранят электрическую энергию в магнитных полях. Когда ток больше не посылается двигателям, магнитная энергия возвращается в электрическую энергию и может повредить компоненты. H-Bridge помогает изолировать ваш Arduino лучше всего. Вы не должны подключать двигатель непосредственно к Arduino.

Хотя H-Bridges можно легко сделать самому многие предпочитают покупать H-Bridge (например, чип L293NE / SN754410) из-за удобства. Это чип, который мы будем использовать в этом уроке. Физические номера контактов и их назначение ниже:

  • Пин 1 (1, 2EN) → Мотор 1 Включен/Выключен (HIGH/LOW)
  • Пин 2 (1A) → Мотор 1 логический выход 1
  • Пин 3 (1Y) → Мотор 1 терминал 1
  • Пин 4 → Земля
  • Пин 5 → Земля
  • Пин 6 (2Y) → Мотор 1 терминал 2
  • Пин 7 (2A) → Мотор 1 логический выход 2
  • Пин 8 (VCC2) → Питание для двигателей
  • Пин 9 → Мотор 2 Включен/Выключен (HIGH/LOW)
  • Пин 10 → Мотор 2 логический выход 1
  • Пин 11 → Мотор 2 терминал 1
  • Пин 12 → Земля
  • Пин 13 → Земля
  • Пин 14 → Мотор 2 терминал 2
  • Пин 15 → Мотор 2 логический выход 2
  • Пин 16 (VCC1) → Питание для H Br >Шаг 6: Схема соединения

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

Для шагового двигателя Ардуино 4 вывода на H-Bridge должны подключаться к 4 выводам двигателя. Затем 4 логических вывода подключаются к Arduino (8, 9, 10 и 11). Как показано на диаграмме выше, для питания двигателей можно подключить внешний источник питания. Чип может обрабатывать внешний источник питания от 4,5 до 36 В (мы выбрали батарею 9В).

Шаг 7: Загрузка кода и тестирование

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

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

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

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

  • применение интегрированных, уже имеющихся примеров;
  • написание отдельных кодов самостоятельно.

Первый вариант является наиболее простым и самым распространенным. Ничего искать и скачивать из сети не нужно. Просто открываем среду Arduino IDE, заходим в меню, выбираем Файл, затем пункт Примеры, иподпункт Basics. Кликаем на один из самых простых примеров:

применение интегрированных примеров

Запускаем его и работаем.

Панель управления

Обратите внимание на Панель управления софта (мы незаслуженно обходили ее стороной, исправляемся). Она имеет несколько клавиш.

Напомним их предназначение:

Кнопки

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

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

Добавление скетча

Мы часто предлагали и будем это делать далее готовые скетчи для Arduino Uno. Так вот — многие из них подойдут и под другие контроллеры: Arduino Nano или Arduino Mega, об этом ищите указания в статьях. Это важно!

Фраза «Залить скетч» означает то, что его следует скопировать и вставить в форму для компиляции. Она часто встречается – потому будьте внимательны!

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

  • Какую типичную психологическую ошибку допускает крупская
  • Какую ошибку совершила наташа ростова
  • Какую ошибку совершил раскольников стоя на пороге квартиры старухи процентщицы
  • Какую ошибку совершил раскольников при убийстве
  • Какую ошибку совершил пьер безухов