Заготовка для шестиногого робота

Я — программист, увлёкся электроникой несколько месяцев назад и недавно открыл для себя робототехнику. Это область оказалась настолько интересной, что я просто не мог удержаться, и решил сделать что-нибудь, что хотя бы с натяжкой можно было бы назвать роботом. После долгих размышлений выбор пал на шестиногого «паучка».
Вдохновила меня на это дело вот эта заметка robocraft.ru/blog/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 }; // сколько раз отдавать команду поворота паре ног

    /* Чтобы сервы силой держали заданный угол, им нужно постоянно давать команды.
     * Сделаем это <COMMAND_QUANTS> раз, в данном случае - 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. «А где мобильность?» — спросите вы. Ответ прост — аккума не нашлось. Есть две свинцовые бандуры весом по пять кило, но этот робот слишком хил для них (:
  • +4
  • 1 декабря 2010, 01:06
  • burjui

Комментарии (11)

RSS свернуть / развернуть
+
+2
Отличная работа!
Большое спасибо за такой подробный отчёт и качественный код :)
Порадовала передача из ПКЛ — у меня такую вылепить терпения не хватило бы :)
Возникло несколько вопросов:
1. Как удалось раскатать такую ровную пластину из ПКЛ?
2. Элементы передачи выглядят почти одинаковыми — использовался шаблон или «на глаз»?
3. конденсаторы на гребёнках используются в качестве фильтра?

Надеюсь найдётся небольшой аккумулятор и робот обретёт долгожданную мобильность свободу :)
Надеюсь на продолжение :)
avatar

noonv

  • 1 декабря 2010, 09:53
+
+1
Спасибо за отзыв (:

Отвечаю на вопросы:
1) Пластины я обычно леплю из нагретого ПКЛ вручную, после чего грею феном, кладу на блюдце и раскатываю маркером, как тесто (можно батарейкой). Если нужно сделать толстую пластину, я её клею из нескольких потоньше. В тяжёлых случаях (большая толщина) помогает кипяток в термосе: кидаешь туда твёрдый ПКЛ, ждёшь 5-10 минут, вынимаешь годный к лепке.
2) На глаз. Я поленился подрезать детальки ножницами — получилось бы вообще идеально.
3) Да, и в качестве буфера — это мне Zoltberg подсказал, а без кондёров CraftDuino постоянно перезагружалась.

Это «пилотная» статья, продолжение будет обязательно — я не успокоюсь, пока не оптимизирую конструкцию до минимума. CraftDuino хороша для прототипирования, а в готовом устройстве я бы предпочёл маленькую самопальную плату с МК, благо есть лазерный принтер — ЛУТи не хочу. Габариты робота слишком большие, буду уменьшать.
А в перспективе я хочу делать всё серьёзно, как у ребят из Стэнфорда: лекции по робототехнике.
avatar

burjui

  • 1 декабря 2010, 11:21
+
0
А, да, совсем забыл — здоровые портновские ножницы для не очень толстого ПКЛ рулят. Для очень толстого — ножницы по металлу.
avatar

burjui

  • 1 декабря 2010, 23:34
+
+2
Супер!
И когда у меня руки до чегонить подобного дойдут=((
Про конденсаторы позволю себе отвеить за автора — да, фильтры.
А вот питать сервы от 5в прям с крафтины/ардуинины — несовсем правильно — стабилизатор не греецца?(трёхногий такой, рядом с разъёмом питания)
Ну и по тойже причине очень боязно за USB…
Импульсный ток потребления (даже одной такой мелкой) сервы может быть весьмааа велИк, конденсаторы конечно спасают, но лишь отчасти.
avatar

Zoltberg

  • 1 декабря 2010, 11:00
+
+1
Думаю над этим. В конце концов, это только заготовка, а я пока не очень шарю в электронике. Эту проблему я решу в следующей реинкарнации робота.
Кстати, как насчёт акселерометров, гироскопов и т.п. экзотики: где их лучше заказывать? У филинов такого не водится, даже МК-то не всегда можно купить.
avatar

burjui

  • 1 декабря 2010, 11:36
+
+1
Прикольно! Автор, нацепи на ноги ему по мааахонькой резиночке — думаю будет прикольно бегать даже по стеклу…
avatar

imwode

  • 1 декабря 2010, 13:32
+
+1
Да-да, я так и сделаю со следующей версией робота (это — прототип). Моему коллеге на днюху подарили машинку на радиоуправлении, так он натянул ей на колёса напальчники, чтобы хорошо ездила по паркету (:
avatar

burjui

  • 1 декабря 2010, 14:25
+
0
картинки не грузятся :-(((
avatar

imwode

  • 1 декабря 2010, 14:53
+
+1
Странно :\ Я их заливал на Яндекс.Фотки, дома всё отображается, на работе — то же, в том числе и с отключенным кэшем. Вот тебе ссылка на альбом с фотками.
avatar

burjui

  • 1 декабря 2010, 16:18
+
0
Спасибо за подробное описание (делаю первые шаги в роботостроении) решил повторить вашу модельку с минимальным конструктивным изменением. Когда ожидать дальнейшее развитие проекта?
avatar

raphtor

  • 8 января 2011, 22:17
+
0
Ну что вы, это не проект, а так, поделка :D
Через недельки две на работе должны дать отпуск, тогда и займусь роботом. Возможно, получится и раньше. Только следующий вариант я хочу сделать уже не на CraftDuino, а на самодельной плате с МК (скорее всего, на ATTiny13 или ATTiny2313).
avatar

burjui

  • 9 января 2011, 04:51

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.