Драйвер A4988 + Arduino: управление шаговым NEMA17
A4988 самый популярный драйвер шаговых двигателей для 3D-принтеров, ЧПУ-станков и робототехники. Чип от Allegro, на плате с радиатором, управляется всего двумя сигналами: STEP отвечает за шаг, DIR за направление. Ток до 2 А на обмотку, но только с радиатором.
Подключение к Arduino предельно простое, и почти вся сложность спрятана в одном действии: выставить ток потенциометром VREF. Сделать это неверно можно дважды: либо двигатель не тянет нагрузку, либо чип перегревается и уходит в защиту.
В нашем симуляторе A4988 как чип не моделируется, но есть симулятор шагового 28BYJ-48 через ULN2003 с библиотекой Stepper.h: логику переключения фаз и расчёт шагов там отработать можно.
Грабль питания: VMOT и VDD это разные цепи
Мотор питается от VMOT, куда подаётся от 8 до 35 В, а логика драйвера питается от VDD, куда нужно 3.5-5.5 В. Это две независимые цепи, и их нельзя смешивать. Arduino даёт на VDD 5 В от USB или от блока питания, а VMOT придётся питать отдельным источником: типично 12 В и 2 А на один двигатель NEMA17.
Общий провод GND у Arduino и у блока питания обязателен, без него драйвер не поймёт команды. И отдельный конденсатор 100 мкФ прямо на входе VMOT рядом с платой: в момент коммутации обмоток в цепи возникают выбросы, и без этого конденсатора Arduino перезагружается. Второй момент, который забывают: контакты VMOT на плате иногда закрыты пластиковой заглушкой, её нужно снять.
VREF и ток: ограничение без перегрева
A4988 ограничивает ток внутренними шунтами. Настройка делается потенциометром VREF, а считается ток по формуле Imax = VREF / (8 × Rsense). Сопротивление шунта на вашей плате нужно посмотреть на маркировке резистора: на распространённых модулях стоит 0.1 Ом, и тогда Imax = VREF / 0.8, а на некоторых встречается 0.05 Ом, и тогда Imax = VREF / 0.4. Для NEMA17 с током 1 А на фазу при Rsense 0.1 Ом ставим VREF 0.8 В, при Rsense 0.05 Ом ставим 0.4 В.
VREF измеряют мультиметром при включённом питании: плюс щуп на центральный вывод потенциометра, минус на GND. Ток двигателя при этом настраивают по datasheet конкретной модели: у NEMA17 с номиналом 1.5 А на обмотку выставляют около 70-80 процентов от паспортного тока. Без радиатора A4988 держит около 1 А, с радиатором до 2 А. При перегреве крип срабатывает термозащита при 165 °C и выключает обмотки, мотор в этот момент просто остановится.
#define STEP 3#define DIR 4void setup() { pinMode(STEP, OUTPUT); pinMode(DIR, OUTPUT); digitalWrite(DIR, HIGH); // CW}void loop() { for (int i = 0; i < 200; i++) { digitalWrite(STEP, HIGH); delayMicroseconds(2000); digitalWrite(STEP, LOW); delayMicroseconds(2000); } delay(1000); digitalWrite(DIR, LOW); // CCW}Микрошаг выбирается пинами MS1, MS2 и MS3: полный шаг, 1/2, 1/4, 1/8 или 1/16. Полный шаг даёт 200 шагов на оборот для мотора с шагом 1.8°, а 1/16 даёт 3200 шагов, и движение становится заметно плавнее. Если пины MS не подключены, внутри чипа стоят подтяжки, и режим получается полный шаг. Важно помнить: микрошаг не добавляет точности, он только разбивает один полный шаг на мелкие. Реальная точность позиционирования остаётся на уровне шага мотора.
По datasheet минимальная длительность импульса STEP составляет 1.9 мкс. В коде выше стоит delayMicroseconds(2000), то есть 2 мс, и это с запасом: скорость получается около 250 шагов в секунду, а при 200 шагов на оборот это чуть больше одного оборота в секунду. Для быстрых перемещений ставят 500-1000 мкс, но на Uno, где delayMicroseconds достаточно точен, лучше уходить в прерывание по таймеру.
| Микрошаг | MS1 | MS2 | MS3 | Шагов/оборот |
|---|---|---|---|---|
| Full | 0 | 0 | 0 | 200 |
| Half | 1 | 0 | 0 | 400 |
| Quarter | 0 | 1 | 0 | 800 |
| Eighth | 1 | 1 | 0 | 1600 |
| Sixteenth | 1 | 1 | 1 | 3200 |
Что сначала не получилось
Первый мотор я подключил и сразу задал направление, но вместо вращения получил рывок и остановку. Причина оказалась в заглушке на контактах VMOT: пластик, который закрывает винты, я сорвал, а перемычку под ним не увидел. Второй затык был в запитке: я взял блок питания 12 В от старого роутера, а у него на выходе 12 В 0.5 А. При старте мотор сразу уходил в защиту.
Отдельно запомнилось, что микрошаг 1/16 на NEMA17 при минимальном токе даёт вялый звук и слабое удержание. Я сперва решил, что двигатель неисправен, а на деле просто выставил ток слишком низким для 3200 микрошагов. Когда поднял ток до паспортного значения, звук стал ровным, и мотор перестал проскальзывать под нагрузкой.
Личный опыт: принтер из столовой расходников
Первый настоящий проект на A4988 у меня был простой: ось X механизма, который сам собирал из алюминиевого профиля. Один NEMA17, ремень GT2, и задача: сделать 20 шагов вперёд, подождать, 20 шагов назад. Расчёт по таблице микрошага давал 200 шагов на оборот при полном шаге, и я крутил ровно один оборот за цикл. Проверял не на глаз, а по числу шагов: счётчик в Serial показал ровно 200 импульсов на оборот, а полный оборот вала я проверял по отметке на шкиве.
Ток я выставил по формуле: при Rsense 0.1 Ом на плате VREF получился 0.8 В, что соответствует примерно 1 А на фазу. Мотор при этом не грелся, а температура чипа под радиатором держалась в комнатных пределах. Когда я ускорил перемещение, сократив паузу между импульсами до 500 мкс, мотор стал заметно тише и держал момент ровнее, но ток по осциллографу на обмотке вырос, и радиатор пришлось ставить обязательно.
Авторская позиция: что взять новичку
Начинать лучше с A4988 и полного шага: так проще понять, что драйвер вообще работает, и не нужно сразу возиться с микрошагом. Потенциометр на плате при этом трогайте постепенно, с шагом 0.1 В, и после каждой правки дайте мотору поработать пару минут: перегрев проявляется не сразу. Если проект требует плавности и тишины, берите TMC2208, там ток задаётся цифрой и есть режим с низким током, который умеет удерживать мотор без звука. A4988 берите там, где важна цена и не нужна тишина.