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


Я — программист, увлёкся электроникой несколько месяцев назад и недавно открыл для себя робототехнику. Это область оказалась настолько интересной, что я просто не мог удержаться, и решил сделать что-нибудь, что хотя бы с натяжкой можно было бы назвать роботом. После долгих размышлений выбор пал на шестиногого «паучка».

Вдохновила меня на это дело вот эта заметка /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. Отличная работа!
    Большое спасибо за такой подробный отчёт и качественный код 🙂
    Порадовала передача из ПКЛ — у меня такую вылепить терпения не хватило бы 🙂
    Возникло несколько вопросов:
    1. Как удалось раскатать такую ровную пластину из ПКЛ?
    2. Элементы передачи выглядят почти одинаковыми — использовался шаблон или «на глаз»?
    3. конденсаторы на гребёнках используются в качестве фильтра?

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

    • Спасибо за отзыв (:

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

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

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

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

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

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

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

  3. Спасибо за подробное описание (делаю первые шаги в роботостроении) решил повторить вашу модельку с минимальным конструктивным изменением. Когда ожидать дальнейшее развитие проекта?

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

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Arduino Bluetooth CraftDuino DIY Google IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение