Драйвер 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 два полных 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–4 Ω, — второй конец той же обмотки; с двумя другими на экране будет обрыв (OL).
- Оставшиеся два провода — вторая обмотка, между ними должно быть такое же сопротивление. По измеренному сопротивлению и номинальному току можно проверить напряжение с наклейки мотора в калькуляторе закона Ома.
- Нет мультиметра? Соедини концы двух проводов и покрути вал рукой: если он стал заметно туже, эти два провода — одна обмотка.
- Подключи одну обмотку к пинам 1A–1B драйвера A4988, а другую — к 2A–2B. Если мотор вращается не в ту сторону, достаточно поменять местами два провода одной из обмоток.
Распиновка A4988 и схема подключения
| Пин A4988 | Arduino Uno | ESP32 | Raspberry 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 мотора |
| VDD | 5V | 3V3 | 3V3 (OUT) |
| GND (рядом с VDD) | GND | GND | GND |
| STEP | D2 | GPIO 25 | GP2 |
| DIR | D5 | GPIO 26 | GP3 |
| ENABLE | D8 | GPIO 27 | GP4 |
| MS1, MS2, MS3 | 5V (шаг 1/16) | 3V3 (шаг 1/16) | 3V3 (шаг 1/16) |
| RESET, SLEEP | Соединить перемычкой | Соединить перемычкой | Соединить перемычкой |
Почему конденсатор 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 A | Vref для 1 A | Vref для 1,2 A |
|---|---|---|---|---|---|
| R050 | 0,05 Ω | Vref = I × 0,4 | 0,32 V | 0,40 V | 0,48 V |
| R068 | 0,068 Ω | Vref = I × 0,544 | 0,44 V | 0,54 V | 0,65 V |
| R100 | 0,1 Ω | Vref = I × 0,8 | 0,64 V | 0,80 V | 0,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 мультиметром: пошагово
- При полностью отключённом питании отсоедини мотор от драйвера. Для измерения Vref мотор не нужен.
- Подай питание логики на пины VDD и GND драйвера A4988 (хватит 5V от Arduino). Vref формируется из этого напряжения, поэтому без VDD измерить его нельзя; если VMOT остаётся подключённым, ничего страшного.
- Переключи мультиметр в режим постоянного напряжения (диапазон 2 V или 20 V). Чёрным щупом коснись GND, а красным — металлической верхушки потенциометра; на некоторых платах вместо этого есть маленькая контрольная точка с надписью VREF.
- Поворачивай потенциометр совсем чуть-чуть маленькой пластиковой или керамической отвёрткой и следи за показаниями. На большинстве плат вращение по часовой стрелке увеличивает Vref, но бывает по-разному; некоторые потенциометры после полного оборота возвращаются в начало, так что двигайся маленькими шагами.
- Когда расчётное значение достигнуто, отключи питание, подключи мотор и только после этого снова подай питание.
- Дай мотору поработать несколько минут и проверь температуру микросхемы. Если палец не удаётся удержать на ней даже несколько секунд, немного уменьши Vref или поставь радиатор.
Микрошаг через MS1, MS2 и MS3
Микрошаг (microstepping) — это когда драйвер плавно меняет ток в двух обмотках и делит каждый полный шаг на более мелкие части. A4988 выбирает один из пяти режимов по логическим уровням на пинах MS1–MS3. У этих пинов есть встроенные стягивающие резисторы (pull-down), поэтому если все три оставить неподключёнными, мотор работает в режиме полного шага.
| MS1 | MS2 | MS3 | Режим | Шагов на оборот | Угол шага |
|---|---|---|---|---|---|
| LOW | LOW | LOW | Полный шаг | 200 | 1,8° |
| HIGH | LOW | LOW | Полушаг | 400 | 0,9° |
| LOW | HIGH | LOW | Шаг 1/4 | 800 | 0,45° |
| HIGH | HIGH | LOW | Шаг 1/8 | 1600 | 0,225° |
| HIGH | HIGH | HIGH | Шаг 1/16 | 3200 | 0,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 шагов.
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.
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 шагов/мм.
| Ось | STEP | DIR | Примечание |
|---|---|---|---|
| X | D2 | D5 | Концевой выключатель D9 |
| Y | D3 | D6 | Концевой выключатель D10 |
| Z | D4 | D7 | Концевой выключатель D12 (GRBL 1.1) |
| A | Перемычками | Перемычками | Дублирует X, Y или Z (например, ось Y с двумя моторами) |
| Все драйверы | – | – | Общий пин EN D8: LOW = драйверы включены |
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?.
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?.
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: сравнение
| Параметр | A4988 | DRV8825 | TMC2208 |
|---|---|---|---|
| Напряжение мотора | 8–35 V | 8,2–45 V | 4,75–36 V |
| Комфортный длительный ток | Около 1 A (без радиатора) | Около 1,5 A (без радиатора) | Около 0,85 A RMS (с небольшим радиатором) |
| Максимальный ток | 2 A (при хорошем охлаждении) | 2,2 A (при хорошем охлаждении) | Около 1,4 A RMS (пиковый 2 A) |
| Самый мелкий микрошаг | 1/16 | 1/32 | 1/16 (с интерполяцией до 1/256) |
| Ток через Vref | I = Vref / (8 × Rs) | I = Vref × 2 | Зависит от платы, по формуле производителя |
| Пин питания логики | Нужен VDD | Не нужен (этот пин — выход FAULT) | Нужен VIO |
| Шум | Заметный писк | Писк, как у A4988 | Почти бесшумный (StealthChop) |
| Минимальный импульс STEP | 1 µs | 1,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 |
Идеи проектов с 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.
Что собрать после прочтения
Все проекты
Работа с шаговым мотором
Мотор, который поворачивается шаг за шагом ровно настолько, насколько нужно, как стрелка часов. Через плату драйвера Arduino поворачивает маленький шаговый мотор на полный оборот в одну сторону, ждёт

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

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

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

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

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

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

Робот, объезжающий препятствия
Как насчёт того, чтобы собрать умную машину, которая сама находит дорогу? Робот, объезжающий препятствия, постоянно осматривает всё вокруг благодаря ультразвуковому датчику спереди. Встретив препятств
Другие статьи
Приложение BlueGrays
Собери эту схему шаг за шагом в телефоне
Схема подключения, код и список деталей на одном экране. 200+ проектов на Arduino, ESP32 и Pico готовы к сборке.
Наведи камеру телефона
Наведи камеру на код — откроется магазин приложений на телефоне.
или открыть магазин

