Управление шаговым двигателем с помощью Arduino

Ridikxx
Offline
Зарегистрирован: 05.05.2016

Нужна помощь добрых людей. Я в этом пока еще не силен. Загружал готовые примеры из библиотеки AcceStepper, Но дальше тупик. Я изменял там скорость вращения, крутил то в одну то в другую сторону. Но что делать дальше?!

Вот кстати комплектующие:

Шаговый двигатель - 17HS8401;

Адуино - Mega 2560;

Драйвер ШД - DVR8825

Задача такая:

- Надо чтобы ШД двигался определенное количество шагов с заданной скоростью, после чего замедлился до нужной скорости, дошел до заданной отметки и вернулся в исходное положение. И так циклично. Вроде не много требую...но для меня и это сложно. У вас, профи, займет это не более 20 минут. А у меня недели или месяцы изучения этого вопроса. Очень надеюсь на вашу помощь.

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Я правильно понял - вы подключили мотор и примеры из библиотеки нормально работают, вопрос только в алгоритме?

Использование этой библиотеки - это обязательное требование?

P.S. Вам какой-то профи сказал по секрету, что это займет не более 20 минут?

Ridikxx
Offline
Зарегистрирован: 05.05.2016

По мне так....лишь бы работало после заливки скетча в ардуино.

А по поводу того, что это не займет много времени у понимающих людей, мне дали понять на другом форуме. Мне советовали взять скетч готовый(со своими параметрами) и переделать его под себя. Но для меня это....как попросить родителей установить винду. Был вариант предложен управлять непосредственно обмотками двигателя.

Ridikxx
Offline
Зарегистрирован: 05.05.2016

// Управление Моторедуктором распределения воздушного потока 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(0000);

}



void rotateR() // 24 шага по часовой стрелке = 1 оборот оси = 1 мм движения штока вниз

{

  for (byte i = 0; i < 6; i++) { // один такой блок сдвигает шток на 1/6 мм

    Step(1010);            // один такой шаг сдвигает шток на 1/24 мм

    Step(0110);

    Step(0101);

    Step(1001);

  }

}



void rotateL() // 24 шага по часовой стрелке = 1 оборота оси = 1 мм движения штока вверх

{

  for (byte i = 0; i < 6; i++) { // один такой блок сдвигает шток на 1/6 мм

    Step(1001);            // один такой шаг сдвигает шток на 1/24 мм

    Step(0101);

    Step(0110);

    Step(1010);

  }

}



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(1010);           // один такой шаг сдвигает шток на 1/48 мм

    StepH(0010);

    StepH(0110);

    StepH(0100);

    StepH(0101);

    StepH(0001);

    StepH(1001);

    StepH(1000);

  }

}



void rotateLH() // 48 шагов с полушагами по часовой стрелке = 1 оборота оси = 1 мм движения штока вверх

{

  for (byte i = 0; i < 6; i++) { // один такой блок сдвигает шток на 1/6 мм

    StepH(1001);           // один такой шаг сдвигает шток на 1/48 мм

    StepH(0001);

    StepH(0101);

    StepH(0100);

    StepH(0110);

    StepH(0010);

    StepH(1010);

    StepH(1000);

  }

}



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);

}

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Управление обмотками и ваш драйвер DVR8825 - это как бы взаимоисключающие параграфы.

На этом форуме полно готовых решений или рекомендаций (в том числе и моих) по управленрию ШД с помощью подобных драйверов - можете их взять за основу и внести нужные изменения. Если хотите, чтобы вам дали готовое решение - предложите вознаграждение - от желающих помочь отбоя не будет.

 

 

P.S. На каком именно форуме вам дали такой совет? Почему, если не секрет, вы не попросили о помощи там?

Onkel
Offline
Зарегистрирован: 22.02.2016

Gippopotam пишет:

Управление обмотками и ваш драйвер DVR8825 - это как бы взаимоисключающие параграфы.

Ну не совсем, drv8825 тоже управляет обмотками, только это драйвер (если так можно сказать) более высокого уровня, или просто драйвер, а то даже повторители на дарлингтонах тоже (причем обычно, даже наиболее часто) называют "драйверами", не говоря уже о чипах Н-мостов и плат на этих чипах.

2 ТС

Вам нужно или код менять, или драйвер .

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

p.masyukov@gmail.com -- обсудим.. 

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Onkel пишет:

Ну не совсем, drv8825 тоже управляет обмотками, только это драйвер (если так можно сказать) более высокого уровня, или просто драйвер, а то даже повторители на дарлингтонах тоже (причем обычно, даже наиболее часто) называют "драйверами", не говоря уже о чипах Н-мостов и плат на этих чипах.

Это вы сейчас с кем разговаривали?