Набор «робо-рука» приехал ко мне в тот период, когда я уже наивно считал, что раз умею управлять одной сервой — соберу манипулятор за вечер. Вечером первого дня рука стояла, четыре SG90 были подключены, скетч с последовательными write() был залит. Я положил маркер на площадку захвата, запустил сценарий — и рука начала складываться: серво плеча загудела, предплечье просело, маркер остался лежать, а пластиковая качалка с треском перескочила зуб. Полчаса я поднимал углы по одному, пока не сел и не посчитал момент на бумажке — чего не сделал до сборки.
Оказалось, я ни разу не задался вопросом, что такое степень свободы и почему в наборе именно четыре привода, а не три и не шесть. Куда какой сустав, какой вес он держит и почему плечо просело при паспортных 1,8 кг·см — эти вопросы надлежало задать до вклейки первых стоек. В этом уроке я разберу конструкцию 4 DOF так, как хотел бы прочитать тогда: что даёт каждая ось, как прикинуть момент плеча на салфетке, какое питание выдержит четыре серво и как обкатывать суставы по одному, чтобы не гадать, кто именно сбоит.
Живая плата понадобится на этапе механики; а сценарий «база плюс плечо» можно посмотреть в симуляторе ниже — стенд из двух осей.
Степень свободы: одна серво — один сустав
Степень свободы — это независимое движение, за которое отвечает один привод. У серво-манипулятора арифметика простая: четыре серво — четыре степени свободы, DOF. Рука человека имеет семь — поэтому она может менять положение кисти, не двигая локоть, и брать предметы десятком неудобных захватов. Нашим четырём хватает на честную работу: база разворачивает всю руку влево-вправо, плечо поднимает и опускает предплечье, локоть доводит кисть до предмета, захват смыкает рычаги. Три первых сустава определяют, куда кисть пришла, четвёртый — что она сделала, когда пришла.
Почему я советую именно четыре, а не шесть? Не потому, что шесть плохо. Шесть DOF — это отдельная история про внешнее питание на каждый узел, про балансировку и про то, что без датчиков обратной связи вы всё равно двигаете руку вслепую. Четыре — золотая середина: питание укладывается в один блок 5–6 В, скетч влезает в Uno без библиотек посложнее Servo.h, а механика собирается из печатных или фанерных деталей за вечер. Когда рука заработает, шестую ось добавить проще, чем чинить сразу шесть.
Моё мнение по захвату: он благодарнее любого другого сустава. Пинцетный хват из двух рычагов на одной серво прощает и люфт, и кривую деталь — щель между губками перекрывает огрехи геометрии. Я видел рабочие руки с хомутом-захватом, но не видел приятной в работе руки, у которой захват бьётся о противную губку с перегрузом.
Мой порядок сборки после той истории: расчёт на бумажке, стенд питания, только потом механика. На бумажке для каждого сустава выписываю максимальный вес и плечо — и умножаю. Стенд питания собираю раньше руки и проверяю одной серво под нагрузкой, держа рычаг пальцем. Механика идёт последней не потому, что неважна, а потому, что переклеить стойку проще, чем перевешивать блок питания. И ещё одна привычка: пока рука на столе, никаких резких write() через весь ход — упоры в столешнице бьют по шестерням и по питанию. Первый запуск — с вдвое замедленной интерполяцией.
| Сустав | Серво в моём стенде | Рабочий ход | Зачем отвечает |
|---|---|---|---|
| База | SG90 | 30–150° | разворачивает всю руку к цели, несёт вес всех узлов сверху |
| Плечо | MG996R | 45–135° | поднимает предплечье — самый нагруженный сустав |
| Локоть | MG90S | 60–120° | доводит кисть до предмета, компенсирует наклон |
| Захват | SG90 | 20–110° | смыкает рычаги, держит предмет весом 10–40 г |
Теперь бумажка, которой мне не хватило. Момент на оси плеча — это вес, умноженный на плечо. Маркер 11 г на конце предплечья длиной 14 см даёт 11 × 14 = 154 г·см. Но само предплечье весит 38 г, и его центр масс сидит примерно на середине, в 7 см от оси: ещё 38 × 7 = 266 г·см. В сумме около 420 г·см — и это горизонтальное положение, худший случай: в нижней точке рычаг давит на ось почти всем весом, а не моментом. Дальше в счёт идёт локоть с кистью — по факту мой узел плеча в худшей позе тянул на 0,8 кг·см.
Формально SG90 с её 1,8 кг·см влезает. Формально. Паспортные 1,8 кг·мм — это стендовый потолок при 4,8 В и неспешном перемещении; под реальной нагрузкой с рывком серво выдаёт процентов на 20–30 меньше, а просадка питания срезает ещё столько же. Отсюда моё правило с границей: считай момент сустава и умножай на два — если результат укладывается в половину паспортного момента, серво проживёт долго. Для плеча моего манипулятора запас «0,8 × 2 = 1,6 кг·см» — это уже впритык, поэтому туда встал MG996R с его 9,4 кг·см при 4,8 В: с таким потолком рука перестала гудеть на подъёме, а не «стала сильнее процентов на двадцать».
Если сомневаетесь в цифрах своей серво — я разбирал токи и моменты MG995/MG996R отдельно, там же про то, почему металлические шестерни на плече не роскошь: сервоприводы MG995 и MG996R: токи и питание.
Питание четырёх серво — второй пункт, который решил бы половину моих проблем заранее. При старте движения каждая SG90 берёт 100–250 мА, и старты редко получаются одновременными — но если сценарий дёргает базу и плечо сразу, пик легко уходит за 1 А. MG996R под нагрузкой добавляет свой ампер с лишним. USB-порт с его 500 мА на всё про всё здесь не жилец: напряжение проседает, Uno перезагружается, серво теряют заказанный угол. Рабочая схема одна: отдельный блок 5–6 В на 2–3 А, минус блока соединён с GND Arduino, плюс идёт только на серво, а электролит 1000 мкФ стоит у клемм — он сглаживает те самые пики старта. Про общий провод и разводку земли я писал пошагово в уроке про внешнее питание: два источника и общий GND, а если собираете стенд на макетке — пригодится и питание макетки от внешнего источника.
Тестируем суставы по одному
Дисциплина обкатки, которая экономит вечера: один сустав — один тест. Сначала база: покачивание с печатью угла, слушаем, как серво проходит ход, не заедает ли на кромке стойки. Потом подключаем плечо и повторяем, и так до захвата. Если проверять всё сразу четырьмя движениями, то любой сбой превращается в гадание: то ли питание, то ли механика плеча, то ли скетч. Я даже порядок сборки держу тот же, что и порядок тестов: база, плечо, локоть, захват — и на каждом шаге убеждаюсь, что предыдущий сустав не разболтался от винтования соседнего.
От краёв хода отступайте: рабочий диапазон 30–150° вместо полных 0–180° — правило, к которому я пришёл после облизанных шестерён, живое оно и для манипулятора. Если основы ещё не повторяли — вот первый урок раздела: подключение сервопривода SG90.
#include <Servo.h> Servo sustav; // сигнальный провод тестируемого суставаconst int OTSTUP = 30; // отступ от упоров, градусы void setup() { sustav.attach(9); // для теста базу и плечо цепляю по очереди Serial.begin(9600);} void loop() { for (int ugol = OTSTUP; ugol <= 180 - OTSTUP; ugol++) { sustav.write(ugol); Serial.print("ugol="); Serial.println(ugol); delay(15); // примерно 50 градусов в секунду } for (int ugol = 180 - OTSTUP; ugol >= OTSTUP; ugol--) { sustav.write(ugol); delay(15); }}Две оси в движении: репетиция сценария
Когда каждый сустав проверен, их соединяют в сценарий: разворот базы, подъём плеча, перенос, возврат. Ключ к тому, чтобы рука выглядела как рука, а не как судорога, — двигать обе оси маленькими шагами, по одному градусу за такт, с паузой 15–20 мс. Пятьдесят–шестьдесят градусов в секунду — скорость, при которой серво успевает за приказом, а не догоняет его с гудением; про саму технику я подробно писал в уроке про плавное движение: интерполяция угла без delay. В симуляторе ниже — именно такой стенд из двух осей, база и плечо: он отрабатывает три точки сценария и печатает пары baza= plecho= в момент прибытия каждой оси. Цели в массивах можно менять — сценарий подхватит новые углы на следующем круге.
- 1. Что означает «манипулятор 4 DOF»?
- 2. Почему на плечо я ставлю MG996R, а не SG90?
- 3. Как правильно запитать четыре серво манипулятора?
- 4. Груз 11 г висит в 14 см от оси плеча. Какой момент он создаёт?
- 5. С чего начинать обкатку собранной руки?
- Степень свободы = один сервопривод: база, плечо, локоть, захват — четыре оси, четыре команды write().
- Момент сустава считай до сборки: вес груза плюс вес рычага, умноженные на плечо; результат удвой и сравни с половиной паспортного момента серво.
- Плечо — самый нагруженный сустав: SG90 впритык, MG996R с запасом; металлические шестерни здесь обязательны.
- Четыре серво — это внешний блок 5–6 В на 2–3 А, общий GND с Arduino и электролит 1000 мкФ у клемм.
- Обкатка по одному суставу с печатью ugol= в Serial; рабочий ход 30–150° вместо полных 0–180°.
Частые вопросы по теме урока
- Что означает «манипулятор 4 DOF»?
- DOF — степень свободы. Четыре серво дают четыре независимых движения: база, плечо, локоть, захват. у него четыре независимых движения, по одному на сервопривод
- Почему на плечо я ставлю MG996R, а не SG90?
- Момент плеча в худшей позе у моего стенда — около 0,8 кг·см; с двойным запасом это 1,6 кг·см, впритык к 1,8 кг·см SG90. MG996R даёт 9,4 кг·см при 4,8 В. плечо несёт вес предплечья и груза, паспортный момент SG90 не оставляет запаса
- Как правильно запитать четыре серво манипулятора?
- Пики старта легко превышают 1 А. USB-порт отдаёт около 500 мА — платы уйдёт в сброс. Внешний блок плюс общий провод земли — единственная рабочая схема. от внешнего блока 5–6 В на 2–3 А с общим GND и конденсатором у клемм
- Груз 11 г висит в 14 см от оси плеча. Какой момент он создаёт?
- Момент = вес × плечо: 11 г × 14 см = 154 г·см. Не забудьте добавить вес самого рычага. примерно 154 г·см
- С чего начинать обкатку собранной руки?
- Один сустав — один тест. Иначе любой сбой превращается в гадание между питанием, механикой и кодом. с теста каждого сустава по очереди, начиная с базы