Перейти к содержанию

Перезагрузка Ардуино программно, командой

Перезагрузка Ардуино программно, командой

Чтобы перезагрузить Arduino без нажатия кнопки Reset, существует три варианта — мы рассмотрим их все в этом обзоре. Перезапуск Arduino необходим при зависании микроконтроллера или при использовании радио модуля nRF24L01, например, когда приемопередатчик теряет связь и перестает работать. Перезапуск радиопередатчиков затруднителен, но перезапуск платы Arduino при зависании не представляет проблемы.

Необходимые компоненты:

  • Arduino Uno / Arduino Nano / Arduino Mega
  • резистор
  • макетная плата
  • коннекторы

Дополнительные материалы на эту тему:

  1. Внешние и аппаратные прерывания в Ардуино
  2. Цифровые и аналоговые пины Arduino Uno / Nano
  3. Описание и характеристики плат семейства Arduino

Аппаратный сброс микроконтроллера Ардуино возвращает все параметры платы к значениям по умолчанию, т.е. все переменные сбрасываются к исходным значениям, а все активные порты деактивируются и устанавливаются заново. Жесткий сброс (hard reset arduino uno) — это реальный сброс, который происходит при нажатии кнопки RESET. Но этот сброс можно вызвать и из кода, подав сигнал низкого уровня на pin Reset Arduino.

Перезагрузка Ардуино аппаратным способом

Перезагрузка Ардуино аппаратным способом

В следующем примере программы в начале работы скетча важно установить высокий уровень сигнала на выводе 12, иначе произойдет сброс микроконтроллера (hard reset arduino nano). В этом примере будет происходить аппаратный сброс микроконтроллера каждые 10 секунд (период можно изменить). Соберите схему на макетной плате, как показано на изображении выше и загрузите следующую программу в плату Ардуино Уно.

Скетч для аппаратной перезагрузки Ардуино


unsigned long timer;

void setup() {
  digitalWrite(12, HIGH); 
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
  Serial.begin(9600);
  delay(100);
  Serial.println("start");
  timer = millis();
}

void loop() {
  // встроенный светодиод на 13 пине
  // будет мигать при каждой перезагрузке
  digitalWrite(13, HIGH);
  if (millis() - timer > 10000) {
    Serial.println("reboot");
    delay(100);
    digitalWrite(12, LOW);
  }
}

Перезагрузка Ардуино программным способом

Перезагрузка Ардуино программно, командой

Мягкий сброс (soft reset arduino) — это не настоящий сброс программы, а просто переход к началу кода (по нулевому адресу). Другими словами, код начинает выполняться с самого начала, не затрагивая параметры Arduino на момент сброса. Например, если на момент сброса микроконтроллера на каком-либо выходе было установлено значение «HIGH», то после перезагрузки оно не вернется в значение «LOW», а останется «HIGH».

Скетч для программной перезагрузки Ардуино

unsigned long timer;

void setup() {
  pinMode(13, OUTPUT);
  Serial.begin(9600);
  delay(100);
  Serial.println("start");
  timer = millis();
}

void loop() {
  // встроенный светодиод на 13 пине
  // НЕ будет мигать при каждой перезагрузке
  digitalWrite(13, HIGH);
  if (millis() - timer > 10000) {
    Serial.println("reboot");
    delay(100);
    asm volatile("jmp 0x00");
  }
}

Для использования Watchdog необходимо включить файл avr/wdt.h, а затем вызвать функцию wdt_enable(). Сторожевой таймер представляет собой встроенный таймер (до 8 секунд), который может быть запущен или сброшен. Как только таймер достигает нуля, контроллер выдает сигнал сброса, и устройство самостоятельно сбрасывается. Если программа выполняется слишком долго, сторожевой таймер перезагрузит Arduino.

Скетч перезагрузки Ардуино командой 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);
  /* можно выбрать одно из нескольких значений
  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);
  }
}

Заключение. На трех примерах мы рассмотрели, как программно (arduino software reset) и аппаратно (hard reset arduino mega 2560) сбросить плату Arduino Uno или Arduino Nano. Помните, что при использовании аппаратного сброса нужно быть осторожным и устанавливать правильные значения перед перезагрузкой микроконтроллера. Если вам нужен настоящий сброс, используйте жесткую перезагрузку (arduino reset pin).

Комментарии 4

  • Не, не катит.
    Прокрутил все рекомендованные варианты,
    — задержка по выводу в монитор только в «Скетч для программной перезагрузки Ардуино», но не перезагрузка платы.
    — а:
    > » Скетч для аппаратной перезагрузки Ардуино» и
    > «Скетч перезагрузки Ардуино командой Watchdog»
    вообще … ???
    Тщательней надо, тщательней.

  • аппаратный сброс данным способом не пройдет… Ардуинка уйдет в вечный сброс, пока не отключить электричество… Нужна схема одновибратора

  • Спасибо! Программный сброс Arduino Nano помог от зависаний после использования комбинации функций IR-декодирования и звука (tone)

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

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

newzaym
➜