Я — программист, увлёкся электроникой несколько месяцев назад и недавно открыл для себя робототехнику. Это область оказалась настолько интересной, что я просто не мог удержаться, и решил сделать что-нибудь, что хотя бы с натяжкой можно было бы назвать роботом. После долгих размышлений выбор пал на шестиногого «паучка».
Вдохновила меня на это дело вот эта заметка /projects/250.html о роботах Pololu robotics & electronics, спасибо Zoltberg’у за подсказку.
Для первого раза решил сильно не заморачиваться с самодельной платой с МК, и решил использовать свой экземпляр CraftDuino — с её помощью сделать прототип куда проще, ноги сделать из скрепок, как в статье, а шасси — из поликапролактона (ПКЛ).
Итак, я начал с платформы — сделал лист из ПКЛ толщиной миллиметра в три, шириной с плату CraftDuino, а длину подобрал так, чтобы кроме платы поместились ещё три сервопривода:
Потом прикрутил плату:
и сервоприводы
В версии Pololu ноги были прикреплены прямо к качалкам сервоприводов. Я решил, что резкие нагрузки в неродной сервам плоскости излишни, и приделал стержни из ПКЛ для крепежа примитивной механической передачи:
Передача в сборе:
Ноги сделал отдельно, чтобы прикрепить их позднее:
Насадил передачи на стержни и валы сервоприводов, откалибровав последние опытным путём: выставил им такие углы, при которых качалки боковых серв параллельны «бортам» платформы, а качалка нижней сервы — самой платформе:
После «приваривания» ног получился такой агрегат:
Но какой же я новичок в робототехнике, если не сделаю хоть одну ошибку? И я таки как минимум одну сделал! Получившийся монстр прилично кренился вперёд, раскачивался, из-за чего довольно медленно шёл. Тогда я решил переделать конструкцию: открутил плату, обрезал лишнюю часть платформы:
… и разместил плату снизу:
Для удобного подключения серв и экспериментов у меня были припасены три шнурка с кондёрами на 100 мкф:
Разъёмы питания серв я объединил в «гребёнку», а управляющие линии левой, средней и правой серв повесил на 8, 10 и 12 пины CraftDuino соответственно:
Как видно, конструкция довольно тривиальна. Посмотрим-ка теперь код (:
#include <Servo.h> // Функция определения знака целого числа, понадобится ниже. Возвращает -1, 0 или 1 int sign(int value) { return (value < 0 ? -1 : (value > 0 ? 1 : 0)); } /* "ПараНог" :D * Конструктивно это одна нога, но я решил быть дотошным */ struct LegPair { Servo servo; // каждой паре ног - по серве int neutral, offset; // это углы нейтрального положения и поворота (смещения) при ходьбе LegPair(): neutral(90), offset(15) // задаём значения по умолчанию { } // Конфигурация: цепляемся к пину, устанавливаем "нейтралку" и угол поворота void configure(int pin, int neutral_angle = 90, int offset_angle = 15) { /* Здесь 700 и 2800 - длины управляющих импульсов, которые * для моих серв соответствуют углам 0 и 180 радусов */ servo.attach(pin, 700, 2800); neutral = neutral_angle; offset = offset_angle; } /* Поворот пары относительно нейтрального положения в заданном направлении * на заданный при конфигурации угол */ void turn(int direction) { servo.write(neutral + offset * sign(direction)); } }; // Уберсложный класс робота struct Hexapod { LegPair left, middle, right; // три пары ног, так ведь? // "Подсоединение" робота к пинам для левой, средней и правой пар ног void connect(int left_pin, int middle_pin, int right_pin) { /* Вот тут поточнее настраиваем сервы: смотрим, при каких значениях "нейтральных" углов * ноги стоят ровно (для этого ниже предусмотрена калибровка). Углы поворота настраиваем так, * чтобы средняя пара ног не мешала при ходьбе боковым. Выше я задал по умолчанию 15 градусов, * а левой и правой парам зададим 20 - шире шаг, не мешкаемся! */ left.configure(left_pin, 95, 20); middle.configure(middle_pin, 93); right.configure(right_pin, 90, 20); } // А этим методом мы можем за один вызов позиционировать все ноги void turn(int left_dir, int middle_dir, int right_dir) { enum { COMMAND_QUANTS = 10 }; // сколько раз отдавать команду поворота паре ног /* Чтобы сервы силой держали заданный угол, им нужно постоянно давать команды. * Сделаем это раз, в данном случае - 10 раз. */ for (int i = 0; i < COMMAND_QUANTS; ++i) { left.turn(left_dir); middle.turn(middle_dir); right.turn(right_dir); /* Рекомендуемая задержка между командами для серв. С учётом текущего * значения COMMAND_QUANTS, суммарная длительность turn() составит 0.2 секунды. */ delay(20); } } }; Hexapod robot; // одного экземпляра нам хватит, пожалуй void setup() { robot.connect(8, 10, 12); // вот так легко подключить единожды сконфигурированного робота } //#define CALIBRATE // раскомментировать для калибровки void loop() { #ifdef CALIBRATE robot.turn(0, 0, 0); // ставим на нейтралку, вот и вся калибровка #else // А вот и сверхсложный алгоритм ходьбы (: // Пары ног: левая средняя правая robot.turn( -1, 1, -1); // боковые по часовой стрелке, среднюю правой стороной вниз robot.turn( 1, 1, 1); // боковые против часовой стрелки, среднюю не трогаем robot.turn( 1, -1, 1); // боковые не трогаем, среднюю левой стороной вниз robot.turn( -1, -1, -1); // боковые по часовой стрелке, среднюю не трогаем #endif }
Ну, и под конец всего этого кошмара — соответствующее по духу демонстрационное видео.
Часть 1. Попытка побега
Часть 2. Беглец задержан
P.S. «А где мобильность?» — спросите вы. Ответ прост — аккума не нашлось. Есть две свинцовые бандуры весом по пять кило, но этот робот слишком хил для них (:
0 комментариев на «“Заготовка для шестиногого робота”»
Отличная работа!
Большое спасибо за такой подробный отчёт и качественный код 🙂
Порадовала передача из ПКЛ — у меня такую вылепить терпения не хватило бы 🙂
Возникло несколько вопросов:
1. Как удалось раскатать такую ровную пластину из ПКЛ?
2. Элементы передачи выглядят почти одинаковыми — использовался шаблон или «на глаз»?
3. конденсаторы на гребёнках используются в качестве фильтра?
Надеюсь найдётся небольшой аккумулятор и робот обретёт долгожданную
мобильностьсвободу 🙂Надеюсь на продолжение 🙂
Спасибо за отзыв (:
Отвечаю на вопросы:
1) Пластины я обычно леплю из нагретого ПКЛ вручную, после чего грею феном, кладу на блюдце и раскатываю маркером, как тесто (можно батарейкой). Если нужно сделать толстую пластину, я её клею из нескольких потоньше. В тяжёлых случаях (большая толщина) помогает кипяток в термосе: кидаешь туда твёрдый ПКЛ, ждёшь 5-10 минут, вынимаешь годный к лепке.
2) На глаз. Я поленился подрезать детальки ножницами — получилось бы вообще идеально.
3) Да, и в качестве буфера — это мне Zoltberg подсказал, а без кондёров CraftDuino постоянно перезагружалась.
Это «пилотная» статья, продолжение будет обязательно — я не успокоюсь, пока не оптимизирую конструкцию до минимума. CraftDuino хороша для прототипирования, а в готовом устройстве я бы предпочёл маленькую самопальную плату с МК, благо есть лазерный принтер — ЛУТи не хочу. Габариты робота слишком большие, буду уменьшать.лекции по робототехнике .
А в перспективе я хочу делать всё серьёзно, как у ребят из Стэнфорда:
А, да, совсем забыл — здоровые портновские ножницы для не очень толстого ПКЛ рулят. Для очень толстого — ножницы по металлу.
Супер!
И когда у меня руки до чегонить подобного дойдут=((
Про конденсаторы позволю себе отвеить за автора — да, фильтры.
А вот питать сервы от 5в прям с крафтины/ардуинины — несовсем правильно — стабилизатор не греецца?(трёхногий такой, рядом с разъёмом питания)
Ну и по тойже причине очень боязно за USB…
Импульсный ток потребления (даже одной такой мелкой) сервы может быть весьмааа велИк, конденсаторы конечно спасают, но лишь отчасти.
Думаю над этим. В конце концов, это только заготовка, а я пока не очень шарю в электронике. Эту проблему я решу в следующей реинкарнации робота.
Кстати, как насчёт акселерометров, гироскопов и т.п. экзотики: где их лучше заказывать? У филинов такого не водится, даже МК-то не всегда можно купить.
Прикольно! Автор, нацепи на ноги ему по мааахонькой резиночке — думаю будет прикольно бегать даже по стеклу…
Да-да, я так и сделаю со следующей версией робота (это — прототип). Моему коллеге на днюху подарили машинку на радиоуправлении, так он натянул ей на колёса напальчники, чтобы хорошо ездила по паркету (:
картинки не грузятся :-(((
Странно :\ Я их заливал на Яндекс.Фотки, дома всё отображается, на работе — то же, в том числе и с отключенным кэшем. Вот тебе ссылка наальбом с фотками.
Спасибо за подробное описание (делаю первые шаги в роботостроении) решил повторить вашу модельку с минимальным конструктивным изменением. Когда ожидать дальнейшее развитие проекта?
Ну что вы, это не проект, а так, поделка 😀
Через недельки две на работе должны дать отпуск, тогда и займусь роботом. Возможно, получится и раньше. Только следующий вариант я хочу сделать уже не на CraftDuino, а на самодельной плате с МК (скорее всего, на ATTiny13 или ATTiny2313).