Библиотека Accelstepper, шаговые двигателя

Тема в разделе "Arduino & Shields", создана пользователем Azret, 21 май 2017.

  1. Azret

    Azret Нуб

    Здравствуйте! Столкнулся с такой проблемой (см скетч), у меня не одновременно останавливаются двигателя. Двигателя вращают 2 вала, одинакового шага (2мм), но задача состоит в том, чтобы за один оборот одного двигателя, второй проходил 0,2 мм. Оба двигателя вращают правильное количество оборотов. Но один на доли секунд вращает дольше, и с увеличением числа оборотов эти секунды растут. Мне кажется это из-за функции ускорения. Вопрос: Можно ли в этой библотеке задать так, чтобы двигателя начали свое вращение без ускорения? ,

    #include <AccelStepper.h>
    AccelStepper Stepper1(4, 8, 9, 10, 11); //использует пин 12 и 13 для dir и step, 1 - режим "external driver" (A4988)
    AccelStepper Stepper2(4, 2, 3, 4, 5);
    int KNOPKA1 = 7; // пин кнопки положительное вращение
    int KNOPKA2 = 6; // пин кнопки отрицательное
    long steeps1 = 96000; // количество шагов на 60 оборотов вала
    long steeps2 = 9600; // количество шагов на 6 оборотов вала
    long KNO1 = 0; // Исходное значение для таймера.
    long KNO2 = 200; // 200 милисекунд предотвращения повторного нажатия
    long dir = 1; //используется для смены направления

    void setup() {

    Stepper1.setMaxSpeed(5000); //устанавливаем максимальную скорость вращения ротора двигателя (шагов/секунду)
    Stepper1.setAcceleration(3000); //устанавливаем ускорение (шагов/секунду^2)
    pinMode(KNOPKA1, INPUT_PULLUP); // включаем внутренний подтягивающий резистор
    pinMode(KNOPKA2, INPUT_PULLUP); // включаем внутренний подтягивающий резистор
    Stepper2.setMaxSpeed(500);
    Stepper2.setAcceleration(300);

    //Stepper1.setSpeed(3000);
    //Stepper2.setSpeed(300);

    }

    void loop()
    {
    unsigned long r = millis();

    if(digitalRead(KNOPKA2) == 1)

    {
    if(r - KNO1 > KNO2)
    {
    Stepper2.move(steeps2);
    Stepper1.move(steeps1);

    steeps2 = steeps2*1;
    steeps1 = steeps1*1;
    KNO1 = r;

    }
    }
    Stepper1.run();
    Stepper2.run();



    if(digitalRead(KNOPKA1) == 1)
    {
    if(r - KNO1 > KNO2)
    {
    Stepper2.move(-steeps2);
    Stepper1.move(steeps1);
    steeps2 = steeps2*1;
    steeps1 = steeps1*1;

    KNO1 = r;

    }
    }
    Stepper1.run();
    Stepper2.run();



    }
     
  2. vvr

    vvr Инженерище

    посмотрите пример с постоянной скоростью
     
  3. Azret

    Azret Нуб

    Если можно подскажите пожалуйста, где посмотреть или вы имеете ввиду, посмотреть по форуму?

    Просто при отключения строк задающих максимальную скорость и ускорение, останется строга управления скорости, но этот оператор не может заставить вращаться двигатель должным образом. Двигатель начинает вращаться, только очень медленно, с постепенным ускорение которое тоже очень медленно.
     
  4. vvr

    vvr Инженерище

    примеры - AccelStepeer - examples - ConstantSpeed
    там нет ускорения - замедления

    а вообще правильно делать на одном моторе
    два НИКОГДА не будут одинаково работать
     
    arkadyf нравится это.
  5. qwone

    qwone Гик

    Или рисовать свою библиотеку на спареные ШД , но при плохом драйвере или питании возможно проскальзование.
     
    arkadyf нравится это.
  6. Azret

    Azret Нуб

    Где эти примеры?
     
  7. Azret

    Azret Нуб

    а почему вы считаете что 2 двигателя не возможно с этой библиотеки заставить работать?
     

    Вложения:

  8. qwone

    qwone Гик

    Похоже у вас наверное маразм или склероз. Работать они будут, а вот синхроно нет . Вы сами про это писали, или уже забыли. Так включите свою шарманку и посмотрите.
    Или это не вы написали??
     
  9. Azret

    Azret Нуб

    а Вы че такие нервные??? )))))
     
  10. lex.susanin

    lex.susanin Нуб

    Кхм, не хочу показаться человеком желающим придти на всё готовенькое, но блин, та же проблема.
    Для corexy дёрнуло самому прошивку написать. Как всегда подумал - да чего там сложного. Теперь мучаюсь.

    В общем чтобы например направить каретку по траектории скажем 30 градусов, нужна как раз такая синхронизация. И вроде как мне кажется я её логично вычисляю, но что-то не так. И начинаю сомневаться что дело в разгоне. Я поставил его на 10000 сразу. То есть его вклад минимален. Дело походу в скорости, потому как с увеличением расстояния разница растёт, а фактор ускорения действует только на старте и финише.

    расстояние а - 3000 шагов, расстояние б - 1000 шагов
    логичная скорость для а - 1600 шагов в секунду, для б - 533, а реальная для б - 333

    Ума не приложу что с этим делать. Вы случайно не смогли найти решение?