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

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

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

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

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

Подробно объясню: как они работают, как подключать к Arduino, как устанавливать предел тока драйверов и как программировать с библиотекой и без. Также покажу, как легко управлять несколькими шаговыми двигателями через Arduino CNC Shield для любых проектов.

Нам предстоит много всего. Можно посмотреть видео или прочитать письменный урок ниже со всеми кодами и схемами подключения.

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

Начну с краткого объяснения, что это такое и как работает — это поможет лучше понять остальное.

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

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

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

Именно поэтому они называются шаговыми — они движутся дискретными шагами.

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

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

Так, 50 шагов ротора × 4 ориентации = 200 шагов на полный оборот. 360° / 200 = 1.8° на шаг.

Катушки статора организованы в две фазы, что видно по 4 проводам двигателя — по два на фазу. Четыре ориентации возможны за счет пропуска тока через фазы в обоих направлениях.

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

Тем не менее, теперь понятно: для управления шаговым двигателем нельзя просто подать питание — ничего не случится. Нужно подавать питание на две фазы в обоих направлениях и посылать импульсы в определенном порядке и временной последовательности. Поэтому нужны драйверы.

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

Управление NEMA17 с Arduino и драйвером A4988

Переходим к первому примеру: управление NEMA17 с драйвером A4988.

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

Обычно NEMA17 имеет 200 шагов (1.8°/шаг), есть модели с 400 шагами (0.9°/шаг). Обозначение NEMA17 описывает только размер передней панели: число — размер в дюймах, деленное на 10 (17/10 = 1.7 дюйма). Для NEMA23 — 2.3 дюйма.

Размер панели фиксирован, но длина NEMA17 варьируется от 20 до 60 мм, меняя потребность в мощности. Обычно определяется допустимым током: 0.3А до 2.5А.

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

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

Отличная фича A4988 (как и у других) — ограничение тока. Позволяет задать ток, который будет потреблять двигатель, независимо от его рейтинга. Можно подключить 2.5А двигатель, но ограничить драйвер 1.5А. Двигатель не на полной мощности, но работает. Если рейтинг двигателя ниже установленного лимита — перегреется. Рекомендуется подбирать драйвер под рейтинг двигателя.

Подключение A4988 к Arduino

Посмотрим, как подключить драйвер, двигатель и Arduino.

Компоненты для урока:

Disclosure: Это партнерские ссылки. Как ассоцииат Amazon я зарабатываю на квалифицированных покупках.

В правом верхнем углу драйвера — пины VMOT и GND: сюда подключается питание двигателя (8–36В). Рекомендуется декуплирующий конденсатор (минимум 47мкФ) для защиты от скачков напряжения.

Далее — 4 пина для двигателя: одна фаза на 1A/1B, вторая — на 2A/2B.

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

Далее — пины логики: VDD и GND (3–5В). С другой стороны — Step и Direction, подключаются к любым пинам Arduino. Direction задает направление вращения, Step — управляет шагами. Каждый импульс на Step = один шаг в выбранном направлении.

Над ними — Sleep и Reset (active low). Sleep по умолчанию HIGH, RST — floating. Чтобы включить драйвер проще всего — соединить эти пины (если их функции не используются). Enable тоже active low — если не притянуть к HIGH, драйвер включен.

Следующие три пина — MS1, MS2, MS3 — выбор микрошага. Разрешение зависит от конструкции двигателя (обычно 200 шагов/оборот для NEMA17). Драйверы имеют микрошаг — промежуточные уровни тока для промежуточных позиций. Например, quarter-step: 200 × 4 = 800 микрошагов/оборот. A4988 поддерживает до 16 микрошагов = 3200 шагов/оборот (0.1125°/шаг). Есть драйверы до 256 микрошагов = 51200 шагов/оборот (0.007°/шаг).

Эти пины имеют pull-down резисторы: если оставить неподключенными — full-step режим. Для другого разрешения подавайте 5В на соответствующие пины по таблице.

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

Теперь, когда знаем подключение, перейдем к программированию. Но перед подачей питания на двигатель — еще одна важная вещь: настройка лимита тока драйвера.

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

На A4988 есть небольшой подстроечный потенциометр для настройки лимита. По часовой — ток растет, против — падает. Два метода определения фактического значения лимита.

Метод 1: Измерение опорного напряжения (Vref) на потенциометре относительно GND. Формула:

Current Limit = Vref / (8 × Rcs)

Rcs — сопротивление токовых резисторов рядом с чипом. Обычно 0.05, 0.1 или 0.2 Ом. Нужно посмотреть маркировку. У меня R100 = 0.1 Ом.

Пример: Vref = 0.7В, Rcs = 0.1 Ом → лимит = 0.875А. Для лимита 1А нужен Vref = 0.8В.

Метод 2: Прямое измерение тока через катушки. Подключаем двигатель и драйвер как описано. Контроллер можно не подключать, но подать 5В на Direction и Step — двигатель удерживает позицию. MS пины оставить не подключенными (full-step). Отключить одну катушку и включить амперметр последовательно. Подав логику (5В) и питание двигателя (12В), считываем ток.

Важно: в full-step ток в катушках достигает только 70% от реального лимита. Для других режимов микрошага показания амперметра умножать на 1.3 для получения реального лимита.

Оба метода дали примерно одинаковые результаты.

Примеры кода для шаговых двигателей и Arduino

Пример кода 1: Базовое управление без библиотеки

/* 
 * Basic example code for controlling a stepper without library 
 * by Dejan, https://howtomechatronics.com 
 */
#define stepPin 2
#define dirPin 5

void setup() {
  pinMode(stepPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
}

void loop() {
  digitalWrite(dirPin, HIGH);
  for(int x = 0; x < 800; x++) {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(700);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(700);
  }
  delay(1000);
  digitalWrite(dirPin, LOW);
  for(int x = 0; x < 1600; x++) {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(500);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(500);
  }
  delay(1000);
}

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

Определяем пины STEP и DIR как выходы. В loop: устанавливаем направление (HIGH), циклом for посылаем 200 импульсов на STEP (полный оборот в full-step). Импульсы — переключение HIGH/LOW с задержкой. Задержка определяет скорость: меньше задержка — выше скорость. Затем меняем направление (LOW) и посылаем 400 импульсов (два оборота). При смене микрошага на quarter-step (800 шагов/оборот) первый цикл даст 90°, второй — полный оборот.

Пример кода 2: Управление скоростью через потенциометр

/* Basic example code for controlling a stepper without library 
 * by Dejan, https://howtomechatronics.com */
#define stepPin 2
#define dirPin 5
int customDelay, customDelayMapped;

void setup() {
  pinMode(stepPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
}

void loop() {
  speedControl();
  digitalWrite(stepPin, HIGH);
  delayMicroseconds(customDelayMapped);
  digitalWrite(stepPin, LOW);
  delayMicroseconds(customDelayMapped);
}

void speedControl() {
  customDelay = analogRead(A0);
  customDelayMapped = map(customDelay, 0, 1023, 300, 3000);
}

Описание: Считываем потенциометр (0–1023), маппим на задержку 300–3000 мкс. Минимум ~300 мкс — ниже двигатель начинает пропускать шаги. Метод прост и работает для простых задач. Для сложного управления лучше использовать библиотеку.

Управление с библиотекой AccelStepper — примеры

Самая популярная библиотека — AccelStepper от Mike McCauley. Очень универсальная: контроль скорости, ускорения/замедления, целевых позиций, одновременное управление несколькими двигателями.

Хорошая документация. Я использовал для Camera Slider, 3D wire bending, SCARA arm и др. Подробности и коды на сайте.

Пример: Управление скоростью через потенциометр с AccelStepper

/* 
 * Basic example code for controlling a stepper with the AccelStepper library 
 * by Dejan, https://howtomechatronics.com 
 */
#include 
AccelStepper stepper1(1, 2, 5); // (Тип драйвера: 2 пина STEP, DIR)

void setup() {
  stepper1.setMaxSpeed(1000);
}

void loop() {
  stepper1.setSpeed(analogRead(A0));
  stepper1.runSpeed();
}

Описание: Подключаем библиотеку (установить через Library Manager). Создаем экземпляр: 1-й параметр — тип драйвера (1 для 2 пинов), остальные — номера пинов. При нескольких двигателях определяем каждый отдельно. В setup: setMaxSpeed — макс. скорость в шагах/сек (до 4000, но >1000 может быть ненадежно). В loop: setSpeed() задает текущую скорость (аналоговый ввод 0–1023), runSpeed() реализует её. Отрицательное значение — обратное направление.

Пример: Два двигателя с ускорением и замедлением

/* Controlling two stepper with the AccelStepper library 
 * by Dejan, https://howtomechatronics.com */
#include 
AccelStepper stepper1(1, 2, 5);
AccelStepper stepper2(1, 3, 6);

void setup() {
  stepper1.setMaxSpeed(1000);
  stepper1.setAcceleration(500);
  stepper1.setCurrentPosition(0);
  stepper2.setMaxSpeed(1000);
  stepper2.setAcceleration(500);
  stepper2.setCurrentPosition(0);
}

void loop() {
  stepper1.moveTo(800);
  stepper1.runToPosition();
  stepper2.moveTo(1600);
  stepper2.runToPosition();
  stepper1.moveTo(0);
  stepper2.moveTo(0);
  while (stepper1.currentPosition() != 0 || stepper2.currentPosition() != 0) {
    stepper1.run();
    stepper2.run();
  }
}

Описание: В setup: setAcceleration() задает ускорение, setCurrentPosition(0) — стартовую позицию. В loop: moveTo() — целевая позиция (в quarter-step 800 = 1 оборот). runToPosition() — блокирующая функция: ждет достижения позиции. Для неблокирующего — run() (делает один шаг за вызов, вызывать часто). Здесь moveTo(0) для обоих, затем while с run() для обоих до позиции 0. В while можно добавлять другой код.

Пример: Координированное управление несколькими двигателями (MultiStepper)

/* Controlling multiple steppers with AccelStepper and MultiStepper 
 * by Dejan, https://howtomechatronics.com */
#include 
#include 
AccelStepper stepper1(1, 2, 5);
AccelStepper stepper2(1, 3, 6);
AccelStepper stepper3(1, 4, 7);
MultiStepper steppersControl;
long gotoposition[3];

void setup() {
  stepper1.setMaxSpeed(1000);
  stepper2.setMaxSpeed(1000);
  stepper3.setMaxSpeed(1000);
  steppersControl.addStepper(stepper1);
  steppersControl.addStepper(stepper2);
  steppersControl.addStepper(stepper3);
}

void loop() {
  gotoposition[0] = 800;
  gotoposition[1] = 1600;
  gotoposition[2] = 3200;
  steppersControl.moveTo(gotoposition);
  steppersControl.runSpeedToPosition();
  delay(1000);
  gotoposition[0] = 0;
  gotoposition[1] = 0;
  gotoposition[2] = 0;
  steppersControl.moveTo(gotoposition);
  steppersControl.runSpeedToPosition();
  delay(1000);
}

Описание: Подключаем MultiStepper, создаем экземпляр и массив long для целевых позиций. В setup: макс. скорости и добавление двигателей в steppersControl. В loop: заполняем массив целями (1, 2, 3 оборота в quarter-step), moveTo() вычисляет нужные скорости для одновременного прихода, runSpeedToPosition() блокирует до завершения. MultiStepper не поддерживает ускорение/замедление.

Arduino CNC Shield для управления несколькими двигателями

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

Щит надевается на Arduino UNO, управляет до 4 двигателей, оставляя остальные пины свободными. Я использовал для 4-осевого SCARA манипулятора.

Обновлю этот раздел с подробностями скоро.

DRV8825 vs A4988

Теперь про DRV8825. Всё, что объяснено для A4988, применимо и к DRV8825: принцип, подключение, код — почти идентичны. Различия в технических характеристиках.

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

Другие нюансы: потенциометр в другом месте, другая формула Vref. DRV8925 не требует логического питания, тот пин — FAULT выход. Безопасно подключить FAULT к 5В для совместимости с A4988.

Важно: при замене A4988 на DRV8825 следите за ориентацией! Потенциометр у A4988 под чипом, у DRV8825 — над чипом. Легко поставить наоборот.

Настройка лимита: измеряем Vref (один зонд на GND, другой на потенциометр). Формула:

Current limit = Vref × 2

Таблица выбора микрошага аналогична.

Итог: DRV8825 лучше A4988 — выше ток, напряжение, разрешение → плавнее и тише работа.

Драйвер TMC2208

Говоря о плавности и тишине — TMC2208. Чип от Trinamic (Германия), специализирующейся на motion control. TMC2208 — бесшумный драйвер, прямая замена для A4988/DRV8825. Широко используется в 3D-принтерах, граверах, сканерах.

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

В сочетании с технологией StealthChop2 (бесшумный контроль тока) — ультра-тихий контроль.

Уровни шума: A4988 ~65 дБ, DRV8825 ~67 дБ, TMC2208 ~41 дБ. TMC2208 управляет абсолютно бесшумно — впечатляюще.

Ток TMC2208 чуть выше A4988: 1.2А (пик 2А). Настройка лимита: измеряем Vref (зонд на GND, другой на контакте рядом с Enable). Формула:

Current limit = Vref × 0.71

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

Код — тот же, что для других.

У TMC2208 есть продвинутые фичи: UART интерфейс (управление одной линией вместо Step/Dir), больше опций настройки.

Итог: TMC2208 лучше A4988 и DRV8825, но дороже. Если не нужны экстра-фичи и шум не критичен — остальные два отличный выбор.

Заключение

Мы рассмотрели практически всё для управления шаговыми двигателями с Arduino. NEMA17 и три драйвера — невероятно универсальны для множества приложений с позиционным контролем. Узнайте больше, изучив мои Arduino-проекты.

Если интересно управление крупнее — NEMA23 или NEMA34 — будет отдельный урок.

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

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

  1. Доступный дыхание-контроллер (Breath Controller) на Arduino с USB-MIDI
  2. Как делаются мгновенные лотерейные билеты: дизайн, безопасность и будущие тренды
  3. Учебный стенд Arduino Mega 2560: сенсоры, моторы, дисплеи и собственная PCB
  4. Создание приложения Fridgeye с дисплеем Nextion: пошаговое руководство
  5. Понимание коксовочного давления: причины, последствия и стратегии снижения
  6. Марки формовочных песков: свойства и применение в литейном деле
  7. Умный браслет на Arduino MKR GSM 1400: мониторинг здоровья и геолокации через Hologram IoT
  8. Архитектурная модель «Умная остановка» с автоматической тентой
  9. PiBot: Робот-пианист на Arduino для точного исполнения музыки
  10. Проверенные стратегии продления ресурса штамповочного инструмента