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

Adeni

✩✩✩✩✩✩✩
25 Фев 2025
1
0
Доброго всем времени суток.
Подскажите, как с помощью этой библиотеки реализовать управление двумя двигателями через прерывания? В библиотеке есть пример для одного двигателя, но поправить его под два у меня никак не получается. Либо второй двигатель не едет, либо оба движутся с одной скоростью и ускорением, хотя заданы разные.
 

ValeDeMare

✩✩✩✩✩✩✩
16 Ноя 2022
13
0
Добрый день, в программировании на ардуино не слишком силен. Помогите пожалуйста. Задача, управлять скоростью вращения шагового двигателя с точностью до 1 шага в секунду с помощью энкодера.
Как энкодером и дисплеем менять переменную и выводить результат на экран я знаю, но не могу разобраться как приравнять скорость вращения к этой переменной
Использую библиотеку GyverStepper, если вручную задавать скорость двигатель нормально крутит, если в код вставить строку
stepper.setSpeedDeg(sp); где sp это переменная, скорости вращения, то двигатель вообще не крутит.
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
592
177
@ValeDeMare,
Покажите код. с stepper.setSpeedDeg(sp);
И при непонятках, бывает полезно выводить в Serial значения. Например выводите в Serial значения sp, может оно считается неверно.
Лучше выводить ТОЛЬКО при изменении значения sp.
 

ValeDeMare

✩✩✩✩✩✩✩
16 Ноя 2022
13
0
@Bruzzer, да я для начала просто вручную присваиваю значие int8_t Sp = 50 ; далее уже в LOOP stepper.setSpeedDeg(sp); и всё, движок молчит. если же просто задать stepper.setSpeedDeg(50); то всё работает и на экран значение sp выводил, как и ожидалось там 50..
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
592
177
Это довольно странное поведение. Без кода не понятно где ошибка. Sp и sp - это разные переменные, но наверно это просто описка и в коде у вас написано правильно. Приведите короткий ПОЛНЫЙ пример. Полный - это значит его можно скомпилировать. И напишите какая у вас ардуино.
 

ValeDeMare

✩✩✩✩✩✩✩
16 Ноя 2022
13
0
Оформи код соответствующим тэгом, см. Правила
@Bruzzer,чудеса...
// крутимся с заданной скоростью

#include <GyverStepper.h>
GStepper<STEPPER4WIRE> stepper(2048, 5, 3, 4, 2);
//GStepper<STEPPER2WIRE> stepper(2048, 2, 5);
int8_t Sp = 10 ;

void setup() {
stepper.setRunMode(KEEP_SPEED); // режим поддержания скорости
//stepper.setSpeedDeg(50); // в градусах/сек
stepper.setSpeedDeg(Sp);

}

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

вот так работает

// крутимся с заданной скоростью

#include <GyverStepper.h>
GStepper<STEPPER4WIRE> stepper(2048, 5, 3, 4, 2);
//GStepper<STEPPER2WIRE> stepper(2048, 2, 5);
int8_t Sp = 10 ;

void setup() {
stepper.setRunMode(KEEP_SPEED); // режим поддержания скорости
//stepper.setSpeedDeg(50); // в градусах/сек


}

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

а вот так нет.... stepper.setSpeedDeg(Sp); в setup работает, а в loop нет почемуто (((( плата ардуино nano



и самое интересное вот так тоже не работает, тоесть задание скорости в loop приводит к глюку

// крутимся с заданной скоростью

#include <GyverStepper.h>
GStepper<STEPPER4WIRE> stepper(2048, 5, 3, 4, 2);
//GStepper<STEPPER2WIRE> stepper(2048, 2, 5);
int8_t Sp = 10 ;

void setup() {
stepper.setRunMode(KEEP_SPEED); // режим поддержания скорости



}

void loop() {
stepper.setSpeedDeg(50); // в градусах/сек
// stepper.setSpeedDeg(150);
stepper.tick();

}
 
Изменено:

ValeDeMare

✩✩✩✩✩✩✩
16 Ноя 2022
13
0
Оформи код соответствующим тэгом, см. Правила
@poty, нелогично... но вроде понял, будет костыль вроде if (sp!=Sp) {Sp=sp; stepper.setSpeedDeg(Sp); } а энкодер меняет переменную sp...

// крутимся с заданной скоростью

#include <GyverStepper.h>
GStepper<STEPPER4WIRE> stepper(2048, 5, 3, 4, 2);
//GStepper<STEPPER2WIRE> stepper(2048, 2, 5);
int8_t Sp = 0 ;
int8_t sp = 0 ;
#define T_PERIOD 2000
uint32_t timer = 0;//таймер

void setup() {
stepper.setRunMode(KEEP_SPEED); // режим поддержания скорости
stepper.setSpeedDeg(0); // в градусах/сек


}

void loop() {

if (millis()-timer > T_PERIOD){
timer=millis();
sp+=5;}
if (sp!=Sp) {Sp=sp; stepper.setSpeedDeg(Sp); }
//stepper.setSpeedDeg(50);
//stepper.setSpeedDeg(150);
stepper.tick();

}

вот так работает. ОГРОМНОЕ СПАСИБО всем кто помог разобраться, дальше буду допиливать
 
Изменено:

Bruzzer

★★★✩✩✩✩
23 Май 2020
592
177
@ValeDeMare,
В одном из сообщений вы писали, что вам недопустимо пропускать шаги (потом сообщение было отредактировано, и это пропало).
Я не знаю, насколько это реально критично - пропуск команд для шагов при постоянной скорости, но с теоретической точки зрения - вызов setSpeedDeg из <GyverStepper.h> попутно сбрасывает таймер для tick() и соответственно период между тиками может увеличиваться, а при слишком частом вызове и вовсе останавливать мотор, что у вас и происходило.
В <GyverStepper2.h> нет сброса таймера при вызове setSpeed, и период между тиками при частом вызове более предсказуем. Но между 1 и 2 версией есть отличия.

ПС. Код желательно вставлять используя специальное форматирование.
1746187535774.png
 

ValeDeMare

✩✩✩✩✩✩✩
16 Ноя 2022
13
0
@Bruzzer,спасибо. но мне критично только после подбора скорости, чтобы не пропускались шаги, в момент измененния скорости не важно, просто пока не пойму есть ли пропуски когда ардуино постоянно мониторит энкодер eb.tick(); , я постарался чтобы дисплей и действия с переменной от энкодера происходили только если flag=true, а он меняется долгим удержанием кнопки энкодера. суть в том, что всё устройство сделано "на коленке" и точно рассчитать скорость из-за неточности в расстоянии на котором просверлено отверстие невозможно и придется в полевых условиях настраивать, не хочется с собой ноут тащить, а подбирать значение скорости энкодером, собственно после подбора вероятно скетч упрощу до нескольких строк, чтбы глюков не могло вылезти.