Кнопка и delay

Вопросы программирования в системе Ардуино
Андрей_Л
Сообщения: 2
Зарегистрирован: 02 июн 2017, 07:47

Кнопка и delay

Сообщение Андрей_Л » 02 июн 2017, 08:03

Добрый день.
Кнопка запускает двигатель на определенное время, устанавливая сигналы для драйвера двигателя. Длительность работы двигателя определяется через delay. Каждое нажатие кнопки запускает двигатель.

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

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


Эдуард
Администратор
Сообщения: 484
Зарегистрирован: 30 окт 2016, 20:53

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).

Андрей_Л
Сообщения: 2
Зарегистрирован: 02 июн 2017, 07:47

Re: Кнопка и delay

Сообщение Андрей_Л » 05 июн 2017, 08:19

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

Goga-romanov
Сообщения: 7
Зарегистрирован: 21 апр 2018, 11:52

Re: Кнопка и delay

Сообщение Goga-romanov » 21 апр 2018, 14:57

Пожалуйста подскажите этот код для ардуино уно подойдет?

Эдуард
Администратор
Сообщения: 484
Зарегистрирован: 30 окт 2016, 20:53

Re: Кнопка и delay

Сообщение Эдуард » 21 апр 2018, 15:14

Да, конечно.

Goga-romanov
Сообщения: 7
Зарегистрирован: 21 апр 2018, 11:52

Re: Кнопка и delay

Сообщение Goga-romanov » 21 апр 2018, 15:24

Спасибо добрые люди

Goga-romanov
Сообщения: 7
Зарегистрирован: 21 апр 2018, 11:52

Re: Кнопка и delay

Сообщение Goga-romanov » 21 апр 2018, 21:16

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

Goga-romanov
Сообщения: 7
Зарегистрирован: 21 апр 2018, 11:52

Re: Кнопка и delay

Сообщение Goga-romanov » 21 апр 2018, 21:21

А в место кнопки я могу подключить датчик препятствия? заранее благодарен

Эдуард
Администратор
Сообщения: 484
Зарегистрирован: 30 окт 2016, 20:53

Re: Кнопка и delay

Сообщение Эдуард » 21 апр 2018, 21:36

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

Goga-romanov
Сообщения: 7
Зарегистрирован: 21 апр 2018, 11:52

Re: Кнопка и delay

Сообщение Goga-romanov » 30 апр 2018, 09:34

Тоесть нужно смотреть по датчику какой подбирать? Хотя в моем понимании также как с кнопкой датчик при фиксации подает 5v на указанный контакт платы ардуино и мотор будет делать обороты при не паступающем сигнале мотор будет стоять

Goga-romanov
Сообщения: 7
Зарегистрирован: 21 апр 2018, 11:52

Re: Кнопка и delay

Сообщение Goga-romanov » 03 май 2018, 18:09

блин у меня скетч не работает пишет ошибка компиляции


Вернуться в «Программирование Ардуино»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 5 гостей