Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Освоение шаговых двигателей с помощью Arduino:подробное руководство

В этом уроке мы узнаем все, что нам нужно знать об управлении шаговыми двигателями с помощью Arduino. Мы расскажем, как управлять шаговым двигателем NEMA17 в сочетании с A4988, DRV8825 и шаговым драйвером TMC2208.

Эта комбинация шаговых двигателей и драйверов используется в бесчисленных приложениях, где требуется управление положением, например, в 3D-принтерах, станках с ЧПУ, робототехнике, машинах автоматизации и т. д.

Я уже использовал его во многих своих проектах Arduino, например в следующем:

Я подробно объясню, как они работают, как подключить шаговые двигатели к Arduino, как установить ограничение тока драйверов и как их программировать с библиотекой Arduino или без нее. Кроме того, я покажу вам, как можно легко управлять несколькими шаговыми двигателями с помощью платы Arduino с ЧПУ для любого типа проекта Arduino. 

Итак, нам есть что рассказать в этом уроке. Вы можете посмотреть следующее видео или прочитать письменное руководство ниже, которое также включает все примеры кодов и схемы подключения.

Что такое шаговый двигатель и как он работает?

Я начну с краткого объяснения, что такое шаговый двигатель и как он работает, поскольку это поможет нам лучше понять все остальное в этом уроке. 

Шаговый двигатель – это уникальный тип бесщеточного двигателя постоянного тока, положение которого можно точно контролировать даже без обратной связи.

Принцип работы шагового двигателя основан на магнитных полях. Он состоит из двух основных компонентов:статора и ротора. Ротор обычно представляет собой постоянный магнит, окруженный несколькими катушками статора.

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

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

Увеличивая количество магнитных полюсов ротора, мы можем увеличить количество возможных положений остановки, тем самым увеличив разрешение или точность двигателя. Обратите внимание, что это всего лишь базовое объяснение, и более подробную информацию вы можете найти в моем руководстве «Как работают шаговые двигатели». 

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

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

Я упоминал, что катушки статора организованы в две фазы, и мы также можем заметить это, если посмотрим на количество проводов шагового двигателя. Имеет 4 четыре провода, по два на каждую фазу. Возможны четыре различных ориентации магнитного поля, поскольку мы можем пропускать ток через фазы в обоих направлениях.

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

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

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

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

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

Как управлять шаговым двигателем NEMA17 с помощью Arduino и шагового драйвера A4988

Хорошо, теперь мы можем рассмотреть первый пример этого руководства:как управлять шаговым двигателем NEMA 17 с помощью шагового драйвера A4988. 

Хорошо, теперь мы можем рассмотреть первый пример этого руководства, как управлять шаговым двигателем NEMA 17 с помощью шагового привода A4988.

NEMA17 — самый популярный шаговый двигатель среди производителей, поскольку он предлагает отличные характеристики и в то же время доступен по цене. Его также можно найти практически в любом настольном 3D-принтере и лазерном гравере. 

Обычно шаговый двигатель NEMA17 имеет разрешение 200 шагов или разрешение 1,8 градуса на шаг, но есть также модели с разрешением 400 шагов и разрешением 0,9 градуса на шаг. Здесь следует отметить, что обозначение NEMA17 на самом деле описывает только размер двигателя с точки зрения размера передней лицевой панели.

Число обозначает размер лицевой панели в дюймах при делении на 10, или в данном случае 17, разделенное на 10, будет равно 1,7 дюймам лицевой панели или 2,3 дюймам лицевой панели в случае NEMA23.

Итак, размер лицевой панели фиксирован, но длина шаговых двигателей NEMA17 может варьироваться от 20 мм до 60 мм, вместе с этим варьируется и потребляемая мощность двигателя. Требуемая мощность обычно определяется тем, какой ток может потреблять двигатель, а диапазон для этих шаговых двигателей NEMA17 составляет от 0,3 А до 2,5 А.

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

A4988 имеет максимальный номинальный ток 2 А на катушку, но на самом деле это пиковый номинал. Рекомендуется поддерживать ток около 1 А, но, конечно, можно увеличить и до 2 А при условии хорошего охлаждения микросхемы. 

Замечательная особенность шагового драйвера A4988, как и всех других приводов, — это ограничение тока. Благодаря этому мы можем легко установить, какой ток будет потреблять двигатель независимо от его номинала. Например, мы можем подключить даже шаговый двигатель на 2,5А, но ограничим ток драйвера до 1,5А. Таким образом, хотя мотор и не будет работать на полную мощность, мы все равно сможем его использовать.

С другой стороны, если номинал двигателя ниже установленного ограничения тока на драйвере, двигатель может перегреться. Конечно, всегда рекомендуется стараться сопоставлять текущую мощность двигателя с текущей мощностью драйвера.

Соединение A4988 и Arduino

Хорошо, теперь давайте посмотрим, как соединить драйвер A4988 с шаговым двигателем и контроллером Arduino.

Вы можете получить компоненты, необходимые для этого руководства по Arduino, по ссылкам ниже:

Раскрытие информации:это партнерские ссылки. Как сотрудник Amazon, я зарабатываю на соответствующих покупках.

В правом верхнем углу драйвера расположены контакты VMOT и GND, сюда мы подключаем источник питания двигателя, напряжение которого может находиться в диапазоне от 8 до 36 В. Здесь также рекомендуется использовать развязывающий конденсатор между этими двумя выводами, чтобы защитить плату от скачков напряжения. Нам следует использовать большой электролитический конденсатор емкостью не менее 47 мкФ. 

Далее идут четыре контакта, к которым мы подключаем шаговый двигатель. Одна фаза двигателя идет на контакты 1A и 1B, а другая фаза на контакты 2A и 2B. 

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

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

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

Далее у нас есть контакты питания микросхемы или логики, VDD и GND, напряжение которых может составлять от 3 В до 5 В. С другой стороны у нас есть контакты Step и Direction, которые можно подключить к любому контакту платы Arduino. С помощью штыря Direction мы выбираем направление вращения двигателя, а с помощью штифта Step мы управляем шагами двигателя. С каждым импульсом, который мы посылаем на вывод Step, двигатель будет продвигаться на один шаг в выбранном направлении. 

Прямо над этими контактами у нас есть контакты Sleep и Reset, которые, как следует из их названий, используются для перевода драйвера в спящий режим или его сброса. Следует отметить, что оба этих контакта имеют активный низкий уровень. По умолчанию вывод Sleep находится в состоянии HIGH, но вывод RST находится в плавающем состоянии. Это означает, что самый простой способ включить драйвер — просто соединить эти два контакта друг с другом, предполагая, что мы не будем использовать функции этих контактов. 

На выводе Enable также активен низкий уровень, поэтому, если мы не потянем его на ВЫСОКИЙ уровень, драйвер будет включен. 

Следующие три контакта, MS1, MS2 и MS3, предназначены для выбора шагового разрешения двигателя. Мы уже говорили, что разрешение шага зависит от конструкции двигателя, которое обычно составляет 200 шагов на оборот для шагового двигателя NEMA 17. Однако все шаговые драйверы имеют функцию, называемую микрошагом, которая позволяет управлять двигателем с более высоким разрешением. Это достигается за счет подачи питания на катушки промежуточного уровня тока, что создает промежуточные положения ступенек.

Например, если мы выберем разрешение в четверть шага, 200 шагов двигателя станут:200, умноженное на 4, равно 800 микрошагам за оборот. Для этого драйвер будет использовать четыре различных уровня тока на катушках. 

Драйвер A4988 имеет максимальное разрешение 16 микрошагов, что соответствует 200-шаговому двигателю NEMA17 с 3200 шагами на оборот, или это 0,1125 градуса на шаг. Это действительно впечатляющая точность, и именно поэтому эти типы шаговых двигателей и драйверов используются во многих приложениях. На самом деле, существуют шаговые драйверы с частотой до 256 микрошагов, то есть целых 51 200 шагов на оборот, или 0,007 градуса на шаг.

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

A4988 Ограничение тока

Хорошо, теперь, когда мы знаем, как подключить шаговый двигатель и драйвер к плате Arduino, мы можем перейти к объяснению того, как запрограммировать или закодировать Arduino для управления шаговым двигателем. Однако, прежде чем мы это сделаем или перед тем, как подать питание на двигатель, нам нужно сделать еще одну очень важную вещь — отрегулировать ограничение тока драйвера.

Как мы уже объясняли, нам необходимо настроить ограничение тока драйвера так, чтобы оно было ниже номинального тока двигателя, иначе двигатель перегреется.

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

Первый метод предполагает измерение опорного напряжения на самом потенциометре и GND. Мы можем измерить опорное напряжение с помощью мультиметра и использовать это значение в следующей формуле для расчета ограничения тока драйвера:

Текущий предел =Vref / (8 x Rcs)

Rcs — это сопротивление измерения тока или значения резисторов измерения тока, расположенных рядом с чипом. В зависимости от производителя эти значения обычно составляют 0,05, 0,1 или 0,2 Ом. Итак, нам нужно более внимательно посмотреть на номинал этих резисторов, чтобы точно рассчитать предел тока с помощью этого метода. В моем случае эти резисторы имели маркировку R100, что означало 0,1 Ом.

Например, если мы измеряем опорное напряжение 0,7 В и имеем резисторы сопротивлением 0,1 Ом, предел тока составит 0,875 А. Или, если мы хотим ограничить ток, скажем, до 1 А, нам следует отрегулировать опорное напряжение до 0,8 В. 

Второй метод установки ограничения тока заключается в непосредственном измерении тока через катушки. Для этого нам нужно соединить шаговый двигатель и драйвер, как объяснялось ранее. Мы можем пропустить подключение контроллера, а вместо этого подключить 5 В к контактам направления и шага, чтобы двигатель оставался активным и удерживал одно положение. Выводы MS следует оставить отключенными, чтобы драйвер работал в полношаговом режиме. Затем мы можем отсоединить одну линию или катушку от двигателя и соединить ее последовательно с амперметром. Таким образом, как только мы подадим на драйвер одновременно логическое напряжение 5 В и питание двигателя 12 В в моем случае, мы сможем узнать, какой ток протекает через катушку.

Однако здесь следует отметить, что при работе драйвера в полношаговом режиме ток в катушках может достигать лишь 70% от фактического ограничения тока. Итак, при использовании драйвера в других микрошаговых режимах показания амперметра следует умножить на 1,3, чтобы получить фактическое значение ограничения тока драйвера. 

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

Шаговые двигатели и Arduino – примеры кода

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

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

Пример кода 1

/* 
 * Basic example code for controlling a stepper without library
 * 
 * by Dejan, https://howtomechatronics.com
 */
// defines pins
#define stepPin 2
#define dirPin 5 
 
void setup() {
 // Sets the two pins as Outputs
 pinMode(stepPin,OUTPUT); 
 pinMode(dirPin,OUTPUT);
}
void loop() {
 digitalWrite(dirPin,HIGH); // Enables the motor to move in a particular direction
 // Makes 200 pulses for making one full cycle rotation
 for(int x = 0; x < 800; x++) {
 digitalWrite(stepPin,HIGH); 
 delayMicroseconds(700); // by changing this time delay between the steps we can change the rotation speed
 digitalWrite(stepPin,LOW); 
 delayMicroseconds(700); 
 }
 delay(1000); // One second delay
 
 digitalWrite(dirPin,LOW); //Changes the rotations direction
 // Makes 400 pulses for making two full cycle rotation
 for(int x = 0; x < 1600; x++) {
 digitalWrite(stepPin,HIGH);
 delayMicroseconds(500);
 digitalWrite(stepPin,LOW);
 delayMicroseconds(500);
 }
 delay(1000);
}Code language: PHP (php)

Описание кода:

Здесь все, что нам нужно сделать, это определить, к какому номеру контакта подключены выводы STEP и DIR, и определить их как выходы. В цикле сначала мы устанавливаем направление вращения двигателя, устанавливая ВЫСОКИЙ статус контакта «Направление». Затем с помощью цикла «for» мы посылаем 200 импульсов на вывод STEP, что заставит двигатель вращаться полный цикл, учитывая, что он работает в полношаговом режиме. Импульсы генерируются простым переключением состояния вывода STEP HIGH на LOW с некоторой задержкой между ними. Эта временная задержка фактически определяет скорость вращения. Если его опустить, то скорость вращения увеличится, так как шаги будут происходить быстрее, и наоборот. 

Затем мы меняем направление вращения и с помощью другого цикла «for» посылаем 400 импульсов, которые заставят двигатель вращаться два полных цикла. Однако, если мы изменим микрошаговый режим драйвера, скажем, на четверть шага, что позволит двигателю теперь иметь 800 шагов, первый цикл заставит двигатель вращаться только на 90 градусов, а второй цикл - только на половину оборота.

Пример кода 2

Вот еще один простой пример:управление скоростью шагового двигателя с помощью потенциометра.

Для этого достаточно подключить потенциометр к Arduino и прочитать его значение с помощью функции AnalogRead().

/*
 Basic example code for controlling a stepper without library
 by Dejan, https://howtomechatronics.com
*/
// defines pins
#define stepPin 2
#define dirPin 5
int customDelay, customDelayMapped;
void setup() {
 // Sets the two pins as Outputs
 pinMode(stepPin, OUTPUT);
 pinMode(dirPin, OUTPUT);
}
void loop() {
 speedControl();
 // Makes pules with custom delay, depending on the Potentiometer, from which the speed of the motor depends
 digitalWrite(stepPin, HIGH);
 delayMicroseconds(customDelayMapped);
 digitalWrite(stepPin, LOW);
 delayMicroseconds(customDelayMapped);
}
// Custom function for reading the potentiometer and mapping its value from 300 to 3000, suitable for the custom delay value in microseconds
void speedControl() {
 customDelay = analogRead(A0); // Read the potentiometer value
 customDelayMapped = map(customDelay, 0, 1023, 300, 3000); // Convert the analog input from 0 to 1024, to 300 to 3000
}Code language: PHP (php)

Описание кода:

Затем мы можем сопоставить или преобразовать значения потенциометра от 0 до 1023 в значения, подходящие для времени задержки в микросекундах для импульсов Step. Я обнаружил, что минимальное значение задержки между шагами составляет около 300 микросекунд. Опустившись ниже, шаговый двигатель начал пропускать шаги. 

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

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

Самая популярная библиотека для управления шаговыми двигателями с помощью Arduino — это библиотека AccelStepper Майка МакКоли. Это чрезвычайно универсальная библиотека, позволяющая контролировать скорость, ускорение и замедление, устанавливать целевые положения, одновременно управлять несколькими шаговыми двигателями и т. д.

В библиотеке есть отличная документация, объясняющая, как работает каждая функция. Я уже использовал эту библиотеку для нескольких своих проектов Arduino, для управления движением моего слайдера камеры DIY, станка для 3D-гибки проволоки, робота-манипулятора SCARA и некоторых других. Если вам интересно, на сайте есть подробности и пояснения к коду для каждого проекта. 

Теперь давайте рассмотрим несколько примеров кода с использованием этой библиотеки.

Пример кода – управление скоростью шагового двигателя с помощью потенциометра

В первом примере будет управлять скоростью двигателя с помощью потенциометра.

/* 
 * Basic example code for controlling a stepper with the AccelStepper library
 * 
 * by Dejan, https://howtomechatronics.com
 */
#include <AccelStepper.h>
// Define the stepper motor and the pins that is connected to
AccelStepper stepper1(1, 2, 5); // (Type of driver: with 2 pins, STEP, DIR)
void setup() {
 // Set maximum speed value for the stepper
 stepper1.setMaxSpeed(1000);
}
void loop() {
 stepper1.setSpeed((analogRead(A0));
 // Step the motor with a constant speed previously set by setSpeed();
 stepper1.runSpeed();
}Code language: PHP (php)

Описание кода:

Итак, здесь сначала нам нужно подключить библиотеку AccelStepper. Конечно, прежде чем мы это сделаем, нам нужно установить библиотеку, и мы можем сделать это из менеджера библиотек Arduino IDE. Нам просто нужно выполнить поиск «AccelStepper», и библиотека появится, и мы сможем ее установить. 

Затем нам нужно создать экземпляр класса AccelStepper для нашего двигателя. Первый параметр здесь — это тип драйвера, в данном случае для драйвера с двумя управляющими пинами это значение равно 1, а два других параметра — это номера пинов, к которым наш драйвер подключается к Arduino. Если у нас есть несколько шаговых двигателей, нам нужно определить каждый из них следующим образом, и мы можем назвать их как захотим, в данном случае я назвал свой двигатель шаговым1. 

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

В разделе цикла с помощью функции setSpeed() мы устанавливаем текущую скорость двигателя, и в данном случае это аналоговый вход потенциометра от 0 до 1023.

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

Пример кода – Управление двумя шаговыми двигателями с ускорением и замедлением

Вот еще один пример управления двумя шаговыми двигателями с реализацией ускорения и замедления с помощью библиотеки AccelStepper.

/*
 Controlling two stepper with the AccelStepper library
 by Dejan, https://howtomechatronics.com
*/
#include <AccelStepper.h>
// Define the stepper motor and the pins that is connected to
AccelStepper stepper1(1, 2, 5); // (Typeof driver: with 2 pins, STEP, DIR)
AccelStepper stepper2(1, 3, 6);
void setup() {
 stepper1.setMaxSpeed(1000); // Set maximum speed value for the stepper
 stepper1.setAcceleration(500); // Set acceleration value for the stepper
 stepper1.setCurrentPosition(0); // Set the current position to 0 steps
 stepper2.setMaxSpeed(1000);
 stepper2.setAcceleration(500);
 stepper2.setCurrentPosition(0);
}
void loop() {
 stepper1.moveTo(800); // Set desired move: 800 steps (in quater-step resolution that's one rotation)
 stepper1.runToPosition(); // Moves the motor to target position w/ acceleration/ deceleration and it blocks until is in position
 stepper2.moveTo(1600);
 stepper2.runToPosition();
 // Move back to position 0, using run() which is non-blocking - both motors will move at the same time
 stepper1.moveTo(0);
 stepper2.moveTo(0);
 while (stepper1.currentPosition() != 0 || stepper2.currentPosition() != 0) {
 stepper1.run(); // Move or step the motor implementing accelerations and decelerations to achieve the target position. Non-blocking function
 stepper2.run();
 //
 //
 }
}Code language: PHP (php)

Описание кода:

Итак, нам нужно определить два шаговых двигателя и в настройке с помощью функции setAcceleration() установить значение ускорения для двигателей. Используя функцию setCurrentPosition(), мы устанавливаем положение двигателей на 0 шагов. 

В разделе цикла мы начинаем с функции moveTo(), с помощью которой мы сообщаем двигателю, в какую позицию двигаться или на сколько шагов он должен двигаться. В случае разрешения в четверть шага 800 шагов будут означать один полный оборот. Затем функция runToPosition() перемещает двигатель в это положение, одновременно реализуя ускорение и замедление. Однако это функция блокировки, поэтому выполнение кода будет продолжаться до тех пор, пока шаговый двигатель не достигнет этого положения. 

Тем же методом перемещаем второй мотор на 1600 шагов или два полных оборота с разрешением в четверть шага. 

Если мы не хотим, чтобы наш код блокировался до тех пор, пока двигатель не достигнет целевого положения, вместо использования функции runToPosition() нам следует использовать функцию run(). Run() также реализует ускорение и замедление для достижения целевой позиции, но при каждом вызове он делает только один шаг. Поэтому нам нужно вызывать его как можно чаще. По этой причине здесь мы поместили функции run() для обоих двигателей в этот цикл while, который выполняется до тех пор, пока оба шаговых двигателя не достигнут позиции 0. Ранее мы установили два двигателя для перехода в позицию 0 с помощью функций moveTo(). 

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

Пример кода – управление несколькими шаговыми двигателями с помощью библиотеки AccelStepper

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

Это можно легко сделать с помощью класса MultiStepper, входящего в состав библиотеки AccelStepper.

/*
 Controlling multiple steppers with the AccelStepper and MultiStepper library
 by Dejan, https://howtomechatronics.com
*/
#include <AccelStepper.h>
#include <MultiStepper.h>
// Define the stepper motor and the pins that is connected to
AccelStepper stepper1(1, 2, 5); // (Typeof driver: with 2 pins, STEP, DIR)
AccelStepper stepper2(1, 3, 6);
AccelStepper stepper3(1, 4, 7);
MultiStepper steppersControl; // Create instance of MultiStepper
long gotoposition[3]; // An array to store the target positions for each stepper motor
void setup() {
 stepper1.setMaxSpeed(1000); // Set maximum speed value for the stepper
 stepper2.setMaxSpeed(1000);
 stepper3.setMaxSpeed(1000);
 // Adding the 3 steppers to the steppersControl instance for multi stepper control
 steppersControl.addStepper(stepper1);
 steppersControl.addStepper(stepper2);
 steppersControl.addStepper(stepper3);
}
void loop() {
 // Store the target positions in the "gotopostion" array
 gotoposition[0] = 800; // 800 steps - full rotation with quater-step resolution
 gotoposition[1] = 1600;
 gotoposition[2] = 3200;
 steppersControl.moveTo(gotoposition); // Calculates the required speed for all motors
 steppersControl.runSpeedToPosition(); // Blocks until all steppers are in position
 delay(1000);
 gotoposition[0] = 0;
 gotoposition[1] = 0;
 gotoposition[2] = 0;
 steppersControl.moveTo(gotoposition);
 steppersControl.runSpeedToPosition();
 delay(1000);
}Code language: PHP (php)

Описание кода:

Здесь нам также нужно подключить класс MultiStepper и создать его экземпляр. Затем нам нужно определить массив типа «long», который будет использоваться для хранения целевых положений наших двигателей. В разделе настройки нам нужно определить максимальные значения скорости степперов и добавить степперы в ранее созданный экземпляр MultiStepper, который в моем случае я назвал «steppersControl». 

В разделе цикла мы начинаем с сохранения значений целевой позиции в ранее созданном массиве. Я установил первый шаговик на один оборот, второй на два оборота и третий на три оборота. Затем мы можем назначить этот массив функции moveTo(), которая рассчитает необходимые скорости для всех двигателей, чтобы одновременно достичь этих позиций. Затем нам просто нужно вызвать функцию runSpeedToPosition(), которая переместит двигатели в их положение. Однако следует отметить, что эта функция блокирует код до тех пор, пока шаговые двигатели не достигнут заданного положения. Вместо этого мы могли бы использовать функцию run(), если не хотим блокировать код. Также следует отметить, что класс MultiStepper не поддерживает ускорение и замедление. 

Тем не менее, если вы хотите узнать больше, на более продвинутых примерах, вы можете посмотреть мои проекты Arduino, о которых я уже упоминал, все подробности и коды к ним есть на сайте.

Щит ЧПУ для управления несколькими шаговыми двигателями для любого проекта Arduino

Продолжая тему управления несколькими шаговыми двигателями, стоит упомянуть и взглянуть на щит Arduino с ЧПУ.

Основная цель Arduino CNC Shield — управление 2- или 3-осевыми станками с ЧПУ, но на самом деле это отличный вариант для управления любым типом проекта, где нам нужно управлять несколькими шаговыми двигателями, поскольку он компактен и обеспечивает простое подключение драйверов и двигателей. 

Этот щит устанавливается поверх платы Arduino UNO и может управлять до 4 отдельными шаговыми двигателями, а все оставшиеся контакты Arduino доступны для использования. Я использовал эту комбинацию платы Arduino UNO и щита с ЧПУ для управления моим 4-осевым роботом-манипулятором SCARA.

Скоро я обновлю этот раздел статьи о том, как использовать щит ЧПУ с Arduino, и укажу более подробную информацию.

DRV8825 против A4988

Хорошо, теперь давайте продолжим и посмотрим, как можно управлять шаговыми двигателями с помощью другого драйвера, о котором я упоминал вначале, DRV8825.

На самом деле, все, что мы объяснили до сих пор об управлении шаговыми двигателями с помощью шагового драйвера A4988, применимо и к DRV8825. Принцип работы, подключения и кодировка у обоих этих драйверов практически одинаковы. Разница между ними заключается в технических характеристиках и сейчас мы их рассмотрим и сравним.

DRV8825 — это шаговый драйвер от Texas Instruments, который можно использовать в качестве прямой замены драйвера Allegro A4988, поскольку их соединения одинаковы. Три ключевых различия между ними заключаются в том, что DR8825 может выдавать больший ток, чем A4988, без дополнительного охлаждения (1,5 А против 1 А), у него более высокое максимальное напряжение питания (45 В против 35 В) и более высокое разрешение микрошагов (32 против 16 микрошагов). 

Конечно, у них есть и другие незначительные различия. Например, потенциометр ограничения тока имеет другое расположение, и соотношение между настройкой ограничения тока и напряжением опорного контакта отличается. DRV8825 не нуждается в питании логики, и расположение этого контакта используется как выход FAULT.

Однако можно безопасно подключить вывод FAULT напрямую к 5 В, поэтому DRV8825 можно использовать в качестве прямой замены в системах, предназначенных для драйвера A4988. 

Однако стоит отметить, что при замене драйвера A4988 на DRV8825 очень важно убедиться в правильной ориентации драйвера. Я уже упоминал, у них потенциометры находятся в разных местах, у А4988 - под чипом, а у DRV8825 - над чипом, и это иногда может вызвать путаницу и драйвер легко поставить не той стороной. 

Для установки ограничения тока мы можем измерить опорное напряжение одним щупом на GND, а другим на самом потенциометре.

Формула расчета для шагового привода DRV8825 следующая:

Текущий предел =Vref x 2

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

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

Драйвер шагового двигателя TMC2208

Говоря о более плавной и тихой работе, давайте взглянем на шаговый драйвер TMC2208. Чип TMC2208 произведен Trinamic, немецкой компанией, специализирующейся на электронике управления движением. TMC2208 — это бесшумный драйвер шагового двигателя, который также можно использовать в качестве прямой замены в системах, предназначенных для драйверов A4988 или DRV8825. Он широко используется в настольных 3D-принтерах, лазерных граверах, сканерах и т. д.

Что отличает этот драйвер от двух других, так это его встроенный блок интерполяции, который обеспечивает 256 делений или микрошагов. Это обеспечивает идеальное синусоидальное управление, которое генерируется внутри чипа. Это означает, что драйвер выдаст на шаговый двигатель 256 микрошагов, независимо от того, какое разрешение микрошагов мы выбрали через два вывода MS:2, 4, 8 или 16 микрошагов. Это обеспечивает более плавную работу и значительно снижает нагрузку на микроконтроллер.

Эта особенность драйвера в сочетании с бесшумной технологией регулирования тока StealthChop2 обеспечивает сверхтихое управление шаговыми двигателями. Вот сравнение уровней шума трех динамиков.

Уровни шума шагового двигателя: A4988 около 65 дБ, DRV8825 около 67 дБ и TMC2208 около 41 дБ.

TMC2208 приводит в движение шаговые двигатели совершенно бесшумно, что действительно впечатляет.

Номинальный ток TMC2208 немного выше, чем у драйвера A4988, или составляет 1,2 А при пиковом токе 2 А. Для установки ограничения тока драйвера мы снова можем использовать тот же метод, который описан для других драйверов. Нам нужно измерить опорное напряжение одним щупом на GND, а другим — рядом с контактом включения.

Формула расчета лимита тока следующая:

Текущий предел =Vref x 0,71

Хотя его можно использовать в качестве прямой замены, драйвер TMC2208 имеет немного другую распиновку по сравнению с драйвером A4988. Здесь у нас есть только два контакта для выбора разрешения микрошагов и для включения драйвера нам нужно подключить контакт Enable к GND.

С точки зрения кодирования он такой же, как и два других драйвера. 

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

В целом, TMC2208 является лучшим драйвером, чем A4988 и DRV8825, но это нормально, поскольку он имеет более высокую цену. Хотя, если вам не нужны эти дополнительные функции и уровень шума вас не беспокоит, два других драйвера — просто отличный выбор.

Заключение

Итак, мы рассмотрели практически все, что нам нужно знать об управлении шаговыми двигателями с помощью Arduino. NEMA17 и три драйвера:A4988, DRV8825 и TMC2208 невероятно универсальны и могут использоваться во многих приложениях, где требуется управление положением. Вы всегда можете узнать больше, изучив некоторые из моих проектов Arduino.

Если вы хотите научиться управлять более крупными шаговыми двигателями, такими как NEMA23 или NEMA34, для этого у меня также есть специальное руководство. 

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


Производственный процесс

  1. Туннель интеллектуальной дезинфекции и санитарии
  2. Процесс термообработки металлических деталей с ЧПУ
  3. LEGO Wall-E с Arduino
  4. Система мониторинга предприятий Windows 10 IoT
  5. Что такое механический пресс?
  6. Как сваривать титан:процесс и методы
  7. Генератор волн JX
  8. Управление / синхронизация сотен реле одновременно
  9. Кусочек Raspberry Pi
  10. Микрофоны:как они сделаны?