Каретка подъемного механизма в нижнем положении стоит на концевом выключателе (индуктивном), и организовать какой-то отъезд или парковку по этому концевику - нет возможности. Скетч рабочий, каретка ходит по заданным командам (шаговый двигатель) и концевики работают как должны.
Но если контроллер включается в самом нижнем положении, когда нижний концевик
активен при старте, то ничего не запускается.
Простые решения (разные, в коде) не помогают, high, low, переменные и их значения, условия, кейсы, или я не могу корректно совместить их с библиотеками которые использую - accelstepper, gyverstepper, ezbutton.
Подскажите в какую сторону копать,
пусть не кодом, но направлением, так скажем.
То есть, другими словами, определенного
пина при включении контроллера просто
"не должно существовать“, а потом он должен появляться. Остается наверное еще и такой вариант как подключение самого концевика
через реле, но это уже совсем от отчаянья, наверное.
Один из вариантов, на GyverStepper, и это рабочий код.
То есть все работает, но если контроллер включается в нижнем положении каретки,
и при включении же, - отрабатывает “stopdown(0); //pin D3”, то программа не работает.
Как отключать этот пин при включении контроллера?
Еще один вариант (всего их пять или шесть) на AccelStepper с кейсами,
тоже рабочий, но только если не включать контроллер в нижнем положении каретки,
когда активен нижний концевик
#include <ezButton.h>
#include <AccelStepper.h>
#define dirPin 12 //pin D6
#define stepPin 14 //pin D5
#define enPin 13 //pin D7
#define relayPin 15 //pin D8
ezButton buttonup(5); //pin D1
ezButton buttondown(4); //pin D2
ezButton stopup(16); //pin D0
ezButton stopdown(0); //pin D3
AccelStepper stepper(AccelStepper::DRIVER, stepPin, dirPin);
#define STATE_DOWN 61
#define STATE_MOVE_UP 62
#define STATE_ST_MOVE_UP 63
#define STATE_UP 64
#define STATE_MOVE_DOWN 65
#define STATE_ST_MOVE_DOWN 66
#define MAX_POSITION 230000
#define MIN_POSITION 0
int stepperState = STATE_DOWN;
int direction = 1;
long targetPos = 0;
void setup() {
pinMode(dirPin, OUTPUT);
pinMode(stepPin, OUTPUT);
pinMode(enPin, OUTPUT);
pinMode(relayPin, OUTPUT);
buttonup.setDebounceTime(50);
buttondown.setDebounceTime(50);
stopup.setDebounceTime(50);
stopdown.setDebounceTime(50);
stepper.setMaxSpeed(9600);
stepper.setAcceleration(3200);
stepper.setSpeed(9600);
}
void loop() {
buttonup.loop();
buttondown.loop();
stopup.loop();
stopdown.loop();
if (buttonup.isPressed())
stepperState = STATE_MOVE_UP;
else if (buttondown.isPressed())
stepperState = STATE_MOVE_DOWN;
if (stopup.isPressed())
stepperState = STATE_ST_MOVE_UP;
if (stopdown.isPressed())
stepperState = STATE_ST_MOVE_DOWN;
switch (stepperState) {
case STATE_DOWN:
//digitalWrite(enPin, HIGH); // драйвер шагового двигателя отключен
stepper.setCurrentPosition(MIN_POSITION);
digitalWrite(relayPin, LOW);
break;
case STATE_MOVE_UP:
//digitalWrite(enPin, LOW); // драйвер шагового двигателя включен
direction *= 1;
targetPos = direction * MAX_POSITION;
stepper.moveTo(targetPos);
stepper.run();
if (stepper.distanceToGo() == 0) {
stepperState = STATE_UP;
}
digitalWrite(relayPin, HIGH);
break;
case STATE_ST_MOVE_UP:
stepper.setCurrentPosition(MAX_POSITION);
digitalWrite(relayPin, HIGH);
stepperState = STATE_UP;
break;
case STATE_UP:
//digitalWrite(enPin, HIGH); // драйвер шагового двигателя отключен
digitalWrite(relayPin, HIGH);
break;
case STATE_MOVE_DOWN:
//digitalWrite(enPin, LOW); // драйвер шагового двигателя включен
direction *= -1;
targetPos = direction * MIN_POSITION;
stepper.moveTo(targetPos);
stepper.run();
if (stepper.distanceToGo() == 0) {
stepperState = STATE_DOWN;
//digitalWrite(enPin, HIGH); // драйвер шагового двигателя отключен
}
digitalWrite(relayPin, HIGH);
break;
case STATE_ST_MOVE_DOWN:
stepper.setCurrentPosition(MIN_POSITION);
digitalWrite(relayPin, LOW);
stepperState = STATE_DOWN;
break;
}
}
вариантов, как я пытался игнорировать или поставить условие на отработку “stopdown” (нижнего концевика) тоже было много, но они у меня не работают, различные, не получается у меня это.
Подскажите в какую сторону смотреть.
Без пустого трепа, даже без кода, просто подскажите,
если можете.
Подскажите пожалуйста правильное решение, можно без кода, просто укажите через что это правильно решается. На пустые “воспитательные рассуждения” у меня просто нет ни времени ни желания.
Я не понимаю, а в ходе нормальной работы программы (поле успешного старта) этот концевик никогда не нажимается, что ли? Или после первого нажатия программа зависает наглухо?
В чем разница между стартом и работой?
Я сразу написал что парковаться/отъезжать нет возможности. Такова конструкция. Каретка опустилась (села на концевик) и затем например контроллер выключился. А затем включился
и не работает потому что концевик зажат. Как отъезжать от концевика у меня вариант есть,
только применить его не могу.
Даже двух-трех миллиметров чтобы съехать с индуктивного датчика у меня нет.
В программе все с концевиками замечательно, туда-сюда все ходит, ничего не мешает.
Проблема только на момент включения самого контроллера.
Если выключается/включается контроллер в любой точке между концевиками, то все работает замечательно, многократно, без проблем.А если при включении контроллера каретка стоит в крайнем (любом) положении, то есть мы включаем контроллер, а концевик уже нажат - то программа не работает.
Допустим, концевик это та же кнопка.
Представьте, что вы сначала нажали какую-то кнопку (и удерживаете ее) а потом включили сам контроллер.
Как игнорировать эту кнопку?