Создавая своего первого робота (Робот для настольного хоккея), а именно механическую часть, узнал много интересного для себя, чем и хочу поделиться.
Примерно половину знаний я «нагуглил» или подсмотрел на Youtube, а вторую половину получил на практике, методом проб и ошибок в многочисленных экспериментах.
Расскажу про 4 момента, на мой взгляд заслуживающих особого внимания:
- Разгон шагового мотора до максимальных оборотов.
- Одновременная работа массива из шаговых моторов через один контроллер.
- Охлаждение шаговых моторов и драйверов.
- Как избавиться от писка шаговых моторов.
В настольном хоккее Stiga Play-Off с каждой стороны по 6 игроков (вратарь и 5 на поле). У моего робота для настольного хоккея, в соответствии с количеством игроков — 6 роборук, по одной руке для каждого игрока, и каждую руку приводят в движение 2 мотора. Первый мотор перемещает игрока вперёд и назад, а второй мотор вращает клюшку. Итого задействовано 12 шаговых моторов.
Почему именно шаговые моторы? Мне понадобилась точность и аккуратность, а шаговый мотор как раз и обладает способностью вращать вал строго на заданное количество градусов/шагов. Но, кроме точности, понадобилась скорость, и тут начались проблемы и поиск решения.
1. Разгон шагового мотора до максимальных оборотов
При поиске в интернет можно найти много информации про ЗD принтеры, ЧПУ, роборуки с 6 степенями свободы и тому подобным устройствам. Но, мне нужно передвинуть игрока на ~40 см за доли секунды или ударить клюшкой по шайбе так, чтобы она полетела в ворота через всё игровое поле. И что делать? — ставить опыты и выжимать из моторов все соки!
Вал шагового мотора вращается импульсами и моторы, которые я использовал для робота (типоразмер Nema 17) делают 1 полный оборот за 200 шагов, по 1.8 градуса за 1 шаг.
Как новичок, я приобрёл самые обычные драйверы для шаговых двигателей A4988, купил контроллер Ардуино Мега с самым большим количеством входов/выходов, CNC Shield v3 для удобного размещения сразу 4-х драйверов, блок питания на 12 вольт, всё соединил проводами по инструкциям с многочисленных сайтов. Разобрался как написать скетч-программу для Ардуино и запустил.
Моторы стали вращаться, но мне была нужна скорость. Если подать с контроллера на драйвер мотора 1000 импульсов в секунду, мотор будет вращаться со скоростью 5 оборотов в секунду. Замечательно, но этого было мало. Увеличил количество импульсов и мотор перестал трогаться – пищит и не крутится, не хватает сил тронуться сразу на таких оборотах. Это как на машине с механикой сразу включить 5-ю передачу. Пришлось дорабатывать скетч контроллера для плавного, но по возможности, быстрого старта. Есть, конечно, готовые классы AccelStepper, но как-то я с недоверием его воспринял, будут ограничения как всегда, подумал и сделал свой собственный класс для плавного старта, в котором использовал формулу кубической параболы с некоторыми вспомогательными коэффициентами.
Сначала интервалы между импульсами нужно делать больше, чтобы мотор тронулся, и дальше плавно сокращать интервалы между импульсами. Мотор будет плавно разгоняться благодаря такому программному вариатору. Для разных моторов могут быть свои условия максимально быстрого разгона, нужно экспериментировать, понять где потолок возможностей мотора по напряжению и току.
При таком разгоне обязательно присутствуют пропуски шагов, но потеря нескольких шагов для тех целей, которые я преследовал, не важны, это не 3D печать.
Подвожу итог – для максимального RPM нужно обеспечить плавный разгон.
2. Одновременная работа массива из шаговых моторов через один контроллер
Как уже озвучено выше, в роботе используется 12 шаговых моторов. Этот массив моторов управляется через 1 контроллер Ардуино Мега, который был выбран из-за наличия большого количества пинов (входов/выходов).
Чтобы управлять 12 моторами мне понадобилось:
- 12 пинов контроллера для передачи шагов на драйверы моторов
- 12 пинов для установки направления вращения
- 12 пинов для управления включением/отключение драйверов моторов (необязательно, но желательно, т.к. оказалось важным для охлаждения)
Дополнительно задействовал ещё 24 пина:
- 12 пинов для получения данных от оптических концевых выключателей (нужны для безопасности механики, ограничивая зону перемещения приводов игроков, разве можно полностью доверять программе? Датчики по одному установлены в начале и конце каждого привода и ещё есть пружины для мягкой остановки, разве можно полностью доверять датчикам?)
- 12 пинов для RGB-светодиодов индикации режимов работы (зелёный горит при подаче питания, синий добавляется при движении вперёд/назад и красный добавляется при вращении клюшки, в общем, зелёный для пользы, а синий и красный цвета для красоты)
В скетче для Ардуино создал класс Player для управления 2-мя моторами (перемещение и вращение клюшки) и при запуске создаётся 6 экземпляров этого класса. При инициализации классов передаются номера пинов, к которым будет привязан каждый из «игроков», т.о. каждый из 6-ти игроков привязан к своим драйверам/моторам, датчикам и светодиодам.
В цикле loop скетча проверяется порт USB на наличие команды от компьютера и по очереди вызываются методы Move и Rotate у 6-ти объектов игроков для выполнения движений или остановок.
Подведу итог — контроллер Ардуино Мега оснащён очень большим количеством входов/выходов >70. Если потребуется решить некую задачу, можно подключить десятки шаговых моторов.
3. Охлаждение шаговых моторов и драйверов
Если на драйвер шагового мотора на пин VMOT подать питание и драйвер будет включен (по умолчанию ENABLE=0 — включен), мотор, возможно, начнёт немного пищать (зависит от драйвера), а обмотки мотора и драйвер начнут греться. Можно потрогать радиатор драйвера и убедится в этом. Я начал использовать питание мотора 12V и нагрев быстро почувствовал, а при 36V мне очень не понравился этот эффект.
Дожидаться, пока сгорят обмотки мотора или драйвер я не стал и начал разбираться, что не так. Всё решить помог пин ENABLE. В случае, если вращение мотора не требуется, следует выключить драйвер ENABLE=1, а когда понадобится вращение, нужно просто включить драйвер ENABLE=0. Поскольку в роботе используются 12 моторов, и они не очень часто вращаются одновременно, значит им можно давать остыть, когда не нужны.
Я взял под контроль пин Enable каждого драйвера мотора через Ардуино. Понадобилось дополнительно задействовать 12 пинов контроллера, но драйверы стали холодными и моторы больше не шумят, хотя используется напряжение 36V.
4. Как избавиться от писка шаговых моторов
Сначала я приобрёл драйверы для шаговых моторов A4988, понадобилось 12 штук. Они популярные, надёжные, простые и понятные, а также очень дешёвые, для новичков самое то. Всё работало почти хорошо, с шагами всё понятно, 1 импульс – 1 шаг, 200 импульсов при 1.8 градуса на 1 шаг – 1 оборот мотора.
Но, было 2 неприятных момента. На малых оборотах, особенно, когда нужно медленно повернуть клюшку игрока, у моторов наступал тремор. И ещё, этот писк! При работе 12 моторов было ощущение, что со мной разговаривает R2D2.
Стал искать решение проблемы и узнал о тихих драйверах с немецкими чипами Trinamic TMC 2100, 2130, 2208 и прочих сериях. Стоят они в несколько раз дороже, но, если Вам нужна тишина и плавность хода, они того стоят.
В TMC есть режим StelthChop с интерполяцией 4 или 16 входных импульсов в 256 микрошагов. После тестирования, выбрал режим 4->256 микрошагов.
Скетч для Ардуино потребовалось немного дописать, т.к. теперь для полного оборота мотора требовалось не 200 шагов, а в 4 раза больше (800 на 1 полный оборот) из-за используемого режима StelthChop 4->256. Больше шагов – плавнее и тише ход. Вращение сейчас плавное, тихое и никакого писка.
Видео, что в итоге получилось:
Надеюсь, мой опыт поможет кому-нибудь в других проектах.
Автор: Андрей Хорькин