Страница 1 из 1

Кнопка и delay

Добавлено: 02 июн 2017, 08:03
Андрей_Л
Добрый день.
Кнопка запускает двигатель на определенное время, устанавливая сигналы для драйвера двигателя. Длительность работы двигателя определяется через delay. Каждое нажатие кнопки запускает двигатель.

Подскажите, как при нажатии кнопки, если в это время двигатель работает, его останавливать?

Я использовал внешнее прерывание на кнопку, но двигатель не останавливается и есть дребезг.
На внешнее прерывание создана функция, которая вызывает другую для управления контактами драйвера двигателя. В основном цикле программы, обработки нажатия кнопки и управления двигателем нет, но есть управление другими элементами схемы и используется delay.
Можете подсказать как обработать внешнее прерывание и дребезг?

Re: Кнопка и delay

Добавлено: 02 июн 2017, 20:26
Эдуард
Здравствуйте!

Я строю программы по другому принципу. Все задачи должны отрабатываться параллельно. Так построены практически все программы уроков. Все мои библиотеки рассчитаны на работу параллельным процессом. Сложные программы по другому не сделать.

Я бы реализовал вашу задачу так.
Прежде необходимо создать прерывание по таймеру и в нем обрабатывать состояние кнопки (урок 9, библиотека Button).

Код: Выделить всё

#include <TimerOne.h>
#include <Button.h>

Button button1(8, 40); // создание объекта кнопка 1, вывод 8, время фильтрации 20 мс

void setup() {
  Timer1.initialize(500);  // инициализация таймера 1, период 500 мкс
  Timer1.attachInterrupt(timerInterrupt, 500);  // задаем обработчик прерываний
}

void loop() {

  }

}

//-------------------------------------- обработчик прерывания 500 мкс
void  timerInterrupt() {
  button1.filterAvarage();  // вызов метода фильтрации кнопки
}


Теперь в цикле loop() можно всегда узнать текущее состояние кнопки – признак button1.flagPress и выделить момент нажатия кнопки (фронт) – признак button1.flagClick .

Дальше в прерывание по таймеру надо добавить функцию управления шаговым двигателем (урок 29, библиотека StepMotor).

Код: Выделить всё

#include <TimerOne.h>
#include <Button.h>
#include <StepMotor.h>

Button button1(8, 40); // создание объекта кнопка 1, вывод 8, время фильтрации 20 мс
StepMotor myMotor(10, 11, 12, 13);  // создаем объект типа StepMotor, задаем выводы для фаз

void setup() {
  Timer1.initialize(500);  // инициализация таймера 1, период 500 мкс
  Timer1.attachInterrupt(timerInterrupt, 500);  // задаем обработчик прерываний
  myMotor.setMode(0, false);  // шаговый режим, без фиксации при остановке
  myMotor.setDivider(20);     // делитель частоты 20   
}

void loop() {

}

//-------------------------------------- обработчик прерывания 500 мкс
void  timerInterrupt() {
  button1.filterAvarage();  // вызов метода фильтрации кнопки
  myMotor.control(); // управвление двигателем 
}


Теперь в цикле loop() всегда можно сделать нужное количество шагов функцией step(). Например, myMotor.step(100);.

Для того, чтобы по нажатию кнопки сделать нужное количество шагов, добавьте в loop() следующий код.

Код: Выделить всё

#include <TimerOne.h>
#include <Button.h>
#include <StepMotor.h>

Button button1(8, 40); // создание объекта кнопка 1, вывод 8, время фильтрации 20 мс
StepMotor myMotor(10, 11, 12, 13);  // создаем объект типа StepMotor, задаем выводы для фаз

void setup() {
  Timer1.initialize(500);  // инициализация таймера 1, период 500 мкс
  Timer1.attachInterrupt(timerInterrupt, 500);  // задаем обработчик прерываний
  myMotor.setMode(0, false);  // шаговый режим, без фиксации при остановке
  myMotor.setDivider(20);     // делитель частоты 20   
}

void loop() {

  if ( button1.flagClick == true ) {
    // был клик кнопки
    button1.flagClick= false;         // сброс признака
    myMotor.step(100);  // сделать 100 шагов
  }

}

//-------------------------------------- обработчик прерывания 500 мкс
void  timerInterrupt() {
  button1.filterAvarage();  // вызов метода фильтрации кнопки
  myMotor.control(); // управление двигателем 
}


По такому принципу вы можете построить более сложную программу. В цикле loop() логически связываете управление объектами, обрабатываемыми в прерывании по таймеру. В данном случае это признак нажатия кнопки button1.flagClick и функция запуска двигателя myMotor.step(100).

Re: Кнопка и delay

Добавлено: 05 июн 2017, 08:19
Андрей_Л
Здравствуйте.
Спасибо за ответ.
Программу исправил. Двигатель подергивается, ротор не вращается.
Загрузил версию программы, которая раньше работала правильно. Но собранное устройство не работает. Не светит сегментный индикатор, не таботает потенциометр.
Буду разбираться.

Re: Кнопка и delay

Добавлено: 21 апр 2018, 14:57
Goga-romanov
Пожалуйста подскажите этот код для ардуино уно подойдет?

Re: Кнопка и delay

Добавлено: 21 апр 2018, 15:14
Эдуард
Да, конечно.

Re: Кнопка и delay

Добавлено: 21 апр 2018, 15:24
Goga-romanov
Спасибо добрые люди

Re: Кнопка и delay

Добавлено: 21 апр 2018, 21:16
Goga-romanov
Хочу сделать пожертвование, киви кошелек поддерживает перевод или нет? Просто каждый труд должен быть вознагражден, благодаря вашему проекту хочу собрать апликатора этикеток думаю что с этим скетчем все получится

Re: Кнопка и delay

Добавлено: 21 апр 2018, 21:21
Goga-romanov
А в место кнопки я могу подключить датчик препятствия? заранее благодарен

Re: Кнопка и delay

Добавлено: 21 апр 2018, 21:36
Эдуард
Да. Только надо учесть, что для кнопки активный уровень низкий. Т.е. когда кнопку нажимают, на входе 0.

Re: Кнопка и delay

Добавлено: 30 апр 2018, 09:34
Goga-romanov
Тоесть нужно смотреть по датчику какой подбирать? Хотя в моем понимании также как с кнопкой датчик при фиксации подает 5v на указанный контакт платы ардуино и мотор будет делать обороты при не паступающем сигнале мотор будет стоять

Re: Кнопка и delay

Добавлено: 03 май 2018, 18:09
Goga-romanov
блин у меня скетч не работает пишет ошибка компиляции