управление шаговыми двигателями

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем лемира, 1 май 2015.

  1. лемира

    лемира Нерд

    Здравствуйте. Делаю мини-ЧПУ и возник такой вопрос: пуска-старта-стопа двигателей. Мне нужно по времени инициализировать импульсы, как это сделать? допустим двигатель должен двигаться 5 секунд и останавливаться, или 15 секунд и останавливаться, за это время двигатель совершит эн круговых вращений вала, а с переходом на ЧПУ , соединяя вал с направляющими и осью, совершит маленькое продорльное перемещение. Как это закодить?
     
  2. vvr

    vvr Инженерище

    а какие двигатели
     
  3. лемира

    лемира Нерд

    Step motor 28BYJ-48 c драйвером ULN2003
     
  4. vvr

    vvr Инженерище

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

    лемира Нерд

    "
    " а как закодить нужное кол-во шагов? код не подскажите?
     
  6. Unixon

    Unixon Оракул Модератор

    Для управления STEP/DIR, как на TroykaStepper:
    Код (Text):

    #define PIN_DIR 2
    #define PIN_STEP 3

    void move(int dir, int steps)
    {
     digitalWrite(PIN_DIR, dir);
     for (int i=steps; i>0; i--)
     {
      digitalWrite(PIN_STEP, HIGH);
      digitalWrite(PIN_STEP, LOW);
     }
    }
     
     
  7. лемира

    лемира Нерд

    А что такое dir и step? Step как я понимаю - шаг, количество шагов, а dir что такое? где можно подробнее почитать об коде?
     
  8. Unixon

    Unixon Оракул Модератор

    dir = direction, направление вращения, может быть 0 или 1.
    Что за железка у вас управляет шаговыми двигателями? Схема драйвера есть?
     
  9. лемира

    лемира Нерд

    Step motor 28BYJ-48 c драйвером ULN2003
     
  10. лемира

    лемира Нерд

  11. Unixon

    Unixon Оракул Модератор

    Этому т.н. "драйверу" нужно вручную порядок переключения обмоток задавать.
     
  12. Unixon

    Unixon Оракул Модератор

  13. лемира

    лемира Нерд

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

    /* Дмитрий Осипов. http://www.youtube.com/user/d36073?feature=watch

    v.01 вправо влево Arduino Шаговый двигатель 28BYJ-48 – 5V Stepper Motor

    Так как этот маломощный шаговый двигатель питается 5V, я не использовал

    драйвер для шагового двигателя, а подключил его напрямую к Pins Arduino.

    1 тест) Подключаем шаговый двигатель к 4 Pins Arduino,

    покрутим "туда сюда обратно" (360 градусов).

    2 тест) Добавим кнопку, нажимаем на кнопку меняем направление вращения.

    3 тест) добавим переменный резистор, крутим резистор меняем скорость вращения.

    ----------------------------------------

    Скачать sketch.

    v.01 вправо влево Arduino Шаговый двигатель 28BYJ-48 – 5V Stepper Motor

    v.01 button resistor Arduino Шаговый двигатель 28BYJ-48 – 5V Stepper Motor

    */

    //-----------------

    // красный +5V не использовал.

    // declare variables for the motor pins

    int motorPin1 = 8; // Blue / Синий - 28BYJ48 pin 1

    int motorPin2 = 9; // Pink / Розовый - 28BYJ48 pin 2

    int motorPin3 = 10; // Yellow / Желтый - 28BYJ48 pin 3

    int motorPin4 = 11; // Orange / Оранжевый - 28BYJ48 pin 4

    // установить скорость шагового двигателя.

    //variable to set stepper speed.

    int motorSpeed = 1200;

    // Кол-во сделанных шагов.

    // count of steps made.

    int count = 0;

    // Необходимое количество шагов, для одного полного оборота, на (360 градусов).

    // number of steps per full revolution.

    int countsperrev = 512;

    int lookup[8] = {

    B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};

    //////////////////////////////////////////////////////////////////////////////

    void setup() {

    // declare the motor pins as outputs.

    pinMode(motorPin1, OUTPUT);

    pinMode(motorPin2, OUTPUT);

    pinMode(motorPin3, OUTPUT);

    pinMode(motorPin4, OUTPUT);

    // Serial.begin(9600);

    }

    void loop(){

    if(count < countsperrev )

    clockwise();

    else if (count == countsperrev * 2)

    count = 0;

    else

    anticlockwise();

    count++;

    }

    //set pins to ULN2003 high in sequence from 1 to 4

    //delay "motorSpeed" between each pin setting (to determine speed)

    // функция поворачивает мотор против часовой стрелки.

    void anticlockwise()

    {

    for(int i = 0; i < 8; i++)

    {

    setOutput(i);

    delayMicroseconds(motorSpeed);

    }

    }

    // функция поворачивает мотор по часовой стрелке.

    void clockwise()

    {

    for(int i = 7; i >= 0; i--)

    {

    setOutput(i);

    delayMicroseconds(motorSpeed);

    }

    }

    void setOutput(int out)

    {

    digitalWrite(motorPin1, bitRead(lookup[out], 0));

    digitalWrite(motorPin2, bitRead(lookup[out], 1));

    digitalWrite(motorPin3, bitRead(lookup[out], 2));

    digitalWrite(motorPin4, bitRead(lookup[out], 3));

    }


    ВОПРОС. Всё работает, но поворот осуществляет на 360 градусов налево и на 360 градусов направо. Как остановить выполнение программы по выполнению поворота на 360 градусов.
     
  14. Unixon

    Unixon Оракул Модератор

    Код (Text):

    bool done = false;

    void loop()
    {
     if (!done)
     {
      //turn left
      //turn right
      done = true;
     }
    }
     
     
  15. лемира

    лемира Нерд

    спасибо, сейчас попробую
     
  16. лемира

    лемира Нерд

    не, что-то не получается. if done= false, а он вначале фэлс и заходит в цикл, ставлю дан = труе и он не выходит из ифа. не, вообще моторы теперь не крутятся
     
    Последнее редактирование: 6 май 2015
  17. лемира

    лемира Нерд

    куда вставить done = true? Всё работает спасибо
     
    Последнее редактирование: 6 май 2015
  18. Unixon

    Unixon Оракул Модератор

    И не должен выходить. Вы просто ставите флаг, что в следующий раз в этот if{} не заходить.

    В конец if{}, когда все выполнилось. А можно и в начало даже, если там промежуточный выход где-то есть.
     
  19. лемира

    лемира Нерд

    bool done=false;
    void loop() if (!done) {
    {

    if(count < countsperrev )

    clockwise();

    else if (count == countsperrev * 2)

    count = 0;

    else
    {
    anticlockwise();
    done=true;
    count++;
    }
    }
    } Если делаю так, то он крутит против часовой и останавливается? а почему-то не крутится по часовой


    А если делаю так:

    bool done=false;
    void loop() if (!done)
    {
    {

    if(count < countsperrev )

    clockwise();

    else if (count == countsperrev * 2)

    count = 0;

    else

    anticlockwise();
    count++;

    }
    done=true;
    } то не крутится вообще!
     
  20. Unixon

    Unixon Оракул Модератор

    Вы слишком рано останавливаете выполнение.
    Проверяйте count перед установкой флага.