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

AlexGyver

★★★★★★✩
Команда форума
30 Июл 2018
359
570
Для более эффективной работы в прерывании лучше использовать gyverstepper2, об этом в той же статье написано
 

AlexGyver

★★★★★★✩
Команда форума
30 Июл 2018
359
570
Если нормально написать опрос энкодера без while - прерывания для мотора будут не нужны. Почему энкодер ломается из за прерываний мотора - вопрос, возможно где то не хватает volatile или опять же запрета прерываний
 
  • Лойс +1
Реакции: Epszit

j0ker

✩✩✩✩✩✩✩
31 Май 2023
3
0
Есть CNC Shield v3, DRV8825, NEMA17. Пытаюсь крутить моторчик с помощью библиотеки GyverStepper. Но крутится только в одну сторону, менял setSpeed(-2000), вставлял reverse() - ничего не помогает. Почему так?

C++:
#include <GyverStepper.h>

GStepper<STEPPER4WIRE> stepper(200, 2, 5);

void setup() {
  pinMode( 8 ,OUTPUT);          // ВАЖНО !!!!!
  digitalWrite(8, LOW);         // иначе не будет работать

  stepper.setMaxSpeed(5000);
  stepper.setRunMode(KEEP_SPEED);
  stepper.setSpeed(2000);
}

void loop() {
    stepper.tick();
}
 

viktor1703

★★★✩✩✩✩
9 Дек 2021
568
138
Сигналы/питание-"земля" доходят до драйвера? Может какая дорожка в обрыве. А, может быть и такое, как было на моей плате, были закорочены дорожки. По питанию моторов, при первом включении выгорел предохранитель и какие-то, уже не помню, к одному из четырех драйверов сигнальные. Пришлось резать одну и воспользоваться МГТФом.
 

j0ker

✩✩✩✩✩✩✩
31 Май 2023
3
0
Написал простенький скетч, без использования библиотеки GyverStepper - всё работает, крутится туда-сюда.
Непонятно.
Может у кого есть работающий скетч для CNC Shield v3 с GyverStepper, а то библиотека хорошая и удобная.

C++:
const int StepX = 2;
const int DirX = 5;

void setup() {
  pinMode(StepX,OUTPUT);
  pinMode(DirX,OUTPUT);
 
  pinMode( 8 ,OUTPUT);
  digitalWrite(8, LOW);
 
}
 
void loop() {
 digitalWrite(DirX, HIGH); // set direction, HIGH for clockwise, LOW for anticlockwise
 
 for(int x = 0; x < 200; x++) { // loop for 200 steps
  digitalWrite(StepX,HIGH);
  delayMicroseconds(500);
  digitalWrite(StepX,LOW);
  delayMicroseconds(500);
 }
delay(1000); // delay for 1 second
    
 digitalWrite(DirX, LOW); // set direction, HIGH for clockwise, LOW for anticlockwise

    for(int x = 0; x < 200; x++) { // loop for 200 steps
  digitalWrite(StepX,HIGH);
  delayMicroseconds(500);
  digitalWrite(StepX,LOW);
  delayMicroseconds(500);
 }
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,707
474
@j0ker, драйвер 8825 условно 2-х проводной. Следовательно, вместо
GStepper<STEPPER4WIRE> stepper(200, 2, 5);
нужно указать
GStepper<STEPPER2WIRE> stepper(200, 2, 5);
И будет вам счастье.;)
Читайте внимательно описание вот здесь , раздел "Документация GStepper" - Инициализация.
 
  • Лойс +1
Реакции: j0ker

j0ker

✩✩✩✩✩✩✩
31 Май 2023
3
0
И правда, как я раньше не заметил. Большое спасибо. Теперь всё работает.
 

Vitaliy_K

✩✩✩✩✩✩✩
31 Мар 2022
3
0
Здравствуйте. GStepper2 <STEPPER4WIRE> stepper (2048, 5, 3, 4, 2); 5, 3, 4, 2 – данные порты берутся с Ардуино нано. Подключил модуль PCF8575. Мне нужно подключить порты с модуля PCF8575, а не с ардуино в GStepper2 <STEPPER4WIRE> stepper (2048, PCF8575.5, PCF8575.3, PCF8575.4, PCF8575.2) (пример); Как правильно это сделать, ПОДСКАЖИТЕ.
 

Dima89

✩✩✩✩✩✩✩
27 Июл 2023
3
0
Подскажите как передать в конструктор класса объект GStepper?
Таким способом не получается ошибка:
Compilation error: no matching function for call to ‘GStepper2<(GS_driverType)0>::GStepper2()’

C++:
#include "GyverStepper2.h"

class My {
  public:
    My(GStepper2<STEPPER2WIRE> stepper ){
      _stepper =  stepper;
    }
    private:
     GStepper2<STEPPER2WIRE> _stepper;
  };
 

vortigont

★★★★★★✩
24 Апр 2020
1,018
532
Saint-Petersburg, Russia
Подскажите как передать в конструктор класса объект GStepper?
эта фраза не имеет смысла. Попробуйте еще раз.

в простейшем случае как-то так:

C++:
#include "GyverStepper2.h"

template <GS_driverType D>
class My : public GStepper2<D> {
  public:
    My(uint16_t steps) : GStepper2<D>(steps) {
      //do something
    }
    private:
     //GStepper2<STEPPER2WIRE> _stepper; это не надо
};
 

Sabonius

✩✩✩✩✩✩✩
7 Мар 2021
4
0
Понимаю, что очень чайницкий вопрос, но

Использую GStepper2.
Мне нужно, чтобы двигатель резко менял направление вращение например каждые 2 оборота.
И чтобы помнил сколько ему ещё крутиться, поэтому останавливать и делать setTarget() не годится.
Для этого подходит функция reverse().

Вот это не работает. И кстати какую bool переменную нужно передавать в reverse и зачем?
C++:
if ((stepper.pos % 400 == 0)) {
    guide.reverse(1);
  }
 

Chak

✩✩✩✩✩✩✩
6 Янв 2024
3
0
Всем привет
У меня есть вот такой мотор LSA421S14-A-UKBN-152 с вот такими характеристиками
1713425728486.png
И есть драйвер TB67S249FTG и стандартный H-bridge LM298N

когда подключаю мотор через LM298N и использую библиотеку GyverStepper2 всё работает
когда подключаю мотор через TB67S249FTG с другой библиотекой - то всё то же работает, но когда хочу использовать GyverStepper2 с этим драйвером, то он не хочет даже запускаться

На TB67S249FTG ток вроде как настроен правильно и Vref выставлен в 1.10 v (с другими библиотеками всё работает)
на TB67S249FTG пробовал ставить режим работы full step и 1/2 step

мне кажется, что у меня проблема с созданием объекта мотора (не очень понимаю из моего даташита сколько шагов полный оборот)

пытался запустить код из примера homing (на 4 пиновом драйвере всё ок, а на 2 пиновом - не хочет работать)

C++:
#include <Arduino.h>
#include "Debug.h"
#include "GyverStepper2.h"

#define dirPin 12
#define stepPin 11
#define enPin 10
void homing();

#define LIMSW_X 3

GStepper2<STEPPER2WIRE> stepper(2048, stepPin, dirPin, enPin);


void setup()
{
    Serial.begin(9600);
    pinMode(LIMSW_X, INPUT_PULLUP);
    delay(1000);
    DEBUGLN("setup");
    homing();     
}

void loop()
{
}

void homing()
{
    stepper.enable();
    DEBUGLN("start homing");
    if (digitalRead(LIMSW_X))
        DEBUGLN("start");
    {                          // если концевик X не нажат
        stepper.setSpeed(-10); // ось Х, -10 шаг/сек
        while (digitalRead(LIMSW_X))
        {                   // пока кнопка не нажата
            stepper.tick(); // крутим
        }
        // кнопка нажалась - покидаем цикл
        stepper.brake(); // тормозим, приехали
        DEBUGLN("finish");
    }
    stepper.reset(); // сбрасываем координаты в 0
}
может кто-то может подсказать куда смотреть, ибо я уже ничего не понимаю
 

sinedlpk

✩✩✩✩✩✩✩
24 Июн 2024
6
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
6
0
мне нужно что бы ШД 4 раза проехал туда сюда (от 0 до 400)
 

viktor1703

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

sinedlpk

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

sinedlpk

✩✩✩✩✩✩✩
24 Июн 2024
6
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
568
138
Для вставки кода пользуйтесь кнопкой. 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,117
919
Если это действие нужно делать однократно - переносите в setup и всё, иначе, как уже отметил @viktor1703, нужно условие продолжения цикла loop или проверка флага перед блоком движения.
 

sinedlpk

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