Управление шаговым двигателем.

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем Ridikxx, 30 июл 2016.

  1. Ridikxx

    Ridikxx Нуб

    Нужна помощь . Я в этом пока еще не силен. Загружал готовые примеры из библиотеки AcceStepper, Но дальше тупик. Я изменял там скорость вращения, крутил то в одну то в другую сторону. Но что делать дальше?!
    Вот кстати комплектующие:
    Шаговый двигатель - 17HS8401;
    Адуино - Mega 2560;
    Драйвер ШД - DVR8825
    Задача такая:
    - Надо чтобы ШД двигался определенное количество шагов с заданной скоростью, после чего замедлился до нужной скорости, дошел до заданной отметки и вернулся в исходное положение. Ту же самую операцию должен проделать второй шаговый двигатель, но в обратном направлении и так поочередно.Вроде не много требую...но для меня и это сложно.
     
    Последнее редактирование: 6 авг 2016
  2. Ridikxx

    Ridikxx Нуб

    #include <AccelStepper.h>

    // Define a stepper and the pins it will use
    AccelStepper stepper; // Defaults to AccelStepper::FULL4WIRE (4 pins) on 2, 3, 4, 5

    void setup()
    {
    }

    void loop()
    {
    if (stepper.distanceToGo() == 0)
    {
    // Random change to speed, position and acceleration
    // Make sure we dont get 0 speed or accelerations
    delay(1000);
    stepper.moveTo(rand() % 200);
    stepper.setMaxSpeed((rand() % 200) + 1);
    stepper.setAcceleration((rand() % 200) + 1);
    }
    stepper.run();
     
  3. Ridikxx

    Ridikxx Нуб

    мне кажется вот с этим примером надо по работать.
     
  4. Ridikxx

    Ridikxx Нуб

    Это готовый пример с библиотеки. Но у меня только два пина выходят с ардуино на драйвер, а потом на двигатель. А здесь сразу на двигатель?
     
  5. CryNET

    CryNET Гик

    Гугл навел на готовую библиотеку с GitHub, там же есть readme и примеры:
    https://github.com/laurb9/StepperDriver

    Так же Datasheet на драйвер:
    https://www.pololu.com/file/0J590/drv8825.pdf
    Тут же схема подключения есть, и описание как с ним работать, но по идее библиотека выше это умеет.

    Тут тоже похожая тема:
    http://arduino.ru/forum/apparatnye-voprosy/problemy-v-svyazke-arduino-nano-drv8825-shagovik
     
    Последнее редактирование: 31 июл 2016
  6. Ridikxx

    Ridikxx Нуб

    Спасибо. Буду пробовать.
     
  7. TotCambIKoka

    TotCambIKoka Нерд

    На драйвера два пина: шаг (step) и направление (dir) достаточно переделать блинк, добавив туда цикл который отправит нужное количество шагов за определенное время
    Код (C++):

    /*Двигаем шаговый двигатель через драйвер с шаг\направление (STEP\DIR)
       Специально для Амперка ру, by TotCambIKoka
    */

    #define PIN_STEP 4
    #define PIN_DIR 5
    void setup() {
      Serial.begin(9600); // мне лень доставать шаовик, так тчо я проверяю свой код так
      pinMode(PIN_STEP, OUTPUT);
      pinMode(PIN_DIR, OUTPUT);

      unsigned long int  count_step;// счетчик шагов
      byte dir;// направление 1 - по часовой. 0 - против
      int first_speed = 1000; // будем посылать в задержку (delay) в милисикундах
      int second_speed = 200;

      for ( count_step = 0, dir = 0 ; count_step <= 10; count_step++) // крутим 10 шагов
      {
        Serial.print ("count_step = "); Serial.println (count_step); // проверяем
        Serial.print ("dir = "); Serial.println (dir);

        if ( count_step < 5)
          delay (second_speed);// быстро крутим
        else if ( count_step >= 5 ) // если прошли 5 шагов
        {
          dir = 1; // меняем направление
          delay (first_speed); // медленно крутим ( в 5 раз медленнее)
        }
      }
    }

    void loop() {
    }
     
  8. Ridikxx

    Ridikxx Нуб

    Попробовал загрузить ваш скетч - шаговик стоит.
     
  9. TotCambIKoka

    TotCambIKoka Нерд

    :confused: очень странно, проверте правильность подключения, и ни вкоем случае не извлекайте драйвер шагового двигателя при поданом на него питании.
    Пошел доставать шаговик
     
  10. Ridikxx

    Ridikxx Нуб

    другие скетчи если загружать, то они работают при таком же подключении.
     
  11. ostrov

    ostrov Гуру

    Можно вручную прописать работу катушек. Разобраться только как они работают и крутить в любые стороны и несколькими способами. Подкинуть код?
     
  12. Ridikxx

    Ridikxx Нуб

    было бы неплохо.
     
  13. ostrov

    ostrov Гуру

    Я уже тут публиковал. Вот пример для конкретного шаговика без привязки к конкретному МК:
    Код (C++):
    // Управление Моторедуктором распределения воздушного потока 2170-8127100
    // (или другим двухфазным биполярным шаговым двигателем)
    // обязтелен драйвер ШД!

    #define A    8    //пины для управления обмотками (А-крайний левый контакт)
    #define B    9
    #define C    10
    #define D    11

    #define BUTTON_R  6 // кнопка вперед
    #define BUTTON_L  7 // кнопка назад

    // задержка между шагами, для моторедуктора 2170 максимум это примерно 4мс (скорость штока 10 мм/сек)
    // для замедления - увеличить, ускорять не рекомендуется
    int delStep = 4;
    byte counter = 0;
    unsigned long timerBut;

    void setup()
    {
      pinMode(A, OUTPUT);
      pinMode(B, OUTPUT);
      pinMode(C, OUTPUT);
      pinMode(D, OUTPUT);
      pinMode(BUTTON_R, INPUT_PULLUP);
      pinMode(BUTTON_L, INPUT_PULLUP);
      for (int i = 0; i < 41; i++) rotateR();
      counter = 0;
      Serial.begin(9600);
    }

    void loop()
    {
      if (!digitalRead(BUTTON_R)) {
        delay(10);
        if (!digitalRead(BUTTON_R)) {
          if (counter < 40) {
            rotateL();
            stopStep();
            counter++;
            Serial.println(counter);
            timerBut = millis() + 1000;
            while (!digitalRead(BUTTON_R) and (timerBut > millis()));
            if (timerBut <= millis()) {
              for (counter; counter < 41; counter++) rotateL();
              }
          }
        }
      }
      if (!digitalRead(BUTTON_L)) {
        delay(10);
        if (!digitalRead(BUTTON_L)) {
          if (counter > 0) {
            rotateR();
            stopStep();
            counter--;
            Serial.println(counter);
            timerBut = millis() + 1000;
            while (!digitalRead(BUTTON_L) and (timerBut > millis()));
            if (timerBut <= millis()) {
              for (counter; counter > 0; counter--) rotateR();
              }
          }
        }
      }
    }


    // +++++ ОСНОВНЫЕ ФУНКЦИИ +++++

    void stopStep() { // выключение двигателя
      Step(0, 0, 0, 0);
    }

    void rotateR() // 24 шага по часовой стрелке = 1 оборот оси = 1 мм движения штока вниз
    {
      for (byte i = 0; i < 6; i++) { // один такой блок сдвигает шток на 1/6 мм
        Step(1, 0, 1, 0);            // один такой шаг сдвигает шток на 1/24 мм
        Step(0, 1, 1, 0);
        Step(0, 1, 0, 1);
        Step(1, 0, 0, 1);
      }
    }

    void rotateL() // 24 шага против часовой стрелки = 1 оборота оси = 1 мм движения штока вверх
    {
      for (byte i = 0; i < 6; i++) { // один такой блок сдвигает шток на 1/6 мм
        Step(1, 0, 0, 1);            // один такой шаг сдвигает шток на 1/24 мм
        Step(0, 1, 0, 1);
        Step(0, 1, 1, 0);
        Step(1, 0, 1, 0);
      }
    }

    void Step(boolean a, boolean b, boolean c, boolean d) // один шаг
    {
      digitalWrite(A, a);
      digitalWrite(B, b);
      digitalWrite(C, c);
      digitalWrite(D, d);
      delay(delStep);
    }


    // +++++++ ЗКЗОТИКА ++++++

    void rotateRH() // 48 шагов с полушагами по часовой стрелке = 1 оборота оси = 1 мм движения штока вверх
    {
      for (byte i = 0; i < 6; i++) { // один такой блок сдвигает шток на 1/6 мм
        StepH(1, 0, 1, 0);           // один такой шаг сдвигает шток на 1/48 мм
        StepH(0, 0, 1, 0);
        StepH(0, 1, 1, 0);
        StepH(0, 1, 0, 0);
        StepH(0, 1, 0, 1);
        StepH(0, 0, 0, 1);
        StepH(1, 0, 0, 1);
        StepH(1, 0, 0, 0);
      }
    }

    void rotateLH() // 48 шагов с полушагами по часовой стрелке = 1 оборота оси = 1 мм движения штока вверх
    {
      for (byte i = 0; i < 6; i++) { // один такой блок сдвигает шток на 1/6 мм
        StepH(1, 0, 0, 1);           // один такой шаг сдвигает шток на 1/48 мм
        StepH(0, 0, 0, 1);
        StepH(0, 1, 0, 1);
        StepH(0, 1, 0, 0);
        StepH(0, 1, 1, 0);
        StepH(0, 0, 1, 0);
        StepH(1, 0, 1, 0);
        StepH(1, 0, 0, 0);
      }
    }

    void StepH(boolean a, boolean b, boolean c, boolean d) // один шаг
    {
      digitalWrite(A, a);
      digitalWrite(B, b);
      digitalWrite(C, c);
      digitalWrite(D, d);
      delay(delStep / 2);
    }
     
    Последнее редактирование: 8 авг 2016
  14. Ridikxx

    Ridikxx Нуб

    Я так понял, тут кнопки управления еще появились(вперед и назад).
     
  15. Ridikxx

    Ridikxx Нуб

    Ребята, ну помогите со скетчем. Я столько времени трачу на поиски нужной мне информации, но толку мало. Для вас это минут 20-30 займет. А для меня уже недели. И еще не известно сколько понадобится. Мне проект нужно воплотить в ближайшее время.Если есть добрые люди на форуме-помогите. С меня "магарыч". Все таки и ваше время жалко. Пока тема открыта открыта, значит помощь еще нужна.
     
  16. ostrov

    ostrov Гуру

    Это готовый рабочий код, можно его взять и легко переделать под свои нужды. Внизу базовые функции управления двигателем. Что сложного?
     
    DIYMan нравится это.
  17. Ridikxx

    Ridikxx Нуб

    Я извиняюсь заранее за глупые вопросы. В этой программе не нужен получается драйвер? На кой тогда драйвер? И как избавиться от управления кнопками в этом скетче?
     
  18. ostrov

    ostrov Гуру

    Драйвер нужен хотя бы потому, что Ардуино не выдает на ножках достаточную мощность. Что до кнопок, то я писал код под свою задачу потому они там есть, но убрать что то всегда легче чем добавить. Если вы этого сами не сможете, то вам сюда, желающие помочь найдутся сразу же.
     
  19. CryNET

    CryNET Гик

    Код (C++):
    void loop()
    {
      if (!digitalRead(BUTTON_R)) { //Если кнопка нажата
        delay(10); //Защита от "дребезка" кнопки
        if (!digitalRead(BUTTON_R)) { //Если это не ложное срабатывание и кнопка реально нажата
          if (counter < 40) { //Тут уже управление самим мотором
            rotateL();
            stopStep();
            counter++;
            Serial.println(counter);
            timerBut = millis() + 1000;
            while (!digitalRead(BUTTON_R) and (timerBut > millis())); //Пока кнопка удерживается
            if (timerBut <= millis()) {
              for (counter; counter < 41; counter++) rotateL(); //поворачиваем мотор...
              }
          }
        }
      }
      if (!digitalRead(BUTTON_L)) {
        delay(10);
        if (!digitalRead(BUTTON_L)) {
          if (counter > 0) {
            rotateR();
            stopStep();
            counter--;
            Serial.println(counter);
            timerBut = millis() + 1000;
            while (!digitalRead(BUTTON_L) and (timerBut > millis()));
            if (timerBut <= millis()) {
              for (counter; counter > 0; counter--) rotateR();
              }
          }
        }
      }
    }
    По сути тут вроде всё ясно, если же вам кнопки не нужны, то пользуйтесь "управляющими" функциями, которые вам подписали ниже цикла "void loop()":

    Код (C++):
    // +++++ ОСНОВНЫЕ ФУНКЦИИ +++++

    void stopStep() { // выключение двигателя
      Step(0, 0, 0, 0);
    }

    void rotateR() // 24 шага по часовой стрелке = 1 оборот оси = 1 мм движения штока вниз
    {
      for (byte i = 0; i < 6; i++) { // один такой блок сдвигает шток на 1/6 мм
        Step(1, 0, 1, 0);            // один такой шаг сдвигает шток на 1/24 мм
        Step(0, 1, 1, 0);
        Step(0, 1, 0, 1);
        Step(1, 0, 0, 1);
      }
    }

    void rotateL() // 24 шага по часовой стрелке = 1 оборота оси = 1 мм движения штока вверх
    {
      for (byte i = 0; i < 6; i++) { // один такой блок сдвигает шток на 1/6 мм
        Step(1, 0, 0, 1);            // один такой шаг сдвигает шток на 1/24 мм
        Step(0, 1, 0, 1);
        Step(0, 1, 1, 0);
        Step(1, 0, 1, 0);
      }
    }

    void Step(boolean a, boolean b, boolean c, boolean d) // один шаг
    {
      digitalWrite(A, a);
      digitalWrite(B, b);
      digitalWrite(C, c);
      digitalWrite(D, d);
      delay(delStep);
    }


    // +++++++ ЗКЗОТИКА ++++++

    void rotateRH() // 48 шагов с полушагами по часовой стрелке = 1 оборота оси = 1 мм движения штока вверх
    {
      for (byte i = 0; i < 6; i++) { // один такой блок сдвигает шток на 1/6 мм
        StepH(1, 0, 1, 0);           // один такой шаг сдвигает шток на 1/48 мм
        StepH(0, 0, 1, 0);
        StepH(0, 1, 1, 0);
        StepH(0, 1, 0, 0);
        StepH(0, 1, 0, 1);
        StepH(0, 0, 0, 1);
        StepH(1, 0, 0, 1);
        StepH(1, 0, 0, 0);
      }
    }

    void rotateLH() // 48 шагов с полушагами по часовой стрелке = 1 оборота оси = 1 мм движения штока вверх
    {
      for (byte i = 0; i < 6; i++) { // один такой блок сдвигает шток на 1/6 мм
        StepH(1, 0, 0, 1);           // один такой шаг сдвигает шток на 1/48 мм
        StepH(0, 0, 0, 1);
        StepH(0, 1, 0, 1);
        StepH(0, 1, 0, 0);
        StepH(0, 1, 1, 0);
        StepH(0, 0, 1, 0);
        StepH(1, 0, 1, 0);
        StepH(1, 0, 0, 0);
      }
    }

    void StepH(boolean a, boolean b, boolean c, boolean d) // один шаг
    {
      digitalWrite(A, a);
      digitalWrite(B, b);
      digitalWrite(C, c);
      digitalWrite(D, d);
      delay(delStep / 2);
    }
    Вставляйте rotateR(), rotateL() и stopStep() куда вам нужно в код...
     
  20.