Второй слайдер я строил из того, что нашлось в ящике, и винт там стоял уже TR8×2. Константы первого скетча переехали в новый без изменений — и каретка на команду «проедь сто миллиметров» ушла на четыреста: на мелком свинце оборот приносит вдвое меньше пути, а шагов на миллиметр становится вчетверо больше. Тогда я выписал всю механику в три формулы, а потом спрятал их в скетч, который сам считает скорость по любому винту. Этим скетчем — и формулами за ним — и займёмся.
Задача урока шире одного слайдера: любые оси с винтом — шторки, дозаторы, столики станка — живут на одной цепочке «свинец → шаги → скорость». Посчитав её один раз честно, вы перестанете подбирать константы наощупь и заранее увидите, где мотор упрётся в срыв шагов, а где винт окажется слишком медленным для задачи.
Свинец: главная цифра винта
Свинец — расстояние, которое гайка проходит за один полный оборот винта. Для линейки TR8 он стоит вторым числом в названии: TR8×2 — два миллиметра за оборот, TR8×8 — восемь, TR8×16 — шестнадцать. Диаметр у всех один — восемь миллиметров, гайка от TR8×8 накручивается на TR8×2, но ход у неё на чужом винте будет не тот: свинец определяет всё.
Формул пересчёта две. Шагов на миллиметр: шаги_на_оборот × микрошаг / свинец. Оборотов в минуту: мм/мин / свинец. Микрошаг — делитель драйвера: полушаг удваивает число шагов, 1/4 — учетверяет, драйвер A4988 на 1/16 даёт шестнадцать. У 28BYJ-48 микрошага нет, поэтому в наших формулах он равен единице, но считать его нужно уже сейчас: NEMA17 с двумястами шагами на оборот и драйвером на 1/16 живёт в этих же формулах, просто с другими числами — мотор мы разбирали в уроке про NEMA 17 и 200 шагов, а механику деления шага — в уроке про микрошаг 1/16.
Таблица ниже — вся вилка свинцов на 28BYJ-48 без микрошага. Смотрите на последнюю колонку: предел мотора — пятнадцать оборотов в минуту, и на мелком свинце он превращается в до обидного маленькую линейную скорость.
| Винт | Свинец, мм/оборот | Шагов на мм | Цена шага | Потолок при 15 RPM |
|---|---|---|---|---|
| TR8×2 | 2 | 1024 | 0,98 мкм | 30 мм/мин |
| TR8×8 | 8 | 256 | 3,9 мкм | 120 мм/мин |
| TR8×16 | 16 | 128 | 7,8 мкм | 240 мм/мин |
Момент: почему быстро — значит слабо
Проверка скорости — два деления. Для 5 мм/мин на TR8×8: обороты 5 / 8 = 0,625 RPM, шагов в секунду 256 × 5 / 60 = 21,3. Запас до потолка в двадцать четыре раза, мотор даже не заметит. А вот та же скорость на TR8×2 требует уже 1280 шагов в секунду — вдвое выше срыва: мелкий свинец съедает скоростной запас на ровном месте, потому что каждый миллиметр пути оплачивается четырьмя лишними сотнями шагов.
Момент падает с ростом частоты шагов по физике, а не по капризу экземпляра: обмотка — индуктивность, ток в ней нарастает не мгновенно, и чем короче шаг, тем меньше успевает магнитное поле. На низкой скорости мотор тянет то, что задыхается тянуть на высокой, — я разбирал это с числами в уроке про срыв шагов и момент. Для оси с винтом вывод практический: тяжёлое поднимай медленно или бери свинец покрупнее — редуктор из резьбы достаётся бесплатно.
Последняя цифра, которую стоит проверить до сборки, — целочисленный интервал. В скетче пауза между шагами хранится в целых миллисекундах, и на быстрых ходах дробь теряется: 60000 / (256 × 12) = 19 вместо честных 19,53 — каретка едет на 2,7 % быстрее расчётной. Для слайдера это пустяк, для стоп-моушна с сотнями кадров — накопится. Точное лечение — вести остаток в дробной переменной и снабжать шаг лишней миллисекундой по мере накопления, классический накопительный счётчик.
#include <Stepper.h> const float SHAGOV_NA_OBOROT = 2048.0; // 28BYJ-48, полные шаги Stepper stepper(2048, 8, 10, 9, 11); void setup() { stepper.setSpeed(10); Serial.begin(9600); Serial.println("Vvedite: svinec_mm mikroshtag mm_min kontrol"); Serial.println("Primer: 8 1 5 1");} void loop() { if (Serial.available() > 0) { float svinec = Serial.parseInt(); // свинец, мм за оборот float mikroshtag = Serial.parseInt(); // делитель: 1, 2, 4, 8, 16 float mmMin = Serial.parseInt(); // скорость, мм/мин float kontrol = Serial.parseInt(); // 1 - контрольный оборот if (svinec < 1 || mikroshtag < 1 || mmMin <= 0) { Serial.println("Ne ponyal. Primer: 8 1 5 1"); return; } float shagNaMm = SHAGOV_NA_OBOROT * mikroshtag / svinec; float rpm = mmMin / svinec; float shagVSek = shagNaMm * mmMin / 60.0; Serial.print("shagov na mm: "); Serial.println(shagNaMm, 1); Serial.print("oborotov v minutu: "); Serial.println(rpm, 3); Serial.print("shagov v sekundu: "); Serial.println(shagVSek, 1); if (rpm > 15.0) { Serial.println("Verdik: vyshe 15 RPM motor sryvaet shagi"); } else { Serial.println("Verdik: skorost po silam motora"); } if (kontrol >= 1) { Serial.println("Kontrolnyy oborot: gajka proedet svinec mm"); stepper.step(2048); // один оборот = свинец миллиметров } }}Протокол ввода — четыре числа через пробел: свинец, делитель микрошага, скорость, флаг контрольного хода. Serial.parseInt пропускает пробелы и переводы строк, поэтому строка «8 1 5 1» разбирается на четыре числа — приёмы разбора я собирал в уроке про parseInt, а настройки монитора порта, чтобы плата услышала строку, — в первом уроке про Serial.
Контрольный ход — моя любимая часть: мотор делает ровно один оборот, и гайка обязана проехать столько миллиметров, сколько написано в свинце. На TR8×8 это восемь миллиметров по линейке. Если линейка показывает два — у вас в руках TR8×2, и все константы надо пересчитать. Оборот не зависит ни от микрошага, ни от скорости — самая честная проверка винта, и занимает она шесть секунд на 10 RPM.
Калькулятор в симуляторе: скорость под пальцем
В симуляторе калькулятор живёт на потенциометре: ползунок A0 задаёт скорость от 1 до 12 мм/мин, Serial печатает всю цепочку расчёта — миллиметры в минуту, обороты, шаги в секунду — и мотор тут же едет с темпом, который только что посчитал. Ползунок влево — скорость падает до единиц шагов в секунду, и на собственных глазах становится видно, что такое таймлапс-темп.
- Свинец — путь гайки за оборот; у TR8×8 это 8 мм, и это не шаг резьбы: четыре захода по 2 мм
- Шагов на мм = 2048 × микрошаг / свинец; RPM = мм/мин / свинец — от микрошага не зависит
- Вилка на 28BYJ-48: TR8×2 — 1024 шаг/мм и 30 мм/мин потолок, TR8×8 — 256 и 120, TR8×16 — 128 и 240
- Момент падает с частотой шагов: индуктивность не даёт току нарасти; мелкий свинец съедает скоростной запас
- Контрольный оборот — честная проверка винта: один оборот = свинец миллиметров по линейке
- 1. Сколько миллиметров проходит гайка за один оборот винта TR8×8?
- 2. Во сколько раз вырастет число шагов на мм при переходе к микрошагу 1/4?
- 3. Какой потолок линейной скорости у 28BYJ-48 на винте TR8×2 при его пределе 15 RPM?
- 4. Какие обороты в минуту нужны для 6 мм/мин на TR8×8?
- 5. Почему момент шаговика падает с ростом скорости?
Формулы посчитаны и спрятаны в скетч, но и они не ответят на вопрос «жив ли конкретный мотор из посылки». Для этого нужен стенд: следующий урок собирает серию тестов — оборот с хронометражем, порции, реверс со счётчиком — по одной кнопке, с таблицей симптомов на выходе.
Частые вопросы по теме урока
- Сколько миллиметров проходит гайка за один оборот винта TR8×8?
- Свинец — второе число в названии: четыре захода резьбы по 2 мм дают восемь миллиметров за оборот. 8
- Во сколько раз вырастет число шагов на мм при переходе к микрошагу 1/4?
- Делитель микрошага умножает число шагов: 1/4 даёт учетверённый счёт при том же пути. В 4 раза
- Какой потолок линейной скорости у 28BYJ-48 на винте TR8×2 при его пределе 15 RPM?
- 15 оборотов × 2 мм свинца = 30 мм/мин. Мелкий свинец превращает скоростной потолок мотора в черепаший. 30 мм/мин
- Какие обороты в минуту нужны для 6 мм/мин на TR8×8?
- 6 / 8 = 0,75 RPM. Дробь меньше единицы — значит, темп задаёт таймер, а не setSpeed. 0,75
- Почему момент шаговика падает с ростом скорости?
- Чем короче шаг, тем меньше ток успевает нарастить магнитное поле. На низкой скорости мотор тянет больше. Обмотка индуктивна: ток не успевает нарасти за время шага