Gyver Stepper, вопросы по библиотеке

Aschas

✩✩✩✩✩✩✩
15 Авг 2020
20
0
Доброго времени суток.
Вопрос такой :как определить что шаговик приехал в целевую позицию, чтобы использовать это как условие для продолжения кода?
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,188
1,280
Москва
Например так же как в 3д принтерах. когда принтер приезжает в домашнюю позицию, то он нажимает на концевики. Эту позицию он запоминает как начальную и все расчеты шагов делает от нее
 

Aschas

✩✩✩✩✩✩✩
15 Авг 2020
20
0
Концевик это понятно, был бы жёсткий упор было бы ещё лучше.Я говорю не про "hard", а про "soft" то есть типа AccelStepper::distanceToGo()
как организовать тоже самое и без бубнов в GyverStepper
 

Aschas

✩✩✩✩✩✩✩
15 Авг 2020
20
0
С работает или нет это понятно ,а вот готовность по позиционированию как организовать
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,188
1,280
Москва
если работает, то не дошел, как только дойдет до нужной позиции крутить не будет.

Но вообще я понял, что документацию никто не читает, проще же написать, прям как чукчи-писатели.
Установленную целевую позицию можно прочитать:
...
getTarget()
getTargetDeg()
...
Также можно вручную установить текущую позицию мотора в шагах и градусах при помощи:
..
И прочитать её:
getCurrent();
..
 

Aschas

✩✩✩✩✩✩✩
15 Авг 2020
20
0
C++:
 myTimer.setTimeout(500);
 if (!stepper2.getState()){
 digitalWrite(REZ, LOW);
  myTimer.setTimeout(1000);
 if (myTimer.isReady()) {
  digitalWrite(REZ, HIGH);}
А в ответ тишина
 

Aschas

✩✩✩✩✩✩✩
15 Авг 2020
20
0
Ну прочёл я целевую позицию и что
getTarget() ? Я и та к её знаю сам задавал
 

Aschas

✩✩✩✩✩✩✩
15 Авг 2020
20
0
C++:
 if (stepper2.getCurrent()==stepper2.getTarget()){
 digitalWrite(REZ, LOW);
  myTimer.setTimeout(1000);
 if (myTimer.isReady()) {
  digitalWrite(REZ, HIGH);}
Это я пробовал изначально, сейчас повторил результат отрицательный
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,188
1,280
Москва
Напиши простой скетч, где в конце setup задаешь позицию куда ехать
в цикле loop кроме stepper2.tick() напиши вывод в serial
if (stepper2.getCurrent()!=stepper2.getTarget())
{
Serial.print(stepper2.getCurrent());
Serial.print(" ");
Serial.print(stepper2.getTarget());
}

и посмотри на значения. По идее когда мотор остановится, то вывод должен прекратиться.
 

Aschas

✩✩✩✩✩✩✩
15 Авг 2020
20
0
Да всё так. Так где же собака порылась

C++:
 if (stepper2.getCurrent()==stepper2.getTarget()){
 digitalWrite(REZ, LOW);
 Serial.println("REZ");
  myTimer.setTimeout(1000);
 if (myTimer.isReady()) {
  digitalWrite(REZ, HIGH);}
в результатеСнимок2.JPG

как же прекратить эту вакханалию и где задержка в 1 секунду
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,188
1,280
Москва
Тебя очень сложно понять. Если то, что я показал работает корректно, то ошибка у тебя в логике.

rez будет выводиться каждый цикл loop , когда выполняется условие, т.е. мотор дошел до нужной позиции.
о что такое пин rez я не ведаю отродясь. Какая такая задержка тоже не понятно, НО таймер будет каждый раз перезапускаться пока совпадает позиция цели и текущая, так что isready никогда не выполниться пока мотор не запустится второй раз. Как только он запуститься таймер пойдет нормально, но т.к. проверка только внутри условия, то проверка его готовности не выполнится. А при 1-ом же заходе в тело условия он опять отложиться на 1 сек.
Вот это все мне понятно из того огрызка кода, что видел. Надо больше золота вдумываться в написание кода, это не ЕГЭ, тут не угадаешь
 
  • Ахах! +1
Реакции: AlexGyver

AlexGyver

★★★★★★✩
Команда форума
30 Июл 2018
359
567
Доброго времени суток.
Вопрос такой :как определить что шаговик приехал в целевую позицию, чтобы использовать это как условие для продолжения кода?
А ты документацию пробовал читать? В самом начале всё написано

Также tick() возвращает true, если мотор движется к цели или крутится по KEEP_SPEED и false, если мотор остановлен или приехал.
Метод getState() возвращает текущее состояние мотора аналогично tick().

Возвращает целевую позицию в шагах и градусах
getTarget()
getTargetDeg()

Возвращает текущую позицию в шагах и градусах
getCurrent();
getCurrentDeg();

Если нужен distanceToGo - вызываешь (getTarget() - getCurrent()) очевидно
 

Aschas

✩✩✩✩✩✩✩
15 Авг 2020
20
0
Добрый день. Значит с логикой Вам видней, но нихрена не работает
если так
C++:
 #include "GyverStepper.h"
#include "GyverTimer.h"
#include "GyverButton.h"
GStepper<STEPPER2WIRE> stepper2(96, 4, 5);
#define BTN_PIN 13
#define REZ     24
GButton butt1(BTN_PIN);
boolean flag = false;
long Shag=384;
GTimer myTimer(MS);
void setup() {
  Serial.begin(9600);
  pinMode(REZ, OUTPUT);
  digitalWrite(REZ, HIGH);
}

void loop() {
butt1.tick();
if (butt1.isPress()) {
    stepper2.setRunMode(FOLLOW_POS);
  stepper2.setMaxSpeed(100);
  stepper2.setAcceleration(10000);
  stepper2.setTarget(Shag,RELATIVE);
  Serial.print(stepper2.getCurrent());
    if (stepper2.getCurrent()==stepper2.getTarget()){
  flag = true;
   Serial.println(flag);
   Serial.print(stepper2.getCurrent());
    }
}
   if (flag ){
digitalWrite(REZ, LOW);
Serial.println("REZ");
  myTimer.setTimeout(1000);
if (myTimer.isReady()) {
  Serial.println("Timeout");
  digitalWrite(REZ, HIGH);
  flag = false;
  }
  }
stepper2.tick();
}
то вообще ничего ни флага getCurrent()
если так
C++:
 #include "GyverStepper.h"
#include "GyverTimer.h"
#include "GyverButton.h"
GStepper<STEPPER2WIRE> stepper2(96, 4, 5);
#define BTN_PIN 13
#define REZ     24
GButton butt1(BTN_PIN);
long Shag=384;
GTimer myTimer(MS);
void setup() {
  Serial.begin(9600);
  pinMode(REZ, OUTPUT);
  digitalWrite(REZ, HIGH);
}

void loop() {
butt1.tick();
if (butt1.isPress()) {
    stepper2.setRunMode(FOLLOW_POS);
  stepper2.setMaxSpeed(100);
  stepper2.setAcceleration(10000);
  stepper2.setTarget(Shag,RELATIVE);
  Serial.print(stepper2.getCurrent());
}
    if (stepper2.getCurrent()==stepper2.getTarget()){
digitalWrite(REZ, LOW);
Serial.println("REZ");
  myTimer.setTimeout(1000);
if (myTimer.isReady()) {
  Serial.println("Timeout");
  digitalWrite(REZ, HIGH);
  }
  }
stepper2.tick();
}
то вакханалия, сразу после запуска rez rez rez.....оно и понятно target 0 current тоже 0 всё в порядке
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,188
1,280
Москва
Как бы тебе объяснить.. понять что ты хочешь сказать добиться этим кодом было бы можно, если бы он работал правильно. Я могу понять как работает этот код, но зачем, если он работает не правильно? Постарайся объяснить что ты хочешь получить в результате. русским по белому, что бы я (и не только я ) понял. С достаточно большой долей вероятности есть более простые решения, так всегда бывает, новички такого напридумывают.

ЗЫ. Скажи, а ты "Три мушкетера" читал ? К теме не относится, для себя надо.
 
  • Ахах! +1
Реакции: AlexGyver

Aschas

✩✩✩✩✩✩✩
15 Авг 2020
20
0
Легенда такая, морчик по внешнему событию подаёт что то и затем происходит рез.
Читал раза 3.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,188
1,280
Москва
Видимо тут ты и ошибся. Вот пример. Я хочу что бы при нажатии кнопки лопнул воздушный шарик, который будет подаваться в определенное место
Мои действия.
Setup:
1) При включении поставить иголку в исходную позицию.
Цикл loop:
1) Если нажата кнопка, то двигать иголку до позиции укола.
2) Иголка НЕ на позиции ?
если да , то 3) если нет то 5)
3) продолжаем движение
4) идем на п. 8)
5) надо делать укол ?
если да. то 6) если нет то 7)
6) укол
7) иголку двигаем в исходную позицию
8) КОНЕЦ ЦИКЛА
 

Aschas

✩✩✩✩✩✩✩
15 Авг 2020
20
0
Я делал что то подобное на AccelStepper только рез делал тоже шаговиком и всё работало как часы
C++:
if(Schet==Stopa){
  Schet=0; 
  mystepper_1.setAcceleration( Speed*50);
  mystepper_1.setSpeed( Speed*10);
  mystepper_1.setCurrentPosition(0);
  mystepper_1.runToNewPosition(Lenta);
if(mystepper_1.distanceToGo()==0){
  delay(100);
  mystepper.setAcceleration(Speed_1*50);
  mystepper.setSpeed(Speed_1*10);
  mystepper.setCurrentPosition(0);
  mystepper.runToNewPosition(200);
сейчас хотел попробовать на Gyver Stepper
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,188
1,280
Москва
Вот я Rez понял как результат. Но после пояснения стало понят, что это именно разрез.
Но тогда разрез это не какое то мгновенное действие, а процесс, который занимает определенное время.
Больше вопросов чем ответов
 

Aschas

✩✩✩✩✩✩✩
15 Авг 2020
20
0
Да нет это бумажная леночка которой перекладывается опять же бумага на листорезательной машине устройство работает уже три года без нареканий.
А сейчас я просто решил освоить Gyver Stepper, придумал легенду и пытаюсь воплотить.
И всё это от скуки на пенсии, опять же хоть кокой то приработок.