Урок 35. Подключение STEP/DIR драйверов шаговых двигателей к Ардуино. Библиотека StepDirDriver.

модуль TB6560-V2
В уроке подключим STEP/DIR драйвер TB6560-V2 к плате Ардуино. Научимся управлять им с помощью библиотеки StepDirDriver.

Предыдущий урок     Список уроков     Следующий урок

TB6560-V2 недорогой драйвер шаговых двигателей поддерживающий все типичные режимы и функции STEP/DIR драйверов.

 

В уроке будем подключать его к плате Ардуино. Все схемы и программы урока подойдут к любому другому STEP/DIR драйверу.

Подключение драйвера к плате Ардуино.

 В статье о модуле TB6560-V2 есть две схемы подключения к микроконтроллеру. Будем использовать эту.

Схема подключения модуля TB6560-V2При высоком уровне сигнала (+5 В) через светодиод входного оптрона течет ток, и модуль воспринимает это как активный управляющий уровень. Резисторы 330 Ом ограничивают ток светодиодов. Т.е. драйвером можно управлять сигналами непосредственно с выводов микроконтроллеров.

С учетом этого схема подключения драйвера TB6560-V2 к плате Ардуино выглядит так.

Схема подключения к АрдуиноОбратите внимание на плавкий предохранитель. Я настоятельно рекомендую его поставить. В схемах с простыми драйверами при сгорании ключей через двигатель течет рабочий ток, ограниченный либо сопротивлением обмотки, либо дополнительным резистором. В драйверах со стабилизацией тока ток регулируется за счет ШИМ модуляции. Если в подобных устройствах сгорают выходные ключи, то на двигатель может попасть полное напряжение питания. Это приведет к недопустимому току и сгоранию шагового двигателя. Процесс это медленный, поэтому от выхода из строя привода спасет любой предохранитель – плавкий или самовосстанавливающийся.

Параметры драйвера задаются переключателями на плате модуля. Я задал ток фазы 1 А.

Положение переключателей

Переключателями S3 иS4 выбирается режим коммутации фаз.

Состояние переключателей Режим
S3 S4
OFF OFF шаговый
ON OFF полу шаговый
ON ON микро шаговый
1/8 шага
OFF ON микро шаговый
1/16 шага

Для начала я задал шаговый режим, потом проверил все остальные. Все режимы описаны в статье о модуле TB6560-V2. Там же показано, как задавать их переключателями модуля.

Собранная схема у меня выглядит так.

Система управленияОсталось научиться управлять такой системой.

 

Библиотека StepDirDriver.

Эту библиотеку я разработал для управления STEP/DIR драйверами. Она полностью совместима по функциям с библиотекой StepMotor (урок 29). Только 2 отличия:

  • Конструктор имеет другие аргументы. Просто для STEP/DIR драйвера требуются другие сигналы управления и другое количество сигналов.
  • В функции установки режима setMode() игнорируется параметр stepMode – режим коммутации. Режим задается переключателями на драйвере.

Загрузить библиотеку StepDirDriver можно по этой ссылке.

Описание класса StepDirDriver.

У класса следующие public методы.

class StepDirDriver {

  public:
    StepDirDriver(byte pinStep, byte pinDir, byte pinEn); // конструктор
    void  control();  // управление, функция должна вызываться регулярно с максимальной частотой коммутации фаз
    void  step(int steps);  // инициирует поворот ротора на заданное число шагов
    void  setMode(byte stepMode, boolean fixStop);  // задает режимы коммутации фаз и остановки
    void  setDivider(int divider);  // установка делителя частоты для коммутации фаз
    int readSteps();  // чтение оставшихся шагов   
} ;

Нетрудно догадаться, о назначении аргументов конструктора:

  • pinStep - вывод сигнала STEP;
  • pinDir - вывод сигнала DIR;
  • pinEn - вывод сигнала ENABLE.

StepDirDriver myMotor1(10, 11, 12);  // создаем объект StepDirDriver, задаем выводы для сигналов STEP, DIR, ENABLE

Описание методов библиотеки StepDirDriver.

void control()

Необходимо вызывать метод регулярно в параллельном процессе (прерывании по таймеру). В нем вырабатываются управляющие сигналы, определяющие коммутацию фаз. Частота вызова функции control() вместе с делителем, задаваемым функцией setDivider, определяет скорость вращения двигателя.

// обработчик прерывания 200 мкс
void  timerInt () {  
  myMotor1.control(); // управление двигателем
 }

void step(int steps)

Метод инициирует поворот двигателя на заданное число шагов. В микро шаговых режимах речь идет не о физических шагах двигателя, а о микро шагах. Параметр steps с положительным значением инициирует поворот против часовой стрелки, с отрицательным значением – по часовой стрелке.

Запустив вращение функцией step()

myMotor1.step(300);  // сделать 300 шагов против часовой стрелки

программа может выполнять другие задачи. Двигатель остановится сам. В любой момент двигатель можно остановить командой

myMotor1.step(0);  // остановить привод

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

myMotor1.step(30000);  // постоянное вращение

О том, что двигатель остановился можно узнать с помощью метода readSteps().

void setMode(byte stepMode, boolean fixStop)

Метод задает состояние двигателя при остановке.

  • Если fixStop = true, то при остановке на обмотки двигателя подается ток удержания, положение ротора зафиксировано.
  • При fixStop = false, напряжение с обмоток двигателя при остановке снимается.

Аргумент stepMode игнорируется. Он добавлен для совместимости с такой же функцией библиотеки StepMotor.

myMotor1.setMode(0, true);  // фиксация ротора при остановке
myMotor1.setMode(0, false);  // двигатель полностью отключен

void setDivider(int divider)

Функция задает коэффициент деления частоты вызова метода control(), а значит, определяет скорость вращения двигателя. Скорость вращения можно вычислить по следующей формуле:

Rpm = 60 000  /   ( divider  * Tcontrol * Nдвигателя  ) / Nмикрошагов

  • Rpm – скорость вращения в оборотах в минуту;
  • Tcontrol – период вызова метода control() в мс;
  • Nдвигателя – число шагов двигателя на полный оборот;
  • Nмикрошагов – число микро шагов двигателя на одну фазу.

Для шагового режима Nмикрошагов = 1, для полу шагового Nмикрошагов = 2 и т.д.

myMotor1.setDivider(5);     // делитель частоты 5

int readSteps()

Метод считывает количество шагов, оставшихся до остановки двигателя. Возврат 0 означает, что двигатель остановлен.

if (myMoto1r.readSteps() == 0)  {
  // двигатель остановлен
}

 

Примеры использования библиотеки StepDirDriver.

Использование новой библиотеки ничем не отличается от применения функций библиотеки StepMotor из предыдущих уроков.

Всего два отличия:

  • Подключение библиотеки #include <StepDirDriver.h>  вместо #include <StepMotor.h>.
  • Другой формат конструктора StepDirDriver myMotor(10, 11, 12); вместо StepMotor myMotor(10, 11, 12, 13).

В программе меняются всего 2 строки. 

Можете загрузить и проверить скетч программы, которая заставляет сделать двигатель 2 оборота по часовой стрелке со скоростью 1 оборот в секунду, затем пауза 1 секунда, 2 оборота против часовой стрелки, опять пауза на секунду и так в цикле. Он похож на примеры из предыдущих уроков для библиотеки StepMotor. Не забудьте установить библиотеку StepDirDriver.

Проверка драйвера шагового двигателя с AT командами.

Я заменил две строчки программы драйвера с управлением от компьютера из Урока31 и получилось новое устройство для работы с шаговым двигателем. Загрузить новый драйвер с управлением по протоколу AT команд можно по этой ссылке.

Собрал систему по схеме в начале урока и проверил в самых разных режимах. Не буду описывать все подробно. Остановлюсь на микро шаговом режиме.

Задал микро шаговый режим с 16 микро шагами. У меня двигатель имеет 400 физических шагов. В микро шаговом режиме получился двигатель, имеющий целых 6400 шагов на оборот! Поробовал управлять программой верхнего уровня StepMotor (урок 31).


Окно программы StepMotorВсе работает. Точность установки просто невероятная.

Проверил и работу следящего электропривода из урока 32.


Окно программы следящего электроприводаРазрешающая способность положения ротора почти 0,05 °!

Наверное, в последних двух уроках я убедительно показал преимущества STEP/DIR драйверов. Но какой драйвер применять в конкретном случае решать разработчику. Что важнее низкая цена простого драйвера из ключей или функциональность STEP/DIR драйвера.

Бывают очень серьезные разработки с простыми драйверами. Например, практически все шаговые двигатели в фасовочном оборудовании НПП ”РОСТ” работают в униполярном режиме с простыми драйверами-ключами. Из-за этого у двигателей уменьшился крутящий момент, снизилась максимальная скорость вращения, но зато значительно упала цена системы управления. Для устройств с 7-10 шаговыми двигателями это важно.

 

Надо выбирать оптимальный вариант. В каких-то случаях без STEP/DIR драйвера не обойтись, в других проектах вполне удачно будут работать простые драйверы.

Предыдущий урок     Список уроков     Следующий урок

29 комментариев на «Урок 35. Подключение STEP/DIR драйверов шаговых двигателей к Ардуино. Библиотека StepDirDriver.»

  1. Здравствуйте, спасибо за урок. Не могли бы вы подсказать, как с помощью вашей библиотеки реализовать движение двигателя на один шаг и остановку, подобно кнопке «+1 шаг» в вашей программе? никак не могу разобраться с таймингами. Заранее благодарю.

    • Здравствуйте!
      Сделать функцией step() один шаг. myMotor.step(1); Программа верхнего уровня эту команду и вызывает.

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

      И еще. Арсентий, если хотите подробно обсудить какой-нибудь вопрос — я открыл форум http://mypractic-forum.ru.

  2. Здравствуйте
    А как решить задачу управления двумя или тремя шаговыми двигателями одновременно но с разными скоростями?

    • Здравствуйте. Создать три объекта StepDirDriver и задать для них разные скорости.

  3. Не компилируется sketch_34_5.
    GetFileAttributesEx C:\DOCUME~1\Admin\LOCALS~1\Temp\arduino_build_726012: Не удается найти указанный файл.

    Ошибка компиляции для платы Arduino/Genuino Uno.

    • Еще раз проверил. Все компилируется. Может быть библиотеки не подключили. Какую ошибку компилятор пишет?

      • На работе проверил все компилится.
        Скорее всего чтото с компилятором или с компом.
        Спосибо за ответ.
        Уроки Класс.

  4. Спасибо за урок.
    А как использовать данную библиотеку, если у драйвера общая не земля а +5 вольт?

    • Здравствуйте!
      Библиотека рассчитана на управляющие импульсы высокого уровня. Но в принципе полярность не сложно изменить.

  5. Доброго. Помогите чайнику, подключил драйвер к ардуино и ШД правильно как у вас (все минуси на драйвере в кучу и к GND ардуино, степ-10, дир-11, енабл-12), теперь не могу разобратса с кодом, если вам несложно пропишите мне простой код, лево/раво/пауза.
    Я раньше только с компа по лпт работал, а для совсем простих задач пробую через ардуино.
    Зарание благодарен.

  6. Скопировал ваш скетч, пишет ошибку,

    Arduino: 1.6.7 (Windows 7), Плата:»Arduino/Genuino Uno»

    C:\Users\ADMIN\Documents\Arduino\sketch_jun12c\sketch_jun12c.ino:7:22: fatal error: TimerOne.h: No such file or directory

    #include

    ^

    compilation terminated.

    Несколько библиотек найдено для «StepDirDriver.h»
    Используется: C:\Users\ADMIN\Documents\Arduino\libraries\StepDirDriver
    Не используется: C:\Program Files (x86)\Arduino\libraries\StepDirDriver
    exit status 1
    Ошибка компиляции.

    Это сообщение будет содержать больше информации чем
    «Отображать вывод во время компиляции»
    включено в Файл > Настройки

    Помогите чайнику пожалуйста

  7. с первой вроде разобрался, вот новая(
    Arduino: 1.6.7 (Windows 7), Плата:»Arduino/Genuino Uno»

    C:\Users\ADMIN\Documents\Arduino\sketch_jun12c\sketch_jun12c.ino:8:22: fatal error: TimerOne.h: No such file or directory

    #include

    ^

    compilation terminated.

    exit status 1
    Ошибка компиляции.

    Это сообщение будет содержать больше информации чем
    «Отображать вывод во время компиляции»
    включено в Файл > Настройки

  8. Получилось скомпилировать, даже на драйвере лампочка моргает видно есть сигнал, возможно проблема с моим драйвером YKA2608MC эму нужна фиксация при остановке, у него чуток другие команды на енабл, помогите разобратса пожалуйста

    • Возможно нужна интерфейсная плата? я такой драйвер подключал через нее, можно обойтись без интерфейсной платы сразу с ардуино на драйвер?

      • Здравствуйте!
        Какая интерфейсная плата? Если драйвер с интерфейсом STEP/DIR, то подключается непосредственно к плате Ардуино.

        • Заработало! Спасибо, моя ошибка в том что я не подключил средние обмотки шаговика, нужно все 6 проводов подключать Оо, а нельзя както на 4 как всегда было? может возможно с ардуино в cw/ccw интерфейс драйвера подавать команды?

  9. Здравствуйте!
    Если не составит труда, можете написать пример чтобы поставить шаговик в ноль и датчик края рабочей зоны?
    Заранее Благодарен.

    • Здравствуйте!
      Конкретная реализация зависит от структуры программы. Принцип такой. Создаете объект Button (урок 9) для датчика-концевика. В цикле вызываете функцию step(1000). Указываете заведомо большое число шагов, я задал 1000. Анализируете концевик. Как только он становится активным (нажатым), останавливаете двигатель функцией step(0).
      Лучше откройте тему на форуме сайта http://mypractic-forum.ru/ и более конкретно опишите задачу. Как вы хотите реализовать ее в прерывании или цикле loop().

  10. Подключил униполярный шагавикчерез ключи, работает. Но когда стоит, греется движок, жаль, нет функции удерживания. И как выше сказано про управление по step dir. Как бы нибыло  за программу пять.

  11. подскажите пжта: использую двигатель 17HS2408 Nema17. в даташите двигателя сказано, что rated current=0,6 A. значит я должен выставить на TB6560-V2 0,5 или 0,8 А ?

    и можно ли подключить к TB6560-V2 два двигателя (одинаковых), как в этом случае выставлять ток ?

    • Здравствуйте!
      Если режим работы длительный, тогда лучше 0,5 А.
      Два двигателя к одному драйверу со стабилизацией тока фазы подключать нельзя. Токи равномерно между обмотками не распределятся. Разница в сопротивлении, индуктивности, механической нагрузке…

      • спасибо за оперативный ответ.
        т.е. в принципе можно подключить два драйвера к arduino на свободные ноги. в скетче просто продублировать блоки ?

        и вопрос с питанием. подключил блок питания на 24 V 1 А. двигатель 17HS2408 еле работает. возможно, надо взять 2А ? у вас какой блок питания на картинке ?

        • Здравствуйте!
          Можно два драйвера подключить к одним и тем жен выводам платы.
          У меня блок питания 12 В, 6 А. Но с вашим все должно работать. Может быть вы слишком высокую скорость задали? От блока питания драйвер должен потреблять ток примерно 0,5 А * 0,5 А * 8 Ом / 24 В * 2 обмотки = 170 мА

  12. при скорости делителя в программе Stepmotor выше 60-ти перестает вращаться, только стучит.
    не работает программе шаговый режим — все время крутит в одну и ту же сторону, как при положительном,так и отрицательном значении шагов(может проблема в коде ?). если нажимать на стрелки, то крутит в правильном направлении. кстати, с AT командами в шаговом режиме тоже крутит в одну и ту же сторону.
    в чем может быть проблема ? все же блок питания ?

    • Здравствуйте!
      Проверьте с помощью простых программ из урока. Может вы неправильно подключили. Какой драйвер?

      • драйвер все тот же — (я выше писал) TB6560-V2.
        если бы подключение было неверным AT команды не работали бы. а они работают на скорости 20.
        заказал блок питания 12В 5А для драйвера.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *