как подключить шд к ардуино уно через мотор шилд

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем qwenya77, 9 ноя 2013.

  1. nailxx

    nailxx Официальный Нерд Администратор



    Код (C++):

    #include <Stepper.h>

    Stepper motor = Stepper(200, 4, 6, 5, 7);

    void setup()
    {
        motor.setSpeed(50);
    }

    void loop()
    {
        motor.step(100);
        delay(1000);
    }
     
     
    vitaly и qwenya77 нравится это.
  2. Renat

    Renat Нерд

    Вообще я понял что мотор шилд всетаки нужен для управления обычными коллекторными моторами, и только в крайнем случае для шаговых движков. Лучше возьму драйвер для шагового двигателя на базе микросхемы A4988. Народ на забугорных форумах пишет что очень хорошо работает, да к тому же поддерживает микростепинг и исключает характерное гудение при маленьких обородах за счет разбиения шага до 16 маааленьких шажочков)).
     
  3. qwenya77

    qwenya77 Нерд

    Огромное спасибо!!!
    работает!!!!!
     
  4. nailxx

    nailxx Официальный Нерд Администратор

    Спецовые микросхемы в общем случае лучше справляются со своей задачей. Но конкретно в случае с Motor Shield микростеппинг также на раз реализуется средствами МК.
     
  5. Renat

    Renat Нерд

    А попробуйте с мотором как в моем случае
    Шаговый двигатель 36HT20-0504MA
    [​IMG]
    Просто я сколько не мучался с этой библитекой у меня так и не получилось его завести
     
  6. Renat

    Renat Нерд

    В отличие от спецовой микросхемы Motor Shield в два раза больше драгоценных управляющих ножек у ардуины забирает.
     
  7. nailxx

    nailxx Официальный Нерд Администратор

    Не вопрос:

    Код (C++):

    #include <Stepper.h>

    Stepper motor = Stepper(400, 4, 6, 5, 7);

    void setup()
    {
        motor.setSpeed(20);
    }

    void loop()
    {
        motor.step(200);
        delay(1000);
    }
     



    Аргумент про драгоценные ножки — аргумент :)
     
  8. qwenya77

    qwenya77 Нерд

    как бы реверс ему задать?
     
  9. qwenya77

    qwenya77 Нерд

    а реверс как сделать?
     
  10. Renat

    Renat Нерд

    Шайтанама. А если подключить как было у меня? К М1 зеленый к минусу черный к плюсу, к М2 синий к минусу красный к плюсу на шилде.
     
  11. Dmitriy Kunin

    Dmitriy Kunin Гик

    Мой вопрос был не праздный, про мощу и температуру, A4988 я парочку спалил, не понял я чего ей не хватает, но горят они... Так, что ножки теряем зато работоспособность находим.
     
  12. nailxx

    nailxx Официальный Нерд Администратор

    Код (C++):

    void loop()
    {
        motor.step(200); // вперёд
        delay(1000);
        motor.step(-200); // назад
        delay(1000);
    }
     
    Просто пины наоборот определить:

    Код (C++):

    Stepper motor = Stepper(400, 7, 5, 6, 4);
     
     
  13. Renat

    Renat Нерд

    Коллеги! Сейчас от нечего делать сравнил поведение степера с программками со стандартной библиотекой <Stepper.h>, с которой нам показывал работоспособность уважаемый nailxx (доработан только количество оборотов в секунду для синхронизации обеих программ) и своей, которую я выложил вчера. Выяснилось, что со стандартной библиотекой при одних и тех же оборотах мотор работает менее стабильно, работает громче, силы теряет раза в два, и максимально достигаемая скорость меньше примерно в 1.5 раза!
    Прочувствуйте разницу.
    Программа 1

    #include <Stepper.h>
    Stepper motor = Stepper(200, 4, 6, 5, 7);
    void setup()
    {
    motor.setSpeed(60);
    }
    void loop()
    {
    motor.step(2000);
    delay(1000);
    }

    Программа 2

    int motorPin1 = 4;
    int motorPin2 = 5;
    int motorPin3 = 6;
    int motorPin4 = 7;
    int delayTime = 6;

    void setup() {
    pinMode(motorPin1, OUTPUT);
    pinMode(motorPin2, OUTPUT);
    pinMode(motorPin3, OUTPUT);
    pinMode(motorPin4, OUTPUT);
    }

    void loop() {
    digitalWrite(motorPin1, HIGH);
    digitalWrite(motorPin2, HIGH);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, LOW);
    delay(delayTime);
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3,HIGH );
    digitalWrite(motorPin4, HIGH);
    delay(delayTime);
    digitalWrite(motorPin1,LOW);
    digitalWrite(motorPin2, HIGH);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, LOW);
    delay(delayTime);
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3,HIGH);
    digitalWrite(motorPin4, LOW);
    delay(delayTime);
    }
     
  14. qwenya77

    qwenya77 Нерд

    Я тоже отметил что со скетчем от Рената мотор крутит мощнее, но почему?
    Уважаемый nailxx, не могли бы Вы нам объяснить это явление?
     
  15. qwenya77

    qwenya77 Нерд

    Ренат, а как бы в этом скетче задать реверс?
     
  16. fr0ster

    fr0ster Гик

    Ну как в стандарте задали скорость, так он и жужжит.
    Код (Text):
    void Stepper::setSpeed(long whatSpeed)
    {
      this->step_delay = 60L * 1000L / this->number_of_steps / whatSpeed;
    }
    То есть для сравнения в коде Рената delayTime надо выставить в 5.
    А так же либо из стандартного кода убрать delay(1000); из цикла, либо добавить такой же в код Рената.

    Вот хотелось бы в равных условиях сравнение услышать :)
     
  17. Renat

    Renat Нерд

    Выставлял и на 5 и на 4 , все равно крутится быстрее и стабильней.
     
  18. nailxx

    nailxx Официальный Нерд Администратор

    Дело в порядке переключения режимов работы обмоток. Библиотека Stepper рассчитана на, скорее, кручение униполярного двигателя через ULN2003. Из `Stepper.cpp`:

    Код (C++):

        switch (thisStep) {
          case 0:    // 1010
          digitalWrite(motor_pin_1, HIGH);
          digitalWrite(motor_pin_2, LOW);
          digitalWrite(motor_pin_3, HIGH);
          digitalWrite(motor_pin_4, LOW);
          break;
          case 1:    // 0110
          digitalWrite(motor_pin_1, LOW);
          digitalWrite(motor_pin_2, HIGH);
          digitalWrite(motor_pin_3, HIGH);
          digitalWrite(motor_pin_4, LOW);
          break;
          case 2:    //0101
          digitalWrite(motor_pin_1, LOW);
          digitalWrite(motor_pin_2, HIGH);
          digitalWrite(motor_pin_3, LOW);
          digitalWrite(motor_pin_4, HIGH);
          break;
          case 3:    //1001
          digitalWrite(motor_pin_1, HIGH);
          digitalWrite(motor_pin_2, LOW);
          digitalWrite(motor_pin_3, LOW);
          digitalWrite(motor_pin_4, HIGH);
          break;
        }
     
    Ренат же выбрал наиболее правильный режим.
     
  19. fr0ster

    fr0ster Гик

    А задержку из цикла убирали?
     
  20. fr0ster

    fr0ster Гик

    Тогда можно дополнить стандартную либу режимом Рената для таких двигателей.