СОДЕРЖАНИЕ ►
Для того, чтобы перезагрузить Arduino не нажимая кнопку Reset, существует три варианта — все способы мы рассмотрим в этом обзоре. Перезагрузку Arduino требуется выполнять при зависании микроконтроллера или при работе с nRF24L01+ радио модулем, например, когда трансивер теряет связь и перестает работать. Перезагрузить радиопередатчики сложно, а вот перезагрузить Ардуино не составит проблем.
Для этого занятия потребуется:
- Arduino Uno / Arduino Nano / Arduino Mega;
- резистор на 1 кОм;
- макетная плата;
- провода «папа-папа».
Программная перезагрузка Ардуино (soft reset)
Программная перезагрузка — это на самом деле не настоящий сброс программы, а просто переход в начало кода (в нулевой адрес). То есть код начинает исполнятся с самого начала, не влияя на установки Ардуино на момент soft reset. Например, если на момент перезагрузки микроконтроллера был установлен сигнал «HIGH» на каком-то выходе, то значение не вернется по умолчанию в «LOW», а так и останется «HIGH».
Перезагрузка Ардуино из программы (softReset)
unsigned long timer; void setup() { Serial.begin(9600); delay(100); Serial.println("start"); timer = millis(); } void loop() { if (millis() - timer > 10000) { Serial.println("reboot"); delay(100); asm volatile("jmp 0x00"); } }
Пояснения к коду:
- функция asm volatile(«jmp 0x00»); перезапускает программу с начала, но не сбрасывает порты, команду можно использовать в любом месте кода;
- в нашем примере перезагрузка из программы происходит каждые 10 секунд.
Чтобы использовать сторожевой таймер (watchdog), необходимо включить файл avr/wdt.h, а затем вызвать функцию wdt_enable(). Сторожевой таймер — это встроенный таймер (до 8 секунд), который можно запустить или сбрасывать в начальное состояние программным способом (arduino uno reset). Как только таймер «дотикает» до нуля, контроллер подает сигнал сброса и устройство уходит в hard перезагрузку.
Перезагрузка Ардуино при зависании (Watchdog)
#include "avr/wdt.h" unsigned long timer; void setup() { wdt_disable(); Serial.begin(9600); delay(100); Serial.println("start"); timer = millis(); wdt_enable(WDTO_4S); // активация таймера, каждые 4 секунды его нужно сбрасывать /* Возможные значения для константы 15mS WDTO_15MS 30mS WDTO_30MS 60mS WDTO_60MS 120mS WDTO_120MS 250mS WDTO_250MS 500mS WDTO_500MS 1S WDTO_1S 2S WDTO_2S 4S WDTO_4S 8S WDTO_8S */ } void loop() { // wdt_reset(); // чтобы не было перезагрузки снимите комментарий if (millis() - timer > 10000) { Serial.println("reboot"); delay(1000); } }
Пояснения к коду:
- чтобы не происходило перезагрузки микроконтроллера, следует снять комментарий с команды wdt_reset();, тогда счетчик будет запускаться заново — в противном случае каждые 4 секунды будет происходить перезагрузка Ардуино.
Аппаратная перезагрузка Ардуино (hard reset)
Аппаратная перезагрузка возвращает все настройки платы по-умолчанию, т.е. все переменные возвращаются к исходному значению, а все задействованные порты отключаются и устанавливаются заново. Т.е. hard reset — это самая настоящая перезагрузка, которая происходит при нажатии на кнопку RESET. Но эту перезагрузку также можно вызвать из кода, подав низкий сигнал на порт Reset Ардуино.

unsigned long timer; void setup() { digitalWrite(12, HIGH); pinMode(12, OUTPUT); Serial.begin(9600); delay(100); Serial.println("start"); timer = millis(); } void loop() { if (millis() - timer > 10000) { Serial.println("reboot"); delay(100); digitalWrite(12, LOW); } }
Пояснения к коду:
- важно установить высокий уровень сигнала на 12 пине в самом начале программы, иначе будет происходить сброс (arduino nano reset);
- в примере перезагрузка Ардуино из кода происходит каждые 10 секунд.
Заключение. Мы рассмотрели, как перезагрузить Ардуино на программном уровне на примере трех вариантов. Не забывайте, что используя аппаратную перезагрузку необходимо быть внимательным и устанавливать нужные значения до перезагрузки микроконтроллера. Ну а если нужен самый настоящий reset микроконтроллера, то используйте аппаратную перезагрузку Ардуино (hard reset arduino).










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