Библиотека AccelStepper

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем aleksanya, 10 ноя 2017.

  1. aleksanya

    aleksanya Нуб

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

    #include<AccelStepper.h>

    #define HALFSTEP 8

    // Определение пинов для управления двигателем
    #define motorPin1 2 // IN1 на 1-м драйвере ULN2003
    #define motorPin2 3 // IN2 на 1-м драйвере ULN2003
    #define motorPin3 4 // IN3 на 1-м драйвере ULN2003
    #define motorPin4 5 // IN4 на 1-м драйвере ULN2003

    // Инициализируемся с последовательностью выводов IN1-IN3-IN2-IN4
    // для использования AccelStepper с 28BYJ-48
    AccelStepper stepper1(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4);

    void setup(){
    pinMode(13, OUTPUT);
    stepper1.setMaxSpeed(800.0);
    stepper1.setAcceleration(100.0);
    stepper1.setSpeed(100);
    stepper1.moveTo(30);
    }

    void loop(){
    // Изменяем направление, если шаговик концевика
    if(digitalRead(13)==HIGH)
    {
    stepper1.moveTo(digitalRead(0)==HIGH);
    stepper1.run();
    }
    stepper1.run();
    }
    Это мои соображения, но они не работают.
    Помогите, пожалуйста.
     
  2. ostrov

    ostrov Гуру

    Во-первых, код отфарматируйте автоматически и вставьте в соответствующий тег (слева от кавычек).
    Во-вторых, код содержит кучу ошибок и нестыковок. Например, как эти строки должны работать в паре?
    Код (C++):
    pinMode(13, OUTPUT);
    ....
    if(digitalRead(13)==HIGH)
    В-третьих, что вы хотели добиться этой строкой?
    Код (C++):
    stepper1.moveTo(digitalRead(0)==HIGH);
    Ну и так далее. Даже если считать, что библиотека работоспособная.

    А для начала попробуйте хотя бы задачу поставить вменяемую. Что должен делать шаговик, шагать 30 шагов или шагать пока не сработает концевик? И когда решите, тогда и попробуйте еще раз написать программу.
     
  3. aleksanya

    aleksanya Нуб

    Код (C++):
    #include<AccelStepper.h>

    #define HALFSTEP 8

    // Определение пинов для управления двигателем
    #define motorPin1 2 // IN1 на 1-м драйвере ULN2003
    #define motorPin2 3 // IN2 на 1-м драйвере ULN2003
    #define motorPin3 4 // IN3 на 1-м драйвере ULN2003
    #define motorPin4 5 // IN4 на 1-м драйвере ULN2003

    // Инициализируемся с последовательностью выводов IN1-IN3-IN2-IN4
    // для использования AccelStepper с 28BYJ-48
    AccelStepper stepper1(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4);

    void setup(){
    pinMode(13, OUTPUT);
    stepper1.setMaxSpeed(800.0);
    stepper1.setAcceleration(100.0);
    stepper1.setSpeed(100);
    stepper1.moveTo(30);
    }

    void loop(){
    // Изменяем направление, если шаговик концевика
    if(digitalRead(13)==HIGH)
    {
    stepper1.moveTo(digitalRead(0)==HIGH);
    stepper1.run();
    }
    stepper1.run();
    }
    Шаговик должен пройти 30 шагов, остановиться, дальше опять пройти 30 шагов и так пока не дойдет до концевика, затем вернуться в исходную точку и все повторяется.
     
  4. Tomasina

    Tomasina Сушитель лампочек Модератор

    Исходная точка - это достижение координаты 0 или срабатывание второго концевика и обнуление координаты?
     
  5. aleksanya

    aleksanya Нуб

    Исходная точка - это координата, из которой начато движение, там же стоит второй концевик.
     
  6. aleksanya

    aleksanya Нуб

    Код (C++):
    #include<AccelStepper.h>

    #define HALFSTEP 8

    // Определение пинов для управления двигателем
    #define motorPin1 2 // IN1 на 1-м драйвере ULN2003
    #define motorPin2 3 // IN2 на 1-м драйвере ULN2003
    #define motorPin3 4 // IN3 на 1-м драйвере ULN2003
    #define motorPin4 5 // IN4 на 1-м драйвере ULN2003


    AccelStepper stepper1(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4);

    void setup(){
    pinMode(13, OUTPUT);
    stepper1.setMaxSpeed(800.0);
    stepper1.setAcceleration(100.0);
    stepper1.setSpeed(100);
    }

    void loop(){
    int val=0;
    val=val+30;
    stepper.runToNewPosition(val);
    delay(500);
    stepper1.moveTo(digitalRead(0)==HIGH);
    }
    Вот еще одна моя попытка, но она тоже не работает.
     
  7. Tomasina

    Tomasina Сушитель лампочек Модератор

    Вы не ответили на мой вопрос.
     
  8. aleksanya

    aleksanya Нуб

    В точке, откуда было начато движение стоит второй концевик, к которому система возращается после срабатывания первого - это исходная точка.
     
  9. rkit

    rkit Гуру

    Нормально работают.
     
  10. ostrov

    ostrov Гуру

    Как и главное зачем?
     
  11. rkit

    rkit Гуру

    Считывают уровень на пине. Чтобы знать.
     
  12. ostrov

    ostrov Гуру

    Даю 146% что в данном случае имелось ввиду не это. Чувак просто хочет считать состояние концевика, но не умеет этого сделать.
     
  13. rkit

    rkit Гуру

    Ну это да.
     
  14. ostrov

    ostrov Гуру

    Автору даю совет. Шаговик делает шаг (два, три и тп), проверяет состояние пина. Если он нажат меняем направление и крутим так же до другого концевика. В общем, меняется только направление движения и опрашиваемый концевик.
     
  15. aleksanya

    aleksanya Нуб

    Код (C++):
    #include<AccelStepper.h>

    #define HALFSTEP 8

    // Определение пинов для управления двигателем
    #define motorPin1  2 // IN1 на 1-м драйвере ULN2003
    #define motorPin2  3 // IN2 на 1-м драйвере ULN2003
    #define motorPin3  4 // IN3 на 1-м драйвере ULN2003
    #define motorPin4  5 // IN4 на 1-м драйвере ULN2003

    // Инициализируемся с последовательностью выводов IN1-IN3-IN2-IN4
    // для использования AccelStepper с 28BYJ-48
    AccelStepper stepper(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4);
    int btnPin = 13;
    int step=0;
    void setup() {
      pinMode(btnPin, INPUT);
      stepper.moveTo(30);

     
      stepper.setMaxSpeed(800.0);
      stepper.setAcceleration(100.0);
      stepper.setSpeed(100);
    }

    void loop() {

      if (digitalRead(btnPin))
      {
        stepper.moveTo(-stepper.currentPosition());
     
      }
      else
      {
        if (stepper.distanceToGo() == 0) {stepper.moveTo(stepper.currentPosition() - 1);}
        delay(800);  //
          stepper.run();
      }
    }
     
    Вот еще одна попытка, но не работает вообще. Помогите, пожалуйста.
     
  16. aleksanya

    aleksanya Нуб

    Как сделать, чтобы он в одну сторону вращался по 30 шагов много раз? Он у меня один раз прокручивается и все.
     
  17. aleksanya

    aleksanya Нуб

    Код (C++):
     while (digitalRead(inPin1)==LOW) { // Make the Stepper move CW until the switch is deactivated
        Stepper1.moveTo(val);
        Stepper1.run();
        val=val+30;
        delay(5);
      }
    Насколько я помню, если в цикл while поместить переменную, постоянно увеличивающуюся, то он постоянно должен двигаться в одну сторону. Но почему-то это не работает.