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

Евгений.Ш

✩✩✩✩✩✩✩
1 Фев 2020
3
0
Здравствуйте. Подскажите по коду. Мне нужно регулировать скорость вращения шагового двигателя, переменным резистором. Резистор 10Ком. Высокие обороты нормально регулируются, а вот на низких скорость остается большей чем мне нужно. Моторчик 17HS4401

C++:
// драйвер STEP-DIR

#include <GyverStepper.h>
GStepper<STEPPER2WIRE> stepper(200, 2, 3, 4);
// 2 - STEP
// 3 - DIR
// 4 - EN

void setup() {
  stepper.setRunMode(KEEP_SPEED); // режим поддержания скорости
  stepper.setSpeedDeg(50);        // в градусах/сек
}
void loop() {
  stepper.tick();
  // сделаем таймер на 50 мс и будем опрашивать потенциометр
  // менять скорость чаще нет смысла
  static uint32_t tmr2;
  if (millis() - tmr2 > 50) {
    tmr2 = millis();
    // ставим новую скорость (-512.. шагов в секунду)
    // будет крутиться в разные стороны
    stepper.setSpeed(-512 - analogRead(0));
  }
}
 

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

★★★★★★★
14 Авг 2019
4,192
1,281
Москва
вот это плохая идея на мой взгляд:
-512 - analogRead(0)
Известно, что потенциометр дает значения от 0 до 1023
Допустим есть гранцы оборотов от 4 до 35 чисто для примера. Тогда можно записать
stepper.setSpeed(map(analogRead(A0),0,1023,4,35))
И еще , в setSpeed() передается значение , какого типа ?
 
Изменено:

Евгений.Ш

✩✩✩✩✩✩✩
1 Фев 2020
3
0
Не знаю. Я новичок. Код взят из примеров в библиотеке.
если ставлю положительное значение 512
stepper.setSpeed(512 - analogRead(0))
то моторчик регулируется до определенного значения и начинает крутится в другую строну.
Попробовал сделать как вы написали регулировка на низкой скорости стала то что нужно. Спасибо.
Объясните если не трудно, что означают эти цифры 0,23,4,35 ?
 
Изменено:

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

★★★★★★★
14 Авг 2019
4,192
1,281
Москва
Опечатка там, подправил..
0,1023 - это минимальное и максимальное значение , которое может выдать функция analogRead
4, 35 это минимальная и максимальная скорость которую я хочу получить.
setSpeed получает значение типа int, т.е. 2 байта со знаком. т.е. от -16384 до 16383.
При записи вида 512 - analogRead(0) можно получить значения от -511 до 512. Вот и движение в разные стороны. При записи -512 -analogRead(0) получаются значения от - 512 до - 1535. Вот и движение в одну сторону, без возможности двигаться медленно. Это математика...
 
  • Лойс +1
Реакции: Евгений.Ш

Евгений.Ш

✩✩✩✩✩✩✩
1 Фев 2020
3
0
[B]Старик Похабыч[/B] спасибо. Подскажите как минимальная скорость 4 соотносится с количеством оборотов. Как можно посчитать сколько оборотов в минуту делает моторчик на минимальной скорости 4 и на максимальной скорости 35?
 

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

★★★★★★★
14 Авг 2019
4,192
1,281
Москва
Надо посмотреть описание библиотеки. Алекс не зря писал, там все достаточно подробно написано, SetSpeed(4) это 4 шага двигателя в секунду. Соотв. 240 шагов в минуту. А сколько шагов в обороте зависит от характеристик мотора.
 

Amadei

✩✩✩✩✩✩✩
4 Дек 2018
11
2
Здравствуйте уважаемые форумчане. Подскажите пожалуйста.
Столкнулся с такой проблемой, метод stop(), в библиотеке GyverStepper, не сбрасывает tick(). Он продолжает показывать true, во что бы то и стало.
Как сбросить tick() на ноль?

В догонку такой еще вопрос. Можно ли как-то изменить скорость вращения шагового двигателя, пока он едет к позиции в режиме FOLLOW_POS?
Заранее спасибо за информацию.
 

Duet

✩✩✩✩✩✩✩
11 Май 2021
6
0
Здравствуйте. Уровень любитель. Вообще не много разочаровался в ардуинке. Не думал что управление шаговым двигателем это почти не посильная задача для ардуино. От управления двумя шд на одной ардуинке вообще отказался, не говоря уже о дисплее. Задача управление одним DM542 несколькими кнопками с четко установленными оборотами. В скетче только кнопки и подсветка кнопок на 595 микросхеме. Даже при такой простой программе не могу добиться нормальной работы шд. Что-то мешает работе библиотеке GyverStepper.
C++:
#define DRIVER_STEP_TIME 4
#include <GyverStepper.h>
GStepper<STEPPER2WIRE> stepper(200, 3, 4);
#include <Button.h>
#include <Click.h>
Button BUTTON_01;     //Кнопка Вкл,выкл режимов оборотов X+
Button BUTTON_06;     //Кнопка Вкл,выкл режимов оборотов X-
Button BUTTON_02;     //Переключатель оборотов режим 1
Button BUTTON_03;     //Переключатель оборотов режим 2
Button BUTTON_07;     //Переключатель оборотов режим 3
Button BUTTON_08;     //Переключатель оборотов режим 4
Button BUTTON_09;     //Переключатель оборотов режим 5
Button BUTTON_010;    //Переключатель оборотов режим 6
Button BUTTON_011;    //Переключатель оборотов режим 7
Button BUTTON_012;    //Переключатель оборотов режим 8
Button BUTTON_013;    //Переключатель оборотов режим 9

Button BUTTON_04;     //Кнопка режим ручной
Button BUTTON_05;     //Кнопка режим автомат
int ggg = 0;          //Переменная кнопки X+
int ggg2 = 0;         //Переменная кнопки X-
int kkk = 0;          //Переменная переключения режимов ручной или автомат вращение +
int kkk2 = 0;         //Переменная переключения режимов ручной или автомат вращение -

int latchPin = 10;
int clockPin = 12;
int dataPin = 11;

int led1 = B00000000; //-Х              B00000010   прав
int led2 = B00000000; //+Х              B00000100
int led3 = B00000000; //Ручной режим    B10000000
int led4 = B00000000; //Авто режим      B01000000

void setup ()
{
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  stepper.setRunMode(KEEP_SPEED);
  BUTTON_01.button(6);
  BUTTON_02.button(8);   //Режим оборотов 1
  BUTTON_03.button(9);   //Режим оборотов 2
  BUTTON_07.button(16);  //Режим оборотов 3
  BUTTON_08.button(17);  //Режим оборотов 4
  BUTTON_09.button(18);  //Режим оборотов 5
  BUTTON_010.button(19); //Режим оборотов 6
  BUTTON_011.button(2);  //Режим оборотов 7
  BUTTON_012.button(5);  //Режим оборотов 8
  BUTTON_013.button(13); //Режим оборотов 9

  BUTTON_04.button(14);
  BUTTON_05.button(15);
  BUTTON_06.button(7);
  pinMode(4, OUTPUT);
  pinMode(3, OUTPUT);
}
void loop() {
 
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST,led1 | led2 | led3 | led4);
  digitalWrite(latchPin, HIGH);
  BUTTON_01.read();
  BUTTON_02.read();
  BUTTON_03.read();
  BUTTON_04.read();
  BUTTON_05.read();
  BUTTON_06.read();
  BUTTON_07.read();
  BUTTON_08.read();
  BUTTON_09.read();
  BUTTON_010.read();
  BUTTON_011.read();
  BUTTON_012.read();
  BUTTON_013.read();
//Кнопки перемещения X-
if (BUTTON_01.event_click_Dn()&& kkk == 2) //вкл,выкл режимов оборотов автомат
{
  ggg = !ggg;
  if (!ggg)stepper.stop();
  ggg2 = 0;
}
if (ggg == 1) {led1 = B10000000;}
if (ggg == 0) {led1 = B00000000;}
if (ggg2 == 1) {led2 = B01000000;}
if (ggg2 == 0) {led2 = B00000000;}
 
if (BUTTON_01.event_click_Dn() && kkk == 1) //вкл режимов оборотов ручной
{
  ggg = 1;
  ggg2 = 0;
}
if (BUTTON_01.event_click_Up() && kkk == 1)//выкл режимов оборотов ручной
{
  ggg = 0;
  stepper.stop();
}
//Кнопки перемещения X+
if (BUTTON_06.event_click_Dn()&& kkk2 == 2) //вкл,выкл режимов оборотов автомат
{
  ggg2 = !ggg2;
  if (!ggg2)
  stepper.stop();
  ggg = 0;
}
if (BUTTON_06.event_click_Dn() && kkk2 == 1) //вкл режимов оборотов ручной
{
  ggg2 = 1;
  ggg = 0;
}
if (BUTTON_06.event_click_Up() && kkk2 == 1)//выкл режимов оборотов ручной
{
  ggg2 = 0;
  stepper.stop();
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Кнопки выбора режима. Ручной или Автомат.
if (BUTTON_04.event_click_Dn()){kkk = 1; kkk2 = 1; led3 = B00000100; led4 = B00000000;}  //кнопка ручной режим
if (BUTTON_05.event_click_Dn()){kkk = 2; kkk2 = 2; led4 = B00000010; led3 = B00000000;}  //кнопка авто  режим
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//переключатель оборотов
if (BUTTON_02.state_button() && ggg == 1) { motor_s1(); } //переключатель оборотов режим 1 +
                                                                                        //....
if (BUTTON_013.state_button() && ggg == 1){ motor_s9(); } //переключатель оборотов режим 9 +

if (BUTTON_02.state_button() && ggg2 == 1) { motor_s11(); } //переключатель оборотов режим 1 -
                                                                                        // ....
if (BUTTON_013.state_button() && ggg2 == 1){ motor_s19(); } //переключатель оборотов режим 9 -
   stepper.tick(); 
}
void motor_s1() {
  stepper.setMaxSpeed(1000);
  stepper.setAcceleration(500);
  stepper.setSpeed(1000); 
}
//...
void motor_s9() {
  //stepper.setRunMode(KEEP_SPEED);
  stepper.setAcceleration(200);
  stepper.setSpeed(1000);
}
void motor_s11() {
  //stepper.setRunMode(KEEP_SPEED);
  stepper.setAcceleration(200);
  stepper.setSpeed(-1000); 
}
//...
void motor_s19() {
  //stepper.setRunMode(KEEP_SPEED);
  stepper.setAcceleration(200);
  stepper.setSpeed(-1000);
}
 

Duet

✩✩✩✩✩✩✩
11 Май 2021
6
0
Короче ей мешает все что в loop. Что бы не прописал, начинаются сбои в работе оборотов. Только в setup если, тогда работает хорошо, но зачем она тогда нужна если я даже кнопку прицепить не могу. Единственная библиотека которая работает это написанная на таймер счетчике, но она по функционалу не дописанная и только один шд.
 

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

★★★★★★★
14 Авг 2019
4,192
1,281
Москва
Для мотора что главное ? равномерность! Пробуй освоить библиотеку гайвера ГайверТаймер(с) и вызывать тик мотора внутри обработчика таймера.
 

Duet

✩✩✩✩✩✩✩
11 Май 2021
6
0
Для мотора что главное ? равномерность! Пробуй освоить библиотеку гайвера ГайверТаймер(с) и вызывать тик мотора внутри обработчика таймера.
Спасибо за совет! Почитал, освоил немного.

Что я не так делаю? Режимы двигателя не устанавливаются, работают оба режима на одних одинаковых оборотах которые даже не задавал.
C++:
#include <GyverTimers.h>
//#define DRIVER_STEP_TIME 1
#include <GyverStepper.h>
GStepper<STEPPER2WIRE> stepper(200, 3, 4);
#include <Button.h>
#include <Click.h>
Button BUTTON_01;     
Button BUTTON_02;   
Button BUTTON_03;     
Button BUTTON_04;     
Button BUTTON_05;     
int ggg = 0;         
int kkk = 0;         
int kkk2 = 0;         
void setup ()
{
  Timer2.setPeriod(stepper.getMinPeriod() / 2);
  Timer2.enableISR();
  stepper.setRunMode(KEEP_SPEED);
  BUTTON_01.button(6);
  BUTTON_02.button(8);   
  BUTTON_03.button(9);   
  BUTTON_04.button(14);
  BUTTON_05.button(15);

  pinMode(4, OUTPUT);
  pinMode(3, OUTPUT);
}
ISR(TIMER2_A) {
  stepper.tick();
}
void loop() {
  BUTTON_01.read();
  BUTTON_02.read();
  BUTTON_03.read();
  BUTTON_04.read();
  BUTTON_05.read();
//Кнопки перемещения X-
if (BUTTON_01.event_click_Dn()&& kkk == 1) //вкл,выкл режимов оборотов автомат
{
  ggg = !ggg;
  if (!ggg)stepper.stop();
}
if (BUTTON_01.event_click_Dn() && kkk2 == 1) //вкл режимов оборотов ручной
{
  ggg = 1;
}
if (BUTTON_01.event_click_Up() && kkk2 == 1)//выкл режимов оборотов ручной
{
  ggg = 0;
  stepper.stop();
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Кнопки выбора режима. Ручной или Автомат.
if (BUTTON_04.event_click_Dn()){kkk2 = 1; kkk = 0;}  //кнопка ручной режим
if (BUTTON_05.event_click_Dn()){kkk = 1; kkk2 = 0;}  //кнопка авто  режим
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//переключатель оборотов
if (BUTTON_02.state_button() && ggg == 1) { motor_s1(); } //переключатель оборотов режим 1
if (BUTTON_03.state_button() && ggg == 1) { motor_s2(); } //переключатель оборотов режим 2   
}
void motor_s1() {
  stepper.setMaxSpeed(3000);
  stepper.setAcceleration(2000);
  stepper.setSpeed(1000);
}
void motor_s2() {
  stepper.setMaxSpeed(3000);
  stepper.setAcceleration(2000);;
  stepper.setSpeed(3000);
}
 

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

★★★★★★★
14 Авг 2019
4,192
1,281
Москва
Частота таймера в 2 раза выше периода мотора. Может надо период таймера менять при изменении скорости мотора ? По идее тикер мотора должен сам понять. Попробуй сделать период таймера раз в 10-20 короче.
 

Duet

✩✩✩✩✩✩✩
11 Май 2021
6
0
Избыточное цитирование
Частота таймера в 2 раза выше периода мотора. Может надо период таймера менять при изменении скорости мотора ? По идее тикер мотора должен сам понять. Попробуй сделать период таймера раз в 10-20 короче.
Приблизительно методом тыка Timer2.setPeriod(130); на оба режима, но это методом тыка, больше или меньше сбои сильные.
 

Duet

✩✩✩✩✩✩✩
11 Май 2021
6
0
Переписал кнопки, теперь все от автора, но проблема осталась. Обороты вместо 3000 шаг. сек, около 400. Собрано на UNO, драйвер TB6560+nema 17 настроенный на полный шаг. В параметре GStepper<STEPPER2WIRE> stepper(200, 3, 4); заданное количество шагов не на что не влияет, любые числа, работает одинаково. Работает очень не стабильно, задержка при вкл. выкл около 2 секунды, акселератор работает не всегда, во время вращения в одном положении сбой как бы удар. Не чего не пойму, хотя вроде все без ошибок.
C++:
#include <GyverButton.h>
#include <GyverTimers.h>
#include <GyverStepper.h>
#define BTN_PIN1 6
#define BTN_PIN2 14
#define BTN_PIN3 15
#define BTN_PIN4 8
#define BTN_PIN5 9
GStepper<STEPPER2WIRE> stepper(200, 3, 4);
GButton butt1(BTN_PIN1,LOW_PULL,NORM_OPEN);
GButton butt2(BTN_PIN2,LOW_PULL,NORM_OPEN);
GButton butt3(BTN_PIN3,LOW_PULL,NORM_OPEN);
GButton butt4(BTN_PIN4,LOW_PULL,NORM_OPEN);
GButton butt5(BTN_PIN5,LOW_PULL,NORM_OPEN);   
int ggg = 0;         
int kkk = 0;         
int kkk2 = 0;         
void setup ()
{
  Timer2.setPeriod(stepper.getMinPeriod() / 2); //stepper.getMinPeriod()
  Timer2.enableISR();
  stepper.setRunMode(KEEP_SPEED);
  stepper.setMaxSpeed(3000);
  stepper.setAcceleration(2500);
  pinMode(4, OUTPUT);
  pinMode(3, OUTPUT);
}
ISR(TIMER2_A) {
  stepper.tick();
}
void loop() {
  butt1.tick();
  butt2.tick();
  butt3.tick();
  butt4.tick();
  butt5.tick();
//Кнопка вкл. выкл
if (butt1.isSingle()&& kkk == 1)
{
  ggg = !ggg;
  if (!ggg)stepper.stop();
}
if (butt1.isHolded() && kkk2 == 1)
{
  ggg = 1;
}
if (butt1.isRelease() && kkk2 == 1)
{
  ggg = 0;
  stepper.stop();
}
//Кнопки выбора режима. Ручной или Автомат.
if (butt2.isSingle()){kkk2 = 1; kkk = 0;}  //кнопка ручной режим
if (butt3.isSingle()){kkk = 1; kkk2 = 0;}  //кнопка авто  режим
//переключатель оборотов
if (butt4.state() && ggg == 1) { motor_s1();} //переключатель оборотов режим 1
if (butt5.state() && ggg == 1) { motor_s2();} //переключатель оборотов режим 2   
}
void motor_s1() {
    stepper.setSpeed(200);
}
void motor_s2() {
    stepper.setSpeed(3000);
}
 

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

★★★★★★★
14 Авг 2019
4,192
1,281
Москва
Я так скду, у меня нема с а4988 крути максимум 6 оборотов в секунду (на любом шаге) для полого шага это 1200. Если нагрузка посущественней, то я ограничиваюсь 5-ю оборотами, т.е. 1000 шагов в секунду. Что бы 3000 в секунду это вентилятор
 

AlexGyver

★★★★★★✩
Команда форума
30 Июл 2018
359
567
@Duet, достаточно было изучить документацию на библиотеку или хотя бы встроенные примеры, там всё написано про работу в прерывании...
 

JSNU

✩✩✩✩✩✩✩
16 Июл 2021
1
0
Привет AlexGyver и всем форумчанам!
Столкнулся с проблемой торможения привода на KEEP_SPEED.
Мотор крутится по кнопке. Ускорение и торможение одинаковые только если привод не успел разогнаться до SetSpeed().
Если держать кнопку, разогнать до SetSpeed и продолжать крутить мотор секунд 10-20, то торможение будет в несколько раз выше ускорения (привод ощутимо быстрее останавливается).
Нашел закономерность, что чем дольше крутить мотор, тем резче будет торможение.
В чем я накосячил?)) подскажите что читать и куда копать?
P.S. в коде много лишнего, смотреть сразу case 2.
C++:
#define SMOOTH_ALGORITHM
#include <GyverStepper.h>
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
GStepper<STEPPER2WIRE> stepper(1000, 14, 15);
int flag = 0;
int c = 0;
int s = 0;
//char a;
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress ip(169, 254, 170, 10);
unsigned int localPort = 6630;
EthernetUDP Udp;
char receivingBuffer[100]; // приемный буфер Udp-пакета
float floatVar; //float градуса

void setup() {
  Ethernet.begin(mac, ip);
  Udp.begin(localPort);
  Serial.begin(9600);
  stepper.setAcceleration(50);
  pinMode (4, INPUT_PULLUP); //концевик
  pinMode (5, INPUT_PULLUP); //кнопка homing
  pinMode (16, OUTPUT); //лампочка homing
  pinMode (6, INPUT_PULLUP); //кнопка по часовой
  pinMode (7, INPUT_PULLUP); //кнопка против часовой
  pinMode (8, INPUT_PULLUP); //вкл/выкл
  pinMode (9, OUTPUT); //лампочка ethernet
  digitalWrite(16, LOW);
}
bool btnState = false;
int i1 = 0;
int i2 = 0;
int i3 = 0;
int h = 0;
void loop() {
  c = 0;

  if (!digitalRead(8)) {  //ЕСЛИ КНОПКА ETHERNET НЕ НАЖАТА
    digitalWrite(9, LOW);
    for (int i = 0; i <= 10 && !digitalRead(5); i++) { //ХОУМИНГ
      //Serial.println(i);
      i1++;
    }
    if (i1 >= 10) c = 1;
    i1 = 0;

    for (int i = 0; i <= 10 && !digitalRead(6); i++) { //ПО ЧАСОВОЙ
      //Serial.println(i);
      i2++;
    }
    if (i2 >= 10) c = 2;
    i2 = 0;

    for (int i = 0; i <= 10 && !digitalRead(7); i++) { //ПРОТИВ ЧАСОВОЙ
      //Serial.println(i);
      i3++;
    }
    if (i3 >= 10) c = 3;
    i3 = 0;
  }
  else digitalWrite(9, HIGH);
  //c = 1;
  //Serial.println(c);

  switch (c) {
    case 1:
      //int h = 0;
      Serial.println(222);
      break;
    case 2:
      Serial.println("HANDTURN CW");
      digitalWrite(16, LOW);
      stepper.setRunMode(KEEP_SPEED);
      //stepper.reset();
      stepper.setSpeed(100, SMOOTH);
      stepper.setAcceleration(50);

      while (stepper.getSpeed() != 0 || !digitalRead(6)) {
        if (!digitalRead(6) && !btnState) {
          btnState = true;
        }
        // кнопка отпущена
        if (digitalRead(6) && btnState) {
          btnState = false;
          stepper.stop();
        }
        stepper.tick();
        if (!stepper.getState()) {
          c = 0;
          break;
        }
      }

    case 3:
      Serial.println(333);
      break;

  }
}
 

BLOCKHEAD

✩✩✩✩✩✩✩
6 Окт 2021
3
0
Привки!
А как в режиме Follow_Pos менять скорость в зависимости от положения двигателя?
Вот у меня есть цикл, который катает мотор по координатам вперед и взад между координатами 0 и 35000. У ней внутре неонка:
C++:
                    if (5000 <= stepper.getCurrent() <= 30000) {
                      stepper.setMaxSpeed(1500);
                      } else {
                        stepper.setMaxSpeed(500);
Задумка в том, чтобы мотор замедлялся при смене направления. Но при моем коде он всю дорогу лупит на скорости 1500.
Задавать параметры ускорения тут несподручно, потому что мне нужны конкретные скорости в зависимости от положения. Можно, конечно рассчитать под них ускорение, но тогда мотор будет останавливаться в промежуточных точках, такое не нужно.
К тому же в дальнейшем эту конструкцию кода нужно будет прикрутить ко второму мотору. То есть скорость второго должна зависеть от положения первого.
 

bort707

★★★★★★✩
21 Сен 2020
2,898
862
@BLOCKHEAD, в первой строке вашего кода - ошибка. Почитайте про операции сравнения в Си, язык не поддерживает одновременное сравнение с двумя аргументами, как у вас.
Причем ошибок при компиляции не будет, просто результат этого сравнения будет совсем не тот, что вы думаете.
 
  • Лойс +1
Реакции: BLOCKHEAD

BLOCKHEAD

✩✩✩✩✩✩✩
6 Окт 2021
3
0
@bort707, Почитал. Осознал. Прослезился.

Теперь не работает регулировка скорости второго мотора:
C++:
                    if (stepper.getCurrent() <= 5000) {
                      stepper2.setSpeed(100);}
Второй мотор работает в режиме KEEP_SPEED. При такой конструкции он просто не крутится. Если задать скорость снаружи условия if, то все работает, только скорость, само собой, не меняется. Куда смотреть? Где я налажал в этот раз?
 

Lumenjer

★★★✩✩✩✩
10 Дек 2020
220
112
@BLOCKHEAD, 1. Вы уверены, что ваше условие выполняется? (скорее всего да, возможно есть какие-то баги в библиотеки связанные с этим делом)
2. Подозреваю, что этот код лежит в loop, отсюда вопрос, зачем вам устанавливать одну и ту же скорость при каждом проходе в loop?
Лучше сделать какой-нибудь флаг на проверку условия и по этому флагу выставить скорость 1 раз и все.


C++:
static bool lowCurrent = false;     // флаг для определения условия позиции
static bool settedSpeed = false;    // флаг для проверки, была ли установлена скорость
if (stepper.getCurrent() <= 5000) {
    lowCurrent = true;                // если условие по позиции выполняется, то флаг true
}
else {
    lowCurrent = false;             // если не выполняется, то false
}
if (lowCurrent != speedSetted) {    // проверяем, равен ли флаг позиции флагу нужной скорости
    speedSetted = lowCurrent;        // если не равен, то присваеваем значение флага позиции
    if (speedSetted) {                // проверяем значение флага
        stepper2.setSpeed(100);     // если он true, то настраиваем скорость (это произойдет только 1 раз за проход первого шаговика по позиции от 0 к 5000)
    }
    else {
                                    // если false - выполняем что-то другое (выполнится 1 раз, когда первый шаговик перешагнет за 5000)
    }
}
 
  • Лойс +1
Реакции: BLOCKHEAD