Таймлапс-слайдер я собирал дважды. Первая версия ехала полными шагами: каждый кадр камера дёргалась на 0,176 градуса, и готовое видео дробилось, будто снимали через дрожащую руку. Вторая работала полушагом — то же железо, тот же мотор, другая последовательность обмоток, и рывок пропал — ноль железа, двадцать строк кода. Разбор слайдера целиком лежит в уроке про таймлапс, здесь — механика полушага и микрошага и цена, которую за плавность платят моментом и скоростью. И да, полушаг у 28BYJ-48 считается руками: стандартная библиотека о нём не знает.
Стандартная библиотека Stepper крутит 28BYJ-48 полными шагами: 2048 на оборот, четыре такта, на каждом работают обе обмотки. Полушаг удваивает дискретность: 4096 позиций, восемь тактов, половина из них — на одной обмотке. Микрошаг идёт дальше и делит шаг до 1/16 и мельче, но требует не грубых ключей, а драйвера с регулировкой тока — A4988 и компанию. У каждого режима своя цена, и о ней половина коротких туториалов молчит. Правило для быстрой прикидки: хотите плавнее — дробите шаг; хотите сильнее — укрупняйте; хотите то и другое сразу — платите за драйвер с запасом и радиатором.
Восемь тактов вместо четырёх
Полный шаг — четыре состояния: обмотки включаются парами, и ротор каждый раз доезжает до положения с максимальным притяжением. Полушаг вставляет между ними промежуточные такты с одной обмоткой: A, AB, B, BC и так по кругу. Приращение угла падает вдвое: 0,088 градуса, 4096 позиций на оборот. Железо то же, последовательность длиннее вдвое. Откуда взялись 2048 и почему редуктор даёт не ровно 64 к 1 — урок про передаточное число; сравнение режимов в картинках — урок про полный шаг и полушаг. Там же — почему библиотека Stepper полушаг не умеет вовсе: её таблица жёстко на четыре такта.
Расплата прячется в тактах с одной обмоткой. Позиция с парой катушек держит полный момент; позиция на одной катушке — примерно 71%, деление на корень из двух. Мотор идёт волной: сильный такт, слабый, сильный. Для слайдера и указателя это неощутимо, для подъёма груза — уже аргумент против. Зато шум и резонанс уходят: приращения мельче, удар ротора о следующую позицию мягче, и на 5 вольтах разницу слышно даже через стол. Механика резонанса простая: на полном шаге ротор получает удар каждый такт, и на какой-то частоте удары совпадают с собственной частотой ротора на магнитной «пружине» — мотор входит в резонанс и теряет шаги именно там. Полушаг сдвигает частоты и разбивает совпадение, микрошаг убирает удар вовсе.
// Полушаг 28BYJ-48: 8 тактов, своя последовательность обмоток// Пины: IN1 - D8, IN2 - D10, IN3 - D9, IN4 - D11const int PINY[4] = {8, 10, 9, 11};// биты: IN1 IN2 IN3 IN4 — одна обмотка чередуется с паройconst byte TAKTY[8] = { B1000, B1100, B0100, B0110, B0010, B0011, B0001, B1001}; void polushag(long pozitsij, int mks) { static byte takt = 0; long n = pozitsij; if (n < 0) n = -n; for (long i = 0; i < n; i++) { if (pozitsij > 0) takt = (takt + 1) & 7; else takt = (takt + 7) & 7; for (int k = 0; k < 4; k++) { digitalWrite(PINY[k], bitRead(TAKTY[takt], 3 - k)); } delayMicroseconds(mks); }} void setup() { for (int k = 0; k < 4; k++) pinMode(PINY[k], OUTPUT); Serial.begin(9600); Serial.println("Polushag: 4096 pozitsij na oborot");} void loop() { polushag(1024, 1800); // четверть оборота за ~3.7 с delay(1000); polushag(-1024, 1800); // обратно delay(1000);}Обратите внимание на скорость: delayMicroseconds(1800) на такт — четверть оборота едет почти четыре секунды. Полушагов вдвое больше, и если вдвое ужимать паузу, мотор на границе срыва — момент на слабых тактах ниже, запас по скорости меньше. На реальной кормушке я ставлю 1500-2000 микросекунд и сплю спокойно; попытка прогнать ту же таблицу на 400 мкс заканчивается гудением и стоячим валом. Запас ниже полутора миллисекунд на такт я не опускаю ни на одном экземпляре — пластик редуктора у каждого свой.
И про потребление: средний ток полушага выше, чем у полного, — на половине тактов работает одна катушка, но переключений вдвое больше, а индуктивность каждый раз тянет выброс. ULN2003 с защитными диодами это переваривает, но плату-переходник на плотной макетке я ставлю подальше от аналоговых входов: шум от переключений ловится даже потенциометром на соседней линии. Кстати, поэтому ULN2003 в наборах часто тёплый даже на неподвижном моторе: обмотки всегда под током, а в полушаге к ним добавляются лишние переключения — греются и мотор, и ключи.
Цена микрошага
Микрошаг — история не про обмотки, а про ток: драйвер раскладывает его по двум фазам по синусу, и ротор встаёт в промежуточные положения. A4988 умеет до 1/16: NEMA 17 получает 3200 позиций на оборот. 28BYJ-48 на такой драйвер не ставят — катушкам нужен свой ULN2003. 0,9-градусные NEMA на той же дроби дают вдвое больше позиций — 6400 на оборот, если нужна именно дискретность. Доля момента удержания падает с делением: на полушаге 71%, на 1/4 около 38%, на 1/8 около 20%, на 1/16 — около десяти процентов от полного шага. Подробный разбор режима — в уроке про 1/16, физику срыва — в уроке про момент и срыв шагов.
Отсюда правило, к которому я пришёл через пару провисших столов: микрошаг покупают за плавность, а не за силу. Держать груз на 1/16 — оставить его на десятой части тяги: первая же вибрация стащит ротор в ближайший полный шаг. Импульсов тоже нужно кратно больше: 32768 на оборот при 1/16 — Uno с digitalWrite тянет единицы килогерц, и потолок скорости падает до нескольких об/мин. Конкретно: Uno с digitalWrite держит порядка пяти тысяч импульсов в секунду — на 1/16 это меньше десяти оборотов в минуту; на 1/4 потолок поднимается вчетверо, на полушаге — в восемь. Микрошаг — для движения, полный шаг — для удержания. Проверка простая: положите на столик груз — ротор на 1/16 съедет на ближайший полный шаг и останется там.
| Режим | Позиций на оборот | Момент позиции | Импульсов на 90 градусов |
|---|---|---|---|
| Полный шаг | 2048 | 100% | 512 |
| Полушаг | 4096 | около 71% | 1024 |
| Микрошаг 1/4 | 8192 | около 38% | 2048 |
| Микрошаг 1/16 | 32768 | около 10% | 8192 |
Теперь ложка дёгтя в точность. Редукция 28BYJ-48 — не 1:64, а 1:63.68395: производитель округлил цифру для витрины. Честный оборот — 4075,8 полушага, а не 4096, значит арифметика уводит вас на двадцать полушагов за оборот — это 1,8 градуса. Сотня оборотов — и указатель смотрит в другую сторону на треть окружности. В полных шагах расхождение то же, просто в другом масштабе: честных полных шагов 2037,9 против расчётных 2048 — те же 1,8 градуса на оборот. Для длинных пробегов ноль берут с концевика при включении: урок про нулевую точку собирает схему homing целиком.
И люфт. Пластиковые шестерни берут зазор 1-3 градуса на каждом реверсе — пара десятков полушагов болтается в механике независимо от электроники. На реверсе с грузом полушаг теряет смысл раньше, чем его съедает арифметика редукции: сначала берётся зазор, потом поедет вал. Поэтому в точных механизмах на BYJ реверс — событие, а не движение: разворот требует либо паузу с встряской, либо переезд через ту же точку с перерасчётом. На ручных стендах я просто избегаю реверса под нагрузкой: направление выбираю раз, потом еду туда-сюда с перерасчётом от нуля.
Мой расклад по режимам после всех этих граблей. Полный шаг — счётчики порций и кормушки: рывок там не виден, момент нужен, арифметика круглая. Полушаг — слайдеры, указатели, всё, что попадает в кадр или в поле зрения: плавность почти на халяву, момент с запасом. 1/4 и мельче — столики приборов, фокусировка, гравировка, где виден каждый микронный сдвиг и где драйвер с чоппером уже стоит по умолчанию.
Гнаться за максимальной дробью бессмысленно по двум причинам. Первая — импульсы: ход на девяносто градусов при 1/16 — это уже восемь тысяч импульсов, и Uno пишет их на пределе. Вторая — механика: люфт редуктора и зазоры зубцов шире деления 1/16, за пределом этой дроби вы покупаете плавность, которую физика не отдаст. Драйверы с интерполяцией решают обе проблемы за вас, поэтому микрошаг мельче 1/16 руками в этом разделе я не трогаю вовсе. Экономия на импульсах заодно разгружает loop: на 1/4 тот же ход занимает вдвое меньше тактов.
- 1. Сколько позиций даёт полушаг на 28BYJ-48 за оборот?
- 2. Какова доля момента удержания на позиции микрошага 1/16?
- 3. Что полушаг делает с шумом и моментом?
- 4. Почему после сотни оборотов 28BYJ-48 уходит от расчётного нуля?
- 5. Что даёт TMC2209 на NEMA 17 без изменения кода?
- Полушаг: 4096 позиций, восемь тактов, плавнее и тише, но половина позиций держит около 71% момента
- Микрошаг 1/16 (A4988): 32768 позиций, удержание около 10% — режим для плавности, не для силы
- Стандартная Stepper.h крутит полными шагами: полушаг для 28BYJ-48 — своя восьмитактная таблица
- Редукция 1:63.68395: честный оборот 4075,8 полушага — длинные пробеги выравнивает концевик
- Люфт пластикового редуктора 1-3 градуса съедает выигрыш микрошага на каждом реверсе
Частые вопросы по теме урока
- Сколько позиций даёт полушаг на 28BYJ-48 за оборот?
- Полушаг делит угол пополам: 2048 полных превращаются в 4096 позиций, шаг 0,088 градуса. Последовательность растягивается с четырёх тактов до восьми. 4096
- Какова доля момента удержания на позиции микрошага 1/16?
- Ток на промежуточных позициях раскладывается по синусу: на 1/16 остаётся около десятой части тяги. Держать груз на таком режиме — оставить его на волоске. около 10% от полного шага
- Что полушаг делает с шумом и моментом?
- Такты с одной обмоткой слабее пары: тяга идёт волной сильный-слабый. Зато приращения мельче и удар ротора мягче — шум и резонанс падают. Плавнее и тише, но половина позиций держит одна обмотка — около 71% момента
- Почему после сотни оборотов 28BYJ-48 уходит от расчётного нуля?
- Честный оборот — 4075,8 полушага, а не 4096: 1,8 градуса разницы за оборот. Длинные пробеги выравнивает концевик, а не арифметика. Редукция не 1:64, а 1:63.68395 — за оборот теряется около 20 полушагов
- Что даёт TMC2209 на NEMA 17 без изменения кода?
- Stealthchop-интерполяция мельчит шаги внутри драйвера: скетч остаётся на полных шагах, а мотор едет тихо и плавно. Интерполяцию до 1/256: шлёте полные шаги, чип дробит их сам