Монтировку для астрофотографии я собрал честно: NEMA 17, редуктор, трапеция разгона, счётчик шагов в long. Месяц всё работало, потом я заметил, что звезда уходит из кадра за двадцать минут съёмки. Счётчик уверенно показывал: платформа повернулась на пять градусов. Метка на валу — капля лака, которую я поставил ещё при сборке, — показывала меньше. Хуже всего было то, что в один вечер мотор пропускал два шага, в другой — восемь, и никакой закономерности, кроме одной: всё случалось под нагрузкой и на разгоне.
Пропущенные шаги — не поломка, а физика: момент ротора не вытянул внешнюю нагрузку или собственное ускорение, поле ушло вперёд, вал остался. Счётчик при этом считает приказы, а не повороты, и разница между планом и фактом копится молча. В уроке про срыв шагов под нагрузкой мы уже видели, как это выглядит со стороны; здесь займёмся практикой: как поймать срыв на живой машине, что его вызывает и как автомат учится жить с ним — лимиты скорости и ускорения, редукция, возврат в ноль по концевику.
Метка на валу и концевик: две правды
Первая правда — механическая метка: капля краски или полоска скотча на валу, видимая глазом. Проверка занимает минуту: скетч командой просит пятьдесят шагов — при 200 на оборот это ровно четверть круга — и вы смотрите, доехала ли метка. Не доехала — часть шагов сорвана, и счётчик врёт ровно на разницу между журналом и четвертью круга. Та же проверка на моторчике 28BYJ-48 просит 512 шагов: 2048 на оборот, четверть — те же девяносто градусов.
Вторая правда — концевик нуля. Метка показывает, что срыв есть; концевик показывает, где ноль, и стирает накопленную разницу: доезжание до края замыкает контакт, и код верит контакту, а не своим числам. Именно так устроен возврат в ноль по homing-концевику; в скетче ниже обе проверки живут вместе: команда «g» едет по плану и печатает счётчик, команда «h» — домой, по правде края.
const int PIN_STEP = 4;const int PIN_DIR = 5;const int PIN_HOME = 2; // концевик нуля: замкнут у края long pos = 0; // счётчик: план, не измерениеlong goal = 0; // приехали, когда pos == goalint dirSign = 1; // 1 вперёд, -1 назад unsigned long lastStep = 0;const unsigned long INTERVAL = 3000; // мкс: 333 шага/с, старт из окна bool atHome() { return digitalRead(PIN_HOME) == LOW; } void setup() { pinMode(PIN_STEP, OUTPUT); pinMode(PIN_DIR, OUTPUT); pinMode(PIN_HOME, INPUT_PULLUP); Serial.begin(9600); Serial.println("g - 50 шагов вперёд, h - домой по концевику");} void loop() { if (Serial.available() > 0) { char c = Serial.read(); if (c == 'g') { dirSign = 1; digitalWrite(PIN_DIR, HIGH); goal = pos + 50; // 50 шагов = четверть круга при 200 на оборот Serial.print("план: 50 шагов, счётчик "); Serial.println(pos); } if (c == 'h') { dirSign = -1; digitalWrite(PIN_DIR, LOW); goal = 0; // правда только у концевика } } if (dirSign > 0 && pos == goal) return; // доехали по плану if (dirSign < 0 && atHome()) { // доехали по правде pos = 0; goal = 0; dirSign = 1; Serial.println("homing: счётчик обнулён по концевику"); return; } if (micros() - lastStep < INTERVAL) return; lastStep = micros(); digitalWrite(PIN_STEP, HIGH); digitalWrite(PIN_STEP, LOW); pos += dirSign;}Внутри loop() нет ничего хитрого: шаги идут по таймеру на micros(), счётчик pos растёт или убывает, край останавливает отъезд и обнуляет счёт — сколько бы шагов ни сорвалось по дороге, у концевика своё слово. Диагностика строится на разрыве: журнал говорит «пятьдесят», метка говорит «четверть круга или нет». Дальше — причины из таблицы ниже, и первая из них лечится редукцией: на половинной скорости момент у моей монтировки с запасом перекрывает разбаланс, и звезда перестала уползать.
Крутой разгон — вторая причина: скачок командной скорости, который вал не догоняет. Лечится стартом из окна низких скоростей и растянутым разгоном — трапецией из урока про расчёт ускорения. Третья и четвёртая причины — электрические: просадка питания сбрасывает драйвер на середине хода, а горячие обмотки теряют момент, про их цену у нас есть урок про нагрев и ток покоя. Если не хочется вести трапецию руками, AccelStepper делает это сама — но окно старта и редукцию она вам не придумает, их задаёт механика.
| Причина | Как видна | Первое лечение |
|---|---|---|
| Срыв по моменту: нагрузка выше момента | гул, вал дёргается или стоит, счётчик продолжает идти | редукция: вдвое меньше скорость — заметно больше момента; облегчить механику |
| Слишком крутой разгон | срыв в первые секунды хода, дальше едет ровно | старт из окна низких скоростей, растянутый разгон |
| Просадка питания при пуске | плата перезагружается, драйвер сбрасывается на середине хода | БП с запасом по току, электролит у входа драйвера |
| Нагрев обмоток | после получаса работы мотор едет всё хуже | снизить ток покоя, дать остыть, проверить радиатор драйвера |
- 1. Счётчик скетча насчитал 50 шагов, а метка на валу не доехала до четверти круга. Что это значит?
- 2. Мотор срывается на старте с грузом, но едет, если начать медленно и разгонять. Что крутить?
- 3. Автомат работает неделю, и позиция уплывает всё сильнее. Что ставят для лечения?
- Пропущенные шаги — физика момента, а не поломка: счётчик считает приказы, вал живёт по своим силам
- Диагноз за минуту: 50 шагов при 200 на оборот — метка на валу обязана пройти четверть круга
- Компенсация: старт из окна низких скоростей, растянутый разгон, редукция — меньше скорость, больше момента
- Возврат в ноль по концевику стирает накопленный срыв: правду знает край, а не счётчик
Частые вопросы по теме урока
- Счётчик скетча насчитал 50 шагов, а метка на валу не доехала до четверти круга. Что это значит?
- Счётчик шагов — план, а не измерение. Сорванные под нагрузкой шаги мотор не восстанавливает: позиция уехала ровно на разницу между журналом и меткой. Часть шагов сорвалась: счётчик считает приказы, а не повороты
- Мотор срывается на старте с грузом, но едет, если начать медленно и разгонять. Что крутить?
- Старт из окна, где момент в запасе, и плавное укорачивание интервала — та же трапеция из урока про разгон: крутой скачок команды вал не догоняет. Стартовать из окна низких скоростей и растянуть разгон
- Автомат работает неделю, и позиция уплывает всё сильнее. Что ставят для лечения?
- Счётчик врёт накопленным срывом, и никакая арифметика это не чинит. Концевик — единственный источник правды: касание края означает ноль. Возврат в ноль по концевику: доезжание до края обнуляет счёт