@Старик Похабыч,
попробовал ради тренировки изобразить в коде
попробовал ради тренировки изобразить в коде
C++:
volatile boolean F_START; //логический флаг стартовой инициации
volatile boolean F_KONC_A; //концевик А
volatile boolean F_KONC_В; //концевик В
long distance=0; //обьявили переменную дистанции и присвоили ей 0
void Initial_positionA() { //ФУНКЦИЯ ОБРАБОТКИ ПРЕРЫВАНИЯ концевик A
if (millis() - debounce >= 200 && digitalRead(2)) {
debounce = millis();
F_KONC_A = 1;
}
}
void Initial_positionB() { //ФУНКЦИЯ ОБРАБОТКИ ПРЕРЫВАНИЯ концевик B
if (millis() - debounce >= 200 && digitalRead(2)) {
debounce = millis();
F_KONC_B = 1;
}
}
void setup() {
F_KONC_A=0;
F_KONC_В=0;
F_START=1;
attachInterrupt(0, Initial_positionA, RISING); //ОБЪЯВЛЕНИЕ ПРЕРЫВАНИЯ А
attachInterrupt(1, Initial_positionB, RISING); //ОБЪЯВЛЕНИЕ ПРЕРЫВАНИЯ B
if (!stepper1.tick() && F_START==1 ){//Если флаг СТАРТ поднят
stepper1.setRunMode(KEEP_SPEED); //Режим поддержания скорости. Просто едем, пока не нажмём концевик А.
stepper1.setMaxSpeed(maxspd/2); //С маленькой скоростью
}
if (F_KONC_A ==1 && F_START==1 &&F_KONC_B==0) //Нажали концевик А, едем к концевику В
stepper1.brake(); //РЕЗКО тормозим, чтобы не сломать концевик
stepper1.reverse(); //Инвертируем направление вращения
stepper1.setMaxSpeed(maxspd/2); //С маленькой скоростью
stepper1.setCurrent(0);//обнуляем координаты
}
if (F_KONC_A ==1 && F_START==1 &&F_KONC_B==1) //Нажали концевик В
stepper1.brake(); //РЕЗКО тормозим, чтобы не сломать концевик
distance=stepper1.getCurrent(); //Получаем координату и записываем её в переменную distance
stepper1.setRunMode(FOLLOW_POS);//Устанавливаем режим следования к цели
stepper1.reverse(); //Инвертируем направление вращения
stepper1.setMaxSpeed(maxspd/2); //С маленькой скоростью
stepper1.setTarget(distance/2, Relative);//Устанавливаем координату цели. После остановки она сбросится в 0.
F_KONC_A=0;
F_KONC_В=0;
F_START=0;
}
Void loop (){
static bool dir = true;
if (!stepper1.tick()) { //Начинаем работать вперёд-назад
stepper1.setMaxSpeed(maxspd);
stepper1.setTarget(dir ? worksteps : -worksteps, RELATIVE);
dir = !dir;
}
}