Четвероногий ползающий робот под управлением Arduino



Уникальность данного робота в его способе передвижения. Он может передвигаться не только «идя» на ногах, но и как бы плывя по твердой поверхности. «Плавающие» движения напоминают движения жуков-плавунцов по водной поверхности.
По словам мастера он не нашел в интернете ни одного робота с такими движениями.
Скимминг (от англ. skim — «скользить») — это неудобный и резкий способ передвижения, но он очень увлекателен и намного быстрее, чем ходьба. Кроме того, это позволило запрограммировать «режим захвата», когда робот может захватывать небольшие и легкие предметы. В первом видео ниже робот идет, затем скользит по полу. Во втором видео робот идет, затем примерно в середине ролика он захватывает мусор и утилизирует его.


Инструменты и материалы:
-Сервомоторы SG90 12 шт — с сервоприводами (в комплекте с серводвигателями: 4 крестообразных, 8 однорычажных) и прилагаемыми винтами;
-Ардуино Нано;
-Макетная плата;
-Сервопривод с импульсной модуляцией (ШИМ);
-Ролики ½ ” — 4 шт;
-Лист пенополистирола толщиной 3,2 мм;
-Пластиковый уголок из полистирола L-образной формы (4,8 мм);
-Модуль ИК-приемника и ИК-пульт дистанционного управления;
-Никель-металлгидридные батареи 9 В — 2 шт;
-Зарядное устройство;
-Разъемы для батарей 9В — 2шт;
-Винты M2 10 мм — 38 шт;
-Гайки M2 — 60 шт;
-Винты M2 6 мм — 14 шт;
-Винты M3 14 мм — 2 шт;
-Гайки M3 -4 шт;
-Светодиод 5 мм — 1 шт;
-Резистор 1000 Ом;
-Перемычки;
-Резиновые шины Lego — 4 шт;
-Кабель Mini USB;
-Клей для моделей;
-Нож;
-Плоскогубцы;
-Дрель;
-Сверло 2 мм;
-Отвертка;
-Наждачная бумага;
-Паяльные принадлежности;




Шаг первый: дизайн
Ноги робота пронумерованы: 1) передняя левая часть робота, 2) задняя левая, 3) задняя правая и 4) передняя правая. Каждая нога состоит из трех частей с серводвигателем для перемещения каждой части. Названия трех двигателей: тазобедренная кость, бедренная кость и большеберцовая кость, и пронумерованы для каждой ноги. Например, при программировании двигателей ноги 1 они называются «hip1», «fem1» и «tib1». Внизу каждого бедренного мотора есть небольшой ролик диаметром ½ дюйма..
Для питания робота используется две батареи по 9 вольт. Одна питает Arduino Nano, который, в свою очередь, питает драйвер серводвигателя и приемник для пульта дистанционного управления. Другая батарея используется для двигателей.
Для управления роботом мастер использовал инфракрасный (ИК) пульт. Он прост в использовании, с предварительно запрограммированным кодом, доступным в Интернете, и имеет множество кнопок, которые упрощают запуск различных функций робота.






Шаг второй: рамки
Чтобы сделать трафарет для рамки бедра, нужно нарисовать на бумаге шаблон на бумаге нижней части серводвигателя. Затем переноситься шаблон на пластик и из пластика вырезаются два прямоугольника для каждого узла (всего восемь деталей).
Затем необходимо сделать разрез на четырех прямоугольниках и соединит детали как на фото. Для фиксации мастер использует клей для моделей.
Каждая тазобедренная рама является зеркальным отображением двух соседних двигателей: ноги 1 и 4, будут иметь шестерни бедренного двигателя, обращенные вперед, а два задних сервопривода бедра, ноги 2 и 3, будут иметь шестерни, обращенные назад. Другими словами, ноги 1 и 2 являются зеркальным отображением ног 4 и 3 соответственно.
Когда все прорези будут закончены, придайте прямоугольникам шестиугольную форму, надрезав углы ножом.
После высыхания клея установите моторы на место.








Шаг третий: подготовка сервопривода
Сервоприводы обычно поставляются с рычагами различной формы. Крестообразный рычаг используется, чтобы прикрепить двигатели бедра к основному корпусу. Используется второе последнее отверстие на самом длинном конце рычага и третье последнее отверстие на коротком конце. Чтобы прикрепить крестообразный рычаг к основному корпусу нужны два винта. Отверстия слишком малы для винтов M2, поэтому нужно их рассверлить.
Для каждого сервопривода бедра и голени используется рычаг с одним концом (всего восемь). При необходимости отверстия на концах этих рычагов также необходимо рассверлить.



Шаг четвертый: подготовка деталей
Изготовление деталей большеберцовой кости
В других проектах существует множество вариаций деталей большеберцовой кости. Те, что предназначены для этого робота, имеют ширину 2 см и длину 7 см. В верхней части большеберцовой кости вырезается прямоугольное отверстия для сервопривода.
Изготовление деталей бедренной кости
Бедренная кость такая же по размерам (2 см х 7 см), что и большеберцовая кость. По центру детали нужно провести линию. Она будет использоваться для выравнивания рычагов сервопривода и отметки положения винта, который будет фиксировать рычаги к частям бедренной кости.
Так же нужно отметить на детали бедренной кости, где будет проходить центр шестеренок большеберцового и бедренного электродвигателей, примерно в 1 см от каждого конца.


Шаг пятый: основной корпус
Основной корпус представляет собой цельный кусок полистирола 3,2 мм размером 9 см x 12 см. Чтобы разметить и просверлить отверстия для крепления сервоприводов бедра, нужно поместить их в опорную раму. Два передних двигателя бедра обращены вперед, а два задних двигателя бедра обращены назад.


Шаг шестой: сборка ножек
Сначала нужно установить все сервоприводы на 90 градусов. При желании можно изменить эскиз развертки в эскизах примера сервопривода в Arduino IDE.
Прикрепите два двигателя к опорной раме с помощью четырех винтов M2 и гаек. Запомните ориентацию электродвигателей бедра в раме бедра и установите электродвигатели бедра шестернями ближе к низу. Затем прикрепите крестообразные рычаги сервопривода к бедренному двигателю с помощью крепежного винта.
Затем, чтобы прикрепить бедренный двигатель к основному корпусу, совместите края набедренной рамы с краями основного корпуса и установите и зафиксируйте сервопривод бедра.
Теперь нужно установить большеберцовый мотор на большеберцовую часть так, чтобы шестерни были ближе к верху. На конце каждой ноги, чтобы улучшить сцепление, когда робот скользит, устанавливается резиновая шина из набора Lego.
Шаг седьмой: схема
Дальше разбираем схему подключения.
Устанавливаем Nano на макетную плату. Устанавливаем перемычки к концам выводов разъема батареи 9 В. Таким образом, красный и черный выводы 9-вольтовой батареи подключены к контактам «Vin» и «GND» Nano соответственно. Драйвер двигателя PWM подключается, как указано в таблице и на схеме.
Подключения всех перемычек следующие:
Драйвер двигателя PWM — Nano:
GND ………………….. GND
SCL ……………… ….. A5
SDA ………………….. A4
VCC ……………… …. 5В

Двигатели подключаются к ШИМ / сервоприводу, соблюдая правильную ориентацию 3 проводов от сервоприводов к каждому ряду из 3 контактов на драйвере двигателя. Контакты для сервоприводов на драйвере помечены 5 В, заземления (GND) и данные. Провода сервопривода обычно красные для 5 В, черные или коричневые для заземления и оранжевые для данных. При такой ориентации двигатели подключаются к ШИМ / сервоприводу следующим образом:

Серводвигатель ….. 3-контактный драйвер двигателя PWM:
hip1 ……………………..0
fem1 …………………….1
tib1 ………………………2
hip2 ……………………..4
fem2 …………………….5
tib2 ………………………6
hip3 ……………………..8
fem3 …………………….9
tib3 ……………………..10
hip4 …………………….12
fem4 ……………………13
tib4 ……………………..14
Примечание: 3, 7 и 11 не используются.
Вторая батарея на 9 В подключается через соединительные провода к винтовой клемме драйвера двигателя ШИМ, красный вывод — к плюсу, черный — к минусу.
Инфракрасный датчик подключается с помощью перемычек к Nano через макетную плату следующим образом:
ИК-датчик: ………. Nano:
Vcc ……………….. 5V
GND ………… …… GND
Данные ……………… D12
Светодиод (LED) используется для информирования, когда робот готов к следующей команде. Если вы нажмете пульт слишком рано, робот пропустит команду. Если вы нажмете несколько раз подряд, пульт даст команду «повторить», на которую робот не запрограммирован. Светодиод подключен к макетной плате, а анод светодиода подключен к контакту D13 Nano. Резистор 1 кОм соединяет катод с землей (GND) Nano.

Шаг восьмой: установка компонентов на основной корпус
Устанавливаем макет с Nano, сервоприводом PWM, ИК-приемником и двумя батареями наверху по центру основного корпуса.
Макетная плата с Nano находится по центру задней части робота. При размещении Nano нужно не забыть вставить кабель мини-USB. Внизу макета есть двусторонняя клейкая прокладка для ее фиксации.
Сервопривод ШИМ располагался по центру в передней части робота и фиксируется винтами.
Приклеиваем четыре небольших полоски L-образного полистирола для удержания на месте батареи.
ИК-приемник расположен сзади слева, возле второй ноги, и удерживается на месте двумя 6-миллиметровыми винтами M2. ИК-приемник должен быть «видим» для пульта дистанционного управления, чтобы ничто не мешало обзору приемника. Две гайки M2 могут служить проставками, а две гайки — для крепления ИК-приемника.




Шаг девятый: установка роликов
Для крепления роликов изготавливается прямоугольный корпус, подходящий для нижней части каждого сервопривода. Дно коробки представляет собой кусок полистирола диаметром 3,2 мм, размером с нижнюю часть сервопривода бедра. Три стороны коробки представляют собой кусочки пластикового уголка в форме буквы «L». Они располагаются на 3,2-миллиметровом элементе, а углы горизонтальной стороны срезаны под углом 45 градусов. На этом этапе нужно отцентровать ролик и отметьте крепежные отверстия. Затем отверстия сверлим и прикручиваем ролик.
Для усиления коробки были вырезаны и приклеены четыре небольших кусочка пластикового уголка в форме буквы «L». Затем устанавливаем корпуса с роликами на нижнюю часть сервопривода и фиксируем винтами.






Шаг десятый: код
Большая часть кода основана на примере эскиза драйвера PWM / Servo от Adafruit и учебном пособии по ИК-дистанционному управлению от Dronebot Workshop.
Код работает с тремя библиотеками:
IRremote.h
Wire.h
Adafruit_PWMServoDriver.h
PWMServoDriver можно загрузить по ссылке Adafruit выше. Как следует из названия, он управляет сервоприводом, который управляет серводвигателями. Библиотека Wire — это стандартная библиотека, которая поставляется с программным обеспечением Arduino IDE. Библиотеку IRremote можно найти в диспетчере библиотек Arduino IDE.
Одна из переменных в коде — «togglePosture», объявленная в верхней части кода. Она отслеживает режим работы робота: шагающий, скользящий или захватывающий. Когда робот собирается двигаться, Nano проверяет значение togglePosture, чтобы определить текущий режим. При необходимости он запустит соответствующую функцию для изменения позы, а затем обновит переменную togglePosture на новый режим (скользящий = 0, стоя = 1, захват / скользящий = 2, или ни один из них = 3). Это позволяет пользователю, например, активировать функцию «skimForward», когда робот стоит. Поскольку робот не находится в режиме скимминга, togglePosture не равно 0. Таким образом, робот вызовет функцию «skimPosture», которая заставит робота опуститься на ролики, а затем значение переменной togglePosture будет обновлено до 0.
Из-за ориентации двигателей некоторые вращаются по часовой стрелке, чтобы согнуться вверх или двигаться вперед, а другие вращаются против часовой стрелки для того же движения. Так, например, для tib1 и tib3 значение 100 полностью изменено. Однако для tib2 и tib4 значение 600 полностью согнуто (т.е. робот опустился).
При ходьбе движения вперед и назад должны быть плавные скоординированные движениями с одновременным движением более чем одного сустава. Это требует серии движений, когда робот перемещает свой вес, чтобы удерживать центр тяжести под тремя ногами, в то время как четвертая нога поднимается и медленно перемещается. Для этого функции прямого и обратного хода разбиты на несколько циклов «for» в коде. Например, одним из первых движений при ходьбе вперед является перенос веса на ногу4. Это следующий фрагмент кода:
 Показать / Скрыть текстfor (tib2 = 400; tib2 < 500; tib2 = tib2 + 1) { if (fem2 < 450) fem2 = fem2 + 1; if (hip3 < 500) hip3 = hip3 + 1; if (tib4 > 300) tib4 = tib4 — 1; if (hip1 > 350) hip1 = hip1 — 1;} pwm.setPWM(0, 0, hip1); pwm.setPWM(5, 0, fem2); pwm.setPWM(8, 0, hip3); pwm.setPWM(14, 0, tib4); pwm.setPWM(6, 0, tib2); delay(delayTime); }
В этом разделе кода первая строка: for (tib2 = 400; tib2 <500; tib2 = tib2 + 1) {
Переменная tib2 соответствует положению большеберцового двигателя на второй ноге и начинается с 400. Эта строка также указывает, что, пока значение tib2 меньше 500, Nano будет циклически проходить через одиннадцать строк кода снова и снова, но каждый раз будет увеличивать значение tib2 на +1. Следующие несколько строк кода представляют собой несколько операторов «if», где fem1 и hip3 также будут увеличиваться в позиции на единицу каждый раз в цикле по мере увеличения tib2, а tib4 и hip1 будут каждый раз уменьшаться на 1.
Строки с «pwm.setPWM» — это функции, которые заставляют сервопривод ШИМ продвигать двигатели в новое положение, указанное операторами «for» и «if». Поскольку каждое положение мотора изменяется только на 1, движение — это небольшое движение. При увеличении этих переменных по одному значению за раз, ноги будут двигаться медленно и плавно. Кроме того, поскольку задействованы tib2, fem1, hip3, tib4 и hip1, эти пять двигателей будут двигаться одновременно, так же, как робот координировал работу нескольких суставов одновременно.
Строка delay (delayTime) заставляет Nano останавливаться перед каждым циклом этого кода. Переменная delayTime была определена в самом начале всего кода, как и переменная togglePosture. Однако эта переменная представляет продолжительность паузы в миллисекундах. Таким образом, она определяет, насколько быстро Nano повторяет этот участок кода снова и снова. Пауза должна быть достаточно короткой, чтобы не казалось, что двигатель останавливается между каждым увеличивающимся движением, иначе он двигался бы, как секундная стрелка на аналоговых часах. Используя эту паузу между каждым циклом прохождения раздела кода, ходьба будет медленнее и плавней.
Когда tib2 достигнет 500, цикл for завершится, и Nano перейдет к следующему разделу кода, который будет управлять другим набором движений с разными моторами.
В отличие от ходьбы, код для движений скольжения и захвата должен быть намного более быстрым, поэтому движения не увеличиваются в циклах «for», как ходьба. Например, в начале функции «skimForward» находится этот фрагмент кода:
 Показать / Скрыть текстfem2 = 330, fem3 = 390; // femurs up pwm.setPWM(5, 0, fem2); pwm.setPWM(9, 0, fem3); if (togglePosture == 0) { fem1 = 375; pwm.setPWM(1, 0, fem1); fem4 = 300; pwm.setPWM(13, 0, fem4); } delay(10);
В этом коде значения fem2 и fem3 изменяются так, что эти две ноги поднимаются вверх. Две строки pwm.setPWM выполняют эти два движения для двигателей, без увеличения движения. Оператор «if» в этом коде предназначен для проверки, находится ли робот в режиме «снятия», и в этом случае выполняются следующие две строки (между фигурными скобками {}). Если переменная togglePosture не равна нулю, то робот находится в режиме захвата. Функция delay (10) задерживает робота на 10 миллисекунд, чтобы дать двигателям достаточно времени для достижения новых позиций.

В конце полного кода раздел loop () очень короткий и быстрый и выглядит следующим образом:
 Показать / Скрыть текстvoid loop() { if (irrecv.decode(&results)) { if (results.value != 0xFFFFFF) { //0xFFFFFF is the "repeat" command from the remote, so the robot will ignore it digitalWrite(LED_PIN, LOW); // turn off standby LED val = results.value; irrecv.resume(); switch (val) { // Which functions to call when button is pressed, buttons were defined before the setup case P: Pause (); break; case Fr: forward(); break; case B: back(); break; case L: left(); break; case R: right(); break; case St: stand(); break; case Lu: legsUp(); break; case Ld: legsDown(); break; case lt: legsTogether(); break; case Eq: gripPosture(); break; case La: legsApart(); break; case Sf: skimForward(); break; case Sb: skimBack(); break; case Sr: skimRight(); break; case Sl: skimLeft(); break; case S: skimPosture(); break; default: break; } } } digitalWrite(LED_PIN,HIGH); // turn on the standby LED just in case }
Первая строка: if (irrecv.decode (& results)) {
Эта строка будет активировать Nano для декодирования ИК-сигнала от пульта дистанционного управления, если он был получен ИК-датчиком.
В строке «val = results.value» значение ИК-сигнала записывается в переменную с именем «val». Затем эта переменная используется в функции переключения, которая сравнивает «val» с различными командами, каждая из которых соответствует одной из функций перемещения. Nano выполнит эту функцию движения, а затем вернется в коде к началу участка цикла, чтобы декодировать следующий ИК-сигнал.
Полную версию кода можно скачать ниже.
Robot_WalkSkimGrip_July2021.ino
Шаг одиннадцатый: управление роботом с помощью инфракрасного пульта дистанционного управления
Настоящий пульт можно увидеть на втором фото этой статьи. Кнопки пульта ДУ заставляют Nano запускать отдельную функцию в коде. Кнопка и название функции (в кавычках) выглядят следующим образом:
ON/Off = “ Pause ” — заставляет робота опускаться на ролики и втягивать все 4 ноги. Полезно для разгрузки двигателей и, следовательно, аккумулятора.
Vol + = “ forward ”. Робот встанет, если еще не сделал этого, и пойдет вперед.
Rev << = « left » Робот встанет, если еще не сделал этого, и повернет налево.
Play = « stand » Робот встанет, если еще не сделал этого.
FastForward >> = « right » Робот встанет, если еще не сделал этого, и повернет направо.
Vol- = « назад ». Робот встанет и пойдет назад.
Стрелка вверх = « gripUp ». Когда робот находится в режиме захвата, робот поднимает передние ноги.
Стрелка вниз = « gripDown ». Когда робот находится в режиме захвата, робот опускает передние ноги.
0 = « gripTogether ». Когда робот находится в режиме захвата, робот приближает передние ноги.
EQ = « gripPosture » Робот принимает позу для режима захвата. Передние лапы втянуты, задние — в стороны.
ST / REPT = « gripTogether ». Когда робот находится в режиме захвата, робот раздвигает ноги дальше друг от друга.
2 = « skimForward » Робот будет скользить вперед, отталкиваясь ногами в стороны.
4 = « skimLeft » Робот скользит влево, выставив ноги в стороны.
5 = « skim » Робот будет принимать стойку для скольжения. Все четыре ноги будут установлены прямо в стороны.
6 = « skimRight » Робот будет скользить вправо, выставив ноги в стороны.
8 = « skimBack » Робот будет скользить назад, отталкивая себя ногами в стороны.

Все готово.

Источник (Source)

Источник: usamodelkina.ru

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