Крепление слайдера для камеры я перепечатывал трижды, а тряска не уходила: на каждом шаге камера вздрагивала, и на таймлапсе кадры прыгали, будто снимали с рук. Мотор работал точно — счёт шагов сходился до единицы, — но сама природа полного шага даёт рывок: ротор не плывёт между положениями, а перескакивает.
Лечится это сменой режима обмоток: тем же мотором, той же платой ULN2003, только последовательность фаз другая. Полушаг раздробил каждый рывок пополам, и кадры срослись. Но прежде чем крутить режимы вслепую, полезно увидеть фазы — иначе настройка превращается в перебор случайных вариантов с непонятным результатом.
Сегодня вскроем то, что библиотека Stepper прячет внутри: четыре линии, такты, три режима работы обмоток. Напишем последовательность руками на digitalWrite — как раз тот случай, когда массивы как таблицы паттернов работают на механику, — и прочитаем её в Serial построчно.
Четыре такта, на которых стоит всё
Физика тут простая. Внутри мотора две обмотки, разведённые на четыре линии IN1-IN4, и ротор с зубцами занимает положение, где магнитные потоки уравновешены. Каждый такт последовательности — новая комбинация включённых катушек — сдвигает это равновесие, и ротор доезжает до следующего положения. Пока такты идут по кругу, вал крутится; порядок тактов нарушен — вал дёргается на месте.
Тактов на один электрический цикл — четыре: за них ротор моторной части проезжает 45 градусов, дальше цикл повторяется, и так восемь раз на оборот мотора до редуктора — эти 32 шага ротора мы уже считали. Вопрос только в том, какие комбинации катушек пускать в тактах — и вот тут расходятся три режима.
Волновой режим — одна фаза на такт, экономно и слабо. Полный шаг — две соседние фазы сразу: поле сильнее, ротор держится увереннее, момент выше. Полушаг чередует одиночные такты с парными: восемь тактов на цикл, каждое положение вдвое ближе к предыдущему, движение получается ступеньками вдвое мельче.
| Режим | Фаз на такт | Тактов на цикл | Шаг ротора | Момент | Плавность |
|---|---|---|---|---|---|
| Волновой | 1 | 4 | 11,25° | Самый слабый, около 0,7 от полного | Грубая, рывками |
| Полный шаг | 2 соседние | 4 | 11,25° | Базовый, максимум на такт | Грубая, но сильная |
| Полушаг | 1 и 2 вперемешку | 8 | 5,625° | Между волновым и полным | Вдвое ровнее, вибрация меньше |
Редуктор умножает всё это, и на выходном валу режимы превращаются в знакомые числа: полный шаг — 2048 позиций на оборот по 0,176 градуса, полушаг — 4096 позиций по 0,088. Момент в полушаге на одиночных тактах ниже, чем в полном: мотор, который тащил груз на двух фазах, на одной может сорваться. Правило, к которому я пришёл на своих механизмах: где нужна плавность на лёгкой нагрузке — полушаг, где момент на тяжёлой — полный, а про скорость и её потолок думайте в обоих случаях.
Числа для наглядности. На слайдере камера весом двести граммов на рычаге пять сантиметров: полный шаг дёргал рамку так, что тряска была видна на кадре; полушаг при том же маршруте удвоил число позиций и раздробил каждый рывок пополам — на таймлапсе это превратилось из дефекта в ровное движение. Плата за гладкость — вдвое больше тактов и, значит, вдвое больше времени на тот же маршрут при прочих равных.
Есть и третий аргумент в пользу полушага — звук. Полный шаг на средних скоростях слышен: тонкий треск на каждом такте, будто мотор шепчется. Полушаг сдвигает частоту тактов вдвое выше, и мотор начинает петь ровной нотой. Для ночного дозатора это не мелочь, поверьте тому, кто его будил.
Библиотека Stepper умеет только полный шаг — и для заслонок, кормушек и турникетов этого хватает. Полушаг придётся гонять руками, и это не потеря: пять минут с digitalWrite дают понимание мотора, которого не даст ни одна обёртка. Заодно вы случайно повторите массивы-паттерны из основ — партитура тактов строится точно так же, как журнал событий или бегущие огни.
const int PINS[4] = {8, 10, 9, 11}; // IN1, IN2, IN3, IN4 // партитура полушага: восемь тактов, единица = катушка включенаconst int HALF[8][4] = { {1, 0, 0, 0}, {1, 1, 0, 0}, {0, 1, 0, 0}, {0, 1, 1, 0}, {0, 0, 1, 0}, {0, 0, 1, 1}, {0, 0, 0, 1}, {1, 0, 0, 1} // цикл замкнулся}; void setup() { for (int i = 0; i < 4; i++) pinMode(PINS[i], OUTPUT);} void loop() { for (int t = 0; t < 8; t++) { for (int i = 0; i < 4; i++) { digitalWrite(PINS[i], HALF[t][i]); } delay(3); // 333 полушага в секунду }}Разбор по слоям. Массив HALF — партитура: восемь строк-тактов, четыре столбца-катушки, единица означает включённую обмотку. Внутренний цикл раздаёт состояния четырём пинам, внешний перебирает такты. delay(3) между тактами — это 333 полушага в секунду; для 28BYJ-48 с её 4096 полушагами на оборот вала выходит около 4,9 оборота в минуту: медленно, зато с запасом по моменту. В боевом скетче delay заменяют таймером на millis — неблокирующий цикл оставляет плате свободу между тактами.
Обратите внимание на связь режимов: полный шаг — это полушаг с выброшенными одиночными тактами, то есть строки партитуры с двумя единицами. Четыре парные строки — 1100, 0110, 0011, 1001 — и есть полный шаг. Такой взгляд экономит память и нервы: одна таблица обслуживает оба режима, разница только в том, как вы по ней шагаете.
Направление меняется порядком чтения партитуры: шагайте индексом от 7 к 0 — и вал поедет обратно. Скорость регулируется паузой между тактами, но помните про потолок: пластиковый редуктор прощает медленную езду, а быструю — нет.
Проверяйте себя по светодиодам платы ULN2003. В полушаге лампы переключаются по кругу, и каждое второе зажигание — сразу две. Горят строго попарно без одиночных — это полный шаг. Мигает одна через одну — волновой. Три состояния, три режима, всё видно без осциллографа.
Смотрим фазы в симуляторе
Симулятор для этого урока собран без библиотеки Stepper: тот же мотор на пинах 8, 10, 9, 11, но такты гонит наш код. Циферблата здесь нет — зато Serial печатает каждый такт: step=номер, mode=0 или 1 и ph=четыре цифры состояния линий IN1-IN4. Для фаз такого «осциллографа для бедных» хватает за глаза, а читать его удобно прямо в браузере.
Первые четыре такта идут полным шагом: в ph всегда две единицы рядом. Потом режим переключается — единицы начинают переезжать по одной. Хитрость внутри кода: полного массива нет, полный шаг берёт из партитуры полушага только парные такты, по формуле i = 2 × t + 1. Прочитайте восемь строк полушага как таблицу — это и есть HALF из скетча выше, только вживую. Если захотите оформить переключение режимов аккуратнее — пригодится switch-case по состояниям.
- Такт — комбинация включённых катушек; в полном шаге 4 такта на цикл, в полушаге 8
- Волновой режим: одна фаза, момент около 0,7 от полного; полный шаг: две соседние фазы, максимум момента
- На валу 28BYJ-48: 2048 позиций в полном шаге, 4096 в полушаге — 0,176° и 0,088°
- Полушаг лечит вибрацию слайдеров и штативов, но на одиночных тактах момент ниже
- Последовательность не перестановочная: два такта местами — и ротор дёргается на месте с гулом
- Диагностика по светодиодам ULN2003: попарно — полный шаг, через одну — волновой, по кругу с одиночными — полушаг
- 1. Сколько тактов в одном цикле полушагового режима?
- 2. Какой режим даёт максимальный момент на такт?
- 3. Сколько позиций на оборот вала даёт полушаг у 28BYJ-48?
- 4. Почему волновой режим почти не применяют на практике?
- 5. В массиве последовательности поменяли местами два соседних такта. Что произойдёт?
Фазы перестали быть магией: восемь тактов, четыре линии, таблица из единиц и нулей — и мотор подчиняется прямо из скетча, без единой библиотеки. Полный шаг в этой картине оказался не отдельным режимом, а выборкой из той же партитуры — и это знание экономит и память, и время отладки. Дальше по разделу — арифметика: откуда берётся 2048, почему честное передаточное число дробное и как переводить градусы в шаги, чтобы кормушка отсыпала ровно порцию. А пока прогоните симулятор ещё раз и попробуйте прочитать ph= как партитуру: после этого чужие скетчи с HALF-массивами читаются с листа, а диагностика по светодиодам занимает секунды вместо вечера с логическим анализатором.
Частые вопросы по теме урока
- Сколько тактов в одном цикле полушагового режима?
- Полушаг чередует одиночные и парные такты: восемь на цикл против четырёх в полном шаге. Поэтому и позиций вдвое больше. 8
- Какой режим даёт максимальный момент на такт?
- Две включённые катушки тянут ротор вместе: поле вдвое сильнее, чем у волнового режима. Поэтому полный шаг — режим по умолчанию в библиотеке. Полный шаг, две соседние фазы
- Сколько позиций на оборот вала даёт полушаг у 28BYJ-48?
- 2048 полных шагов умножаются на два: 4096 полушагов, шаг вала — 0,088 градуса. 4096
- Почему волновой режим почти не применяют на практике?
- Одна катушка тянет слабо: шаг тот же, а тяга падает до семи десятых. Режим годится разве что для экономии тока на холостых поворотах. Момент примерно в 1,4 раза ниже полного при том же размере шага
- В массиве последовательности поменяли местами два соседних такта. Что произойдёт?
- Последовательность циклична и строгая: сломанный порядок заставляет ротор ходить туда-обратно между двумя положениями. Диагноз — мигание светодиодов не по кругу. Ротор будет дёргаться на месте и гудеть