Как установить optiboot в arduino ide
С каждым днем компания "Arduino" разрабатывает и производит все большее количество плат (на данный момент среда версии 1.0.5 поддерживает уже 27 вариаций различных плат), модернизации также постоянно подвергается и среда разработки Arduino IDE.
Данные факты не являются открытием и хорошо известны широкому кругу пользователей, однако есть еще одно очень полезное направление, которое осталось прозябать в тени без должного пиара.
В 2010 году некий Рыцарь Петр (Peter Knight), написал новый бутлоадер, который стал занимать в 4 раза меньше места в сравнении со стандартным (всего 512 б флеш-памяти). Также увеличилась и скорость загрузки скетчей. Теперь она производится на скорости 115200.
Данный бутлоадер получился настолько удачным, что теперь он установлен по дефолту на платах Arduino UNO, Mega 2560.
Установка Optiboot
На данный момент модернизированные бутлоадеры "optiboot" доступны для следующих плат:
Arduino Duemilanove or Nano w/ ATmega328
Arduino Diecimila, Duemilanove, Nano, NG w/ ATmega168
Arduino Mini
LilyPad Arduino w/ ATmega328
LilyPad Arduino w/ ATmega168
Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega328
Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega168
Arduino Mega1280
Arduino NG or older w/ ATmega8
Arduino NG or older w/ ATmega88
Приведем пример установки полной версии.
Для начала необходимо необходимо cкачать ZIP архив с файлами с сайта автора. На данный момент последняя версия 5.0а, датируемая 12.06.2012.
Поле распаковки, внутри папки, мы видим следующие файлы:
Копируем только папки в соответствующие директории в папку со средой Arduino (файл boards.txt не копируем. ). После копирования, в папках можно увидеть новые HEX фалы (подсвечены зеленым)
Теперь необходимо прописать необходимые вам палаты в файлик boards.txt
Вариант 1
Можно полностью скопировать файл boards.txt из папки оптибута и дописать его в файл boards.txt в папке Arduino. Этот вариант самый простой, однако можно столкнуться с проблемой отображения плат. Среда Arduino IDE не раскидывает платы на пару столбцов, а выдаёт их в одном. В связи с этим количество плат, которые вы сможете увидеть, будет прямо пропорционально разрешению вашего экрана.
Пример отображения на мониторе с разрешением 1920x1080
Пример отображения на ноутбуке с разрешением 1366x768
Вариант 2
Вариант 1 прост, но подходит не всегда. Более целесообразно вырвать из файла boards.txt (optiboot), только те платы, которыми вы будете пользоваться.
Хочется отметить, что при открытии данного файла стандартным блокнотом вы увидите полную кашу.
При открытии же любым продвинутым редактором, вашему взору представится следующая картина.
Как мы видим, все расписано красиво и отсюда уже легко можно вырвать нужную вам плату
Для наглядности добавим в список плат только Atmega8 ([Optiboot] Arduino NG or older w/ ATmega8)
Текст вставки в boards.txt будет следующим:
P.S. На наш взгляд то, что можно добавлять или убирать платы из меню среды, простым редактированием файлика "boards.txt" является несомненным плюсом. Лично мне не нравится огромный список плат, половину из которых я даже в руках не держал. Для себя я оставил только те платы, с которыми я часто имею дело.
После добавления меги8, открываем сервис и ищем в платах
Все, осталось только прошить бутлоадер. Если вы уже добавили нужную вам "optiboot" плату в среду Arduino IDE, то прошить "optiboot" бутлоадер можно автоматически прямо из среды, при наличии у вас программатора поддерживаемого IDEшкой.
Статьи в подобной тематике:
А как же комментарии?
В данный момент еще реализованы не все элементы нашего сообщества. Мы активно работаем над ним и в ближайшее время возможность комментирования статей будет добавлена.
Не секрет, что 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в
Загрузчик (bootloader)
Загрузчик живёт в самом конце Flash памяти МК и позволяет записывать прошивку, отправляемую через UART. Загрузчик стартует при подаче питания на МК, ждёт некоторое время (вдруг кто-то начнёт слать код прошивки по UART), затем передаёт управление основной программе. И так происходит каждый каждый раз при старте МК.
- Загрузчик позволяет прошивать МК через UART;
- Загрузчик замедляет запуск МК, т.к. при каждом запуске ждёт некоторое время для потенциальной загрузки прошивки;
- Загрузчик занимает место во Flash памяти. Стандартный старый для Arduino NANO занимает около 2 кБ, что весьма существенно!
- Именно загрузчик мигает светодиодом на 13 пине при включении, как индикация работы.
Программатор
Помимо записи прошивки во flash память, программатор позволяет:
- Считывать содержимое Flash памяти (скачать прошивку на компьютер)
- Полностью очищать чип от всех данных и настроек
- Записывать и читать загрузчик
- Считывать/записывать EEPROM память
- Читать и настраивать фьюзы (fuses, fuse-bits) и лок биты.
USB-TTL (UART)
USB-TTL | Arduino |
DTR | DTR |
RX | TX |
TX | RX |
GND | GND |
VCC/5V/3.3V | VCC |
Фьюзы (Pro)
Фьюзы (фьюз-биты) являются низкоуровневыми настройками микроконтроллера, которые хранятся в специальном месте в памяти и могут быть изменены только при помощи ISP программатора. Это такие настройки как выбор источника тактирования, размер области памяти под загрузчик, настройка отсечки по напряжению и прочее. Фьюз-биты собраны по 8 штук в байты (т.н. байты конфигурации), как типичный регистр микроконтроллера AVR. Таких байтов может быть несколько, они называются low fuses, high fuses, extended fuses. Для конфигурации байтов рекомендуется использовать калькулятор фьюзов (например, вот такой), в котором просто ставятся галочки на нужных битах, и на выходе получается готовый байт в hex виде. Рассмотрим на примере ATmega328p:
Лок-биты (Pro)
Лок-биты (lock-bits) позволяют управлять доступом к памяти микроконтроллера, что обычно используется для защиты устройства от копирования. Лок-биты собраны опять же в конфигурационный лок-байт, который содержит: BOOTLOCK01, BOOTLOCK02, BOOTLOCK11, BOOTLOCK12, LOCKBIT1, LOCKBIT2 (для ATmega328). Калькулятор лок-битов можно использовать этот. BOOTLOCK биты позволяют запретить самому МК запись (самопрограммирование) во flash память (область программы и область загрузчика)
А вот локбиты LOCKBIT позволяют запретить запись и чтение flash и EEPROM памяти извне, при помощи программатора, т.е. полностью защитить прошивку от скачивания и копирования:
Таким образом включив LOCKBIT1 (лок-байт будет 0x3E) мы запретим внешнюю запись во Flash и EEPROM память, т.е. при помощи ISP программатора, а включив LOCKBIT1 и LOCKBIT2 (лок-байт: 0x3C) полностью заблокируем заодно и чтение данных из памяти микроконтроллера. Повторюсь, всё описанное выше относится к ATmega328p, для других моделей МК читайте в соответствующих даташитах.
ISP программатор
USBasp
Решение проблем
Решение большинства проблем с загрузкой через программатор (независимо от того, что написано в логе ошибки):
- Вытащить и обратно вставить usbasp в usb порт
- Вставить в другой usb порт
- Переустановить драйвер на usbasp
- Проверить качество соединения USBasp с МК
- Перепаять переходник и отмыть флюс
Для прошивки микроконтроллера, тактирующегося низкой частотой (менее 1 МГц внутренний клок):
Основные ошибки в логе Arduino IDE
Arduino as ISP
Почти любая другая плата Arduino может стать ISP программатором, для этого нужно просто загрузить в неё скетч ArduinoISP:
- Открыть скетч Файл > Примеры > 11. ArduinoISP > ArduinoISP
- Всё! Ваша Arduino теперь стала ISP программатором
- Подключаем к ней другую Arduino или голый чип по схеме ниже
- Выбираем Arduino as ISP в Инструменты > Программатор
- И можем писать загрузчики, фьюзы или загружать прошивку напрямую во Flash
-
Либо поставить поставить конденсатор ёмкостью
Решение проблем
Для прошивки микроконтроллера, тактирующегося низкой частотой (менее 1 МГц внутренний клок):
- Arduino ISP: нужно изменить частоту загрузки прошивки в скетче Arduino ISP и снова прошить его в ардуино-программатор (см. строку в скетче 45 и ниже);
Работа в Arduino IDE
Прошивка загрузчика
Как убрать загрузчик?
Загрузка скетча
В Arduino IDE можно зашить скетч через программатор, для этого надо нажать Скетч > Загрузить через программатор. Это очень удобно в том случае, когда МК используется без загрузчика, или просто голый МК.
Фьюзы
Конфигуратор платы в Arduino IDE устроен следующим образом: каждой плате в Инструменты > Плата соответствует свой набор настроек, включая фьюзы, которые прошиваются вместе с загрузчиком . Некоторые из них:
- Загрузчик (путь к файлу)
- Скорость загрузки (через загрузчик)
- Объем доступной flash и sram памяти
- Весь набор фьюзов и лок-биты
Файл конфигурации называется boards.txt и найти его можно в папке с ядром Arduino: C:\Program Files (x86)\Arduino\hardware\arduino\avr\boards.txt. Документацию на boards.txt можно почитать здесь. При желании можно вывести нужные фьюзы через калькулятор (читайте выше), изменить их в boards.txt (главное не запутаться, для какой выбранной конфигурации платы делается изменение) и прошить в МК, нажав Инструменты > Записать загрузчик.
Такая работа с фьюзами максимально неудобна, но есть и другие варианты:
- Ядро GyverCore для atmega328, в нем мы сделали кучу готовых настроек фьюзов прямо в настройках платы, читайте в уроке про GyverCore. Несколько загрузчиков, включая вариант без загрузчика, выбор источника тактирования и другие настройки в один клик мышкой.
- Программа AVRdudeprog, про нее поговорим ниже
Avrdudeprog
- Чтение/запись/очистка flash памяти
- Чтение/запись/очистка eeprom памяти
- Полная очистка чипа
- Калькулятор фьюзов и локбитов (чтение/запись)
Более подробный обзор на avrdudeprog можно посмотреть здесь . Давайте посмотрим на калькулятор фьюзов. Выбираем свой микроконтроллер и программатор (можно добавить другие модели микроконтроллеров и программаторов, читай тут). Переходим во вкладку Fuses, нажимаем прочитать. При успешном чтении увидим текущий набор настроек своего чипа. Можно их поменять и загрузить. Важно! Галку инверсные биты не трогаем! Лок-биты и отключение RST заблокирует микроконтроллер, не трогайте их, если такой цели нет! Можно загружать прошивку или загрузчик из .hex файла, указав путь к ней на первой вкладке в окне Flash. Очень удобная утилита для низкоуровневой работы с МК.
Видео
Для проверки загрузчика следует загрузить в плату следующий скетч:
wdt_disable ( ) ; // бесполезная строка до которой не доходит выполнение при bootloop delay ( 5000 ) ; // Задержка, чтобы было время перепрошить устройство в случае bootloop wdt_enable ( WDTO_8S ) ; // Для тестов не рекомендуется устанавливать значение менее 8 сек. // Каждую секунду мигаем светодиодом и значение счетчика пишем в Serial digitalWrite ( 13 , digitalRead ( 13 ) == 1 ? 0 : 1 ) ; delay ( 1 ) ;После подачи питания встроенный светодиод мигнет, сигнализируя о том, что запустился загрузчик. Далее в секции setup происходит включение watchdog с таймером на 8 сек. Через 8 минут работы должна произойти перезагрузка. Если после перезагрузки платы весь цикл повторяется, то ваша плата поддерживает watchdog:
Arduino не подвержена bootloop
В противном случае вы увидите, как светодиод на 13 пине начнёт лихорадочно мигать. Это как раз и есть внешнее проявление bootloop. В мониторе порта вы увидите только первый цикл. После него новые строки выводиться перестанут:
Arduino подвержена bootloop
После прошивки загрузчика optiboot вы уже не сможете загружать в плату скетчи со стандартными настройками среды. Поэтому, рекомендую все последующие действия производить на копии среды разработки. В ОС linux для этого достаточно скопировать каталог, из которого запускается среда разработки с новым именем. В ОС Windows, кажется, тоже достаточно просто скопировать папку (по умолчанию C:\Program Files (x86)\Arduino). Далее все пути к папкам и файлам указаны относительно корневого каталога со средой разработки.
Папку optiboot-master/optiboot/bootloaders/optiboot из архива нужно переместить в hardware/arduino/avr/bootloaders/optiboot
Содержимое файла optiboot-master/optiboot/boards.txt дописать в конец файла hardware/arduino/avr/boards.txt
После (пере)запуска среды разработки, в списке плат появятся новые платы с пометкой [optiboot].
Для прошивки загрузчика вам понадобится 2 платы Arduino. Одна из них будет использоваться в качестве программатора. Теоретически, в качестве программатора подходит любая плата. Но у меня получилось заставить работать только Arduino Uno. Ни Nano, ни leonardo работать программатором не захотели. Если Arduino Uno у вас нет, купить её у проверенного мной продавца можно здесь.
Подключите плату-программатор к компьютеру и залейте в неё скетч Arduino ISP, который входит в стандартную поставку среды разработки (Файл->Arduino ISP->Arduino ISP).
Прошивка скетча Arduino ISP
Теперь можно временно отключить нашу плату-программатор от компьютера. И соединить её с платой, в которую хотим записать загрузчик. В моём случае, это будет Arduino Nano. Прошивка производится через отдельный разъем ICSP, который есть почти на всех платах. MISO соединяется с MISO, MOSI с MOSI и SCK с SCK. При этом подключать ICSP целевой платы нужно к обычным выводам платы-программатора. Это довольно странно, но соединение ICSP-ICSP не работает. Хотя контакты там физически соединены друг с другом. Соединение нужно выполнить вот по такой схеме:
Номер вывода на плате-программаторе | Вывод ISCP разъёма |
---|---|
10 | RST (Reset) |
11 | MOSI |
12 | MISO |
13 | SCK |
Вот распиновка ICSP разъёма (плата ориентирована USB разъёмом вправо):
ICSP разъём Arduino
Дополнительно, необходимо на плате-программаторе установить электролитический конденсатор ёмкостью не менее 10мкФ(uF) между выводом Reset и GND, для препятствования автоматическому сбросу программатора при начале прошивки. Не забудьте подключить питание к целевой плате.
Ещё можно установить светодиоды (через резистор), с помощью которых программатор сигнализирует об ошибках:
Номер вывода на плате-программаторе | Название | Описание |
---|---|---|
9 | Heartbeat | Плавно меняет яркость сигнализируя о нормальной работе |
8 | Error | Ошибка во время прошивки |
7 | Programming | Мигает во время прошивки |
Вот так всё это должно выглядеть в итоге:
Программатор подключён к Arduino Nano
На схеме не показаны резисторы для светодиодов, что бы не загромождать иллюстрацию. Если вы не знаете, зачем светодиодам нужны резисторы, то я вам целую статью написал: Светодиод .
В случае прошивки Arduino Pro Mini, у которого нет IСSP, подключение производится непосредственно к выводам:
Номер вывода на плате-программаторе | Вывод Arduino Mini |
---|---|
11 | 11 |
12 | 12 |
13 | 13 |
А в качестве платы для прошивки указать целевую плату, а не программатор. Т.Е. в моём случае, в качестве платы выбираю Arduino Nano:
Выбор платы для прошивки
Запись загрузчика в плату
Для Arduino Nano:
menu.cpu.nano.atmega328.upload.speed=115200
Для Arduino Mini:
menu.cpu.mini.atmega328.upload.speed=115200
С такими настройками вы уже не сможете заливать скетчи в платы с оригинальным загрузчиком. Поэтому, вам нужно либо прошить все свои платы под optiboot, либо иметь копию среды разработки с изменёнными настройками. Поэтому в начале статьи я и предлагал создать копию среды.
После всех манипуляций подключаем целевую плату к компьютеру и вновь заливаем проверочный скетч из начала статьи. Всё должно работать.
Читайте также: