Робот-курьер на двух 28BYJ-48 должен был проехать от стола до зарядки метр двадцать по прямой, а остановился в пятнадцати сантиметрах раньше — счётчик шагов отрапортовал маршрут честным голосом. Дальше я три вечера выяснял, почему шаговик на колёсах врёт: мотор считает собственные обороты, а колесо живёт своей жизнью между полом и резиной. Базу по самому мотору берите в первом уроке про 28BYJ-48 — здесь только механика колёс.
Шаговик на роботе — редкий выбор, и по делу: он медленный, тяжёлый и ест ток на каждой остановке. Но ниша у него есть: точный темп без энкодеров, остановки по счёту и перенос момента без транзисторных танцев — граница с другими моторами очерчена в уроке про выбор между шаговиком, серво и DC. Если ваш робот ползает по плану, а не мчится, шаговик выигрывает простотой.
Заодно платформа отвечала на вопрос, который мне задают чаще всего: зачем шаговик на колёсах, если DC-моторчик с редуктором дешевле и быстрее. Ответ до сих пор тот же: шаговик считает свой маршрут сам — без энкодеров, без колёсных датчиков, чистой арифметикой. Пока колесо не проскальзывает, счёт шагов и есть одометрия; вся беда в том, что проскальзывает оно всегда — вопрос лишь в том, сколько и когда.
Оборот колеса в сантиметры
Путь за оборот — это окружность колеса: колесо диаметром 65 миллиметров наматывает 204 миллиметра за один оборот вала. Шагов на оборот у 28BYJ-48 — 2048, выходит около сотни шагов на сантиметр пути. Скорость считается тем же делением: спокойный потолок BYJ — десять оборотов в минуту — даёт тридцать четыре миллиметра в секунду; через комнату такой робот едет полминуты. NEMA 17 на шестидесяти оборотах выдаёт двадцать сантиметров в секунду — это уже транспорт, а не декорация, но и ток другой. Диаметр колеса — главный рычаг скорости: крупное колесо умножает путь за оборот и режет шаги на сантиметр, делая платформу грубее в позиционировании, но быстрее; мелкое ползёт порциями и годится для столика, а не для курьера. И помните, что все эти цифры считались с пустым корпусом: груз добавляет инерцию, инерция добавляет проскальзывание на старте.
Вторая цифра — старт. Шаговик трогается мгновенно: на первом такте колесо получает полный момент, и на гладком полу резина на миг проскальзывает — робот коротко дёргается и едет дальше. Лечится разгоном: скорость поднимается ступенями за первую секунду, и колесо успевает цепляться. Ступени стоят несколько сотен миллисекунд на поездку — дёшево против дёрганого старта, из-за которого с платформы съезжает груз. Профиль разгона и цена рывка разобраны в уроке про разгон и торможение, а чтобы езда не блокировала остальную логику, возьмите каркас из урока про планировщик на millis.
| Колесо | Путь за оборот | Шагов на 10 см (BYJ) | Скорость при 10 об/мин |
|---|---|---|---|
| 50 мм | 157 мм | 1304 | 26 мм/с |
| 65 мм | 204 мм | 1003 | 34 мм/с |
| 80 мм | 251 мм | 816 | 42 мм/с |
| 100 мм | 314 мм | 652 | 52 мм/с |
Сцепление — вес на ведущей оси, умноженный на материал пары. Голый пластик по ламинату — лотерея: момент есть, колеса вертятся, робот стоит. Резиновое кольцо на ободе превращает платформу в транспорт; вторая резина не помешает и на ведомых колёсах, если робот должен ехать по ковру. Калиброванный робот на твёрдой ровной поверхности расходится с реальностью на один-три процента пути: метр — сантиметр-три вранья. На разгоне, торможении и поворотах хуже — счётчик завышает пройденное, потому что колесо крутилось больше, чем робот проехал. Проверка сцепления делается без приборов: поднимите ведущую ось с грузом в воздух и попробуйте пальцем остановить колесо при старте — остановилось без борьбы, значит на полу первый же старт пройдёт в скольжении.
Поворот собирается из двух ведущих колёс: разные скорости на левую и правую сторону крутят корпус на месте. Координация двух моторов — та же задача, что у плоттера на двух шаговиках: считать каждую ось своей рукой. И не ставьте оба мотора на одну сторону: ведущая ось должна нести вес — батарея кладётся над ней, а не где пришлось. Не верьте «примерно» в диаметре: замерьте колесо с надетой резиной штангенциркулем — печатный обод гуляет на миллиметр, а это проценты пути на каждом маршруте. Про развесовку честно: платформа с батарейным отсеком сзади ведёт себя как тележка из супермаркета — задняя ось гружёная, передняя молотит воздухом. Мой первый робот носил батарейки сзади и дрейфовал вправо, пока я не догадался, что правое переднее колесо почти не касается пола.
// Робот-платформа: два 28BYJ-48, колёса 65 мм (204 мм за оборот).// Левый мотор: 8,10,9,11. Правый: 4,5,6,7. Разгон 3 -> 10 об/мин.// Моторы крутятся по очереди (Stepper.h блокирует): для синхронного// шага нужен планировщик на millis из урока more13.#include <Stepper.h> Stepper levo(2048, 8, 10, 9, 11);Stepper pravo(2048, 4, 5, 6, 7); const int OKRUZH_MM = 204; // окружность колеса 65 мм void edem(int mm) { long shagov = (long)mm * 2048 / OKRUZH_MM; long kusok = shagov / 4; int skorostyi[4] = {3, 5, 8, 10}; for (int i = 0; i < 4; i++) { levo.setSpeed(skorostyi[i]); pravo.setSpeed(skorostyi[i]); levo.step(kusok); // по очереди: платформа качается, pravo.step(kusok); // но едет; синхрон - планировщик }} void setup() { levo.setSpeed(10); pravo.setSpeed(10); Serial.begin(9600); Serial.println("Platforma gotova: 300 mm po schetchiku");} void loop() { edem(300); Serial.println("Marshrut 300 mm vypolnen (po schetchiku)"); delay(3000);}Почему счётчик шагов — не одометрия
Питание двух моторов — арифметика перед сборкой. Один 28BYJ-48 при езде берёт порядка ста-ста сорока миллиампер, два — до трёхсот: USB-порт макетки на грани, старт обоих моторов разом ловит просадку. Пять вольт отдельно от платы и общая земля — та же схема, что в уроке про внешнее питание. На стоянке обесточивайте обмотки: робот всё равно стоит на колёсах, а триста миллиампер удержания греют моторы и съедают батарею впустую — стратегии снятия тока разобраны в уроке про ток удержания. Провод питания на едущей платформе — расходник: держите разъём съёмным, иначе первый же манёвр вырвет провод из макетки.
Честная ниша шаговика на колёсах — маршрут по счёту без энкодеров: конвейер полки, поездки между двумя точками, медленный темп с остановками. Всё, что гоняет по батарейке и борется за скорость, живёт лучше на DC-моторчиках с редуктором. И про вес честно: платформа с двумя шаговиками, платой и батарейным отсеком съедает полкилограмма до того, как влезет груз — считайте кузов частью полезной нагрузки, а не бесплатной рамой. Главный урок моей платформы: счёт шагов — это план маршрута, а не его факт; внешний ориентир закрывает разрыв между ними.
Разбор стенда. Ползунок внизу — скользкий пол: колесо делает оборот, по счётчику двести четыре миллиметра, фактических меньше сотни, светодиод рапортует о буксовании. Вверху — резиновый коврик: потеря падает до единиц процентов, и поездка почти честна. Ползунок посередине — ламинат: потеря в пределах пары десятков процентов, и уже видно, как счётчик крадёт маршрут. Обратите внимание, куда движется вранье: счётчик всегда завышает, колесо не проезжает больше, чем прокрутилось, — маршрут по одометрии без оглядки всегда съезжает короче расчётного. И заметьте: вал крутится одинаково на обоих краях ползунка — момент мотора не меняется, меняется лишь то, сколько его превращается в путь.
Что с этим делать на реальной платформе. Первый приём — разгон по ступеням, как в скетче выше: старт без рывка убирает пиковое проскальзывание. Второй — ориентиры: стенка, чёрная линия, дальномер; по ним робот перепроверяет счёт и не копит невязку. Третий — запас: маршрут, посчитанный по счётчику в триста миллиметров, закладывайте как триста плюс поправка на покрытие, которую вы измерили один раз на своём полу. Четвёртый — скрипучий, но верный: менять покрытие под задачу; коврик для мыши под колёсами стоит дешевле оптической одометрии и прощает даже старые колёса.
- 1. Какой путь проходит колесо диаметром 65 мм за один оборот?
- 2. Насколько расходится с реальностью одометрия калиброванного робота на твёрдом ровном полу?
- 3. В какую сторону врёт счётчик шагов при буксовании?
- 4. Как убрать проскальзывание на старте?
- 5. Что делать с обмотками моторов, когда робот стоит?
- Путь за оборот — окружность колеса: 65 мм дают 204 мм пути и около 100 шагов BYJ на сантиметр
- Скорость платформы: 10 об/мин BYJ — 34 мм/с на колесе 65 мм; NEMA 17 на 60 об/мин — 20 см/с
- Старт без разгона буксует: скорость поднимается ступенями за первую секунду
- Одометрия по колёсам расходится на 1-3% на ровном полу и всегда завышает путь
- Два мотора едят до 300 мА: питание отдельное от платы, на стоянке обмотки обесточить
Частые вопросы по теме урока
- Какой путь проходит колесо диаметром 65 мм за один оборот?
- Путь за оборот равен окружности: пи на диаметр — 3,14 на 65 = 204 мм. Сотня с лишним шагов BYJ на каждый сантиметр этого пути — поэтому маршрут на двести шагов съедает несколько тысяч импульсов. 204 мм
- Насколько расходится с реальностью одометрия калиброванного робота на твёрдом ровном полу?
- На твёрдой ровной поверхности счёт по колёсам расходится на один-три процента; рывки и повороты добавляют проскальзывание, и счётчик завышает. На 1-3 процента пути, хуже на разгоне и поворотах
- В какую сторону врёт счётчик шагов при буксовании?
- Счётчик считает обороты мотора. Колесо прокрутилось мимо пола — шаги начислены, путь не пройден: одометрия всегда съезжает в большую сторону, иного режима у неё нет. Завышает путь: колесо крутилось больше, чем робот проехал
- Как убрать проскальзывание на старте?
- Шаговик отдаёт полный момент на первом такте; плавный разгон растягивает его на секунду, и резина успевает цепляться. Профиль — в уроке про разгон и торможение, ступени дешевле любого веса. Разгонять скорость ступенями за первую секунду
- Что делать с обмотками моторов, когда робот стоит?
- На стоянке удержание не нужно: платформу держат колёса, а триста миллиампер двух моторов греют обмотки и сажают батарею. Удержание оставьте вертикальным осям без самоторможения. Держать ток: так надёжнее