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

Для того, чтобы перезагрузить ваш Arduino не нажимая кнопку Reset, существует два варианта. Ниже рассмотрены оба.

Для их реализации потребуется минимум дополнительной электрической обвязки.

Используем провод, подключенный к 12 контакту

В этом случае светодиод на 13 пине Arduino (можно использовать и встроенный светодиод), мигает. 12 пин подключается к контакту Reset с помощью одного проводника.

провод, подключенный к 12 контакту Arduino

Без дополнительных ухищрений на программном уровне не обойтись, так как в начале работы нашего скетча, все пины на Arduino принимают значение LOW. В результате мы отключим наш контроллер. Но! Трюк заключается в том, что первое, что происходит в пределах функции setup(): мы подаем HIGH на контакт 12, который вызывает наш пин reset (digitalWrite(resetPin, HIGH), и таким образом обеспечивает сигнал HIGH на контакте Arduino RESET.

int led = 13;//пин 13 будет работать в качестве пина OUTPUT

Уроки Ардуино #16 — аппаратные прерывания

int resetPin = 12;

// функция setup отработате один раз, после того как вы нажмете reset:

// инициализируем цифровой пин в качестве выхода

Serial.begin(9600);// инициализируем подключение по серийному порту

Serial.println(«reset»);// отображаем строку reset, чтобы знать, что была произведена перезагрузка и

// опять отрабатывает функция setup

// цикл loop отрабатывает вновь и вновь:

digitalWrite(led, HIGH); // зажигаем светодиод (HIGH – это подача напряжение)

delay(1000); // ждем одну секунду

digitalWrite(led, LOW); // отключаем светодиод, подав команду LOW

delay(1000); // ждем одну секунду

Serial.println(«this never happens»);

// этого никогда не произойдет, так как Arduino перезагружается

Используем исключительно программную перезагрузку

Программная перезагрузка Arduino

В примере, который приведен ниже, вам не понадобится никакого дополнительного подключения. Мы просто инициализируем функцию reset и после вызываем reset.

void(* resetFunc) (void) = 0;//объявляем функцию reset с адресом 0

Читайте также:
Как работать в программе шум экоцентр

resetFunc(); //вызываем reset

Вся программа для перезагрузки Arduino:

// функция setup отрабатывает один раз после нажатия reset:

// инициализируем цифровой пин в качестве выхода.

Serial.begin(9600);// инициализируем серийный порт

void(* resetFunc) (void) = 0; // объявляем функцию reset

// этот цикл отрабатывается вновь и вновь:

digitalWrite(led, HIGH); // включаем светодиод

delay(1000); // ждем секунду

digitalWrite(led, LOW); // отключаем светодиод, подавая команду LOW

delay(1000); // ждем одну секунду

resetFunc(); //вызываем reset

Для чего можно использовать программную перезагрузку Arduino?

Перезагрузку Arduino на программном уровне можно использовать при работе с nRF24L01+ 2.4 Гц трансивером (с использованием библиотеки RF24 library). Этот скетч отлично подходит в тех случаях, когда трансивер теряет связь и перестает работать. Обеспечить перезагрузку модулей радиопередатчиков 2.4G Гц достаточно сложно, а вот перезагрузить ваш Arduino Uno или Arduino Pro Mini не составит проблем. Ваша программа должна отработать примерно следующее: «Если на протяжении 100 мс не было получено пакета данных, Arduino должен перезагрузиться». В результате модули радиопередатчиков автоматически переподключаются и связь налаживается!

XOD — графический язык программирования Arduino. Обзор языка и среды разработки

Оставляйте Ваши комментарии, вопросы и делитесь личным опытом ниже. В дискуссии часто рождаются новые идеи и проекты!

  • Arduino и серводвигатели — основы
  • Сервомотор и Arduino
  • Распознаем движение и жесты при помощи ПИР датчика и Arduino Nano
  • Видеотрансляция на Youtube с Arduino Yun
  • Датчик отпечатков пальцев и Arduino

Источник: arduino-diy.com

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

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

Для того, чтобы перезагрузить 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 секунд), который можно запустить или сбрасывать в начальное состояние программным способом. Как только таймер «дотикает» до нуля, контроллер подает сигнал сброса и устройство уходит в 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 на программном уровне

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 пине в самом начале программы, иначе будет происходить сброс;
  2. в примере перезагрузка Ардуино из кода происходит каждые 10 секунд.

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

Источник: xn--18-6kcdusowgbt1a4b.xn--p1ai

Что такое Reset

После сброса микроконтроллер сначала ждёт поступления команд от ПК (новый скетч). Если команды есть, то загрузчик записывает получаемые данные, а потом запускает новую программу на выполнение.

Если же команд не поступает, то загрузчик запускает программу, которая была в микроконтроллере ранее. В случае, если никакой программы в микроконтроллере нет, он выполняет по кругу пустой цикл void loop ().

Способ однократного выполнения команд

Давайте напишем скетч, который будет выполнять команды только один раз после нажатия кнопки reset. Для этого все необходимые команды указываются в блоке void setup ().

/* Включаем и выключаем светодиод на одну секунду и так 3 раза подряд, но только при старте скетча*/ void setup () < pinMode (13, OUTPUT); // Настраиваем 13 вывод на работу в режиме выхода digitalWrite (13, HIGH); // установим на выходе логическую 1 delay (1000); // задержка 1 сек digitalWrite (13, LOW); // установим на выходе логический 0 delay (1000); // задержка 1 сек digitalWrite (13, HIGH); // установим на выходе логическую 1 delay (1000); // задержка 1 сек digitalWrite (13, LOW); // установим на выходе логический 0 delay (1000); // задержка 1 сек digitalWrite (13, HIGH); // установим на выходе логическую 1 delay (1000); // задержка 1 сек digitalWrite (13, LOW); // установим на выходе логический 0 delay (1000); // задержка 1 сек >void loop ()

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru