Эдуард писал(а):Я бы сделал это как-то так. Проверять не на чем, поэтому в программе могут быть ошибки. Но сам принцип должен быть понятен. Все делается параллельно, цикл loop() не зависает, в программу можно добавлять новые блоки.
Код: Выделить всё
#include <TimerOne.h>
#include <Button.h>
#include <StepDirDriver.h>
Button button1(2, 40); // остановить двигатель, задний концевик
Button button2(3, 40); // остановить двигатель, передний концевик
Button button3(4, 40); // выдвижение экрана
Button button4(5, 40); // закрытие экрана
StepDirDriver myMotor(10, 11, 12); // создаем объект типа StepMotor, задаем выводы для фаз
byte mode=0; // режим: 0 - стоп, 1 - открывает, 2 - закрывает
void setup() {
Timer1.initialize(250); // инициализация таймера 1, период 250 мкс
Timer1.attachInterrupt(timerInterrupt, 250); // задаем обработчик прерываний
myMotor.setDivider(20); // делитель частоты 20
myMotor.setMode(1, true); // полу шаговый режим, с фиксацией ротора при остановке
delay(50);
button3.flagClick= false;
button4.flagClick= false;
}
void loop() {
if( mode == 0 ) {
//------------------------------------------- стоп
myMotor.step(0);
if( button3.flagClick == true ) mode= 1;
if( button4.flagClick == true ) mode= 2;
}
else if ( mode == 1 ) {
//------------------------------------------- открывает
myMotor.step(-32000); // выдвижение экрана
if( button2.flagPress == true ) {
// открылся
button3.flagClick= false;
button4.flagClick= false;
mode= 0;
}
}
else if ( mode == 2 ) {
//------------------------------------------- закрывет
myMotor.step(32000); // закрытие экрана
if( button1.flagPress == true ) {
// закрылся
button3.flagClick= false;
button4.flagClick= false;
mode= 0;
}
}
else mode=0;
}
//-------------------------------------- обработчик прерывания 0,25 мс
void timerInterrupt() {
myMotor.control(); // управвление двигателем
button1.filterAvarage(); // вызов метода фильтрации кнопки
button2.filterAvarage(); // вызов метода фильтрации кнопки
button3.filterAvarage(); // вызов метода фильтрации кнопки
button4.filterAvarage(); // вызов метода фильтрации кнопки
}
День добрый.
Продолжил заниматься данным проектом..
Возник вопрос, в данном коде как понял работа мотора идет в полной зависимости от времени т.е.
например при выдвижении экрана неважно сколько задать шагов.. двигаться будет до концевика (если его нет, постоянное вращение)
Хотел убрать передний концевик (для тестов кнопка) и добавить две кнопки регулировки угла наклона.
Концевик button2(3 убрать не получилось, кнопки корректировки работают, но насколько корректно хз.
Помогите откорректировать только выдвижение экрана на заданное кол-во шагов и возможно поправить ошибки с кнопками регулировки наклона экрана.
Или может проще добавить фотоэлемент вместо переднего концевика (концевик негде ставить) ?
Код: Выделить всё
#include <TimerOne.h>
#include <Button.h>
#include <StepDirDriver.h>
Button button1(2, 40); // остановить двигатель, задний концевик
Button button2(3, 40); // остановить двигатель, передний концевик
Button button3(4, 40); // выдвижение экрана
Button button4(5, 40); // закрытие экрана
Button button5(6, 40); // кнопка сделать +100 шагов
Button button6(7, 40); // кнопка сделать -100 шагов
StepDirDriver myMotor(11, 10, 12); // создаем объект типа StepMotor, задаем выводы для фаз
byte mode=0; // режим: 0 - стоп, 1 - открывает, 2 - закрывает, 3 - +100 шагов, 4 - -100 шагов
void setup() {
Timer1.initialize(250); // инициализация таймера 1, период 250 мкс
Timer1.attachInterrupt(timerInterrupt, 250); // задаем обработчик прерываний
myMotor.setDivider(1); // делитель частоты 20
//myMotor.setMode(0, true); // полу шаговый режим, с фиксацией ротора при остановке
myMotor.setMode(0, false); // шаговый режим, без фиксации при остановке
delay(50);
button3.flagClick= false;
button4.flagClick= false;
}
void loop() {
if( mode == 0 ) {
//------------------------------------------- стоп
myMotor.step(0);
if( button3.flagClick == true ) mode= 1;
if( button4.flagClick == true ) mode= 2;
if( button5.flagClick == true ) mode= 3;
if( button6.flagClick == true ) mode= 4;
}
else if ( mode == 1 ) {
//------------------------------------------- открывает
myMotor.step(-4100); // выдвижение экрана
if( button2.flagPress == true ) {
// // открылся
button3.flagClick= false;
button4.flagClick= false;
mode= 0;
}
}
else if ( mode == 2 ) {
//------------------------------------------- закрывет
myMotor.step(5000); // закрытие экрана
if( button1.flagPress == true ) {
// закрылся
button3.flagClick= false;
button4.flagClick= false;
mode= 0;
}
}
else if ( mode == 3 ) {
//------------------------------------------- 100 шагов
myMotor.step(-100); // сделать +100 шагов
delay(100);
myMotor.step(0);
button5.flagClick= false;
mode= 0;
}
else if ( mode == 4 ) {
//------------------------------------------- -100 шагов
myMotor.step(300); // сделать -100 шагов
delay(100);
myMotor.step(0);
button6.flagClick= false;
mode= 0;
}
else mode= 0;
}
//-------------------------------------- обработчик прерывания 0,25 мс
void timerInterrupt() {
myMotor.control(); // управвление двигателем
button1.filterAvarage(); // вызов метода фильтрации кнопки
button2.filterAvarage(); // вызов метода фильтрации кнопки
button3.filterAvarage(); // вызов метода фильтрации кнопки
button4.filterAvarage(); // вызов метода фильтрации кнопки
button5.filterAvarage(); // вызов метода фильтрации кнопки
button6.filterAvarage(); // вызов метода фильтрации кнопки
}