Добрый день.
Кнопка запускает двигатель на определенное время, устанавливая сигналы для драйвера двигателя. Длительность работы двигателя определяется через delay. Каждое нажатие кнопки запускает двигатель.
Подскажите, как при нажатии кнопки, если в это время двигатель работает, его останавливать?
Я использовал внешнее прерывание на кнопку, но двигатель не останавливается и есть дребезг.
На внешнее прерывание создана функция, которая вызывает другую для управления контактами драйвера двигателя. В основном цикле программы, обработки нажатия кнопки и управления двигателем нет, но есть управление другими элементами схемы и используется delay.
Можете подсказать как обработать внешнее прерывание и дребезг?
Кнопка и delay
Re: Кнопка и delay
Здравствуйте!
Я строю программы по другому принципу. Все задачи должны отрабатываться параллельно. Так построены практически все программы уроков. Все мои библиотеки рассчитаны на работу параллельным процессом. Сложные программы по другому не сделать.
Я бы реализовал вашу задачу так.
Прежде необходимо создать прерывание по таймеру и в нем обрабатывать состояние кнопки (урок 9, библиотека Button).
Теперь в цикле loop() можно всегда узнать текущее состояние кнопки – признак button1.flagPress и выделить момент нажатия кнопки (фронт) – признак button1.flagClick .
Дальше в прерывание по таймеру надо добавить функцию управления шаговым двигателем (урок 29, библиотека StepMotor).
Теперь в цикле loop() всегда можно сделать нужное количество шагов функцией step(). Например, myMotor.step(100);.
Для того, чтобы по нажатию кнопки сделать нужное количество шагов, добавьте в loop() следующий код.
По такому принципу вы можете построить более сложную программу. В цикле loop() логически связываете управление объектами, обрабатываемыми в прерывании по таймеру. В данном случае это признак нажатия кнопки button1.flagClick и функция запуска двигателя myMotor.step(100).
Я строю программы по другому принципу. Все задачи должны отрабатываться параллельно. Так построены практически все программы уроков. Все мои библиотеки рассчитаны на работу параллельным процессом. Сложные программы по другому не сделать.
Я бы реализовал вашу задачу так.
Прежде необходимо создать прерывание по таймеру и в нем обрабатывать состояние кнопки (урок 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
Здравствуйте.
Спасибо за ответ.
Программу исправил. Двигатель подергивается, ротор не вращается.
Загрузил версию программы, которая раньше работала правильно. Но собранное устройство не работает. Не светит сегментный индикатор, не таботает потенциометр.
Буду разбираться.
Спасибо за ответ.
Программу исправил. Двигатель подергивается, ротор не вращается.
Загрузил версию программы, которая раньше работала правильно. Но собранное устройство не работает. Не светит сегментный индикатор, не таботает потенциометр.
Буду разбираться.
-
- Сообщения: 7
- Зарегистрирован: 21 апр 2018, 11:52
Re: Кнопка и delay
Пожалуйста подскажите этот код для ардуино уно подойдет?
Re: Кнопка и delay
Да, конечно.
-
- Сообщения: 7
- Зарегистрирован: 21 апр 2018, 11:52
Re: Кнопка и delay
Спасибо добрые люди
-
- Сообщения: 7
- Зарегистрирован: 21 апр 2018, 11:52
Re: Кнопка и delay
Хочу сделать пожертвование, киви кошелек поддерживает перевод или нет? Просто каждый труд должен быть вознагражден, благодаря вашему проекту хочу собрать апликатора этикеток думаю что с этим скетчем все получится
-
- Сообщения: 7
- Зарегистрирован: 21 апр 2018, 11:52
Re: Кнопка и delay
А в место кнопки я могу подключить датчик препятствия? заранее благодарен
Re: Кнопка и delay
Да. Только надо учесть, что для кнопки активный уровень низкий. Т.е. когда кнопку нажимают, на входе 0.
-
- Сообщения: 7
- Зарегистрирован: 21 апр 2018, 11:52
Re: Кнопка и delay
Тоесть нужно смотреть по датчику какой подбирать? Хотя в моем понимании также как с кнопкой датчик при фиксации подает 5v на указанный контакт платы ардуино и мотор будет делать обороты при не паступающем сигнале мотор будет стоять
-
- Сообщения: 7
- Зарегистрирован: 21 апр 2018, 11:52
Re: Кнопка и delay
блин у меня скетч не работает пишет ошибка компиляции
Вернуться в «Программирование Ардуино»
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей