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

YPAL

✩✩✩✩✩✩✩
14 Сен 2020
4
0
Строю фрезерный станок. При выключенном шпинделе все шаговики работают нормально. При включении шпинделя начинаются перебои сигнала и шаговики встают. Померил напряжение приходящее с клемы Step а там 0,01 вольта... сигналы на DIR и En нормальные порядка 5 вольт. Похоже шпиндель создает помехи которые перебивают сигнал step. Есть ли способ увеличить напряжение на Step?
 

b707_2

★★✩✩✩✩✩
22 Июл 2020
182
51
для начала я бы проверил, сконфигурирован ли пин STEP как OUTPUT
А то симптомы уж больно характерные.
 

YPAL

✩✩✩✩✩✩✩
14 Сен 2020
4
0
Да использую arduino uno
GStepper< STEPPER2WIRE> stepper1(400, 5, 6, 7);
GStepper< STEPPER2WIRE> stepper2(400, 8, 9, 10);
void setup()
{
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(LED_BUILTIN, OUTPUT);

delay(1000);
stepper1.enable();
stepper1.autoPower(true);
stepper1.setAcceleration(1200);

stepper2.enable();
stepper2.autoPower(true);
// установка ускорения в шагах/сек/сек
stepper2.setAcceleration(1200);
keyboard.begin(DataPin, IRQpin);
Serial.begin(115200);

для начала я бы проверил, сконфигурирован ли пин STEP как OUTPUT
А то симптомы уж больно характерные.
Глянь может я неправильно это сделал?

Нужно найти сопли в схеме.
Провода проверял. И такая проблема на обоих шаговиках...
 

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

★★★★★★★
14 Авг 2019
4,201
1,287
Москва
А как ты снимаешь напряжение со STEP ? Отключи от драйвера и подай на пин HIGH сигнал и сделай измерение.
А если ты пытаешься поймать HIGH во время работы.. Там же нет постоянного напряжения в 5 в, там импульс короткий.
Я думаю, что если нарисовать схему подключения шаговых моторов и шпинделя к ардуино и источника питания, то электроникам будет куда проще угадывать.
 

YPAL

✩✩✩✩✩✩✩
14 Сен 2020
4
0
А как ты снимаешь напряжение со STEP ? Отключи от драйвера и подай на пин HIGH сигнал и сделай измерение.
А если ты пытаешься поймать HIGH во время работы.. Там же нет постоянного напряжения в 5 в, там импульс короткий.
Я думаю, что если нарисовать схему подключения шаговых моторов и шпинделя к ардуино и источника питания, то электроникам будет куда проще угадывать.
Шпиндель с ардуино никак не связан включатся отдельно. А схема стандарт step dir en подключены к цифровым пинам, земля к земле. Просто у меня есть плата от 3д принтера там спокойно можно измерить 5В на степе при включении двигателя.
"Отключи от драйвера и подай на пин HIGH сигнл и сделай измерение." попробую проверить так.
 

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

★★★★★★★
14 Авг 2019
4,201
1,287
Москва
Все равно не понимаю как там можно померить. Двигатель делает шаг, когда на контакт STEP подается ИМПУЛЬС. Импульсты будут подаваться с определенной частотой и определенной длительностью. Эдакий ШИМ сигнал
 

AlexGyver

★★★★★★✩
Команда форума
30 Июл 2018
359
569
Пины делаются OUTPUT сами внутри библиотеки, дублировать в скетче нет смысла. Напряжение на STEP измерить не получится, потому что сигнал подаётся импульсом на 4 микросекунды
 

AlexGyver

★★★★★★✩
Команда форума
30 Июл 2018
359
569

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

★★★★★★★
14 Авг 2019
4,201
1,287
Москва
Да, и осциллографом можно зацепить, но хотелось бы услышать от автора как там все происходит и в вольтах. Может я чего не знаю про ту плату ? Я даже не знаю какая у него плата. Полезно для расширения кругозора. И я сейчас не шучу.
 

AlexGyver

★★★★★★✩
Команда форума
30 Июл 2018
359
569
@Старик Похабыч, думаю там обычный GRBL шилд, в котором все драйвера и провода друг на друга шумят
 
Изменено:

AlexGyver

★★★★★★✩
Команда форума
30 Июл 2018
359
569
@YPAL, помехи не равно низкое напряжение, и напряжение поднимать не нужно. Нужно заняться экранированием силовых проводов и моторов и цеплянием экрана на землю. В этом проблема самоделочных станков: как провода подключить на схеме нарисовано, как как их подключить чтобы схема работала - не написано. Помехи, индуктивные выбросы, хреновые шумящие блоки питания - это всё лучшие друзья самодельщика станков =)
 

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

★★★★★★★
14 Авг 2019
4,201
1,287
Москва

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

★★★★★★★
14 Авг 2019
4,201
1,287
Москва

YPAL

✩✩✩✩✩✩✩
14 Сен 2020
4
0
Да, и осциллографом можно зацепить, но хотелось бы услышать от автора как там все происходит и в вольтах. Может я чего не знаю про ту плату ? Я даже не знаю какая у него плата. Полезно для расширения кругозора. И я сейчас не шучу.
Станок на arduino uno пробую собрать. Буду закупаться экранированными проводами. Завтра если времени хватит сниму сигнал с той платы где 5В.
 

zErrOo

✩✩✩✩✩✩✩
27 Мар 2021
3
0
Здравствуйте. Задача вот какая: нужно управлять шаговыми двигателями(задавать кол-во шагов, которое нужно пройти по одно из осей) через монитор порта. Управление идет через RAMPS 1.4 с DRV8825 . Для этого пытался использовать следующий код:
C++:
#include "GyverStepper.h"

#define STEP_A 54// step
#define STEP_B 60
#define STEP_C 46
#define STEP_D 26
#define DIR_A 55 // dir направления вращения
#define DIR_B 61
#define DIR_C 48
#define DIR_D 28
#define EN_A 38// enable вкл/выкл
#define EN_B 56
#define EN_C 62
#define EN_D 24

char thisChar;
byte availableBytes;
String strData = "";
boolean recievedFlag;
int step_X,
    step_Y,
    step_Z;
                                                          // Расположение двигателей (вид сверху)
GStepper<STEPPER2WIRE> stepperA(100, STEP_A, DIR_A, EN_A);//             B*******A
GStepper<STEPPER2WIRE> stepperB(100, STEP_B, DIR_B, EN_B);//             *       *
GStepper<STEPPER2WIRE> stepperC(100, STEP_C, DIR_C, EN_C);//             *       *
GStepper<STEPPER2WIRE> stepperD(100, STEP_D, DIR_D, EN_D);//             D*******C

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

  stepperA.setRunMode(FOLLOW_POS);
  stepperA.setMaxSpeed(2000);
  stepperA.setAcceleration(1000);
  stepperA.autoPower(true);
  stepperA.enable();
  
  stepperB.setRunMode(FOLLOW_POS);
  stepperB.setMaxSpeed(2000);
  stepperB.setAcceleration(1000);
  stepperB.autoPower(true);
  stepperB.enable();

  
  stepperC.setRunMode(FOLLOW_POS);
  stepperC.setMaxSpeed(2000);
  stepperC.setAcceleration(1000);
  stepperC.autoPower(true);
  stepperC.enable();

  stepperD.setRunMode(FOLLOW_POS);
  stepperD.setMaxSpeed(2000);
  stepperD.setAcceleration(1000);
  stepperD.autoPower(true);
  stepperD.enable();
}

void move_X(long steps)
{
    stepperA.setTarget(-steps);
    stepperB.setTarget(steps);
    stepperC.setTarget(-steps);
    stepperD.setTarget(steps);
    stepperA.tick();
    stepperB.tick();
    stepperC.tick(); 
    stepperD.tick();
}
void move_clock(long steps)
{
  stepperA.setTarget(-steps);
  stepperB.setTarget(-steps);
  stepperC.setTarget(-steps);
  stepperD.setTarget(-steps);
  stepperA.tick();
  stepperB.tick();
  stepperC.tick(); 
  stepperD.tick();
}
void move_Y(long steps)
{
  stepperA.setTarget(steps);
  stepperB.setTarget(steps);
  stepperC.setTarget(-steps);
  stepperD.setTarget(-steps);
  stepperA.tick();
  stepperB.tick();
  stepperC.tick(); 
  stepperD.tick();
}

void loop() 
{
  if (Serial.available() > 0) {                 // если есть что то на вход
    strData = "";                               // очистить строку
    while (Serial.available() > 0) {            // пока идут данные
      strData += (char)Serial.read();           // забиваем строку принятыми данными
      delay(2);                                 // обязательно задержка, иначе вылетим из цикла раньше времени
    }
    recievedFlag = true;                        // поднять флаг что получили данные
  }
  if (recievedFlag) 
  {                                             // если есть принятые данные
    int intVal = strData.substring(1).toInt();  // перевести в int всю строку кроме первых двух символов!
    String header = strData.substring(0, 1);    // создать мини строку, содержащую первые два символа
    if (strData.startsWith("X"))                // если строка начинается с X
      step_X = (long)intVal;
    if (strData.startsWith("Y"))                // если строка начинается с Y
      step_Y = (long)intVal;
    if (strData.startsWith("Z"))                // если строка начинается с Z
      step_Z = (long)intVal;
    
    Serial.print(step_X); Serial.print(" ");  move_X(purp);
    Serial.print(step_Y); Serial.print(" ");  move_Y(step_Y);
    Serial.print(step_Z); Serial.println(" ");move_clock(step_Z);
      
    recievedFlag = false;                       // данные приняты, мой капитан!
    // выводим в порт для отладки
  }
}
Порты указаны правильно, и с другой прошивкой (без монитора порта) все работает, как прописываю через Serial шаговик начинает дрожать.
 

poty

★★★★★★✩
19 Фев 2020
3,040
905
Какой используется МП?
Зачем delay при чтении?
Что такое purp и где она определена?
 
Изменено:

zErrOo

✩✩✩✩✩✩✩
27 Мар 2021
3
0
Какой используется МП?
Зачем delay при чтении?
Что такое purp и где она определена?
Использую Arduino Mega 2560.
Без delay цикл while заканчивается на первом знаке.
purp - устаревшая переменная для отладки, на самом деле стоит step_X.
 

poty

★★★★★★✩
19 Фев 2020
3,040
905
Тогда рассказывайте поточнее. Как задаются команды и обеспечивается время между символами не более 2мс? Почему не отслеживаете конец строки или признак конца команды вместо наличия символов в буфере и delay? Что означает "шаговик начинает дрожать": он дрожит в момент ввода или постоянно, даже без ввода?
Неплохо было бы исправить скетч на актуальный в первом сообщении и привести рабочий вариант (без Serial).
 

zErrOo

✩✩✩✩✩✩✩
27 Мар 2021
3
0
Тогда рассказывайте поточнее. Как задаются команды и обеспечивается время между символами не более 2мс? Почему не отслеживаете конец строки или признак конца команды вместо наличия символов в буфере и delay? Что означает "шаговик начинает дрожать": он дрожит в момент ввода или постоянно, даже без ввода?
Неплохо было бы исправить скетч на актуальный в первом сообщении и привести рабочий вариант (без Serial).
Алгоритм парсинга брал из этой статьи.
После ввода в монитор напряжение на обмотку идёт, драйвера шумят, но сам двигатель не проворачивается.
GyverStepper без Serial:
#define STEP_A 54// step
#define STEP_B 60
#define STEP_C 46
#define STEP_D 26
#define DIR_A 55 // dir направления вращения
#define DIR_B 61
#define DIR_C 48
#define DIR_D 28
#define EN_A 38// enable вкл/выкл
#define EN_B 56
#define EN_C 62
#define EN_D 24

#include "GyverStepper.h"

GStepper<STEPPER2WIRE> stepperA(200, STEP_A, DIR_A, EN_A);
GStepper<STEPPER2WIRE> stepperB(200, STEP_B, DIR_B, EN_B);
GStepper<STEPPER2WIRE> stepperC(200, STEP_C, DIR_C, EN_C);
GStepper<STEPPER2WIRE> stepperD(200, STEP_D, DIR_D, EN_D);

void setup() {
  Serial.begin(9600);
  Serial.println("Start");
  // мотор A,B,C будет перемещаться в заданную позицию
  stepperA.setRunMode(FOLLOW_POS);
  stepperA.setMaxSpeed(2000);
  stepperA.setAcceleration(2000);
  stepperA.autoPower(true);
  stepperA.enable();
 
  stepperB.setRunMode(FOLLOW_POS);
  stepperB.setMaxSpeed(2000);
  stepperB.setAcceleration(1000);
  stepperB.autoPower(true);
  stepperB.enable();

 
  stepperC.setRunMode(FOLLOW_POS);
  stepperC.setMaxSpeed(2000);
  stepperC.setAcceleration(1000);
  stepperC.autoPower(true);
  stepperC.enable();

  stepperD.setRunMode(FOLLOW_POS);
  stepperD.setMaxSpeed(2000);
  stepperD.setAcceleration(1000);
  stepperD.autoPower(true);
  stepperD.enable();
}
void move_A(int steps){stepperA.setTarget(steps);}
void move_B(int steps){stepperB.setTarget(steps);}
void move_C(int steps){stepperC.setTarget(steps);}
void move_D(int steps){stepperD.setTarget(steps);}

void move_X(int steps)
{
    stepperA.setTarget(-steps);
    stepperB.setTarget(steps);
    stepperC.setTarget(-steps);
    stepperD.setTarget(steps);
    stepperA.tick();
    stepperB.tick();
    stepperC.tick();
    stepperD.tick();
}
void move_clock(int steps)
{
  move_A(-steps);
  move_B(-steps);
  move_C(-steps);
  move_D(-steps);
  stepperA.tick();
  stepperB.tick();
  stepperC.tick();
  stepperD.tick();
}
void move_Y(int steps)
{
  move_A(steps);
  move_B(steps);
  move_C(-steps);
  move_D(-steps);
  stepperA.tick();
  stepperB.tick();
  stepperC.tick();
  stepperD.tick();
}

void loop() {
 
  int purp = 10000;
  move_Y(purp);
  Serial.println(stepperA.getCurrent());
}
 

poty

★★★★★★✩
19 Фев 2020
3,040
905
Т.е. Вы вводите команды вручную через терминал? Тогда понятно, почему так происходит. Достаточно набирать медленнее, чем 500 символов в секунду и символы в буфере закончатся быстрее, чем Вы закончите набирать команду.
По хорошему надо иметь признак начала команды (в принципе, используемых Вами "X", "Y", "Z" достаточно) и либо неизменную длину команды (допустим, 5 символов: Х12345), либо ограничитель команды (допустим, символ "$" или перевод строки). Строки 95-99 переписать так, чтобы получить сначала полную команду, а потом её парсить.