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

Для того, чтобы перезагрузить 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");
  }
}

Пояснения к коду:

  1. функция asm volatile(«jmp 0x00»); перезапускает программу с начала, но не сбрасывает порты, команду можно использовать в любом месте кода;
  2. в нашем примере перезагрузка из программы происходит каждые 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);
  }
}

Пояснения к коду:

  1. чтобы не происходило перезагрузки микроконтроллера, следует снять комментарий с команды wdt_reset();, тогда счетчик будет запускаться заново — в противном случае каждые 4 секунды будет происходить перезагрузка Ардуино.

Аппаратная перезагрузка Ардуино (hard reset)

Аппаратная перезагрузка возвращает все настройки платы по-умолчанию, т.е. все переменные возвращаются к исходному значению, а все задействованные порты отключаются и устанавливаются заново. Т.е. hard reset — это самая настоящая перезагрузка, которая происходит при нажатии на кнопку RESET. Но эту перезагрузку также можно вызвать из кода, подав низкий сигнал на порт Reset Ардуино.

Как перезагрузить Arduino на программном уровне
Как перезагрузить Arduino на программном уровне / arduino reset pin
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);
  }
}

Пояснения к коду:

  1. важно установить высокий уровень сигнала на 12 пине в самом начале программы, иначе будет происходить сброс (arduino nano reset);
  2. в примере перезагрузка Ардуино из кода происходит каждые 10 секунд.

Заключение. Мы рассмотрели, как перезагрузить Ардуино на программном уровне на примере трех вариантов. Не забывайте, что используя аппаратную перезагрузку необходимо быть внимательным и устанавливать нужные значения до перезагрузки микроконтроллера. Ну а если нужен самый настоящий reset микроконтроллера, то используйте аппаратную перезагрузку Ардуино (hard reset arduino).



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

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

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.