Механизм поворота головы

Видимо, над всеми клонами K9 из фильма тяготеет некое проклятье по части шеи, унаследованное от оригинала. У него, там, все, тоже, было очень непросто с поворотом головы.


Изюминка в этом всем то, что у оригинального K-9 из фильма голова не поворачивалась в принципе. Даже в “возрожденном сериале”. Но! В куче серий “классического Доктора Кто”, можно видеть, что голова у К-9 бывает слегка повернута вправо:

За этим стоит некая легенда, якобы, почерпнутая из “достоверных источников” (от техников со съемочной площадки). Типа, во время одного из выездов на пленер для съемок, модель К9 слегка повредили в грузовике… Ну, там, типа, голова слегка оторвалась совсем нафиг… Уже на месте, ее отремонтировали скотчем и соплями, как смогли. Кривовато, но съемочную сессию, типа, переживет. А поскольку за одну съемочную сессию снимается много-много сцен, которые потом размазываются по куче серий (а то и сезонов), то вот так и получается, что оригинальный К9 в разных сериях появляется, то со свернутой головой, то с прямой. Такова легенда…

Так ли это все на самом деле или нет – я не знаю. Вроде, ничего невероятного в описанной истории нет… Но, факт: “свернутая голова” для создателей копий этого робота стала своего рода фетишем и теперь некоторые, даже, считают хорошим тоном повторить этот “изысканный полуоборот” в своих поделках.

С другой стороны… Пес с ней с легендой, но вращать головой, а почему бы и нет, собственно? Пускай моя версия этого робота будет уметь вертеть головой, как того и ожидается с позиций антропоморфизма. И пускай для этого не нужны будут сопутствующие “несчастные случаи на производстве”.

Однако, по факту, для реализации этого, казалось бы, нехитрого функционала, мне потребовалось аж три попытки! Первая попытка потерпела провал из-за жадности. Вторая – из-за глупости. С третьего раза вышло все как надо, кажись… К сожалению, на каждую из попыток ушла прорва времени и сил, что тормознуло развитие проекта недели на три-четыре.

Но, обо всем по порядку…


При разработке поворотного узла необходимо было учитывать немалый вес получающейся головы. По самым скромным оценкам, вес головы выходит чуть больше 8 фунтов (около 4 ваших кило). И это только каркас с начинкой без внешней обшивки. Обшивка, полагаю, накинет еще пару фунтов к общему весу.

С учетом конструкции головы, ее точки крепления к шее и распределения компонентов внутри, весь этот вес оказывается крайне несбалансированным. Т.е. на точку крепления всегда приходится максимальная нагрузка, распределить и уравновесить которую не представляется возможным в рамках условностей выбранного дизайна:

Как следствие этого, точка крепления головы к шее должна быть очень прочной. Ведь ей придется не просто удерживать голову, но еще и противостоять инерциальным нагрузкам, которые эта голова начнет производить во время движений. И, даже, не важно, будет робот вращать головой или нет. Он сам по себе в любом случае будет перемещаться в пространстве, таская свою тяжелую репу, подвешенную за краешек на тонкой палочке шеи.


Хорошим примером решения этой проблемы может быть экскаватор, например… Или танк, как другой пример… У них тоже есть, своего рода, “тяжелая голова”, которая должна без помех вращаться, испытывая серьезные инерциальные нагрузки и не отрываться при этом от “туловища”.

В жизни нас уже окружают и танки, и экскаваторы. Соответственно, как не сложно догадаться – все уже изобретено до нас, придумывать ничего не надо… Люди давно разработали для подобного рода конструкций, крепление построенное на базе обширного поворотного кольца (slewing ring) с интегрированной в него ведомой шестерней (обычно) и отдельного от него механизма поворота c редукторами и ведущими шестернями:

Вариантов конструкции может быть множество, но суть у всех одна: распределить нагрузки по максимальной площади опорного элемента, сохранив при этом его функционал и свободу движений. Все это в общем и целом называется slewing drive и является отчасти, как это ни странно, потомком простой червячной передачи (на вики есть только англоязычная версия, простите).

Вот это я и решил устроить для собачки, чтобы она могла полноценно вращать головой.


Попытка первая.

Вначале нужно было выяснить в каких пределах тут можно действовать. Очевидно, что опорная площадь всего механизма не может быть шире самой головы, чтобы не выступать за ее пределы. В моем случае это 3-3/4 дюйма. ОК. Вот, он значит и максимальный диаметр опоры:

Под этот размер было найдено два вот таких опорных роликовых подшипника:

Под подшипники и каркас головы была разработана и создана базовая платформа:

Она включает в себя крепление самой головы (ее каркаса) к поворотному узлу, ведомую шестерню привода, позиции для опорных подшипников, крепление к шее, которое внутри всего этого свободно вращается. Вроде бы, нормуль все получилось. Крепко и надежно.

Согласно неким высосанным из пальца и простейшего ручного безмена предположениям, тяга сервопривода (torque) должна быть порядка 4-5 фунтов на дюйм. С этим расчетом все оказалось ОК.

Но искать и покупать подходящий под задачу серв я пожадничал. Вот это и стало ошибкой.

Решил сэкономить полтора десятка баксов и использовать тот привод, что уже был в загашнике. Типа, авось, потянет, незачем тратиться лишний раз…

Мнда… Не поверите, но в загашниках до сих пор выжила пара дешевых ушлепков из серии GM2. Их я прибарахлил еще аж семь (СЕМЬ!) лет назад под проект “самого бесполезного устройства“. Такого рода компоненты всегда стараюсь берать сразу по несколько штук. Один тогда был использован, два оставшихся были отложены в загашник ждать своего часа. Дождались…

Согласно спецификации, тяга у этих редукторов составляет 38-50 унций на дюйм. Зависит от конкретной модели. Я уже не помнил, что за модель была именно у меня, но решил, что даже при минимальном торке в 38 унций, можно будет поднять его до нужного, посредством шестереночной передачи. Скажем, передача 1:3.5 (например, на ведущей шестерне 12 зубов, на ведомой – 42) легко взвинтит торк до 6-7 фунтов на дюйм, что с лихвой покрывает нужные для задачи минимальные 4-5 фунтов. Обороты, ясен пень, даже и при такой передаче, оставались заведомо бОльшими, чем было нужно, поэтому они в расчет не брались.

Мотор оснащается ведущей шестерней, которая крутит ведомую, встроенную в платформу:

Для наглядности, вот, как все это должно было работать:

Далее… Мотор-редуктор – это вам не цифровой серв. Чтобы его контролировать, нужно очень дофига всего.

Во-первых – контроллер, чтобы управлять скоростью и направлением вращения. ОК. Для этого сгодился простой контроллер на базе L298N (см. в библиотеке), который был объединен с 12-вольтовой общей колодкой (с нее мотор и кормится) и установлен на платформе:

Во-вторых, необходимо отслеживать текущее конкретное положение/угол на который голова повернута. Для решения этой задачи есть много разных вариантов. От магнитного энкодера и оптических датчиков, до простого переменного резистора. Вот, последний и было решено использовать.

В загашниках был найден неплохой переменник на десять оборотов…

Да, голова не делает столько оборотов. Она вообще делает только пол оборота (формально – 180 градусов, но на практике – порядка 120).

Однако, соединять этот переменник было удобнее с валом редуктора мотора, а не с головой. А у редуктора, относительно головы, передача один к трем с половиной, помните? Соответственно, пол оборота головы, это полтора оборота переменника. Т.е., его штатных 10 оборотов – с ушами!… Ну не нашел я в загашнике резистора с меньшим числом оборотов. Были только на пол оборота и вот этот монстр на 10… С другой стороны: больше, не меньше…

Т.о., соединив резистор с валом редуктора и считывая его показания аналоговым входом ардуины, можно узнавать текущий угол поворота. Тривиально.

Очередное крепление, призванное соединить резистор со всем остальным, пара переходных муфт и вуаля:

Но есть тут еще и “в-третьих”…

ОК: мы можем управлять скоростью, направлением и знать текущее положение. Проблема только в том, что “текущее положение” относительно чего? Ведь резистор отдает ардуине просто число от 0 до 1024… Точнее, это ардуина так передает нам то, что передает ей резистор… В любом случае, чему все это соответствует в реальности – ардуина вообще без понятия. Необходимо каким-то образом задавать пределы, чтобы она знала, что вот, например, считанные с резистора 357 = 0 градусов, а считанные 874 = 180 градусов.

Можно было бы все это измерить заранее и внедрить в код ардуины на уровне констант. Если бы не одно “но”… В процессе многочисленных сборок/разборок, положение резистора в сборке всегда немножко меняется. Аналоговый сигнал, который ардуина принимает – тоже плавает в некоторых пределах сам по себе, в зависимости от наводок, глюков резистора и расположения звезд на небе.

Чтобы после каждой сборки, разборки, теста, тюнинга, настройки, появления новых звезд на небе и т.п., не перепрограммировать коэффиценты в ардуине каждый раз, разумнее сделать так, чтобы она определяла все это самостоятельно. При старте например.

Для этого нужно два лимит-свича. Скажем, при старте, ардуина начинает медленно вращать голову влево, пока не сработает первый свич. Клац! Запомнили показания резистора. Это наш ноль. Вращаем медленно в обратную сторону. Клац! Второй свич. Считали показания. Это наши 180 градусов. Зная пределы и имея текущее значение резистора легко теперь посчитать текущий угол в любой момент времени.

ОК: очередные крепления, лимит-свичи на базе микриков. Готово:

Если вы склонны верить публикуемым на этом блоге фотографиям, то понимаете, что вся эта иллюстрация к статье в википедии на тему “клиническая форма шизоидного оверинженеринга” существовала не только на мониторе компьютера, но и в реальности.

Алгоритм работы был таков: при инициализации, контроллер сперва определял, а не нажат ли какой лимит-свич. Если нет, то начиналась инициализация. Если да, то сперва голова откатывалась немного в противоположную от сработавшего свича сторону и только после этого начиналась инициализация. При оной, каждый из лимит-свичей опрашивался по три раза. Усредненное показание принималось в дальнейшем за 0 или за 180 градусов, в зависимости от свича. На финальной стадии инициализации, голова выставлется строго по центру (90 градусов), на основании расчета относительно полученных пределов.

В дальнейшем, нужно было только передавать значения желаемого угла на который должна была повернуться голова и скорость с которой она должна была это сделать. В какую сторону крутить, контроллер определял уже самостоятельно. Равно, как и управлял акселерацией. Движение начиналось с минимальной скоростью, плавно выходило на максимально заданную, а под конец так же плавно замедлялось.

Все это, даже, работало:

Голова отлично выставлялась на заданные углы, не тряслась, не глючила и т.п. Лимит-свичи во время работы выполняли функии предохранителей. На случай, если каким-то образом мотор затеет сбиться со своих пределов и крутанет голову дальше чем надо.

Вроде бы, задача решена. Но, увы…

Продолжалось все это недолго. И слабым звеном конструкции оказались вовсе не мои инженерные извращения: ведущая и ведомая шестерни не показывали ни малейших признаков износа, остальные детали демонстрировали запредельные чудеса прочности. Платформа отлично держала вес всей головы на весу (а не только на столе, как на видео выше). Опорные подшипники показали себя более чем адекватными и выполняющими свою задачу… Подвел дешевый пластмассовый мотор-редуктор.

Пластмассовые шестерни редуктора, напресованные на тонюсенькие стальные оси диаметром с швейную иголку, не выдержали инерции головы. Да, она ускорялась и замедлялась при поворотах плавно. Но, все равно, голова в целом – это невпупенный маховик, запасающий в себе значительное количество инерции во время движения и выстреливающий ее во время остановки.

Шестереночки со временем (через буквально пару дней) стали тупо проворачиваться на своих осях внутри редуктора и перестали передавать вращение от мотора на конечный ведущий вал (вся моя личная “инженерия” начинается уже после него). Мотор жужжит, крутит, но голова не двигается…

Приехали… Пожадничал покупать нормальный привод, адекватный задаче: получай две недели работы по проекту, спущенные в помойку. Логично, чо… И справедливо. Жадность наказуема.


Вторая попытка.

Усвоив урок жадности, приступил к изучению урока глупости.

Из предыдущего урока с пользой была вынесена только сама поворотная платформа с опорными подшипниками. К счастью, я каким-то образом умудрился спроектировать ее так, что поверх можно было навешивать практически что угодно любой формы и устройства.

Итого, платформа прекрасна, надежна и не требует никаких модификаций. Изменения требовались лишь в плане движителя.

От идеи мотор-редуктора я отказался в принципе. Да, можно было найти и купить небольшой мотор-редуктор с нужной мощностью, металлической начинкой и, даже, с червячной передачей от мотора на шестерни.

Кстати, нашел, купил и… отложил в загашник. Пригодицца! Не сейчас, но когда-нибудь. Ну, раз уж оно так все вышло… Тема возникшая один раз – возникнет снова, не сомневаюсь. А в загашнике уже хороший мотор-редуктор лежит…

Кроме промаха с мотором, в предыдущей версии механизма меня немало удручало так же и управление оным. Считайте сами: два лимит-свича = 2 цифровых входа на ардуине, резистор позиционирования = 1 аналоговый вход, вкл/выкл мотора = 1 цифровой выход, управление направлением движения = 1 цифровой выход, управление скоростью = 1 PWM выход. Итого, 6 (шесть!) выходов на ардуине заняты обслугой поворота шеи. Это ж половина ардуины занимается всего одной, не самой критичной функцией робота! Никуда не годится…

Итого: пака-пака, мотор-редуктор (любого вида), привет-привет обычный цифровой серв. Ну, чуть более мощный, чем обычный… С хорошим торком и металлической начинкой:

Вся ботва проводов идущих к мотору сократилась до ровно одной штуки идущей от него на PWM-выход ардуины. А весь код по управлению сократился до использования одной стандартной библиотеки управления сервами, да парой простых сервисных функций.

Однако, теперь поменялся весь принцип передачи движения от мотора к голове. Теперь я не мог использовать шестерни с понижающей передачей. Потому, что ход у серва – 180 градусов. Голова ходит на столько же. Понижать уже ничего никуда не получается.

Рассматривался вариант с таким же сервом, но ходом на 270 градусов. Однако, особой погоды это не делало. При таком раскладе я мог сделать понижайку 1:1.5, но… 20 чертовых кило торка! Это 17 фунтов, против 5 необходимых. Понижать передачу, повышая тягу – смысла нет не малейшего! Оно и без того избыточно. Проще и разумнее использовать серв напрямую, как есть без всяких понижаек.

Оставалось только придумать новое крепление серва к платформе. Плюс, до кучи, 12 вольт ему много. Ему, согласно спецификации, можно 9 максимум. Соответственно, на креплении необходимо предусмотреть место для преобразователя на базе LM259 (см. библиотеку), который будет этим заниматься. Такой же в точности уже был описан в составе принтера.

В результате, родилась вот такая конструкция:

Два преобразователя на базе LM259 – потому, что там у меня будет еще один мотор (для других совершенно целей, об этом будет позже) со своим напряжением и ему все равно понадобится свой преобразователь, а тут они, вроде как, симметрично и аккуратно пристроились оба…

Ну и, очевидно, что ведомая шестерня, встроенная в платформу, с этого момента стала ненужной. Однако, она ничему и не мешала. Чтобы не перепечатывать детали платформы, все было оставлено, как было и эта шестерня осталась в ее составе только в виде загадки для будущих поколений.

Все опять заработало, как это ни странно:

Причем, весьма бодро… Но опять недолго…

Очевидно, что хотя “весовая” нагрузка головы осталась по-прежнему распределенной по большой площади опорных подшипников, но все “поворотные” инерционные нагрузки от мотора к голове теперь сосредоточились в крайне малой области небольшого вала сервопривода. А конкретно, вот на этой “поганке”-креплении:

Логичным итогом стало то, что штатная пластиковая “поганка” (шла в комплекте с мотором) просто-напросто порвалась. Шляпка, прикрученная к платформе – отдельно, а ножка на валу серва – тоже отдельно… Ситуация вернулась к исходной: мотор жужжит, голова не двигается.

Тут бы мне остановиться и подумать, но – нет!

С пламенем во взоре и упрямством в мыслях, на смену пластиковой “поганке” пришла алюминиевая! В продаже отдельно таких есть навалом, но надо ждать пару дней пока доставят. Быстрее воспользоваться “внутренними ресурсами”… У оружейников на работе есть токарный станок, собачка моя им нравится, дал чертеж, через пятнадцать минут получил детальку:

Поскольку отсутствовала простая техническая возможность накатать внутри втулки зубчики-шлицы для посадки на вал редуктора серва (все никак броучер запустить не можем), было принято решение использовать стопорный боковой винт.

Знаете чем это закончилось? Правильно… Стопорный винт стал проскальзывать по мягкой латуни вала, даже будучи затянутым вусмерть.

Ладно, сволочь, погоди… На вале редуктора надфилем снимается аккуратная плоская фаска под стопорный винт.

Знаете чем это закончилось? Правильно… Это не помогло. Винт все равно продолжил проскакивать, но канаву в латуни за собой теперь оставлял глубже…

Но я еще не сдался! Сверлом подходящего диаметра, вал редуктора был просверлен насквозь. Стопорный винт влетел туда со свистом целиком на глубину всего диаметра вала. Тут уж не проскользнешь ваще никак!

Знаете чем это закончилось? Правильно… Вообще, неправильно, конечно… Я сам был шоке, но… Вал редуктора перекусил стопорный винт (жалкие 2мм мягкой стали) внутри втулки. Как кусачками отжмакало!

Все, сдаюсь… Совершенно очевидно, что данный вариант конструкции в принципе не способен выдерживать, приходящиеся на него нагрузки. Что, в общем, было очевидно с самого начала, задумайся я об этом хоть на секунду. Что у меня в голове было – не понимаю…

Эта глупость стоила мне еще недели работы по проекту. Логично, чо… И справедливо. Глупость наказуема.


Третья попытка.

Все же, что-то я вынес из предшествующих приключений.

Во-первых: платформа с опорными подшипниками все так же прекрасна, как и была с самого начала. Ее конструкцию следует сохранить как есть и использовать.

Во-вторых: двадцатикилоторкового серва более чем достаточно для того, чтобы легко и весело размахивать головой во все стороны. Вон, оно даже винты металлические перекусывает! Для управления – всего один провод. Код – стандартная ардуиновая библиотека для серва. Это тоже все надо сохранить и использовать.

Что нуждалось в доработке – узел крепления такого серва к платформе. При этом было так же и понятно, что “поворотные” нагрузки останутся сосредоточенными на вале его редуктора – от этого не уйти (либо возвращаться к начальной идее понижайки с передачей через шестерни, чего не хотелось). Но можно же и такую нагрузку распределить! По двум таким точкам, например.

Скажем, если взять вот такой серв:

Видите? У него две точки крепления. Значит, каждая возьмет на себя лишь половину нагрузки. До кучи: штатные алюминиевые втулки, внутри которых накатаны шлицы под вал редуктора. А значит – никаких проскальзывающих и перекусываемых самопальных стопорных винтов. Надежное крепление втулки к валу по всему ее периметру. Еще для продолжения кучи: ахрененные алюминиевые скобы для монолитной монтировки к платформе.

Изначально, этот серв был разработан под всякие роботизированные руки. На уровне экспериментов, будучи зажатым в тиски на столе, он за веревку с легкостью отрывал от пола здоровенную канистру c ацетоном на пол галлона, с навешанными на нее двумя пассатижами, молотком, полудюжиной отверток и коробкой с метчиками. Фунтов на 15 там было – к бабке не ходи. Серв тягал это все, как пушинку.

Но применение его для поворота головы требовало весьма хитровыдолбанного крепежа:

Оно, естественно, опять заработало:

Но оно и раньше работало, так, что верить cходу в первые результаты уже не хотелось… Но, в этот раз, обошлось, кажется…

Самая невыгодная для серва ситуация – когда голова опущена максимально вниз. В этом случае ему приходится не столько из стороны в сторону ею крутить, сколько поднимать и опускать бОльшую часть ее веса:

Со временем, я еще вернул в код контроллера возможности акселерации из первой попытки. Т.е. плавное наращивание скорости поворота до максимального и плавное же замедление в конце. Так, что оно сейчас далеко не такое дерганное, как на видео выше…

Кому интересно и актуально, библиотека ServoEaser в помощь.


Прошел уже без малого месяц. Все еще работает, как часы. Не наблюдается никаких признаков износа ни в одном из соединений.

Вероятно, следует считать, что задача, наконец, решена.

Что за шум, а драки нету?“:


P.S. За кадром…

Вот так выглядит рабочее место после выходных, проведенных за работой над проектом:

Нужно думать над еще одним роботом… Чтобы убирался на столе… Специально обученная этой операции жена, категорически отказывается заходить в комнату с роботом. Начинает нервничать и параноить, когда Сара начинает за ней пристально следить (угу, сенсоры присутствия я к собачке уже тоже прикрутил и запустил)…

Признаться, меня это тоже слегка раздражает. Надо, наверное, оставить только рефлекс на громкие/резкие звуки, а рефлекс на присутствие теплокровных убрать, оставив его только на уровне собираемых данных об окружающей среде. Возможно, будущий мозг робота, сможет распоряжаться этими данными без вызова острых приступов паранойи у мешков с мясом 🙂


Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.