GyverStepper. Обсуждение библиотеки

sinedlpk

✩✩✩✩✩✩✩
24 Июн 2024
9
0
Оформи код соответствующим тэгом, см. Правила
Добрый день ! подскажите пожалуйста как сделать 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);
}
}
 

sinedlpk

✩✩✩✩✩✩✩
24 Июн 2024
9
0
мне нужно что бы ШД 4 раза проехал туда сюда (от 0 до 400)
 

viktor1703

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

sinedlpk

✩✩✩✩✩✩✩
24 Июн 2024
9
0
Оформи код соответствующим тэгом, см. Правила
да

так он едет до цели и обратно один раз , а надо 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
660
156
Ну так правильно. Пройдитесь по программе. Начинается loop, дальше идет цикл for, прокручивается цикл 4 раза, дальше "асинхронный" ввывод положения шд в сериал, и что дальше? Снова повторение loop. А это снова for 4 раза и сериал, и снова for и сериал, for и сериал, for и сериал, for и сериал, for и сериал, for и сериал, for и сериал, for и сериал. А как вы хотели? Всё как предписано программой. В каком месте остановка мотора?
 
Изменено:

sinedlpk

✩✩✩✩✩✩✩
24 Июн 2024
9
0
Оформи код соответствующим тэгом, см. Правила
Спасибо, Виктор логично, пробывал все команды 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();
}

здесь тоже не едет 4 раза только 1 раз

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

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

viktor1703

★★★✩✩✩✩
9 Дек 2021
660
156
Для вставки кода пользуйтесь кнопкой. 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,292
953
Если это действие нужно делать однократно - переносите в setup и всё, иначе, как уже отметил @viktor1703, нужно условие продолжения цикла loop или проверка флага перед блоком движения.
 

sinedlpk

✩✩✩✩✩✩✩
24 Июн 2024
9
0
добавил кнопку но не едет он 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
9
0
@viktor1703,
Виктор, к сожалению я не мостодонт в программировании, (учился когда-то на АСУ )
можно хоть с кнопкой подправить мне скейч т.е при нажатии кнопки проезжал туда сюда 4 раза
 

viktor1703

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

sinedlpk

✩✩✩✩✩✩✩
24 Июн 2024
9
0
День добрый! подскажите пожалуйста как сделать что бы ШД при нажатии на кнопку крутился ...сейчас проезжает только от одной точки к другой и все при повторном нажатии молчит (шаги не сбрасываются) ...
как сделать что бы позиция вернулась в "0" т.е. обнулилась
команду stepper.reset(); пробовал вставить в начале и в конце результата нет
stepper2:
#include "GyverStepper2.h"
GStepper2< STEPPER2WIRE> stepper(200, 7, 8);
uint32_t pos1 = -800;
uint32_t pos2 = -3200;
void setup() {
  Serial.begin(9600);
  //stepper.enable();
  stepper.setMaxSpeed(1500);     // скорость движения к цели
  stepper.setAcceleration(1500); // ускорение
  stepper.setTarget(pos1, RELATIVE);       // цель
  stepper.setTarget(pos2);       // цель
   pinMode(26, INPUT_PULLUP); //кнопка
}

bool dir = 1;
void loop() {
 

 if (digitalRead(26) == 0)
    {
   //   stepper.reset();
   while(1){
  stepper.tick();   
 
  if (stepper.ready()) {  // едим на первую позицию
    stepper.pause();
    
    dir = dir;   // не разворачиваем
    stepper.setTarget(dir * pos1, RELATIVE); // едем на другую позицию
     stepper.pause();
    

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

viktor1703

★★★✩✩✩✩
9 Дек 2021
660
156
при повторном нажатии молчит
Ну так правильно.
C++:
if (digitalRead(26) == 0)
    {
   //   stepper.reset();
   while(1){
При первом нажатии вы запускаете бесконечный цикл, в котором мотор движется к цели, а выхода из цикла нет.

сделать что бы позиция вернулась в "0"
Так и укажите это в коде.
C++:
dir = dir;   // не разворачиваем
    stepper.setTarget(dir * pos1, RELATIVE);
вы же дрыгатель по пажатию кнопки отправляете в pos1, при повторном нажатии указываете ехать в pos1, то есть туда же.
 
  • Лойс +1
Реакции: sinedlpk

sinedlpk

✩✩✩✩✩✩✩
24 Июн 2024
9
0
@viktor1703,
день добрый Виктор !
в этом коде он едет до -3200 и останавливается при повторном нажатии едет до -800 , нажимаю на кнопку и опять до -800

stepper:
#include "GyverStepper2.h"
GStepper2< STEPPER2WIRE> stepper(200, 7, 8);
uint32_t pos1 = -800;
uint32_t pos2 = -3200;
void setup() {
  Serial.begin(9600);
  //stepper.enable();
  stepper.setMaxSpeed(1500);     // скорость движения к цели
  stepper.setAcceleration(1500); // ускорение
  stepper.setTarget(pos1, RELATIVE);       // цель
  stepper.setTarget(pos2);       // цель
   pinMode(26, INPUT_PULLUP); //кнопка
}

bool dir = 1;
void loop() {
 

 if (digitalRead(26) == 0)

    {
    
    while (stepper.tick()); // мотор асинхронно крутится тут
if (stepper.ready()) {

 
      
    dir = dir;   // не разворачиваем
    stepper.setTarget(dir * pos1, RELATIVE); // едем на другую позицию
    
    

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

в ставил код результата нету

C++:
if (stepper.ready()) {
    stepper.setCurrent(0);
     }
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
521
153
Можете сказать, какая ваша конечная цель?
Вы делаете какое то устройство - если да то какое?
Вы изучаете работу ШД - если да, то с какой целью?
Что то другое - что именно?
 

sinedlpk

✩✩✩✩✩✩✩
24 Июн 2024
9
0
@viktor1703,
мне нужно что бы при нажатии кнопки он доехал до позиции pos2 остановился потом едет до позиции pos1 , пауза
нажали на кнопку еще раз и все это повторилось

@Bruzzer,
делаю станочек для себя и изучаю ардуино
 

viktor1703

★★★✩✩✩✩
9 Дек 2021
660
156
Ну так и пишите, только не своими словами, а командами.

C++:
loop {
if (нажата_кнопка)
{
Установить_цель (pos2) ; // setTarget
while (stepper.tick) {} // ничего не делать, пока мотор крутится
delay(какое-то небольшое время задержки);
Установить_цель(pos1); //setTarget
while (stepper.tick) {} // ничего не делать, пока мотор крутится
delay(время паузы);
}
}
Как-то так.
 
  • Лойс +1
Реакции: sinedlpk

Тролфасе324

✩✩✩✩✩✩✩
13 Янв 2025
1
0
Добрый вечер. Мне нужна помощь)

Я хочу настроить работу шаговика с библиотекой GyverStepper, однако возникают трудности
Вот подключение к UNO:
1736776838362.png 1736776849339.png
IN1 - D2
IN2 - D3
IN3 - D4
IN4 - D5

Когда я использую данный код:

C++:
#include <GyverStepper.h>
GStepper<STEPPER4WIRE> stepper(2038, 5, 3, 4, 2);

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

  // режим следования к целевй позиции
  stepper.setRunMode(FOLLOW_POS);

  // установка макс. скорости в шагах/сек
  stepper.setMaxSpeed(400);

  // установка ускорения в шагах/сек/сек
  stepper.setAcceleration(50);
}

void loop() {
  if (!stepper.tick()) {
    stepper.setTargetDeg(4000);
  }
}
Шаговик реагирует так:
1736777419923.png
Светодиоды постоянно мигают в правильной последовательности (типа последовательно загораются), но шаговик иногда начинает прокручиваться немного, затем останавливается, а потом опять немного пытается крутится. Так происходит какое-то время (5-15 сек) затем он перестаёт двигаться, оставляя светодиоды в таком состоянии.

Затем я решаюсь попробовать такое топорное решение:

C++:
int in1 = 2;
int in2 = 3;
int in3 = 4;
int in4 = 5;

int dl = 850;

void setup() {
  pinMode (in1, OUTPUT);
  pinMode (in2, OUTPUT);
  pinMode (in3, OUTPUT);
  pinMode (in4, OUTPUT);
}

void loop() {
  digitalWrite (in1,LOW);
  digitalWrite (in2,LOW);
  digitalWrite (in3,HIGH);
  digitalWrite (in4,HIGH);
  delayMicroseconds(dl);

  digitalWrite (in1,LOW);
  digitalWrite (in2,LOW);
  digitalWrite (in3,HIGH);
  digitalWrite (in4,LOW);
  delayMicroseconds(dl);

  digitalWrite (in1,LOW);
  digitalWrite (in2,HIGH);
  digitalWrite (in3,HIGH);
  digitalWrite (in4,LOW);
  delayMicroseconds(dl);

  digitalWrite (in1,LOW);
  digitalWrite (in2,HIGH);
  digitalWrite (in3,LOW);
  digitalWrite (in4,LOW);
  delayMicroseconds(dl);

  digitalWrite (in1,HIGH);
  digitalWrite (in2,HIGH);
  digitalWrite (in3,LOW);
  digitalWrite (in4,LOW);
  delayMicroseconds(dl);

  digitalWrite (in1,HIGH);
  digitalWrite (in2,LOW);
  digitalWrite (in3,LOW);
  digitalWrite (in4,LOW);
  delayMicroseconds(dl);
 
  digitalWrite (in1,HIGH);
  digitalWrite (in2,LOW);
  digitalWrite (in3,LOW);
  digitalWrite (in4,HIGH);
  delayMicroseconds(dl);
 
  digitalWrite (in1,LOW);
  digitalWrite (in2,LOW);
  digitalWrite (in3,LOW);
  digitalWrite (in4,HIGH);
  delayMicroseconds(dl);
}
Уже с таким кодом шаговик стал правильно работать, хоть и медленно

А вот и сам вопрос. Что я делаю не так с библиотекой гайвера, что у меня он так себя ведёт плохо?
 

Orion2611

✩✩✩✩✩✩✩
14 Янв 2025
1
0
Здравствуйте.
Можно ли заставить работать библиотеку на NodeMCU?
На данный момент есть такая проблема - неравномерное движение мотора. Т.е. при движении с постоянной скоростью происходят некие рывки (удары)
При этом на AVR работает отлично.
Можно ли это как либо исправить?