Arduino, watchdog, bootloop і прошивка завантажувача optiboot, електронні печеньки

Як вам може бути відомо, Arduino (а вірніше, мікроконтролер на платі) підтримує watchdog (сторожовий таймер) який дозволяє встановити проміжок часу, через який мікроконтролер буде перезавантажений, навіть якщо програма зависне. При цьому, сторожовий таймер може бути скинутий програмно. Схема роботи приблизно наступна: «взодім» таймер на кілька секунд, а далі в основній програмі постійно Обнуляємо лічильник, якщо все йде нормально. Як тільки ми перестанемо обнуляти лічильник (а це і може означати зависання), контролер автоматично перезавантажиться після закінчення заданого часу. Однак, робота з watchdog повинна підтримуватися загрузчиком плати. Справа в тому, що після перезавантаження, яка була викликана watchdog, контролери останніх випусків залишають включеним сторожовий таймер на мінімальний період, тобто 15ms. Це потрібно для того, щоб була можливість всередині програми дізнатися, що перезавантаження була по watchdog.Поетому першочергове завдання завантажувача - зберегти інформацію про те, що перезавантаження була «несподіваною» і відразу ж вимкнути сторожа. Якщо цього не зробити, то система піде в bootloop, тобто буде вічно перевантажуватися. Як відомо, в Arduino є спеціальний завантажувач, який виконується в першу чергу після перезавантаження системи. І, на превеликий жаль, стандартний завантажувач не скидати watchdog! Таким чином, система заходить в жорстокий bootloop (стан «crazy led», при якому світлодіод на 13-му піне блимає як божевільний). Зі статті ви дізнаєтеся, як перевірити завантажувач своєї плати на підтримку watchdog і що робити, якщо він не підтримується.

Для перевірки завантажувача слід завантажити в плату наступний скетч:

Після подачі живлення вбудований світлодіод мигне, сигналізуючи про те, що запустився завантажувач. Далі в секції setup відбувається включення watchdog з таймером на 8 сек. Через 8 хвилин роботи повинно відбутися перезавантаження. Якщо після перезавантаження плати весь цикл повторюється, то ваша плата підтримує watchdog:

Arduino, watchdog, bootloop і прошивка завантажувача optiboot, електронні печеньки

Arduino не схильна до bootloop

В іншому випадку ви побачите, як світлодіод на 13 піне почне гарячково блимати. Це як раз і є зовнішній прояв bootloop. У моніторі порту ви побачите тільки перший цикл. Після нього нові рядки виводитися перестануть:

Arduino, watchdog, bootloop і прошивка завантажувача optiboot, електронні печеньки

Arduino схильна bootloop

Натискання кнопки reset не змінити ситуації. Для «лікування» плати, її потрібно відключити від живлення, потім підключити знову і залити будь-який інший скетч.

Після прошивки завантажувача 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, watchdog, bootloop і прошивка завантажувача optiboot, електронні печеньки

Прошивка скетчу Arduino ISP

Тепер можна тимчасово відключити нашу плату-програматор від комп'ютера. І з'єднати її з платою, в яку хочемо записати завантажувач. У моєму випадку, це буде Arduino Nano. Прошивка проводиться через окремий роз'єм ICSP, який є майже на всіх платах. MISO з'єднується з MISO, MOSI з MOSI і SCK з SCK. При цьому підключати ICSP цільової плати потрібно до звичайних висновків плати-програматора. Це досить дивно, але з'єднання ICSP-ICSP не працює. Хоча контакти там фізично з'єднані один з одним. З'єднання потрібно виконати ось за такою схемою:

Номер висновку на платі-программаторе

Висновок ISCP роз'єму

Ось терморегулятори ICSP роз'єму (плата орієнтована USB роз'ємом вправо):

ICSP роз'єм Arduino

Додатково, необхідно на платі-программаторе встановити електролітичний конденсатор ємністю не менше 10мкФ (uF) між висновком Reset і GND, для перешкоджання автоматичного скидання програматора при початку прошивки. Не забудьте підключити живлення до цільової платі.

Ще можна встановити світлодіоди (через резистор), за допомогою яких програматор сигналізує про помилки:

Номер висновку на платі-программаторе

Плавно змінює яскравість сигналізуючи про нормальну роботу

Помилка під час прошивки

Блимає під час прошивки

Ось так все це повинно виглядати в підсумку:

Arduino, watchdog, bootloop і прошивка завантажувача optiboot, електронні печеньки

Програматор підключений до Arduino Nano

На схемі не показані резистори для світлодіодів, що б не захаращувати ілюстрацію. Якщо ви не знаєте, навіщо светодиодам потрібні резистори, то я вам цілу статтю написав: Світлодіод.

У разі прошивки Arduino Pro Mini, у якого немає IСSP, підключення проводиться безпосередньо до висновків:

Номер висновку на платі-программаторе

Висновок Arduino Mini

Після підключення цільової плати до программатору, потрібно підключити програматор до комп'ютера, як програматора вибрати «Arduino as ISP»:

Arduino, watchdog, bootloop і прошивка завантажувача optiboot, електронні печеньки

А в якості плати для прошивки вказати цільову плату, а не програматор. Тобто в моєму випадку, в якості плати вибираю Arduino Nano:

Arduino, watchdog, bootloop і прошивка завантажувача optiboot, електронні печеньки

Вибір плати для прошивки

Тепер досить вибрати пункт «Інструменти» -> »Записати завантажувач»:

Arduino, watchdog, bootloop і прошивка завантажувача optiboot, електронні печеньки

Запис завантажувача в плату

Після запису завантажувача потрібно ще виправити конфіг. Завантажники optiboot мають ще одну особливість - вони збільшують швидкість взаємодії з послідовного порту, тому при використанні плат з optiboot потрібно внести відповідні зміни в boards.txt:

Для Arduino Nano:
menu.cpu.nano.atmega328.upload.speed = 115200
Для Arduino Mini:
menu.cpu.mini.atmega328.upload.speed = 115200

З такими настройками ви вже не зможете заливати скетчі в плати з оригінальним загрузчиком. Тому, вам потрібно або прошити всі свої плати під optiboot, або мати копію середовища розробки з зміненими настройками. Тому на початку статті я і пропонував створити копію середовища.

Після всіх маніпуляцій підключаємо цільову плату до комп'ютера і знову заливаємо перевірки скетч з початку статті. Все повинно працювати.

Процес прошивки може не стартувати і видаватися помилка:

Схожі статті