GyverStepper2 sweep сделать 4 раза

sinedlpk

✩✩✩✩✩✩✩
24 Июн 2024
13
1
Добрый день ! подскажите пожалуйста как сделать sweep 4 раза (голову сломал
пробывал разное

#include "GyverStepper2.h"

GStepper2<STEPPER2WIRE> stepper(2048, 7, 8);

void setup() {
Serial.begin(9600);
//stepper.enable();
stepper.setMaxSpeed(500); // скорость движения к цели
stepper.setAcceleration(500); // ускорение
stepper.setTarget(400); // цель
}

bool dir = 1;
void loop() {
for (int i = 0; i < 4; i++) {
stepper.tick(); // мотор асинхронно крутится тут
if (stepper.ready()) {
dir = !dir; // разворачиваем
stepper.setTarget(dir * 400); // едем в другую сторону
}
}
// асинхронный вывод в порт
static uint32_t tmr;
if (millis() - tmr >= 30) {
tmr = millis();
Serial.println(stepper.pos);
}
}
 

viktor1703

★★★✩✩✩✩
9 Дек 2021
565
136
Понятно. А по какому событию это должно происходить? Как я думаю, сейчас у вас мотор крутится(???) без туда-сюда без остановки.
 

sinedlpk

✩✩✩✩✩✩✩
24 Июн 2024
13
1
так он едет до цели и обратно один раз , а надо 4 раза всё перепробывал


#include "GyverStepper2.h"
//GStepper2<STEPPER4WIRE> stepper(2048, 5, 3, 4, 2);
GStepper2<STEPPER2WIRE> stepper(2048, 5, 6);

uint32_t tar = 600;
bool dir = 1;

void setup() {
Serial.begin(9600);

//stepper.enable();
stepper.setMaxSpeed(300); // скорость движения к цели
stepper.setAcceleration(300); // ускорение

stepper.setTarget(tar); // цель
}

void loop() {

stepper.tick(); // мотор асинхронно крутится тут
if (stepper.ready()) {
dir = !dir; // разворачиваем
stepper.setTarget(0); // едем в другую сторону
}





// асинхронный вывод в порт
static uint32_t tmr;
if (millis() - tmr >= 30) {
tmr = millis();
Serial.println(stepper.pos);
}

}
 

viktor1703

★★★✩✩✩✩
9 Дек 2021
565
136
Ну так правильно. Пройдитесь по программе. Начинается loop, дальше идет цикл for, прокручивается цикл 4 раза, дальше "асинхронный" ввывод положения шд в сериал, и что дальше? Снова повторение loop. А это снова for 4 раза и сериал, и снова for и сериал, for и сериал, for и сериал, for и сериал, for и сериал, for и сериал, for и сериал, for и сериал. А как вы хотели? Всё как предписано программой. В каком месте остановка мотора?
 
Изменено:

sinedlpk

✩✩✩✩✩✩✩
24 Июн 2024
13
1
Спасибо, Виктор логично, пробывал все команды stepper.brake(); stepper.pause();

void loop() {
for (int i = 0; i < 4; i++) {
stepper.tick(); // мотор асинхронно крутится тут
if (stepper.ready()) {
dir = !dir; // разворачиваем
stepper.setTarget(dir * 400); // едем в другую сторону
}
}
//stepper.brake();
//stepper.pause();
}
 

sinedlpk

✩✩✩✩✩✩✩
24 Июн 2024
13
1
здесь тоже не едет 4 раза только 1 раз

void loop() {
for (int i = 0; i < 4; i++) {
stepper.tick(); // мотор асинхронно крутится тут
if (stepper.ready()) {
dir = !dir; // разворачиваем
stepper.setTarget(0); // едем в другую сторону
}
}
}
 

sinedlpk

✩✩✩✩✩✩✩
24 Июн 2024
13
1
пробывал так же while , выводил в порт циклы (видел для for (0,1,2,3))
как тогда остановить двигатель что бы он потом начал движение
 

viktor1703

★★★✩✩✩✩
9 Дек 2021
565
136
Для вставки кода пользуйтесь кнопкой. Screenshot_2024-07-06-10-13-31-355_com.yandex.browser-edit.jpg
здесь тоже не едет 4 раза только 1 раз
stepper.setTarget(0); // едем в другую сторону
Не в другую, а в целевую позицию 0 шагов. Всё правильно, пришёл в 0, в следующий раз снова в 0 и так до бесконечности, пока не закончится loop, а он не закончится.
как тогда остановить двигатель
Ну, очевидно, нужно не начинать программу заново в "автомате".
что бы он потом начал движение
Вот я же не знаю по какому событию вы желаете начинать движение, по прошествии какого-то промежутка времени, по нажатию кнопки, или ещё какому.
пробывал так же while , выводил в порт циклы (видел для for (0,1,2,3))
Я без понятия куда вы его вставляли, но while нужно вставлять где крутится мотор, и ждать, пока он не остановится, а это tick().
C++:
while (stepper.tick()) {}
 
Изменено:

poty

★★★★★★✩
19 Фев 2020
3,103
915
Если это действие нужно делать однократно - переносите в setup и всё, иначе, как уже отметил @viktor1703, нужно условие продолжения цикла loop или проверка флага перед блоком движения.
 

sinedlpk

✩✩✩✩✩✩✩
24 Июн 2024
13
1
добавил кнопку но не едет он 4 раза

C++:
void loop() {
if (digitalRead(2) == 0) {
 
for (int i = 0; i < 4; i++) {
stepper.tick(); // мотор асинхронно крутится тут
if (stepper.ready()) {
dir = !dir; // разворачиваем
stepper.setTarget(dir * 400); // едем в другую сторону
}

}

}
//stepper.pause();
//stepper.resume();
}
 

sinedlpk

✩✩✩✩✩✩✩
24 Июн 2024
13
1
@viktor1703,
Виктор, к сожалению я не мостодонт в программировании, (учился когда-то на АСУ )
можно хоть с кнопкой подправить мне скейч т.е при нажатии кнопки проезжал туда сюда 4 раза
 

viktor1703

★★★✩✩✩✩
9 Дек 2021
565
136
можно хоть с кнопкой подправить мне скейч
Можно. Вы же не читаете предыдущие сообщения.
while нужно вставлять где крутится мотор, и ждать, пока он не остановится
C++:
while (stepper.tick()) {}
Это нужно вписать вместо
C++:
stepper.tick();
 
  • Лойс +1
Реакции: sinedlpk