NEMA 17 я заказал после того, как 28BYJ-48 сорвалась на ролике шторки теплицы, — а посылка удивила: драйверы A4988 стоили как столовая ложка, три штуки за сотню рублей. Размером с ноготь, шестнадцать ножек с двух сторон — и ни одного знакомого входа IN1-IN4. Куда подключать четыре провода мотора? Где светодиоды, по которым на плате ULN2003 читалась последовательность фаз? Ничего этого нет, и это не жадность производителя, а другой способ управления мотором.
A4988 — не усилитель сигналов, а транслятор: он сам считает фазы, сам дробит шаг до шестнадцатой доли и сам держит ток обмоток, невзирая на напряжение питания. От Arduino ему нужны две линии, плюс логики и плюс мотора. Плата за самостоятельность — требовательность к сборке: без электролита на шине моторного питания драйвер умирает от одного перетыкания провода, я проверил это на втором экземпляре.
В этом уроке — распиновка и интерфейс Step/Dir, два питания и ток под винтом, сон и сброс, и сравнение с ULN2003, чтобы было видно, за что именно мы платим эти копейки. Финал — симулятор с моделью NEMA 17 на двести шагов и ручкой скорости. Микрошаг, токи фаз и цену плавности разберём в следующем уроке, мотор NEMA 17 — в третьем.
Step и Dir: два провода вместо четырёх
Интерфейс занимает два пина и две строки кода. Пин DIR объявляет направление: HIGH — в одну сторону, LOW — в другую; установиться он должен хотя бы за 200 наносекунд до импульса. Пин STEP принимает импульсы: каждый фронт из нуля в единицу — ровно один шаг, высокий уровень держим минимум 1 микросекунду. Всё. Транслятор внутри драйвера сам разложит шаги по обмоткам — ту партитуру тактов, которую мы в уроке про полушаг гоняли руками на digitalWrite, он щёлкает без вашей таблицы.
Третья линия — ENABLE, и она инвертированная: ноль включает мосты, единица отключает. Нога притянута к земле внутри чипа, поэтому её можно вообще не подключать — драйвер живёт. Подадите HIGH — обмотки обесточены, вал проворачивается пальцем, нагрев падает до нуля. Я завожу ENABLE на пин всегда: мотор, который часами греется на удержании без дела, мы уже обсуждали в первом уроке раздела — там он печёк так, что корпус не держать.
Скорость задаётся паузой между импульсами, и тут полезно помнить цену digitalWrite: на Uno команда занимает около 5 микросекунд, так что из простого цикла выжимаются десятки тысяч импульсов в секунду — для сотен оборотов в минуту хватает с запасом. Мой рабочий темп — импульс каждые 2 мс: 200 шагов на оборот дают около 145 об/мин. Выше — только с разгоном: библиотека AccelStepper плавно поднимает частоту и не срывает ротор на старте, а старт на чистом delay с высокой частотой кончается гудением на месте.
| Что | Плата ULN2003 | Драйвер A4988 |
|---|---|---|
| Сигналов от Arduino | Четыре линии IN1-IN4 | Две: STEP и DIR, ENABLE по желанию |
| Кто считает фазы | Ваш код: партитура тактов руками | Транслятор внутри чипа |
| Ток на обмотку | До 500 мА на канал, без контроля | До 1 А без радиатора, до 2 А с охлаждением, винтом по Vref |
| Дробление шага | Только руками, максимум полушаг | До 1/16 аппаратно, тремя перемычками MS |
| Питание мотора | 5 В, как у платы | VMOT 8-35 В плюс электролит 100 мкФ |
Питаний два, и путать их нельзя. VMOT — моторное, от 8 до 35 вольт: я даю 12 В от адаптера на 2 А. VDD — логическое, 3-5,5 В, сажается на 5 В Arduino. Земля общая, без вариантов — иначе сигналы STEP и DIR висят в воздухе. В отличие от связки 28BYJ-48 с платой ULN2003, мотору здесь не нужен плюс платы: у него своя шина, и мелкая плата остаётся для мелких моторов.
Ток задаётся подстроечным винтом, и это главная настройка драйвера. Чип рубит фазы короткими порциями — работает чоппер, — поэтому ток не зависит от напряжения VMOT, только от винта. Формула: ток = Vref / (8 × R сенсора); на типовых клонах стоят резисторы 0,1 Ом, значит, ток равен 1,25 × Vref. Выкрутите винт на 0,8 В — получите 1 А на фазу; мотор с паспортными 1,2 А просит 0,96 В. Меряется вольтметром между винтом и землёй, мотор отключать не нужно.
Теперь то, о чём забывают чаще всего: электролит 100 мкФ между VMOT и землёй, вплотную к клеммам. Провода питания — антенна, обмотки — индуктивность, и обрыв провода под током рождает выброс в десятки и сотни вольт, который пробивает чип быстрее, чем вы успеваете отдёрнуть руку. Зачем конденсатор спасает шину, мы разбирали в уроке про фильтр питания; здесь запомните порядок сборки: конденсатор — раньше, чем подключается мотор.
// Пины A4988: STEP - импульс шага, DIR - направлениеconst int PIN_STEP = 3;const int PIN_DIR = 4; const int STEPS_PER_REV = 200; // 1.8 gradusa na shag void odinImpuls() { digitalWrite(PIN_STEP, HIGH); delayMicroseconds(10); // фронт живёт здесь, минимум 1 мкс digitalWrite(PIN_STEP, LOW); delayMicroseconds(10);} void setup() { pinMode(PIN_STEP, OUTPUT); pinMode(PIN_DIR, OUTPUT); Serial.begin(9600);} void loop() { digitalWrite(PIN_DIR, HIGH); // вперёд for (int i = 0; i < STEPS_PER_REV; i++) { odinImpuls(); delay(2); // 200 шагов за ~0.42 с } Serial.println("Oborot vpered"); delay(1000); digitalWrite(PIN_DIR, LOW); // назад for (int i = 0; i < STEPS_PER_REV; i++) { odinImpuls(); delay(2); } Serial.println("Oborot nazad"); delay(1000);}Функция odinImpuls держит фронт 10 микросекунд — даташит просит минимум одну, запас в десять раз стоит ноль усилий. Пауза delay(2) между импульсами даёт двести шагов примерно за 0,42 секунды — около 145 об/мин. Число честное для чистого вала на 12 В; с нагрузкой у многих экземпляров темп уже на грани срыва: если мотор гудит и стоит — растите паузу вдвое. Где проходит граница срыва и как её вымерять на своём экземпляре, у нас есть отдельный разговор про скорость.
DIR устанавливается до серии импульсов, а не вместе с ними: переключили направление — дайте линии устояться и только потом начинайте щёлкать STEP. Двести импульсов — ровно оборот: арифметика та же, к которой мы привыкли с 2048 шагами, только без редуктора и без его дробного передаточного числа. Вынос импульса в функцию — не эстетика: свои функции в скетче позволяют потом заменить delay на millis-таймер в одном месте, а не по всем циклам.
ENABLE в этом скетче не трогаем — нога молчит, драйвер включён всегда. Для заслонки или дозатора это нормально. Для механизма, который часами стоит с зажатым валом, добавьте HIGH на ENABLE после хода и LOW перед следующим: обмотки отпустит, нагрев уйдёт, но позицию никто не держит — механика должна сама приходить в устойчивую точку.
Сон, сброс и модель в симуляторе
Две ножки с похожими названиями — SLEEP и RESET. Ноль на SLEEP усыпляет чип: потребление падает до микроампер, выходы отключены; после подъёма линии драйверу нужна примерно миллисекунда, прежде чем первый импульс STEP дойдёт до моста. Ноль на RESET возвращает транслятор в нулевой такт — домашнюю позицию: удобно, когда счёт шагов разъехался с механикой. На большинстве модулей эти ножки соединены перемычкой и подтянуты к VDD — ни сна, ни сброса, драйвер просто живёт. Для батарейного проекта уводить чип в сон между ходами — правильный ход, в одну компанию с сном самой платы.
Честно про симулятор: движок не эмулирует ни A4988, ни токи фаз, ни VMOT. Модель построена на библиотечном Stepper с двумястами шагами на оборот — как NEMA 17: каждый вызов step в модели — это на настоящей плате серия импульсов на пине STEP с установленным DIR. Потенциометр A0 задаёт скорость от 2 до 12 об/мин, светодиод D12 мигает на каждый оборот, Serial печатает оборот, скорость и время. Время в симуляторе зависит от скорости прокрутки — смотрите на пропорцию: rpm, умноженные на время оборота, всегда дают около 60 секунд.
- Step и Dir — два пина вместо четырёх: фронт на STEP — один шаг, DIR — направление; ENABLE инвертирован и по умолчанию включён
- VMOT 8-35 В и VDD 3-5,5 В — два питания, земля общая; электролит 100 мкФ вплотную к VMOT ставят раньше мотора
- Ток фазы задаёт винт: на клонах с сенсорами 0,1 Ом ток = 1,25 × Vref; без радиатора держите до 1 А
- SLEEP в нуле — сон до микроампер (ждите 1 мс после пробуждения), RESET в нуле — транслятор в нулевой такт; на модулях они связаны перемычкой
- 200 импульсов — оборот: тот же счёт шагов, что у 2048, только без редуктора, люфта шестерён и потолка 15 об/мин
- 1. Сколько пинов Arduino занимает интерфейс Step/Dir без ENABLE?
- 2. Что произойдёт на фронте импульса STEP?
- 3. Какой ток на фазу задаёт винт на 0,8 В при сенсорных резисторах 0,1 Ом?
- 4. Что делает ноль на пине RESET?
- 5. Зачем на VMOT ставят электролит 100 мкФ вплотную к клеммам?
Связка NEMA 17 и A4988 поехала — но на полном шаге позиции крупные: 1,8 градуса, и на слайдере камеры каждый скачок виден глазом. Драйвер умеет делить шаг на 2, 4, 8 и 16 долей тремя пинами MS1-MS3 — следующий урок про то, как внутри него течёт синус по обмоткам, чем за плавность платим моментом и почему точность позиционирования при этом не растёт в шестнадцать раз.
Частые вопросы по теме урока
- Сколько пинов Arduino занимает интерфейс Step/Dir без ENABLE?
- STEP и DIR — два пина. ENABLE можно не подключать: нога притянута к земле внутри чипа, драйвер включён по умолчанию. Два
- Что произойдёт на фронте импульса STEP?
- Каждый фронт из нуля в единицу — один шаг, высокий уровень держим минимум 1 мкс. Направление задаёт отдельно пин DIR до серии импульсов. Транслятор переключит фазы на один шаг
- Какой ток на фазу задаёт винт на 0,8 В при сенсорных резисторах 0,1 Ом?
- Ток = Vref / (8 × R сенсора) = 0,8 / 0,8 = 1 А, то есть 1,25 × Vref. Мотор с паспортными 1,2 А просит винт на 0,96 В. 1 А
- Что делает ноль на пине RESET?
- RESET сбрасывает внутренний счётчик микрошагов в ноль. Сон — это SLEEP: там тоже ноль, но чип отключает мосты и ест микроамперы. Возвращает транслятор в нулевой такт — домашнюю позицию
- Зачем на VMOT ставят электролит 100 мкФ вплотную к клеммам?
- Обмотки — индуктивность: обрыв провода под током рождает выброс в десятки и сотни вольт, пробивающий чип. Электролит гасит выброс на месте. Чтобы сгладить выброс при обрыве провода моторного питания под током