Как установить optiboot в arduino ide

Установка поддержки Rasbperry Pi Pico в Arduino IDE

В этой статье мы объясним как установить поддержку плат Raspberry Pi Pico в Arduino IDE.

Для установки поддержки этих плат достаточно выполнить несколько простых шагов. Перед их выполнением убедитесь, что на ПК на котором они выполняются есть подключение к сети Интернет и доступ к нему для Arduino IDE не заблокирован в Брендмауре Windows.

1 — Откройте менеджер плат Arduino IDE

Выберете пункт меню "Инструметы" -> "Плата:" -> "Менеджер плат. "

2 — Найдите плату в списке

Введите rp2040 в поле поиска

3 — Установите поддержку плат

Найдите строку Arduino Mbed OS RP2040 Boards и нажмите "Установить"

Начнётся установка. Если появится диалоговое окно "Контроль учётных записей", нажмите "Да".

Если появятся окна "Безопасность Windows" с установкой USB устройств, нажмите "Установить"

4 — проверка

Если Вы ещё не подключили плату к ПК, подключите её зажав кнопку "BOOTSEL" на плате.

Выберете пункт меню "Инструменты" -> "Плата:" -> "Arduino Mbed OS RP2040 Boards" -> "Rasbperry Pi Pico"

Начнётся настройка устройства

После завершения настройки в меню "Инструменты" -> "Порт" должен появится новый COM порт. Выберете его.

Загрузите проверочный скетч в плату (например Blink)

5 — устранение неполадок (Нет COM порта в списке)

Если Вы уже использовали плату с MicroPython и после этого сбрасывали на заводские настройки при помощи flash_nuke.uf2 файла, то после подключения к ПК в Arduino IDE порт платы может быть не виден, но при этом внизу окна Arduino IDE будет показан COM порт отсутствующий в списке.

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

 

Если внизу окна Arduino IDE нет порта не из списка портов или в меню порт уже выбран какой-либо порт, то:

  • Зажмите кнопку "BOOTSEL" на плате при подключении к ПК. Плата определится как флеш карта.
  • Скопируйте на неё вот этот файл. Дождитесь перезагрузки микроконтроллера.
  • В меню "Инструменты" -> "Порт" появится новый порт. Выберете его и загрузите в плату любой скетч, выбрав при этом Raspberry Pi Pico в меню плат.
  • После загрузки скетча плата определится как Raspberry Pi Pico.

Сброс на заводские настройки

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

Безопасное использование ножки RESET на Arduino

Картинка для привлечения внимания

В этой статье я опишу способ безопасного использования ножки RESET на плате Ардуино для собственных нужд.

  • Возможность загружать скетчи обычными для Ардуины способами
  • Возможность использовать в своей программе ножку RESET как digital I/O pin

Гугление по данному вопросу поставит новичков в тупик — вроде бы везде пишут, что такое невозможно, но изредка упоминается, что есть способы обойти это ограничение, как, например, здесь [1].

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

Шаг первый

Тогда начнем с бутлоадера. В сети можно найти множество бутлоадеров для Ардуины с различными возможностями. Я взял самый маленький – optiboot [2]. Он не только освобождает для кода основной программы дополнительные 1,5 килобайта, но и позволяет использовать Watchdog [3]. Скачиваем с сайта последнюю версию с исходниками (архив), распаковываем и копируем папку «\optiboot-9e0c0b9db6fe\optiboot\bootloaders\optiboot» в папку «pathToArduino\hardware\arduino\avr\bootloaders\». Я использую версию Arduino IDE 1.5.8. Если у вас версия Arduino IDE 1.0.5, то найдите папку bootloaders самостоятельно.

Открываем файл «pathToArduino\hardware\arduino\avr\bootloaders\optiboot\optiboot.c» в текстовом редакторе или в имеющейся среде программирования (я использую Atmel Studio 6.2). Следующие строчки надо закомментировать:

А вслед за ними вставить такой код:

Также в шапке программы найдите #include и после всех инклюдов вставьте:

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

Объясню, что тут происходит. Мы убрали переход на основную программу, который происходит после программного сброса и сброса по низкому питанию. PCINT14 – это адрес нашей ножки RESET в регистре PORTC. С помощью прямого обращения к регистру DDRC мы установили для этой ножки pinMode INPUT и подали туда 5 вольт через внутреннее сопротивление (регистр PORTC, так называемое pinMode INPUT_PULLUP). Немного подождали, пока через резистор не перетечет достаточное количество электрончиков, и посмотрели сигнал на ножке через регистр PINC. Если на ноге нет сигнала, значит она заземлена, – приступаем к перепрошивке основной программы. В ином случае, переводим ножку в дефолтный режим INPUT и запускаем основную программу.

Теперь надо это все откомпилировать. В файле omake.bat надо заменить путь к make.exe. В моем случае (версия Arduino IDE 1.5.8) – это «..\..\..\sam\system\CMSIS\Examples\cmsis_example\gcc_atmel\make.exe». Я добавил еще пару опций, так что строчка запуска компиляции выглядит так:

Сначала запускаем omake.exe c параметром clean, затем с параметром atmega328 и внимательно читаем ответ. Если там не упоминаются ошибки «error:», то в папке должна появиться наша прошивка optiboot_atmega328.hex. Замечательно!

Шаг второй

Приступим к перепрошивке бутлоадера. Использовать функцию перепрошивки в среде Arduino IDE в данном случае не самый лучший вариант – это, скорее всего, приведет к неработоспособности Ардуины. Для прошивки бутлоадера будем использовать avrdude.exe. Это консольная программа находится в папке «pathToArduino\hardware\tools\avr\bin\». Прочитать про используемые параметры можно здесь [4]. Для ее использования в папке с прошивкой создадим один командный скрипт flash.bat следующего содержания:

И второй – flash_boot.bat:

Пути к файлам подставьте свои. COM-порт укажите тот, который используется вашим SPI-программатором или Ардуиной, заменяющей программатор. Я же использовал еще одну Pro Mini через COM-программатор PL2303HXA. В нее я закачал стандартный скетч ArduinoISP, который эмулирует работу SPI-программатора по протоколу STK500 v1. Примерная схема подключения показана в этой стате [5].

После того, как все подключено, можно проверить связь с программируемой Ардуиной с помощью запуска flash.bat: он покажет сигнатуру микроконтроллера и другую информацию. Теперь можно запустить второй скрипт flash_boot.bat. Если скажет «столько-то bytes of flash verified», значит все ОК, бутлоадер на месте.

На этом шаге можно проверить работу тестовой прошивки: например, загрузить стандартный Blink и, во время запуска Ардуины, заземлять тестовую ножку (A2 в данном случае). Должно наблюдаться беспорядочное мигание встроенного светодиода – это Watchdog рестартует микроконтроллер на этапе неудачных попыток бутлоадера прочесть из Serial-порта команду для перезаписи основной программы.

Шаг третий

Наконец, самая ответственная стадия – это установка фьюзов. Перед тем, как с ними работать, о них надо в обязательном порядке прочитать, например, тут [6].
Хочу заметить, что неправильные фьюзы можно вылечить с помощью «Atmega fusebit doctor» [7].

«Atmega fusebit doctor» на беспаечной макетной плате

«Atmega fusebit doctor» на беспаечной макетной плате

Используя калькулятор фьюзов [8] и даташит [9], создадим командный скрипт flash_fuse.bat для установки правильных фьюзов в наш многострадальный чип:

Цифра 5 в hfuse отвечает за отключение функции RESET на соответствующей ножке. Остальные фьюзы на ваше усмотрение (сверяемся с даташитом!). Этот момент настал, можно еще вернуться на светлую сторону к стандартной Ардуине, но мы не станем. После установки фьюзов данной командой стандартных способов поменять фьюзы или бутлоадер не будет! Но, если мы все сделали правильно, то основную программу мы можем шить как обычно при помощи заземления ноги RESET (или же просто зажимая кнопку RESET на плате Ардуины). При включении Ардуины встроенный светодиод будет хаотично мигать – это сигнал к тому, чтобы начать загрузку скетча.

Шаг четвертый

Преодолев множество трудностей, мы скомпилировали правильный бутлоадер, прошили его в микроконтроллер и установили правильные фьюзы. Теперь надо исправить кое-что в файле «pathToArduino\hardware\arduino\avr\boards.txt», чтобы Arduino IDE смогла общаться с нашей платой.

Добавим свои настройки в конец файла (для версии Arduino IDE 1.0.5 они немного другие):

Название платы «[Optiboot] Arduino Pro Mini (5V, 16MHz) w/ ATmega328p» появится в меню «Tools/Board» в самом конце списка.

Ограничения

Как вы помните, кнопка RESET на плате Ардуино замыкает ножку RESET на землю [10]. С помощью нее мы вводим микроконтроллер в режим перепрошивки основной программы. Именно поэтому я не рекомендую использовать эту ножку в режиме вывода пяти вольт. Если надо управлять «силовой» нагрузкой, то лучше вывести на ножку землю, а на вторую линию питания нагрузки завести пять вольт. Отключение питания происходит переводом ножки в режим ввода. Так мы избежим возможного короткого замыкания. Остальные режимы можно использовать без проблем.

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

Третье замечание касается стандартной нумерации ножек. Да, у ножки RESET нету номера! Есть только регистры микроконтроллера, которыми она управляется. Эта проблема легко решается несколькими правками файла «pathToArduino\hardware\arduino\avr\variants\standard\pins_arduino.h»:

После этого все стандартные функции, кроме analogRead(), будут работать с ножкой RESET под номером 20 (RST), как и с любой другой. И даже если у вас имеется дополнительные аналоговые ножки A6 и A7, то они работают отдельно по своему принципу. Можете сами убедиться в этом, написав такой скетч:

Заключение

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

Архив со всеми затронутыми файлами для Arduino IDE 1.5.8 вы можете скачать по ссылке [11]. Структура каталогов сохранена.

Optiboot загрузчик для Arduino

Не секрет, что Arduino использует загрузчик для заливки прошивок. До 2012 года они активно пилили bootloader для Atmega, а потом устали. Peter Knight на основе их кода и пары других исходников изобрел свой велосипед — загрузчик Optiboot. Потом он тоже устал и с 2011 года поддержкой стал заниматься Bill Westfield. Он до сих пор медленно развивает проект. Код получился на столько удачным, что официально ставится на все оригинальные Arduino Uno. Что ставят китайцы на свои клоны никто не знает. Поэтому я взял себе за правило менять bootloader после получения плат. Что мы получим установив "лучшийсапог"?

— optiboot занимает 0.5Kb, против 2Kb у Arduino. Это лишних 1.5Kb для вашего кода
— загрузка скетчей происходитв 2 раза быстрее, 115200bps против 57600bps
— почти мгновенное исполнение кода в "камне", за счет маленьких задержек после старта

Я знаю два способа установки Optiboot — автоматический и ручной. Сам пользуюсь ручным.

Автоматический с помощью Arduino IDE. Идем в File -> Preference и в поле "Additional Boards Manager Urls" вписываем строчку package_optiboot_optiboot-additional_ind ex.json разделяя пакеты запятой. Потом идем в Tools -> Boards -> Boards Manager и устанавливаем Optiboot. Теперь подключаем плату, выбираем нужный bootloader и прошиваем.

Ручной способ сложнее, но более правильный, так как контролирутся весь процесс. Первый этап, с помощью старого доброго USBasp (покупал на eBay) или моста FTDI FT232R прошиваем микроконтроллер. Я пользуюсь avrdude в связке с AVRDudess, исходники которого лежат на Github. Под windows нужно скачать файл avrdude-6.x-mingw32.zip и распакоать в папку с AVRDudess.


пошаговая инструкция работы с AVRDudess

Для Arduino Duemilanove, Nano или Pro Mini (5v, 16 MHz) на ATmega328 выбираем optiboot_atmega328.hex и выставляем фьюзы — l: FF, h: DE, e: FD. Для Arduino Pro Micro (16MHz) на ATmega32 берем optiboot_atmega32.hex и выставляем фьюзы — l: FF, h: DE, e: F3.

Второй этап, обучить оболочку работать с новым загрузчиком. Если этого не сделать не получим дополнительных 1.5Kb и 115200bps. Для активации плюшек ныряем в ..\Arduino\hardware\arduino\avravr\board s.txt и дописываем новые куски в соответствующие секции.


пример новой вставки для платы с Optiboot

Уже подправленный boards.txt для Arduino IDE 1.8.4 лежит тут. Финальный аккорд — копируем свежую версию optiboot_atmega328.hex с Github-а в папку ..\Arduino\hardware\arduino\avr\bootload ers\optiboot

UDP: Отличная статья по фьюзам для ATmega328 тут

UDP2: Если хотите питать ATmega328 от 1.8в до 5.5в нужно менять кварц на 4MHz, скорректировать Brown-out Detection с помощью фьюзов и перепрошить bootloader на хитроделанный. Почему так происходит можно узнать из этой статьи.

UDP3: Если не охота возится с 4MHz кварцем, то берем Blue Pill/STM32F103, работает на частоте 72MHz при напряжении от 2в до 3.6в

Добавить комментарий

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