Добрый день, уважаемыее. Это вторая часть статьи про разработку робота-хексапода. Первую часть вы можете найти тут.
В этой статье я расскажу непосредственно про производство самого робота, переход от моделей в SolidWorks к реальному устройству.
Начало производства
Первое, что я бы хотел отметить – между моментом «ну все, у меня есть моделька, проект почти готов» и «у меня на столе стоит готовое устройство», на самом деле, лежит очень и очень много всего. Чем быстрее вы совершите этот переход, тем меньше вероятность, что проект будет заброшен. К этому этапу друг успел подрастерять энтузиазм, так что продолжал проект я один.
После того, как модель была закончена, нужно было приступать к, собственно, производству, и первое, что следовало сделать – закупить необходимые детали. Если с сервоприводами и аккумуляторами никаких проблем не возникло и к этому времени они уже лежали у меня на столе, то поиск всего остального оказался куда менее легким. Я начал с подшипников на тот самый винт, выполняющий роль оси. Так как винт я выбрал M3, то и подшипники нужно было найти с таким же внутренним диаметром. И проще всего это оказалось сделать в магазине для авто/авиа моделей. Поэтому рекомендую всем, кто ищет подобного рода небольшие детали сначала изучить ассортимент магазинов с модельками, это оказалось намного проще, чем связываться с магазинами, специализирующимися на подшипниках.
Я приобрел пару вот таких вот комплектов http://rc-go.ru/cat/product27455.htm — 4 подшипника со внутренним диаметром 3 мм, внешним – 8 мм, и высотой 4 мм, стоимостью 450р за 4 штуки.
Как ни странно, подшипники было найти несложно, а вот купить винты – намного труднее. Дело в том, что начиная с М3 винты продаются почти на каждом углу, но в конструкции присутствовали винтики М2 – ими крепились «качалки» сервоприводов, и использовать там М3 было невозможно – они бы просто разворотили бы качалку. В обычных магазинах таких винтов не было, а магазины крепежа продавали их только тысячами штук. К счастью, я нашел магазин, в котором можно купить даже один винт. Несмотря на несколько неблагозвучное название «Суперболт», магазин оказался очень неплохим, где я сразу закупил весь крепеж – М3 разной длины со скрытой головкой, М2, гайки под них и шайбы.
Разнокалиберные стойки я приобрел в магазине VoltMaster.
В общей сложности вся эта мелочевка вышла дешевле 500 рублей.
Дальше нужно было выбрать где и из чего фрезеровать детали, и вот тут ждала неприятность. Фрезеровали много где, но везде нужен был свой материал, листового алюминия в 2 мм толщиной либо не было, либо «был когда-то, но сейчас кончился». Новые же листы продавались только в формате 1х3 метра, что было, мягко говоря, многовато. Я обзвонил штук пять фирм и нигде не были готовы продать обрезки.
Но, к счастью я вспомнил, что у бывшего одногруппника есть фрезеровальный станок. Связавшись с ним я обговорил задачу, и выяснил, что алюминиевого листа у него тоже нет, зато есть композитный материал под названием ALUCOBOND, представляющий собой «будерброд» из двух тонких слоев алюминия, между которыми заключен какой-то полимер. Толщина этого бутерброда была 3 мм, а плотность (и, соответственно, масса) – в два раза меньше листового алюминия!
Таким образом, после корректировки плотности в солиде, масса новой модели стала около 650 грамм.
Кстати сказать, пару дней назад узнал, что в одной из фирм все-таки можно купить обрезки алюминия, так что если вам непременно нужен дюраль, то иногда его все же можно найти, но искать нужно настойчиво.
После того, как все необходимое было закуплено, пришла пора переходить к следующему этапу.
Производство
А сейчас я расскажу вам о самом важном. О граблях, на которые можно наступить при производстве. Граблях, которые выливаются в дополнительные затраты.
Ну во-первых, если это ваш первый проект… Да даже если не первый, все равно рекомендую резку/фрезеровку заказывать не в крупных фирмах а у небольших частников, если конструкция еще не отлажена. Потому что очень вряд ли, что в крупной фирме вам позволят сидеть рядом и, увидев, что первая деталь не стыкуется с вашими приводами, кричать «останавливай фрезер нахрен!!!».
Так как я фрезеровал у одногруппника у меня такая возможность была. Мы договорились вырезать сначала несколько тестовых деталей, проверить их, а потом, если все будет нормально, вырезать все остальное. Разумеется, тестовые детали не состыковались, поэтому мне пришлось править их на ходу и перевырезать заново.
Итак, на что стоит обратить внимание?
- Резать лазером или фрезеровать? Ответ зависит от ваших требований к конструкции. Резка лазером быстрее. По цене, в принципе, не очень отличается. Но если вам требуется зенкование отверстий, то есть, формирование отверстий для винтов со скрытыми головками, например, как вот на этом рисунке
то лазер вам не поможет. Впрочем, я обнаружил, что такие отверстия элементарно получаются в домашних условиях при помощи дремеля и соответствующей конической насадки, примерно вот такой:
- Двусторонние детали. Имеются в виду детали, которые нельзя получить, не переворачивая фрезеруемый лист – например, имеющие зенкование с обеих сторон, или несквозные пазы. Опять-таки, лазер тут отпадает. Но и с фрезеровкой не все так гладко. Не знаю, как в крупных фирмах, а там где я фрезеровал, это вылилось бы в несказанный геморрой, увеличило бы затраты по времени, и, соответственно, по деньгам. Полагаю, что в крупных фирмах это тоже будет не бесплатно. Поэтому старайтесь избегать таких ситуаций. Зенковать можно и дремелем, это будет быстро и бесплатно.
- Фреза имеет ненулевой радиус. Это очевидно. Поэтому следует помнить о том, что внутренние пропилы не могут быть меньше чем радиус этой фрезы. То есть внутренние углы будут скруглены, а это значит, что ваши детали, вставляющиеся в такие вот пазы, уже не влезут. Поясню на примере:
Это деталь серво-маунта, узла из основания ноги, где крепятся два сервопривода. Красной рамкой обведено технологическое скругление. Если его не сделать в модели, фрезер все равно его прорежет – т.к. физически не может сделать прямой угол. Но только удлинять ваш паз, он, конечно же, не будет, поэтому его реальная длина (то есть длина части с постоянной шириной) окажется меньше на радиус фрезы. Если не хотите допиливать напильником детали, то лучше сразу предусмотреть этот момент. - Размеры. Вы должны перемерить все. Вы слышите? Все. Первым делом нужно приобрести электронный штангенциркуль (можно и обычный, но с электронным удобнее), типа такого
и перемерить все входящие в вашу конструкцию покупные детали с точностью до 0.1 мм. Во-первых, размеры, данные в интернете, часто очень неточные. А во-вторых, для китайцев, похоже, такого понятия как нормальный чертеж, не существует в принципе – вот, например, что они дают на свои серво-приводы:Больше половины необходимых размеров отсутствует, оставшиеся не соответствуют истине. Вот с этим я накололся очень сильно. Нет, я перемерил все, что было необходимо. Но когда рисовал уже упомянутую выше детальку, измерив цилиндрические выступы на приводе (как видно из детали, их там два, один большой, из него торчит вал, второй поменьше, прилеплен к первому), я, не подумав, решил, что мелкий лежит на стороне большого. После того, как вырезали тестовую деталь, привод в нее не встал. При более подробном рассмотрении выяснилось, что малый цилиндр лежит не на стороне большого, а смещен на 0.3 (!) мм. Этих 0.3 мм хватило, чтобы привод не впихивался куда следует.
Разумеется, не везде размеры так критичны – нужно смотреть по конструкции, где погрешность не сильно повлияет. Но главное, не забывать об этом и все перемеривать.
После того, как я несколько раз поправил конструкцию, косяки, наконец-то, пропали, и я получил пакет своих деталек, из которых начал собирать Эктогнатуса.
Сборка
На этапе сборки особых граблей не было. Отмечу только две вещи.
- Гайки откручиваются. Нещадно. К сожалению, гроверных шайб, предотвращающих самоотвинчивание, для винтов М2 не оказалось, а там где были М3, они стопорили подшипник, поэтому, пришлось от них отказаться. И потом, в процессе работы, я имел возможность лицезреть выпадающие на ходу гайки. Поэтому после того, как конструкция собрана и проверена, гайки можно постаринке посадить на эмаль или краску, что я и сделал. Самоотвинчивание прекратилось, все счастливы.
- Покраска робота. Так как этот самый АЛЮКОБОНД был не шибко приятного цвета – синий с одной стороны, зеленый с другой, я решил его покрасить. Очень, очень хорошо для этого дела подошла черная матовая автоэмаль. Ложится хорошо, моментально сохнет. Правда, я красил кисточкой, а спреем, как мне потом сказали, результат получается лучше. Не проверял, но очень возможно.
Вот так выглядела только что выфрезерованная деталь.
Нога в сборе, проверка конструкции.
Модель и реальное туловище робота
Модель и реальный узел сервомаунта
Эктогнатус в сборе
Проверка
Итак, после того, как вся конструкция была собрана, пришло время проверять ее в действии.
Перед тем, как проектировать кастомную электронику, я хотел проверить, как она себя поведет в реальном мире, потребление тока и т.п. Для проверки решено было использовать плату Mini-STM32, о которой я уже рассказывал в соответствующей статье.
Так как запитать от аккумуляторов электронику и приводы без конвертера невозможно, аккумы пока были оставлены не у дел, в конструкции, но неподключенные.
Для проверки я избрал следующий путь: из макетки делается коммутационная плата, к которой подключаются все приводы – на 18 приводов разведено питание и земля, а их сигнальные входы сгруппированы по три штуки (одна нога). К этой плате проводками с гнездами (вот такими) присоединяется Mini-STM32.
Так как каналов было много (18 штук!) а частоты там порядка 50 герц, не было смысла гнаться за аппаратным ШИМом, только геморрой искать. Поэтому сигнальные входы от приводов я повесил на обычные свободные GPIO. К SPI контроллера был подключен радиомодуль с чипом от нордика, которыми я не перестаю восхищаться: http://www.ebay.com/itm/1pcs-NRF24L01-2-4GHz-Antenna-Wireless-Transceiver-Module-For-Microcontr-/261072511055
Так как в свое время я по работе написал для него драйвер под FreeRTOS, работающий на интерраптах и DMA а не простом поллинге, то на плату я этот FreeRTOS и вкатил.
По сути, это получился радиоуправляемый 18-канальный ШИМ-генератор. С точки зрения софта никаких особых хитростей там нет, если не считать драйвер для радиомодуля. ШИМ генерится при помощи одного таймера, по такому же методу, как вот в этой статье от DIHALT
Имеется массив из 18 структур
typedef struct
{
u32 __O *PinAddress;
u16 DutyCycle;
}PWMChannel;
Где *PinAddress – битбанд адрес управления выбранной ногой. Массив сортируется по возрастанию DutyCycle, в регистр Capture-Compare заносится DutyCycle первого элемента и в интеррапте по совпадению таймера уровень на соответствующего пина выставляется через PinAdress. После чего в СС-регистр заносится DutyCycle следующего. Когда таймер дотикивает до максимума, все пины выставляются в 1, массив пересортировывается (на случай, если пришли новые значения), и все повторяется заново. Чтобы пришедшие значения не сбили генерацию, они заносятся в новый массив Work, а в момент переполнения таймера, массивы Work и Sorted меняются местами – таким образом, получаем двойную буфферизацию.
Для общения с компом используется такая же плата, с таким же радиомодулем, подключенная по USB. В ней я реализовал HID-устройство, так что данные на нее шлются элементарно, без дополнительных драйверов, из любого удобного языка программирования. Моя управляющая прога, например, на C#. Управляется передатчик, понятное дело, тоже FreeRTOS, чтобы не приходилось переписывать драйвер модуля. Передача информации роботу идет в одном таске, обмен данными с USB – в других. Даже если по USB не пришло ничего нового, трансмиттер постоянно «пингует» робота, посылая ему пакет с соответствующим заголовком. Так как акноледж у радиомодулей аппаратный, можно сразу узнать есть связь с роботом, или нет, и выставить себе соответствующий байт в статусе. USB-таск в качестве репорта отсылает именно этот статус.
Если же пришли новые данные (значения углов для 18 приводов, в сыром виде, без изысков), то USB-таск складывает их в очередь на трансмит, а трансмиттер-таск в таком же сыром виде шлет их роботу, который, по получении, заносит их в уже упомянутый массив Work.
Таким образом, вся логика может быть реализована на компьютере – на робота будут передаваться только скважности приводов.
Разумеется, в дальнейшем это будет реализовано по-другому, но для проверки годится как нельзя лучше – не приходится по сотне раз перешивать железки.
Интерфейсом прога, написанная за пол дня, похвастаться, конечно не может, но свои функции, в принципе, выполняет. Пока никакой ИК, только форвард-кинематика для отрисовки модельки и банально записанные в лоб последовательности для движений.
После того, как все описанное выше было сделано, я записал несколько последовательностей Эктогнатусу, кои он и воспроизвел на этом видео:
Провода, подведенные к нему – питание от ЛБП, по уже описанной выше причине отсутствия конвертера.
Итак, пришло время сказать о самом главном. Всем граблям грабли, всем косякам косяк.
Хвалебная песнь китайским сервоприводам
Знаете, что показала проверка? Робот еле стоял. Он кое-как мог удерживать свой вес на шести ногах, но достаточно было поднять две, и он заваливался на эту сторону. Увиденное меня очень, очень сильно огорчило. Прямо опустились руки. Я сидел и думал «неужели мои прикидочные расчеты оказались настолько ошибочными, что что робот не может держаться?». Я снял него «этаж» с аккумуляторами – вместо 650-700 грамм Эктогнатус стал весить 500-550. После этого он нехотя изобразил готовность к работе – видео выше заснято именно в этих условиях. Но как же так? И тут я подумал – «может быть, что-то не так с приводами?» и решил измерить заявленный производителем момент. Вот тут и вскрылись грабли, которые так больно настучали мне по лбу.
Как и все грабли, они состояли из двух частей — той, на которую наступаешь, небольшой, металлической, и той, которая сильно бьет по лбу.
Металлической частью граблей оказался факт, что производители выпускают два типа приводов, MG90 и MG90S. Они несколько отличаются параметрами и конструкцией.
Вот MG90S, те что купил я:
Weight: 13.4g
Dimension: 22.8*12.2*28.5mm
Stall torque: 1.8kg/cm (4.8V) — 2.2kg/cm (6.0V)
Operating speed: 0.10sec/60degree(4.8v) — 0.08sec/60degree(6.0V)
Operating voltage: 4.8-6.0V
А вот MG90:
Обратите внимание, на выступ снизу привода (который я обозвал «жопой», ибо в данной ситуации он ей и был, не вставая в конструкцию). На чертеже ее отлично видно:
А вот его параметры:
Weight: 14g
Dimension: 23.1*12.2*29.0mm
Stall torque: 2.2kg/cm (4.8V) — 2.5kg/cm (6.0V)
Operating speed: 0.11sec/60degree(4.8v) — 0.10sec/60degree(6.0V)
Operating voltage: 4.8-6.0V
Заметили разницу? Чуть-чуть помедленнее и чуть-чуть посильнее. Ну хорошо, на эту часть граблей наступил я сам – надо было брать, конечно, MG90, которые посильнее. Впрочем, в конструкцию они не вставали только если пытаться установить оба в серво-маунт (по-правде сказать, не из-за «жопы» а из-за того, что по высоте они были нескольо побльше, чем по длине, а маунт был рассчитан на квадратные приводы). Но вместе с MG90S он вставал в маунт как влитой, безо всяких проблем. Это меня вполне устраивало, так как слабый MG90S оставался только в качестве поворотного сервы, на который почти не было нагрузки. А сервы, на которые приходился весь вес запросто заменялись на MG90.
А теперь обратимся к ручке граблей. Большой и тяжелой. Итак, как воспринимают нормальные люди параметр Stall Torque? Очевидно, вот так: «Если Stall Torque указан X*Y, то когда мы подвесим на расстоянии X от оси сервы груз массой меньше Y, серва сможет этот груз поднять. Если масса будет около Y, то серва сможет его удерживать, но поднять уже не сможет».
Для дорогих и хороших приводов это действительно так – впрочем, проверять все равно не мешает. Но китайские товарищи воспринимают этот параметр по-другому. Он практически не связан с реальным моментом. Я не преувеличиваю, это значит, что для одного MG90S момент может быть в три раза меньше заявленного, для другого – в три с половиной. Для MG90 – в два. И т.п. То есть нету даже линейной зависимости, нельзя просто «делить на три», допустим.
Но давайте поподробнее. Я решил измерить момент своих приводов. Для этого можно воспользоваться нехитрым приспособлением – емкостью, в которую будем наливать воду, чем-нибудь, что послужит плечом и мерной кружкой. В качестве плеча я взял горизонтальную часть ноги робота, длиной 6 см. Таким образом, я ожидал, что серва сможет поднять емкость с 300 мл воды при питании пот 5В источника. Момент в этом случае был бы равен 0.3*6 = 1.8 кг*см. Емкостью послужил литровый пакет из-под сока, у которого я отрезал верх и через который пропустил крепкую проволоку вместо ручки. Если будете повторять это дома, позаботьтесь о том, чтобы и сам пакет и ручка держались крепко, иначе можно залить все оборудование. Плечо прикручивается к серво-приводу, пакет вешается на второй конец плеча, небольшая программка выдает минимальное значение угла поворота, которое сменяется максимальным при нажатии на кнопку. В этом случае, серва пытается поднять груз из крайнего нижнего в крайнее верхнее положение. По количеству воды мы определеяем вес груза, а значит и момент, действующий на серву. Момент, на котором серва уже не сможет поднять груз, но поднимет при небольшом уменьшении и будет Stall Torque.
Что я в итоге увидел: 300 мл (момент 1.8) – серва не шевелится. Что ж, момент завысили, это ожидаемо. Но по прикидкам у меня был большой запас, насколько же они его завысили? Продолжаем мерить.
250 мл (момент 1.5) – почти не шевелится.
150 мл (момент 0.9) – чуть-чуть поднимается, не доходит даже до середины
100 мл (момент 0.6) – почти доходит до середины
~90 мл (момент 0.54) – поднимает груз.
Честно говоря, не поверил своим глазам – я понимаю, что можно завысить показатели, но более чем в три раза… Может, это такая серва попалась? Но нет, я перемерил все 20 штук, что заказывал.
В итоге две трети вели себя как описано выше, треть была еще слабее (насколько – не стал выяснять). Кроме того наблюдался сильный разброс по ШИМу, то есть для одной сервы предельный поворот был при скважности, скажем 0х200 (значение регистра таймера), для другой – 0х1E5, и т.п.
Но не все так плохо. Я заказал 20 приводов MG90, тех, что с «жопой» и посильнее. Результаты измерений были более радужные – при заявленном моменте 2.2 они выдавали около 1.2.
То есть характеристики были завышены уже не в три, а всего в два раза. Ну и по-прежнему были те, что оказывались слабее остальных, но все таки это было не уже не так критично.
Напоминаю, по параметрам, заявленным на сайте, MG90 сильнее, чем MG90S всего в 1.2 раза, в реальности же MG90 превосходит по моменту MG90S более чем в два раза. Кроме того они оказались ощутимо тише и меньше подвержены осцилляциям в районе уставки – привет ПИД-регулятору MG90S.
Вывод из этого такой: никогда не верьте инфе, полученной от китайских производителей, если не хотите потом обнаружить, что параметры на сайте связаны с реальными только через фазу луны и завихрения астрала. Перед разработкой не пожалейте денег на 1-2 привода, посчитайте его реальный момент, потребление, скорость. Это обойдется дешевле, чем потом перезаказывать всю партию. Ну и если вы покупаете китайские приводы – берите с запасом обязательно. Дело не только в том, что треть оказалась еще слабее, а еще и в том, что один был вообще битый (жутко дрыгался, видимо с его регулятором что-то не то было), пара сгорела от натуги и еще у одного сорвало шестерню с вала мотора.
Впрочем, теми, что я приобрел во второй раз, MG90, я вполне доволен. В итоге робот совершенно спокойно поднялся вместе с аккумами, совершенно спокойно смог поднимать ноги, не боясь упасть, и даже смог подняться из «разложенного» положения (как на видео) одним движением, чисто за счет силы сервов, не подпираясь предварительно, кончиками ног.
Грядущие доработки
Вот на этом моменте я и приостановился. Ну, точнее, не совсем остановился, а замедлил темпы разработки, так как закончился мой отпуск и навалилось много работы. Сейчас я в процессе проектирования кастомной электроники для робота, о которой и скажу несколько слов в статье.
Прежде всего, необходимо спроектировать достаточно серьезный конвертер, который сможет отдавать 30Вт в приводы. Я нашел весьма занятную микросхему, которая, по уверениям International Rectifier способна обеспечить DC-DC преобразование из 11.1В в 6В х 10А без радиатора, при том, что внешних мосфетов ей не требуется – только силовой дроссель.
Вот она, родимая: http://www.irf.com/product-info/datasheets/data/ir3475m.pdf
10А приводы, конечно, тянуть не будут – максимум что я видел, когда все приводы застопорены, и робот усиленно пытается подняться – около 6А. Так что микрухи должно хватить. Но это в теории, на практике я ее никогда не юзал – если кто с ней работал, поделитесь впечатлениями.
Вычислителем я оставлю STMку, примерно такую же, как на отладочной, и, в далекой перспективе, запихну в нее инверсную кинематику.
Изначально, связь планировалось оставить на этих радиомодулях – они удобные, для них уже написаны мной дрова, есть версия полностью совместимая по пинам, но с аццким усилком, бьющая на пол километра. А на крышу роботу я планировал поставить камеру. Разумеется, чтобы не делать бесполезную работу по получению «сырого» сигнала с камеры, и посылке его по этому модулю (которому не хватит скорости слать нормальное видео), камеру я планировал брать со встроенным передатчиком, например, такую.
На другой стороне ставится довольно габаритный приемник, а так как выход с него аналоговый, то сюда же добавляется усб-девайс, позволяющий подключать аналоговые источники видеосигнала к компу. И, в принципе, я с этим уже смирился, но тут увидел его.
Роутер TL-MR3020. Чудо китайской технологии. Внешне очень похожий на эппловский девайс.
Внутренне – полноценный комп с линуксом, на который давно портировали OpenWRT.
Плата внутри него размером всего 5.7х5.7 см. И у него есть USB-хост!
Потребление его, даже при самой суровой передаче, не превышает 180 мА, а среднее и вовсе около 100.
Как оказалось, этот роутер (и его полный аналог, просто предназначенный для внутреннего китайского рынка, TL-WR703N, про который и написано большинство статей, если будете искать, ищите по этому названию) уже давно используется электронщиками как одноплатный компьютер, который можно юзать в своих поделках. На нем легко и непринужденно поднимается нормальный видеостримминг, к нему можно легко подключить обычную веб-камеру.
Подобнее про TL-MR3020 и его брата-близнеца TL-WR703N можно почитать на сайте OpenWRT
По работе я как раз сейчас ковыряю его, так что имел счастье поработать с ним вживую.
В общем теперь мой план таков – на моей плате размещается конвертер, обеспечивающий питанием все узлы схемы, СТМка, выступающая в роли контроллера всей механики (ног и поворотной сервы на крыше, поворачивающей камеру), и, возможно, пару датчиков – скажем, акселерометр, чтобы следить за своим наклоном. На эту плату сверху ставится плата от TL-MR3020, с OpenWRT на борту, обеспечивающая стриминг видео и связь робота с компьютером по Wi-Fi. Таким образом избавляемся от громоздкого аналогового приемника видео, конвертера, идущего с ним, отдельного модуля трансивера к компу, и получаем возможность рулить роботом с любого девайса с вайфаем, параллельно наблюдая через его камеру, например – с iPad.
На этом у меня пока все, как только появится время и я доразведу-таки платы и получу результаты – ждите следующую статью.
Спасибо за внимание!
Автор: Ariman