Компоненты · 14 мин чтения

Драйвер A4988 и NEMA 17: настройка Vref, микрошаг и код

Как управлять NEMA 17 через A4988: подключение STEP/DIR, формула Vref, настройка тока мультиметром, микрошаг MS1–MS3, конденсатор 100 µF, AccelStepper и CNC Shield.

Управлять NEMA 17 через A4988 — самый дешёвый способ перенести в свой проект ту точную механику, на которой работают 3D-принтеры, станки с ЧПУ и лазерные граверы. A4988 — это драйвер биполярного шагового двигателя от компании Allegro, который продаётся на модуле размером с подушечку пальца: каждый импульс STEP от Arduino поворачивает мотор на один шаг, пин DIR задаёт направление, а сам драйвер держит ток через обмотки мотора на том значении, которое ты выставишь. Иначе говоря, чтобы вращать мотор, хватит двух пинов и источника питания на 8–35 V.

В этом руководстве разберём, как работает A4988, как найти обмотки NEMA 17 мультиметром, как всё подключить и зачем на линии питания нужен конденсатор 100 µF. Затем перейдём к самому важному шагу — настройке тока через Vref: пошагово разберём формулу и измерение мультиметром. Здесь же — микрошаг через пины MS1–MS3, первый скетч без библиотеки, плавный разгон с AccelStepper, CNC Shield, код для ESP32 и Raspberry Pi Pico, нагрев и радиаторы, сравнение с DRV8825 и TMC2208 и решения классической проблемы «мотор дрожит, но не крутится».

Модуль драйвера шагового двигателя A4988
Модуль драйвера шагового двигателя A4988: 16 пинов в два ряда и маленький потенциометр, которым задаётся ограничение тока.

Что такое A4988 и как он работает?

Внутри A4988 два полных H-моста (по одному на обмотку), транслятор и схема управления током. Транслятор превращает каждый переход LOW→HIGH на пине STEP в нужную последовательность токов для обмоток, так что порядок переключения обмоток в коде считать не нужно. Ток регулируется по принципу чоппера: драйвер постоянно следит за током каждой обмотки через маленький токоизмерительный резистор (Rs) и на короткое время отключает выход, как только ток доходит до заданного предела. Поэтому ток обмоток остаётся безопасным, даже если питать мотор напряжением намного выше номинального, например 12 или 24 V. Кроме того, в микросхеме есть защита от перегрева, пониженного напряжения, короткого замыкания нагрузки и замыкания на землю.

ПараметрЗначение
Питание мотора (VMOT)8–35 V
Питание логики (VDD)3–5,5 V (5 V с Arduino, 3,3 V с ESP32 и Pico)
Ток на обмоткуОколо 1 A без радиатора, до 2 A при хорошем охлаждении
МикрошагПолный шаг, 1/2, 1/4, 1/8, 1/16
Управляющие пиныSTEP, DIR, ENABLE, MS1–MS3, RESET, SLEEP
Импульс STEPЧасти HIGH и LOW не короче 1 µs каждая
ЗащитаТепловая защита (165 °C), блокировка при пониженном напряжении, защита от короткого замыкания
Подходящие моторы4-проводные биполярные шаговые двигатели (NEMA 17, NEMA 14 и др.)

Шаговый двигатель NEMA 17: характеристики и поиск обмоток

NEMA 17 — это не модель мотора, а типоразмер для моторов с фланцем 42 × 42 мм; начинка зависит от длины корпуса и производителя. Самая распространённая в хобби-проектах модель 17HS4401 делает 200 шагов на оборот (1,8°), имеет номинальный ток 1,7 A на фазу, сопротивление обмотки около 1,5 Ω и момент удержания примерно 40 Н·см. Напряжение на её наклейке всего 1,7 A × 1,5 Ω ≈ 2,6 V, но пусть это не вводит в заблуждение: A4988 сам ограничивает ток, поэтому мотор питают от 12–24 V. Более высокое напряжение позволяет току обмотки быстрее нарастать на каждом шаге, и на высоких оборотах мотор теряет меньше момента. Чем он отличается от маленьких униполярных моторов вроде 28BYJ-48, можно узнать в статье 28BYJ-48 и ULN2003.

4 провода мотора принадлежат двум независимым обмоткам, и перед подключением к A4988 нужно знать, какие два провода относятся к одной обмотке. У многих моделей чёрный и зелёный — одна обмотка, красный и синий — другая, но цвета у разных производителей отличаются, поэтому надёжнее всего измерить:

  1. Переключи мультиметр в режим измерения сопротивления (Ω); если непонятно, как это сделать, загляни в руководство по мультиметру.
  2. Зафиксируй один провод и по очереди измерь его с каждым из трёх остальных. Провод, с которым прибор показывает 1–4 Ω, — второй конец той же обмотки; с двумя другими на экране будет обрыв (OL).
  3. Оставшиеся два провода — вторая обмотка, между ними должно быть такое же сопротивление. По измеренному сопротивлению и номинальному току можно проверить напряжение с наклейки мотора в калькуляторе закона Ома.
  4. Нет мультиметра? Соедини концы двух проводов и покрути вал рукой: если он стал заметно туже, эти два провода — одна обмотка.
  5. Подключи одну обмотку к пинам 1A–1B драйвера A4988, а другую — к 2A–2B. Если мотор вращается не в ту сторону, достаточно поменять местами два провода одной из обмоток.

Распиновка A4988 и схема подключения

Пин A4988Arduino UnoESP32Raspberry Pi Pico
VMOTПлюс адаптера 12–24 V (+ 100 µF)Плюс адаптера 12–24 V (+ 100 µF)Плюс адаптера 12–24 V (+ 100 µF)
GND (рядом с VMOT)Минус адаптераМинус адаптераМинус адаптера
1A, 1BОбмотка 1 мотораОбмотка 1 мотораОбмотка 1 мотора
2A, 2BОбмотка 2 мотораОбмотка 2 мотораОбмотка 2 мотора
VDD5V3V33V3 (OUT)
GND (рядом с VDD)GNDGNDGND
STEPD2GPIO 25GP2
DIRD5GPIO 26GP3
ENABLED8GPIO 27GP4
MS1, MS2, MS35V (шаг 1/16)3V3 (шаг 1/16)3V3 (шаг 1/16)
RESET, SLEEPСоединить перемычкойСоединить перемычкойСоединить перемычкой
Никогда не подключай и не отключай провода мотора, пока на драйвер подано питание: энергия, накопленная в обмотке, в этот момент даёт высоковольтный выброс, который может мгновенно вывести A4988 из строя. Перепутанная полярность VMOT тоже сжигает микросхему. Если пин RESET остаётся «висящим» (неподключённым), драйвер не работает или ведёт себя непредсказуемо; соедини его с соседним пином SLEEP. Минус адаптера и GND Arduino обязательно должны быть соединены (см. общая земля).

Почему конденсатор 100 µF обязателен?

На платах A4988 стоят только маленькие керамические конденсаторы. Вместе с индуктивностью проводов питания эти конденсаторы с низким ESR дают выбросы напряжения при включении питания или при резком скачке тока мотора. Даже при питании 12 V такие выбросы могут превысить предельные для микросхемы 35 V и навсегда повредить драйвер. Решение простое: поставь между VMOT и GND, как можно ближе к плате, электролитический конденсатор не меньше 47 µF, а лучше 100 µF. Его номинальное напряжение должно быть с хорошим запасом выше напряжения питания: для 12 V выбирай 25 V, для 24 V — 35 V или 50 V. Электролитические конденсаторы полярные: длинная ножка (+) идёт на VMOT, а короткая (–), со стороны полоски на корпусе, — на GND. О типах конденсаторов читай в статье Что такое конденсатор?, а как подобрать адаптер — в статье питание Arduino.

Настройка тока через Vref: формула

Маленький потенциометр на A4988 задаёт Vref (опорное напряжение), от которого зависит максимальный ток мотора. Драйвер сравнивает это напряжение с падением напряжения на двух токоизмерительных резисторах (Rs) на плате, а пиковый ток обмотки считается так: I = Vref / (8 × Rs). Чтобы найти нужное Vref, переставим формулу: Vref = I × 8 × Rs. Значение Rs смотри по маркировке двух маленьких SMD-резисторов рядом с микросхемой: R100 означает 0,1 Ω, R068 — 0,068 Ω, а R050 — 0,05 Ω. Если с кодами сложно, воспользуйся утилитой SMD-кодов или статьёй коды SMD-резисторов.

Маркировка RsНоминал RsФормулаVref для 0,8 AVref для 1 AVref для 1,2 A
R0500,05 ΩVref = I × 0,40,32 V0,40 V0,48 V
R0680,068 ΩVref = I × 0,5440,44 V0,54 V0,65 V
R1000,1 ΩVref = I × 0,80,64 V0,80 V0,96 V

Какой ток выбрать? Ток с наклейки мотора (1,7 A для 17HS4401) — это потолок, который превышать нельзя. Без радиатора A4988 спокойно выдерживает около 1 A, поэтому 0,8–1 A — хорошая отправная точка. На распространённых платах с резисторами R100 это означает Vref 0,64–0,80 V. Если под нагрузкой мотор пропускает шаги, повышай ток шагами по 0,1 A; если нужно больше 1,2 A, добавь на микросхему радиатор и вентилятор. Лишний ток гораздо сильнее нагревает драйвер и мотор, чем делает мотор заметно мощнее.

Измерение Vref мультиметром: пошагово

  1. При полностью отключённом питании отсоедини мотор от драйвера. Для измерения Vref мотор не нужен.
  2. Подай питание логики на пины VDD и GND драйвера A4988 (хватит 5V от Arduino). Vref формируется из этого напряжения, поэтому без VDD измерить его нельзя; если VMOT остаётся подключённым, ничего страшного.
  3. Переключи мультиметр в режим постоянного напряжения (диапазон 2 V или 20 V). Чёрным щупом коснись GND, а красным — металлической верхушки потенциометра; на некоторых платах вместо этого есть маленькая контрольная точка с надписью VREF.
  4. Поворачивай потенциометр совсем чуть-чуть маленькой пластиковой или керамической отвёрткой и следи за показаниями. На большинстве плат вращение по часовой стрелке увеличивает Vref, но бывает по-разному; некоторые потенциометры после полного оборота возвращаются в начало, так что двигайся маленькими шагами.
  5. Когда расчётное значение достигнуто, отключи питание, подключи мотор и только после этого снова подай питание.
  6. Дай мотору поработать несколько минут и проверь температуру микросхемы. Если палец не удаётся удержать на ней даже несколько секунд, немного уменьши Vref или поставь радиатор.
Удобный приём: прицепи красный щуп «крокодилом» к металлической отвёртке — тогда показания будут видны прямо во время вращения потенциометра; только следи, чтобы отвёртка не касалась соседних пинов. Vref формируется из VDD, поэтому при смене питания логики с 5 V на 3,3 V (например, при переходе с Arduino на ESP32) Vref нужно измерить заново. Если хочется измерить ток через одну обмотку амперметром, делай это в полношаговом режиме и помни, что прибор покажет примерно 70% от заданного предела.

Микрошаг через MS1, MS2 и MS3

Микрошаг (microstepping) — это когда драйвер плавно меняет ток в двух обмотках и делит каждый полный шаг на более мелкие части. A4988 выбирает один из пяти режимов по логическим уровням на пинах MS1–MS3. У этих пинов есть встроенные стягивающие резисторы (pull-down), поэтому если все три оставить неподключёнными, мотор работает в режиме полного шага.

MS1MS2MS3РежимШагов на оборотУгол шага
LOWLOWLOWПолный шаг2001,8°
HIGHLOWLOWПолушаг4000,9°
LOWHIGHLOWШаг 1/48000,45°
HIGHHIGHLOWШаг 1/816000,225°
HIGHHIGHHIGHШаг 1/1632000,1125°

Главная польза микрошага — плавное и тихое вращение: в полношаговом режиме мотор дёргается на каждом шаге, а на некоторых скоростях входит в резонанс и вибрирует, тогда как в режиме 1/16 движение почти непрерывное. Но не стоит ждать, что точность и правда вырастет в 16 раз. Момент, который продвигает вал на один микрошаг, составляет всего sin(90° / 16) ≈ 10% от момента удержания; если трение или нагрузка пересиливают эту маленькую силу, мотор отстаёт на несколько микрошагов. Скорость считается по формуле шагов/с = об/мин × 200 × микрошаг / 60. Например, для 60 об/мин в режиме 1/16 нужно 3200 импульсов STEP в секунду. Если режим нужно менять программно, пины MS тоже можно подключить к Arduino; но в большинстве проектов достаточно задать постоянный режим проводами.

Первый скетч: вращение через STEP и DIR без библиотеки

Скетч ниже без всяких библиотек, только импульсами на пин STEP, поворачивает мотор на один оборот вперёд и на один назад. Считаем, что MS1–MS3 подключены к 5V, то есть мотор работает в режиме 1/16 и один оборот — это 3200 шагов.

C++ (Arduino IDE)
1// A4988 + NEMA 17, kütüphanesiz / without a library
2const int STEP_PIN = 2;            // CNC Shield X ekseniyle aynı / same as CNC Shield X axis
3const int DIR_PIN  = 5;
4const int EN_PIN   = 8;            // aktif LOW / active LOW
5
6const long STEPS_PER_REV = 200L * 16;   // 1,8° motor, 1/16 mikro adım = 3200 / 1.8° motor, 1/16 microstep
7
8void setup() {
9  pinMode(STEP_PIN, OUTPUT);
10  pinMode(DIR_PIN, OUTPUT);
11  pinMode(EN_PIN, OUTPUT);
12  digitalWrite(EN_PIN, LOW);       // sürücüyü aç / enable the driver
13}
14
15void rotate(long steps, unsigned int pauseUs) {
16  digitalWrite(DIR_PIN, steps > 0 ? HIGH : LOW);   // yön / direction
17  delayMicroseconds(5);                           // DIR, STEP'ten önce otursun / let DIR settle before STEP
18  for (long i = 0; i < labs(steps); i++) {
19    digitalWrite(STEP_PIN, HIGH);
20    delayMicroseconds(5);                         // darbe en az 1 µs / pulse at least 1 µs
21    digitalWrite(STEP_PIN, LOW);
22    delayMicroseconds(pauseUs);                   // küçüldükçe hız artar / smaller = faster
23  }
24}
25
26void loop() {
27  rotate(STEPS_PER_REV, 500);      // 1 tur ileri, ~1,6 sn / one turn forward, ~1.6 s
28  delay(1000);
29  rotate(-STEPS_PER_REV, 500);     // 1 tur geri / one turn back
30  delay(1000);
31}

В этом коде важны три тайминга. A4988 требует, чтобы части HIGH и LOW импульса STEP длились не меньше 1 µs; 5 µs — безопасное значение. После смены DIR перед первым импульсом STEP нужно выждать не меньше 200 нс; в коде для этого стоит пауза 5 µs. Скорость задаётся паузой между импульсами: при паузе 500 µs один шаг занимает около 0,51 мс, так что оборот (3200 шагов) длится около 1,6 секунды — это примерно 36 об/мин. У этого кода две слабые стороны: мотор резко стартует сразу на полной скорости, а пока идёт цикл, Arduino не может делать ничего другого. Если сразу уменьшить паузу до 100 µs, мотор, скорее всего, не сможет стартовать и будет только гудеть.

Разгон и торможение с AccelStepper

Шаговый двигатель нельзя мгновенно разогнать с места до высокой скорости: ротор и нагрузка не успевают за таким резким изменением, мотор теряет синхронизацию и пропускает шаги. Решение — наращивать скорость плавно, по рампе, и так же плавно снижать её на подходе к цели. Библиотека AccelStepper, которую можно установить через «Менеджер библиотек» (Library Manager), делает это без блокировки: ты постоянно вызываешь run() внутри loop(), а библиотека делает шаг, когда для него подходит время. Так, пока мотор крутится, можно опрашивать кнопки, обновлять дисплей или снимать показания датчиков; подробно этот подход описан в статье millis() и delay(). На Uno AccelStepper надёжно выдаёт несколько тысяч шагов в секунду (в документации указано около 4000 шагов/с при 16 MHz), поэтому в примере используется 2000 шагов/с — это около 37 об/мин в режиме 1/16.

C++ (Arduino IDE)
1#include <AccelStepper.h>
2
3const int STEP_PIN = 2;
4const int DIR_PIN  = 5;
5const int EN_PIN   = 8;
6const long STEPS_PER_REV = 200L * 16;            // 1/16 mikro adımda 1 tur / one turn at 1/16 microstep
7
8AccelStepper stepper(AccelStepper::DRIVER, STEP_PIN, DIR_PIN);
9
10void setup() {
11  stepper.setEnablePin(EN_PIN);
12  stepper.setPinsInverted(false, false, true);   // EN aktif LOW / EN is active LOW
13  stepper.enableOutputs();
14  stepper.setMaxSpeed(2000);                     // adım/sn, Uno için güvenli / steps per second, safe on Uno
15  stepper.setAcceleration(1500);                 // adım/sn² / steps per second²
16  stepper.moveTo(STEPS_PER_REV * 3);             // 3 tur ileri / three turns forward
17}
18
19void loop() {
20  if (stepper.distanceToGo() == 0) {             // hedefe varıldı / target reached
21    delay(500);
22    stepper.moveTo(stepper.currentPosition() == 0 ? STEPS_PER_REV * 3 : 0);   // git-gel / back and forth
23  }
24  stepper.run();                                 // her döngüde çağır, bekletmez / call every loop, non-blocking
25}
ФункцияЧто делает
AccelStepper(AccelStepper::DRIVER, STEP, DIR)Создаёт объект для драйвера со входами STEP/DIR
setMaxSpeed(шагов/с)Максимальная скорость, которую нужно набрать
setAcceleration(шагов/с²)Темп разгона и торможения
moveTo(позиция) / move(шаги)Перейти в абсолютную позицию или сместиться относительно текущей
run()Делает шаг, если пришло время; нужно постоянно вызывать внутри loop()
runToPosition()Блокирует программу до достижения цели
distanceToGo() / currentPosition()Оставшиеся шаги и текущая позиция
setCurrentPosition(0)Принимает текущую точку за ноль (после поиска нуля по концевому выключателю)
setEnablePin() / setPinsInverted()Задаёт пин EN; инвертируется, потому что у A4988 EN — активный LOW
enableOutputs() / disableOutputs()Подаёт ток на обмотки или отпускает их

Несколько моторов с CNC Shield V3

Если моторов NEMA 17 больше одного, проще всего избежать путаницы проводов с помощью Arduino CNC Shield V3. Эта плата надевается на Uno и несёт четыре гнезда под A4988 (X, Y, Z и A), перемычки микрошага под каждым драйвером, разъёмы для моторов, входы концевых выключателей и клемму питания; если установлены все три перемычки, A4988 работает в режиме 1/16. В таблице подключения мы намеренно выбрали D2, D5 и D8 для STEP, DIR и EN: это пины оси X на шилде, так что скетчи выше работают на шилде без изменений. Если загрузить в Uno прошивку GRBL, шилд превращается в контроллер ЧПУ или лазера, который принимает G-code с компьютера. В GRBL количество шагов на миллиметр для каждой оси задаётся в настройках $100, $101 и $102: со шкивом GT2 на 20 зубьев и микрошагом 1/16 это 200 × 16 / (20 × 2) = 80 шагов/мм, а на ходовом винте T8 с шагом резьбы 8 мм — 200 × 16 / 8 = 400 шагов/мм.

ОсьSTEPDIRПримечание
XD2D5Концевой выключатель D9
YD3D6Концевой выключатель D10
ZD4D7Концевой выключатель D12 (GRBL 1.1)
AПеремычкамиПеремычкамиДублирует X, Y или Z (например, ось Y с двумя моторами)
Все драйверы––Общий пин EN D8: LOW = драйверы включены
Вставляя драйвер в шилд, не ориентируйся на положение потенциометра; совмести пин EN на драйвере с надписью EN на шилде. Драйвер, вставленный наоборот, сгорает в момент подачи питания. Если в коде D8 не переводится в LOW, моторы вообще не сдвинутся. Если вместо A4988 поставить в шилд DRV8825, три перемычки дают режим 1/32, и число шагов на оборот удваивается. Хотя на клемме шилда написано 12–36 V, предел для A4988 — 35 V; безопаснее всего 12 или 24 V.

A4988 с ESP32

Пины ESP32 выдают 3,3 V. A4988 надёжно считает вход за HIGH, только если напряжение выше 70% от VDD; при VDD 5 V порог составляет 3,5 V, и сигнала 3,3 V не хватает. Поэтому при работе с ESP32 или Pico подключай пин VDD драйвера A4988 к 3V3: драйвер спокойно работает от 3–5,5 V, и преобразователь уровней не понадобится. Раз VDD изменилось, не забудь заново измерить Vref. Скетч ниже с разгоном поворачивает мотор на угол, который вводится в мониторе порта (например, 90 или -45). ESP32 намного быстрее, поэтому AccelStepper здесь легко выходит на 6000 шагов в секунду; для ещё больших скоростей присмотрись к библиотеке FastAccelStepper, которая использует аппаратные таймеры. Если ESP32 для тебя в новинку, начни со статьи Что такое ESP32?.

C++ (Arduino IDE)
1#include <AccelStepper.h>
2
3// ESP32: STEP=25, DIR=26, EN=27, A4988 VDD → 3V3
4const int STEP_PIN = 25;
5const int DIR_PIN  = 26;
6const int EN_PIN   = 27;
7const float STEPS_PER_DEG = 200.0 * 16 / 360.0;  // 1/16'da derece başına 8,89 adım / 8.89 steps per degree at 1/16
8
9AccelStepper stepper(AccelStepper::DRIVER, STEP_PIN, DIR_PIN);
10
11void setup() {
12  Serial.begin(115200);
13  stepper.setEnablePin(EN_PIN);
14  stepper.setPinsInverted(false, false, true);   // EN aktif LOW / EN is active LOW
15  stepper.enableOutputs();
16  stepper.setMaxSpeed(6000);                     // adım/sn / steps per second
17  stepper.setAcceleration(4000);                 // adım/sn² / steps per second²
18  Serial.println("Aci yaz, ornek 90 / type an angle, e.g. 90");
19}
20
21void loop() {
22  if (Serial.available()) {
23    float angle = Serial.parseFloat();           // Seri Monitör'den açı / angle from the Serial Monitor
24    while (Serial.available()) Serial.read();    // satır sonunu at / drop the line ending
25    stepper.moveTo(lround(angle * STEPS_PER_DEG));
26    Serial.printf("Hedef / target: %.1f\n", angle);
27  }
28  stepper.run();                                 // bekletmeden adım at / step without blocking
29}

A4988 с Raspberry Pi Pico и MicroPython

На Pico пин VDD драйвера A4988 тоже подключается к пину 3V3 (OUT). Вместо библиотеки разгона в MicroPython можно написать простую линейную рампу, как ниже: функция move() на первых и последних 600 шагах плавно меняет паузу между импульсами от 2000 µs до 400 µs, а в середине идёт на полной скорости. Цикл MicroPython добавляет к каждому шагу несколько десятков микросекунд, поэтому реальная скорость немного ниже расчётной. Если нужны десятки тысяч шагов в секунду или несколько моторов одновременно, блоки PIO на Pico могут формировать импульсы, вообще не нагружая процессор. Как установить MicroPython на Pico, читай в статье Что такое Raspberry Pi Pico?.

MicroPython
1from machine import Pin
2import time
3
4step = Pin(2, Pin.OUT)              # STEP → GP2
5direction = Pin(3, Pin.OUT)         # DIR → GP3
6enable = Pin(4, Pin.OUT, value=0)   # EN → GP4, 0 = sürücü açık / 0 = driver enabled
7
8STEPS_PER_REV = 200 * 16            # 1/16 mikro adım / 1/16 microstep
9
10def move(steps, max_sps=2500, ramp_steps=600):
11    direction.value(1 if steps > 0 else 0)    # yön / direction
12    time.sleep_us(5)
13    n = abs(steps)
14    ramp = min(ramp_steps, n // 2)            # hızlanma ve yavaşlama adımı / accel and decel steps
15    fast = 1000000 // max_sps                 # en kısa bekleme, µs / shortest pause, µs
16    slow = 2000                               # 500 adım/sn ile başla / start at 500 steps/s
17    for i in range(n):
18        k = min(i, n - 1 - i)                 # başa ya da sona uzaklık / distance to start or end
19        pause = slow - (slow - fast) * k // ramp if k < ramp else fast
20        step.value(1)
21        time.sleep_us(3)                      # STEP darbesi / STEP pulse
22        step.value(0)
23        time.sleep_us(pause)
24
25while True:
26    move(STEPS_PER_REV)             # 1 tur ileri / one turn forward
27    time.sleep(1)
28    move(-STEPS_PER_REV // 2)       # yarım tur geri / half a turn back
29    time.sleep(1)

Нагрев, радиаторы и тепловая защита

Нагрев A4988 — это нормально: ток обмоток проходит через MOSFET-транзисторы внутри микросхемы. Полное сопротивление пути тока каждой обмотки обычно составляет 0,64 Ω, а рассеиваемая мощность растёт пропорционально квадрату тока: примерно P ≈ I² × 0,64 Ω. При токе 1 A это около 0,65 W, при 1,5 A — около 1,45 W; по мере нагрева сопротивление микросхемы тоже растёт, так что в реальности цифра ещё выше. Для платы размером с подушечку пальца это очень много тепла. Когда микросхема нагревается до 165 °C, тепловая защита отключает выходы и включает их снова, когда температура опустится примерно на 15 °C. Мотор, который несколько секунд работает, останавливается, а потом сам продолжает вращаться, — классический признак срабатывания этой защиты.

  • Поставь радиатор: Приклей на микросхему маленький алюминиевый радиатор на термоскотч; следи, чтобы он не касался пинов и потенциометра.
  • Обеспечь обдув: При токе выше 1,2 A или в закрытом корпусе маленький вентилятор многократно усиливает эффект радиатора.
  • Ставь ток по потребности: Если мотор под нагрузкой не пропускает шаги, немного уменьши Vref; снижение тока на 20% уменьшает нагрев примерно на 36%.
  • Отключай обмотки в простое: Если момент удержания не нужен, после окончания движения переведи пин EN в HIGH или вызови disableOutputs(); остынут и драйвер, и мотор.
  • Следи и за температурой мотора: Шаговые двигатели потребляют ток даже в неподвижном состоянии, поэтому становятся тёплыми или даже горячими. Если корпус нагревается выше 60 °C, уменьши ток; при такой температуре PLA-детали 3D-принтера начинают размягчаться.
  • Перейди на более мощный драйвер: Если мотору нужно больше 1,5 A, лучше подойдёт драйвер вроде DRV8825 или TMC2209.

A4988, DRV8825 и TMC2208: сравнение

ПараметрA4988DRV8825TMC2208
Напряжение мотора8–35 V8,2–45 V4,75–36 V
Комфортный длительный токОколо 1 A (без радиатора)Около 1,5 A (без радиатора)Около 0,85 A RMS (с небольшим радиатором)
Максимальный ток2 A (при хорошем охлаждении)2,2 A (при хорошем охлаждении)Около 1,4 A RMS (пиковый 2 A)
Самый мелкий микрошаг1/161/321/16 (с интерполяцией до 1/256)
Ток через VrefI = Vref / (8 × Rs)I = Vref × 2Зависит от платы, по формуле производителя
Пин питания логикиНужен VDDНе нужен (этот пин — выход FAULT)Нужен VIO
ШумЗаметный пискПиск, как у A4988Почти бесшумный (StealthChop)
Минимальный импульс STEP1 µs1,9 µsОчень короткий, не проблема
Когда выбиратьДля начала, дёшево и распространёнНужны больший ток и напряжениеТихие 3D-принтеры и настольные станки

Все три драйвера используют одинаковый 16-пиновый формат «StepStick» и часто взаимозаменяемы на CNC Shield, но есть отличия, о которых стоит помнить. У DRV8825 потенциометр расположен в другом месте и формула другая; пин, который у A4988 служит VDD, у DRV8825 — выход FAULT. При том же коде TMC2208 вращает мотор в обратную сторону по сравнению с A4988, поэтому нужно программно инвертировать DIR или развернуть разъём мотора на 180°. Расширенные настройки делаются через UART, а если нужен поиск нуля без датчиков (StallGuard), смотри TMC2209. Короче говоря, для обучения и недорогих проектов A4988 по-прежнему самый разумный старт; если важна тишина, выбирай TMC2208, если нужен больший ток — DRV8825. Общее сравнение типов моторов — в статье DC-мотор, сервопривод и шаговый двигатель.

Мотор дрожит, но не крутится: частые ошибки и решения

СимптомВероятная причинаРешение
Мотор дрожит и гудит, но не крутитсяНеверные пары обмоток: 1A–1B не на одной обмоткеНайди обмотки мультиметром; одну подключи к 1A–1B, другую — к 2A–2B
Вал качается туда-сюдаОборван провод обмотки или плохой контакт на макетной платеПодключи провода мотора через винтовые клеммы или пайкой и прозвони каждый провод
На малой скорости крутится, при разгоне останавливается и пищитСлишком высокая скорость, нет разгона или слишком низкое напряжение питанияДобавь разгон через AccelStepper, снизь максимальную скорость, попробуй 24 V вместо 12 V
Слабый, легко останавливается рукой, пропускает шагиСлишком низкое Vref (предел тока)Повышай Vref шагами по 0,1 A
Работает несколько секунд, останавливается, потом продолжаетПерегрев, срабатывает тепловая защитаДобавь радиатор и вентилятор, снизь ток
Момента нет совсем, вал вращается свободноEN в HIGH, RESET «висит» или нет VMOT либо VDDСоедини RESET с SLEEP, переведи EN в LOW, измерь питание мультиметром
Всегда крутится в одну сторонуПин DIR не подключён или в коде указан не тот пинПроверь провод DIR и номер пина в коде
Arduino перезагружается при старте мотораМотор и Arduino питаются от одного слабого источникаИспользуй для мотора отдельный адаптер и соедини GND
Драйвер внезапно сгорелМотор отключён под питанием, нет конденсатора или драйвер вставлен наоборотДелай подключения при выключенном питании, добавь 100 µF, ориентируй драйвер по пину EN
При проблеме «дрожит, но не крутится» первым делом упрости тест до минимума: запусти скетч без библиотеки, приведённый выше, с паузой 2000 µs. Если на такой малой скорости мотор крутится плавно, подключение в порядке, а проблема в скорости или разгоне; если он по-прежнему дрожит, дело в парах обмоток, проводе или настройке тока. Arduino, которая перезагружается вместе со стартом мотора, — это отдельная проблема с питанием; подробности в статье Почему Arduino перезагружается?.

Идеи проектов с A4988 и NEMA 17

  • Слайдер для камеры: Перемещай камеру по направляющей миллиметр за миллиметром с помощью ремня и шкива GT2 и снимай таймлапс-видео.
  • Плоттер с ручкой (pen plotter): Двигай ручку по двум осям с CNC Shield и GRBL, чтобы переносить рисунки с компьютера на бумагу; чтобы поднимать и опускать ручку, хватит одного сервопривода.
  • Поворотный столик: Поворачивай предмет на равные углы для предметной съёмки или 3D-сканирования; в режиме 1/16 оборот — это 3200 шагов, так что между каждым из 36 снимков нужно примерно 89 шагов.
  • Солнечный трекер: Собери механизм, который в течение дня поворачивает панель к солнцу; вся идея описана в статье солнечный трекер.
  • Основание робота-манипулятора: Поворачивай основание тяжёлой руки мотором NEMA 17 с шестернями вместо сервопривода; про остальные суставы читай в статье робот-манипулятор.
  • Ручное позиционирование: Перемещай мотор быстро джойстиком и точно, шаг за шагом, поворотным энкодером.
  • Автоматическая штора или сдвижная крышка: При запуске найди нулевую точку по концевому выключателю, запомни её через setCurrentPosition(0) и перемещай штору в любое нужное положение.

Вкратце, управление NEMA 17 через A4988 выглядит так: правильно подбери пары обмоток, поставь 100 µF на линию питания, рассчитай Vref по формуле и выставь его мультиметром, выбери микрошаг и запускай мотор с разгоном. Когда эта основа освоена, становится понятно, как устроены 3D-принтеры, станки с ЧПУ и подобные машины. В приложении BlueGrays есть проекты с движением, например «Работа с шаговым мотором» и «Сервопривод на 360 градусов из шагового мотора», — пошагово, со схемами и кодом.

Частые вопросы

Каким должно быть Vref у A4988?

Vref считается по формуле Vref = I × 8 × Rs. На распространённых платах с резисторами R100 (0,1 Ω) она превращается в Vref = I × 0,8, так что для 1 A выставляется 0,8 V. Для NEMA 17 на 1,7 A, например 17HS4401, без радиатора хороший старт — 0,64–0,8 V (0,8–1 A); с радиатором можно подняться до 0,96 V (1,2 A).

Потянет ли A4988 мотор NEMA 17 и какой ток он выдаёт?

Да, A4988 — самый распространённый драйвер для NEMA 17. Без радиатора он спокойно выдаёт около 1 A на обмотку, а с хорошим радиатором и вентилятором — до 2 A. На практике, если длительно нужно больше 1,2–1,5 A, DRV8825 или TMC2209 справятся легче.

Какое напряжение нужно шаговому двигателю NEMA 17?

Напряжение на наклейке (около 2,6 V у 17HS4401) — это просто сопротивление обмотки, умноженное на номинальный ток, а не напряжение, которое нужно подавать прямо на мотор. A4988 сам ограничивает ток, поэтому мотор питают от 12–24 V; более высокое напряжение даёт больше момента на высоких оборотах. Максимум для A4988 — 35 V.

Почему шаговый двигатель дрожит, но не крутится?

Чаще всего неправильно подобраны пары обмоток: два провода одной обмотки должны идти на 1A–1B, а провода другой — на 2A–2B. Другие причины — слишком высокая скорость без разгона, низкое Vref, оборванный провод или слабый источник питания. Сначала проверь мотор на очень малой скорости; если он крутится плавно, проблема в скорости.

Почему A4988 так сильно греется?

Ток обмоток проходит через MOSFET-транзисторы внутри микросхемы, а нагрев растёт пропорционально квадрату тока: при переходе с 1 A на 1,5 A он увеличивается больше чем вдвое. Выше 1 A нужны радиатор и обдув. При 165 °C микросхема сама отключается; признак этого — мотор время от времени останавливается и снова запускается.

A4988, DRV8825 или TMC2208: что выбрать?

A4988 самый дешёвый и простой в освоении, микрошаг у него до 1/16. DRV8825 выдерживает до 45 V, умеет микрошаг 1/32 и без радиатора даёт больший ток. TMC2208 популярен в 3D-принтерах, потому что почти бесшумен, но рассчитан на меньший ток и вращает мотор в обратную сторону по сравнению с A4988.

Все проекты
Работа с шаговым мотором
#67Средний
Premium

Работа с шаговым мотором

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

4.5(31)
42
Сервопривод на 360 градусов из шагового мотора
#68Средний
Premium

Сервопривод на 360 градусов из шагового мотора

Научи обычный шаговый мотор вставать на любой нужный угол по всему кругу. Arduino вычисляет, сколько шагов нужно для каждого угла; мотор по очереди поворачивается на 0, 90, 45, 180, 135 и 360 градусов

4.5(22)
32
Работа с сервоприводом
#35Новичок
Premium

Работа с сервоприводом

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

4.7(48)
67
Управление сервоприводом потенциометром
#36Новичок
Premium

Управление сервоприводом потенциометром

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

4.6(37)
52
Управление сервоприводом джойстиком
#60Средний
Premium

Управление сервоприводом джойстиком

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

4.7(42)
58
Сервопривод на ESP32 (управление потенциометром)
#118Средний
Premium

Сервопривод на ESP32 (управление потенциометром)

В этом проекте сервопривод SG90 управляется потенциометром. Угол сервопривода задаётся сопоставлением аналогового значения потенциометра с диапазоном 0–180 градусов. Библиотека ESP32Servo формирует сигналы сервопривода на подходящих выходных пинах GPIO у ESP32; этот проект использует GPIO 18. Это базовый способ управления для роборук, подвесов камер и механизмов автоматических дверей.

4.3(29)
42
Машинка на L298N с управлением по Bluetooth
#80Продвинутый
Premium

Машинка на L298N с управлением по Bluetooth

Преврати телефон в пульт и управляй своей машинкой-роботом. Arduino получает команды из приложения-пульта на телефоне через Bluetooth-модуль и вращает колёса через драйвер моторов; машинка едет вперёд

5.0(38)
65
Робот, объезжающий препятствия
#81Продвинутый
Premium

Робот, объезжающий препятствия

Как насчёт того, чтобы собрать умную машину, которая сама находит дорогу? Робот, объезжающий препятствия, постоянно осматривает всё вокруг благодаря ультразвуковому датчику спереди. Встретив препятств

5.0(38)
49