Библиотека AccelStepper

vladimir62
vladimir62 аватар
Offline
Зарегистрирован: 10.11.2015

Мне лень подключать второй ШД, но на одном если написать так:

stepper1.setSpeed(speed1);
stepper1.runToNewPosition(steps1);

ШД крутит хорошо.

 

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

все таки посмотрите единицы измерения. И попробуйте явное преобразование типов:

const float steps1 = 600.0; 
const float steps2 = 480.0; 
const float runtime = 20000.0;    // 20 сек
const float speed1 = steps1 * 1000.0 / runtime; // шаги в секунду, поэтому *1000
const float speed2 = steps2 * 1000.0 / runtime;

... 

stepper1.setSpeed(speed1);
stepper1.moveTo((long)steps1);

stepper2.setSpeed(speed2);
stepper2.moveTo((long)steps2);

 

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

vladimir62 пишет:

 

stepper1.setSpeed(speed1);
stepper1.runToNewPosition(steps1);

ШД крутит хорошо.

 

runToNewPosition() - блокирующая функция, moveTo() - неблокирующая, с которой нужно применять run() в цикле, например, так:

while (stepper1.run() || stepper2.run());

 

vladimir62
vladimir62 аватар
Offline
Зарегистрирован: 10.11.2015

Я когда начал осваивать Accel, то не задавал вопросов, а ввел запрос на форуме и все темы из списка внимательно прочитал, кстати с этой ветки и начинается список. Разумется прочитал много ваших комментариев,  то что вы мне написали я знаю, спасибо, с уважением.

nam
Offline
Зарегистрирован: 17.02.2016

Большое  спасибо всем за ответы. Разгадка проблемы оказалась до безобразия простой. Нужно было написать moveTo перед setSpeed.

stepper1.moveTo(steps1);

stepper1.setSpeed(speed1);

Теперь все работает как нужно. Ещё раз спасибо за попытку помочь!

vladimir62
vladimir62 аватар
Offline
Зарегистрирован: 10.11.2015

Чудесно! А весь скетч можно посмотреть? Или секрет?

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

странно, вроде от перестановки ничего не должно меняться.

vladimir62
vladimir62 аватар
Offline
Зарегистрирован: 10.11.2015

И я! И я!... Того же мнения.

nam
Offline
Зарегистрирован: 17.02.2016

Секретного в скетче нет ничего. Это доработанный скетч из библиотеки.
Я тоже думал, что от перестановки разницы быть не должно, однако ошибался.
Вот не знаю, может то чудачества MotorShield? Хотя при чем тут он...

nam
Offline
Зарегистрирован: 17.02.2016
#include <AccelStepper.h>
#include <AFMotor.h>

AF_Stepper motor1(200, 1);
AF_Stepper motor2(200, 2);

int startPosH = 0;
int startPosV = 0;
long runtime = 0;
float SpeedH = 0;
float SpeedV = 0;

void forwardstep1() {
  motor1.onestep(FORWARD, SINGLE);
}
void backwardstep1() {
  motor1.onestep(BACKWARD, SINGLE);
}
// wrappers for the second motor!
void forwardstep2() {
  motor2.onestep(FORWARD, SINGLE);
}
void backwardstep2() {
  motor2.onestep(BACKWARD, SINGLE);
}

AccelStepper stepper1(forwardstep1, backwardstep1);
AccelStepper stepper2(forwardstep2, backwardstep2);

void setup()
{
}

void loop()
{
  startPosH = 2000;
  startPosV = 3000;
  runtime = 60;
  SpeedH = 0;
  SpeedV = 0;
  SpeedH = startPosH / runtime;
  SpeedV = startPosV / runtime;
  
  stepper1.moveTo(startPosH);
  stepper1.setSpeed(SpeedH);
  stepper2.moveTo(startPosV);
  stepper2.setSpeed(SpeedV);
  stepper1.run();
  stepper2.run();
}

 

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Tomasina пишет:
странно, вроде от перестановки ничего не должно меняться.

Я никогда не пользовался прямой установкой скорости, наверно поэтому и не понял фишки. Всегда пользовался ускорением, то есть всеми преимуществами библиотеки. А так происходит следующее: при вызове run() библиотека пытается расчитать скорость, но если moveTo не задан, то из-за равенства текущей и целевой позиции скорость устанавливается в 0. setSpeed() тоже не проходит, если "ехать никуда не надо" Я бы все-же рекомендовал вынести из цикла moveTo и setSpeed, функция run() должна вызываться максимально часто, пока не дорстигнуьа целевая позиция. Поэтому я их заворачиваю в отдельный цикл. Я его писал выше. В теле цикла обычно ставлю опрос концевых датчиков, аварийной кнопки и т.д.

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

а зачем нужна дополнительная библиотека AFMotor.h? Там какие-то фишки, или она заточена под конкретный шилд?

vladimir62
vladimir62 аватар
Offline
Зарегистрирован: 10.11.2015

Мне анализировать код как AlexFisherу не дано. Но я решил проверить скетч. Если откинуть AFMotor и все что с ней связано, потому что у меня нет под рукой второго драйвера и мотор я могу подключитьтолько  один, то loop-то Асселевский! Но ЩД по этому коду едет "вдаль" без остановок и moveTo ему не указ!

Acket
Offline
Зарегистрирован: 23.07.2019

Здравствуйте!

Нужна помощь - не получается заставить двигатель плавно вращаться на малых оборотах - идёт с вибрацией, явно ощутимы шаги и дребезг... используется ардуино нано nema 17 и драйвер 8825. Нужно, чтобы от самых низких оборотов было плавное вращение. В данном примере 50 об/сек

#include <AccelStepper.h>
#define dirPin 5
#define stepPin 2
#define motorInterfaceType 1
AccelStepper stepper = AccelStepper(motorInterfaceType, stepPin, dirPin);
void setup() {
  stepper.setMaxSpeed(2000);
}
void loop() {
  stepper.setSpeed(50);
  stepper.runSpeed();
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Acket пишет:

Нужно, чтобы от самых низких оборотов было плавное вращение.

Это Вы от шагового двигателя такое хотите?

Acket
Offline
Зарегистрирован: 23.07.2019

а что не так? он же может обеспечивать высокую точность позиционирования что такое для него 60 шагов в секунду? мне кажется что на станке при плавном перемещении ничего не вибрирует... (имею в виду простейший диодный лазерный гравёр)

sadman41
Offline
Зарегистрирован: 19.10.2016

Открываем примеры к AccelStepper, смотрим ConstantSpeed. Чем Ваш исходник отличается от стокового примера?

Acket
Offline
Зарегистрирован: 23.07.2019

Так я с него и брал. Единственное, я вставил управление оборотами с потенциометра, но для вопроса это не нужно и я их вырезал. В таком варианте так же работает. https://youtu.be/CYsS-hhsHAE видно как бутылка едет от вибрации и плохо, но заметно шаги движения. без камеры очень ощутимо

sadman41
Offline
Зарегистрирован: 19.10.2016

Стоковый пример работал нормально?

Acket
Offline
Зарегистрирован: 23.07.2019

нет так же

sadman41
Offline
Зарегистрирован: 19.10.2016

Значит микрошаг надо увеличивать.

Acket
Offline
Зарегистрирован: 23.07.2019

я думал, может команда какая есть для этого. я китайскую плату от лазера взял и хочу её использовать для демостолика вращающегося, именно поэтому потенциометр на скорость и установка скорости в петле запущена

Acket
Offline
Зарегистрирован: 23.07.2019

внешне выглядит, как будто серию шагов делает, а потом щелчок и ещё серию...

Acket
Offline
Зарегистрирован: 23.07.2019

в принципе под нагрузкой не так трясётся

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну, черт его знает. Плавность - это субъективная оценка. Зависит от многого.

На большом микрошаге двигатель с градусом 7.5 не очень себя хорошо вёл. На определённых скоростях движок может "войти в резонанс", их надо проскочить.

http://arduino.ru/forum/programmirovanie/peremeshchenie-karetki-na-stanke-shagovym-dvigatelem-proshu-konsultatsii - первый скетч.

В 11-й строке ставите 3мкс, а 13-й скорость регулируете. + Экспериментируете с микрошагом. 

Acket
Offline
Зарегистрирован: 23.07.2019

спасибо, попробую/ а микрошагом где экспериментировать? на плате все 3 ноги спаяны и на +5 сидят, если я правильно понял о чём речь

sadman41
Offline
Зарегистрирован: 19.10.2016

Откуда же мне знать, что за плата? Я не телепат.

Acket
Offline
Зарегистрирован: 23.07.2019

+ Экспериментируете с микрошагом - можно было проще послать я тоже не телепат :))

я спросил - где это меняется в скетче или перемычками... если перемычками, то у меня запаяно, если софтверно, то подскажите где

sadman41
Offline
Зарегистрирован: 19.10.2016

DRV8825 только перемычками.

Acket
Offline
Зарегистрирован: 23.07.2019

ясно, тогда на 32 стоит, по - максимуму

sadman41
Offline
Зарегистрирован: 19.10.2016

Тогда это говорит о том, что момент крайне слабый. Думаю, что вполне может дёргать неравномерно под нагрузкой. То, что было на видео - для 1/32 нехарактерно. Я думал, что на 1/2 шагает максимум.

На голом драйвере экспериментируйте. 

Acket
Offline
Зарегистрирован: 23.07.2019

проверил соединив просто с драйвером - так же работает... Ощущение, что где то задержка между циклами шагов и поэтому так работает... непонятно. Ладно, собрал столик, как то крутится и ладно