Природа всегда была невероятным источником вдохновения для технологических достижений, и инженеры стремились воспроизвести сложные механизмы, обнаруженные у различных животных. Одним из таких замечательных творений является робот-паук. Его также называют четвероногим роботом из-за наличия у него четырех ног. Этот инновационный роботизированный проект направлен на имитацию передвижения и поведения реальных пауков. Среди всех проектов робототехники, представленных на нашем сайте, этот проект на данный момент является одним из самых сложных, но он того стоит.
Робот-паук — это четвероногий шагающий робот, вдохновленный бионической копией паука, который использует свои ноги для передвижения. Его ноги устроены таким образом, что позволяют им двигаться различными способами, включая ходьбу, бег и лазание. Неотъемлемым компонентом этого проекта является интеграция микроконтроллера ESP32, который обеспечивает беспроводное управление и улучшенную координацию движений. ESP32 служит идеальной платформой для робота-паука, повышая его маневренность, универсальность и способность эффективно перемещаться по сложной местности. Благодаря своей исключительной маневренности, универсальности и способности преодолевать сложную местность, роботы-пауки обладают огромным потенциалом в различных областях, включая поисково-спасательные операции, исследования и даже помощь по дому.
Механизм робота-паука
Механизм робота-паука включает в себя несколько ключевых компонентов и принципов, обеспечивающих его передвижение и функциональность.
Роботы-пауки относятся к категории роботов на ногах, которые обычно более сложны, чем колесные роботы. Роботы на ногах превосходно преодолевают сложные ландшафты по сравнению с колесными роботами. В то время как колесные роботы обычно имеют двигатели постоянного тока, роботы на ногах обычно используют серводвигатели.
Одно фундаментальное различие между колесными и ножными роботами заключается в их степенях свободы (в англ. degrees of freedom, DOF). Колесные роботы имеют только одну степень свободы, тогда как роботы на ногах могут совершать более сложные движения.
Степени свободы тела определяются количеством параметров, необходимых для определения положения этого самого тела. В случае с нашим роботом-пауком на каждой ноге имеется по два серводвигателя, которые обеспечивают два разных направления движения. Это означает, что степень свободы для одной ноги равна 2. Таким образом, общая степень свободы робота-паука равна 8.
Этот проект, возможно, не очень сложен с точки зрения проводки и сборки, но невероятно сложен для понимания кинематики движения четвероногого робота-паука.
Чтобы добиться контролируемого движения, робот должен выполнять разное количество поз, которые в совокупности генерируют одно движение. Это можно сделать, реализовав походку ползком (модель движения), при которой одна нога будет находиться в воздухе, а остальные три ноги должны касаться земли во время движения. Обычно, чтобы сделать один шаг вперед, робот принимает 6 различных поз.
Четвероногие походки для движения вперед
Походка относится к определенному паттерну (шаблону) движения ног, необходимому для продвижения тела к желаемому месту назначения. В случае четвероногих роботов походка предполагает подъем одной ноги за раз, а остальные три ноги образуют поддерживающий штатив. Это скоординированное движение обеспечивает стабильность и эффективное передвижение.
Чтобы добиться четвероногой походки, важно определить, когда и в каком положении должна двигаться каждая нога. Этот процесс известен как инверсная (обратная) кинематика. Обратная кинематика позволяет нам рассчитать необходимые значения для серводвигателей, управляющих ногами, что позволяет точно позиционировать ноги для достижения желаемого шаблона походки.
Обратная кинематика играет решающую роль в плавном выполнении четвероногой походки. Предоставляя необходимые инструкции серводвигателям, ноги робота можно точно переместить в заданное положение. Это помогает поддерживать равновесие и достигать эффективного передвижения робота.
На приведенной выше диаграмме показана походка четвероногого робота вперед, демонстрирующая последовательность движений ног, необходимых роботу для эффективного движения вперед. Пунктирная линия показывает, что ступня поднята.
Для обеспечения устойчивости робота крайне важно, чтобы его центр масс (в англ. center of mass, COM) оставался в пределах опорного многоугольника. Под опорным многоугольником понимается воображаемый многоугольник, если внутри которого находится центр масс, робот может сохранять равновесие. Однако если центр масс выйдет за пределы опорного многоугольника, робот станет неустойчивым и может опрокинуться. Эта концепция изображена на рисунке ниже, где робот остается сбалансированным пока его центр масс находится внутри опорного многоугольника. Это служит важнейшим принципом поддержания стабильности и предотвращения сбоев в работе робота.
Компоненты, необходимые для сборки робота-паука
- Микроконтроллер ESP32 (купить на AliExpress).
- Серводвигатель с пластиковой шестерней SG90 — 8 шт. (купить на AliExpress).
- LM2596 — понижающий преобразователь постоянного тока в постоянный (купить на AliExpress).
- Литий-ионный аккумулятор 12 В.
- Выключатель.
- Соединительные провода.
- Макетная или печатная плата.
- Винты, гайки, проставки.
Файлы для изготовления деталей робота-паука
Эти файлы можно скачать по следующей ссылке.
Авторы проекта спроектировали акриловые детали четвероногого робота-паука с помощью SolidWorks. Файлы .dxf вы можете найти по ссылке выше. Если вы хотите внести какие-либо изменения, вы также можете найти файл .svg . Эти детали также легко доступны на многих веб-сайтах электронной коммерции: просто введите в поиск «Четвероногие роботы-пауки» в Google, и вы найдете множество ссылок.
Сборка робота-паука
Регулировка положения серводвигателей
Прежде чем приступить к сборке робота-паука, нам необходимо отрегулировать угол регулировки серводвигателей. В противном случае ваш робот не будет работать должным образом.
Для начала прикрепите рычаг сервопривода к серводвигателю, тщательно выровняв и закрепив его на месте. Мы можем вручную откалибровать и отрегулировать угол серводвигателя, но иногда ручная калибровка неточна или может оказаться невозможной. Таким образом, вы можете откалибровать свои серводвигатели, используя предоставленный код №1 (приведен в конце статьи). Обратитесь к приведенной ниже принципиальной схеме и подключите серводвигатели к контактам 21, 19, 33, 25, 27, 14, 12 и 13 соответственно. Загрузите предоставленный код № 1 в свой модуль ESP32, что облегчит процесс калибровки. Невыполнение этого шага может привести к нестабильной работе вашего робота.
Обеспечивая правильное выравнивание и калибровку сервоприводов, вы закладываете основу для стабильного и хорошо функционирующего робота.
После завершения регулировки сервопривода вы можете перейти к этапам сборки ног робота.
Этапы сборки ног робота
Шаг 1: Возьмите одиночный рычаг сервопривода и поместите его на поворотную пластину подставки. Вставьте крепежный винт сервопривода в одиночный рычаг сервопривода с задней стороны поворотной пластины с поднятыми ногами. Затягивайте винт до тех пор, пока одиночный рычаг сервопривода не будет надежно прикреплен к поворотной пластине.
Шаг 2: Теперь прикрепите еще один одиночный рычаг сервопривода к стоящему рычагу сервопривода. Для этого вставьте крепежный винт сервопривода с задней стороны рычага сервопривода и закрепите его в одинарном рычаге сервопривода. Убедитесь, что соединение прочное и стабильное.
Шаг 3. Двигаясь дальше, соедините параллельное соединение ножки с деталью ножки с помощью винта M3x10 мм и оптоволоконной гайки M3. Дважды проверьте затяжку винта, чтобы убедиться, что шарнир прочно соединен с ножкой.
Шаг 4. Затем прикрепите часть ножки к сервоприводу ножки с помощью винта M3x10 мм и оптоволоконной гайки M3.
Шаг 5: Вставьте еще один сервопривод в держатель сервопривода.
Шаг 6: Поместите верхний конец второго сервопривода в слот для сервопривода на подставке.
Шаг 7. Прикрепите держатель сервопривода к гнезду сервопривода на ножке с помощью двух винтов M3x12 мм и двух оптоволоконных гаек M3.
Шаг 8. Теперь присоедините параллельную пластину опоры к другому концу опоры с помощью винта M3x10 мм и оптоволоконной гайки M3.
Шаг 9: Когда оба сервопривода находятся в центральном положении, а параллельное соединение ног выровнено по горизонтали, прикрепите рычаг сервопривода ноги к первому сервоприводу с помощью прилагаемого винта рычага сервопривода.
Шаг 10. Наконец, присоедините узел опоры, который был выполнен на предыдущих этапах, к нижней шарнирной пластине опоры с помощью двух винтов M3x10 мм и двух гаек M3.
Этап сборки ноги, возможно, был непростым, но как только эти этапы будут выполнены, оставшийся процесс станет более управляемым.
Корпус в сборе
На этом этапе вам следует быть осторожным с цифрами. Схемы поясняются в соответствии с номерами деталей, поэтому перед сборкой вам следует прочитать списки, которые мы создали.
Список деталей схемы 1 и 2:
- 1- Верхняя пластина корпуса
- 2 — Винт M3x10MM
- 3 — Серводвигатель
- 4 — Гайка М3
- 5 — Гайка волокна M3
- 7 — Винт M3x12MM
- 8 — Проставка
- 10 — Держатель сервопривода
Шаг 1: Начните сборку, прикрепив четыре проставки штока к нижней пластине штока. Используйте четыре винта M3x10 мм и четыре плоские гайки M3, чтобы надежно закрепить прокладки на месте.
Шаг 2: Возьмите четыре сервопривода и расположите их поверх верхней пластины шасси, убедившись, что они правильно выровнены.
Шаг 3: Для каждого сервопривода прикрепите сверху держатель сервопривода. Правильно выровняйте держатель и закрепите его на месте.
Шаг 4. Прикрепите каждый держатель сервопривода к верхней пластине корпуса с помощью винтов M3x12 мм и оптоволоконных гаек M3. Убедитесь, что они надежно затянуты.
Шаг 5: Теперь приступайте к прикреплению каждой части ножки к нижней пластине выноса. Используйте винт M3x10 мм и гайку M3 для каждой ножки. Будьте осторожны и не затягивайте винты слишком сильно, так как это может привести к неисправности сервопривода.
Шаг 6: Соедините нижнюю и верхнюю пластины корпуса. Используйте четыре винта M3x10 мм и гайки M3, чтобы надежно соединить эти два компонента.
Шаг 7: Установив сервоприводы и части ножек на место, осторожно поверните каждую ногу на угол 45 градусов, как показано в инструкциях. Установите верхнюю поворотную пластину опоры и прикрепите ее к каждому сервоприводу шарнира и опоре с помощью двух винтов M3x10 мм и двух гаек M3 для каждой опоры.
Шаг 8: Наконец, прикрепите одиночный рычаг сервопривода к соответствующему сервоприводу с помощью винта сервопривода, убедившись, что он надежно прикреплен.
После сборки это будет выглядеть следующим образом:
Схема робота-паука
Схема четвероногого робота-паука на основе модуля ESP32 приведена на следующем рисунке.
Эта принципиальная схема иллюстрирует интеграцию 8 серводвигателей, обеспечивающих движение робота во всех направлениях, с микроконтроллером ESP32.
Робот состоит из четырех ног, каждая из которых соединена с двумя серводвигателями. Один сервопривод отвечает за вращение оси (известный как сервопривод поворота), а другой сервопривод управляет подъемным движением ноги (известный как сервопривод подъема).
Для достижения скоординированного движения серводвигатели подключаются в определенной последовательности (порядке). Точный порядок и соединения зависят от желаемой модели походки и конкретного используемого алгоритма управления. Синхронно управляя движением этих серводвигателей, робот может достичь стабильного и скоординированного передвижения.
ESP32 и серводвигатели :
- Назначьте контакты с поддержкой ШИМ (широтно-импульсной модуляции) на ESP32 для управления сервоприводами. Эти контакты будут генерировать необходимые сигналы ШИМ для регулировки положения каждого серводвигателя.
- Подключите сигнальный провод (обычно желтого или белого цвета) от каждого серводвигателя к отдельному контакту с поддержкой ШИМ на ESP32.
Серво1 | Контакт 21 | Серво5 | Контакт 27 |
Серво2 | Контакт 19 | Серво6 | Контакт 14 |
Серво3 | Контакт 33 | Серво7 | Контакт 12 |
Серво4 | Контакт 25 | Серво8 | Контакт 13 |
Как видите, эти соединения достаточно несложны.
ESP32 и источник питания:
- Подключите положительную клемму источника питания к контактам VCC каждого серводвигателя.
- Подключите клемму заземления источника питания к контактам заземления (GND) всех серводвигателей.
- Подключите контакт заземления (GND) ESP32 к клемме заземления (-) вашего источника питания.
- Подключите вывод Vin ESP32 к положительной клемме (+) источника питания с помощью переключателя.
При работе с несколькими серводвигателями в роботе-пауке требования к мощности превышают те, которые может обеспечить микроконтроллер ESP32. Поэтому необходим внешний источник питания. Однако крайне важно убедиться, что входное напряжение не превышает 5 В, чтобы предотвратить повреждение микроконтроллера ESP32.
Если вы используете батарею с более высоким напряжением, используйте схему снижения напряжения (понижающий преобразователь постоянного тока), чтобы понизить его до 5 В. Подключите выход схемы снижения напряжения к ESP32 и серводвигателям. Это обеспечивает безопасное и эффективное электроснабжение схемы.
Обратите внимание, что конкретные контакты и программный код могут различаться в зависимости от конкретной модели используемой вами платы ESP32 и имеющихся у вас серводвигателей. Важно свериться с техническими данными и схемами выводов ваших компонентов, чтобы узнать точное расположение выводов и требования к напряжению. Кроме того, убедитесь, что вы обращаетесь с источником питания и соединениями безопасно, следуя рекомендациям, чтобы избежать повреждения компонентов.
Объяснение кода четвероногого робота-паука на ESP32
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Робот-паук, описанный в этом проекте, не работает посредством дистанционного управления. Вместо этого он использует разные функции для различных действий, таких как движения вперед, назад, вправо и влево. Эти функции основаны на походке ползком (также известной как походка для четвероногих). Схема походки преобразуется в программу и встраивается в микроконтроллер ESP32. Эта программа дает инструкции серводвигателям, приказывая им переместить ноги робота в желаемые положения для предполагаемых движений. Выполняя запрограммированную походку ползком, робот-паук может достичь скоординированного и контролируемого передвижения.
Важно выполнить код №1 перед началом этапов сборки. Этот код предназначен для калибровки и регулировки серводвигателей под правильными углами. Запустив этот код, вы можете убедиться, что серводвигатели работают правильно и точно расположены. Это поможет предотвратить любые потенциальные проблемы или осложнения на последующих этапах процесса сборки робота.
Примечание. Перед загрузкой кода в ESP32 всегда выключайте переключатель и отключайте внешний источник питания. Этот шаг имеет решающее значение, поскольку переключатель обеспечивает электрическое разделение между выводом Vin ESP32 и выводом Vcc сервопривода. Эта мера предосторожности обеспечивает безопасность и правильное функционирование компонентов во время процесса загрузки кода. Не забывайте следовать этой процедуре каждый раз, когда вы загружаете код в ESP32 для робота-паука, сохраняя электрическое разделение между ESP32 и сервоприводами, чтобы избежать нежелательных осложнений или повреждений.
Код №1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#include <ESP32_Servo.h> // include servo library // Define 8 Servos Servo myServo1; // Front Left Pivot Servo Servo myServo2; // Front Left Lift Servo Servo myServo3; // Back Left Pivot Servo Servo myServo4; // Back Left Lift Servo Servo myServo5; // Back Right Pivot Servo Servo myServo6; // Back Right Lift Servo Servo myServo7; // Front Right Pivot Servo Servo myServo8; // Front Right Lift Servo void setup() { // Attach servos to Arduino Pins myServo1.attach(21); myServo2.attach(19); myServo3.attach(33); myServo4.attach(25); myServo5.attach(27); myServo6.attach(14); myServo7.attach(12); myServo8.attach(13); myServo1.write(90); myServo2.write(90); myServo3.write(90); myServo4.write(90); myServo5.write(90); myServo6.write(90); myServo7.write(90); myServo8.write(90); } void loop() { } |
Основной код программы (код №2) включает в себя все необходимые движения серводвигателей, чтобы ваш робот работал корректно. Без этого кода вы не сможете успешно завершить проект. Это имеет решающее значение для правильной работы робота.
В следующих строках программы мы подключаем библиотеку для управления серводвигателями и объявляется глобальная константа с именем FUNCTION_DELAY, которая представляет собой задержку в миллисекундах между вызовами каждой функции.
1 2 3 4 |
#include <ESP32_Servo.h> // include servo library This line includes the ESP32_Servo library, which provides functions for controlling servo motors using the ESP32 microcontroller. // Define the delay between function calls (in milliseconds) const unsigned long FUNCTION_DELAY = 2000; // 2 seconds |
Далее в программе объявляем восемь объектов Servo — от «myServo1» до «myServo8». Каждый объект представляет собой серводвигатель и связан с определенной функцией (например, поворотом или подъемом) и определенной ногой робота-паука.
1 2 3 4 5 6 7 8 9 |
// Define 8 Servos Servo myServo1; // Front Left Pivot Servo Servo myServo2; // Front Left Lift Servo Servo myServo3; // Back Left Pivot Servo Servo myServo4; // Back Left Lift Servo Servo myServo5; // Back Right Pivot Servo Servo myServo6; // Back Right Lift Servo Servo myServo7; // Front Right Pivot Servo Servo myServo8; // Front Right Lift Servo |
Функция setup выполняется один раз при запуске микроконтроллера. В ней мы прикрепляем каждый объект Servo к соответствующему выводу ESP32 с помощью метода Attach(). Функция center_servos() вызывается для установки всех серводвигателей в центральное положение, а для стабильности добавляется задержка в 2 секунды.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
void setup() { // Attach servos to Arduino Pins myServo1.attach(21); myServo2.attach(19); myServo3.attach(33); myServo4.attach(25); myServo5.attach(27); myServo6.attach(14); myServo7.attach(12); myServo8.attach(13); center_servos(); Serial.println("center"); delay(2000); } |
Следующий блок кода содержит функцию loop(), которая выполняется непрерывно в программе. Она состоит из нескольких циклов for, каждый из которых контролирует количество шагов для определенного движения. На каждой итерации вызывается соответствующая функция движения (‘moveLegServos_Forward()‘, ‘moveLegServos_Backward()‘, ‘moveLegServos_Right()‘, ‘moveLegServos_Left()‘, ‘pushup()‘, ‘dance()‘) . После каждого движения вызывается функция center_servos() для сброса всех серводвигателей в их центральное положение. Между каждым движением вводится задержка в миллисекундах FUNCTION_DELAY.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
void loop() { // Move Forward 10 step for (int i = 0; i < 10; i++) { moveLegServos_Forward(); } center_servos(); delay(FUNCTION_DELAY); // Move Backward 10 step for (int i = 0; i < 10; i++) { moveLegServos_Backward(); } center_servos(); delay(FUNCTION_DELAY); // Move Right 10 step for (int i = 0; i < 10; i++) { moveLegServos_Right(); } center_servos(); delay(FUNCTION_DELAY); // Move Left 10 step for (int i = 0; i < 10; i++) { moveLegServos_Left(); } center_servos(); delay(FUNCTION_DELAY); // dance 10 step for (int i = 0; i < 10; i++) { dance(); } center_servos(); delay(FUNCTION_DELAY); // pushup 10 step for (int i = 0; i < 10; i++) { pushup(); } center_servos(); delay(FUNCTION_DELAY); } |
В следующем фрагменте кода представлена функция moveLegServos_Forward(), которая управляет действиями сервоприводов, позволяющими роботу-пауку двигаться вперед. Она вызывает функции moveLeg_Left_Forward() и moveLeg_Right_Forward() для управления движением каждой ноги. Функция постепенно регулирует углы сервопривода для достижения желаемого положения ног для движения робота вперед.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
// Move Spider Robot Forward Function void moveLegServos_Forward() { // Control the servo actions for each leg // Left side leg - Leg 1 moveLeg_Left_Forward(myServo8, myServo7, myServo8); // Left side leg - Leg 4 moveLeg_Left_Forward(myServo2, myServo1, myServo2); // Left side leg - Legs 1 and 4 for (int angle = 0; angle <= 90; angle += 2) { myServo7.write(angle); myServo1.write(angle); delay(10); } // Right side leg - Leg 2 moveLeg_Right_Forward(myServo6, myServo5, myServo6); // Right side leg - Leg 3 moveLeg_Right_Forward(myServo4, myServo3, myServo4); // Right side leg - Legs 2 and 3 for (int angle = 180; angle >= 90; angle -= 2) { myServo5.write(angle); myServo3.write(angle); delay(10); } } |
Следующий блок кода определяет функцию moveLegServos_Backward(), которая управляет действиями сервоприводов, позволяющими роботу-пауку двигаться назад. Он вызывает функции moveLeg_Left_Backward() и moveLeg_Right_Backward() для управления движением каждой ноги. Функция постепенно регулирует углы сервопривода для достижения желаемого положения ног для движения назад.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
// Move Spider Robot Backward Function void moveLegServos_Backward() { // Control the servo actions for each leg // Left side leg - Leg 1 moveLeg_Left_Backward(myServo2, myServo1, myServo2); // Left side leg - Leg 4 moveLeg_Left_Backward(myServo8, myServo7, myServo8); // Left side leg - Legs 1 and 4 for (int angle = 180; angle >= 90; angle -= 2) { myServo1.write(angle); myServo7.write(angle); delay(10); } // Right side leg - Leg 2 moveLeg_Right_Backward(myServo4, myServo3, myServo4); // Right side leg - Leg 3 moveLeg_Right_Backward(myServo6, myServo5, myServo6); // Right side leg - Legs 2 and 3 for (int angle = 0; angle <= 90; angle += 2) { myServo3.write(angle); myServo5.write(angle); delay(10); } } |
В следующем блоке кода функции moveLegServos_Right() и moveLegServos_Left() управляют сервоприводами, позволяющими роботу-пауку двигаться вправо и влево соответственно.
Эти функции координируют движения сервомоторов ног для достижения желаемого движения робота-паука вправо или влево. Каждая функция вызывает соответствующую функцию moveLeg_Right() или moveLeg_Left() для каждой ноги робота, передавая соответствующие сервообъекты в качестве аргументов.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// Move Spider Robot Right Function void moveLegServos_Right() { // Control the Right turn servo actions for each leg moveLeg_Right(myServo8, myServo7, myServo1); // Leg 4 moveLeg_Right(myServo6, myServo5, myServo7); // Leg 3 moveLeg_Right(myServo4, myServo3, myServo5); // Leg 2 moveLeg_Right(myServo2, myServo1, myServo3); // Leg 1 } // Move Spider Robot Left Function void moveLegServos_Left() { // Control the Left turn servo actions for each leg moveLeg_Left(myServo8, myServo7, myServo1); // Leg 4 moveLeg_Left(myServo6, myServo5, myServo7); // Leg 3 moveLeg_Left(myServo4, myServo3, myServo5); // Leg 2 moveLeg_Left(myServo2, myServo1, myServo3); // Leg 1 } |
Следующий блок определяет функции pushup() и dance(), которые управляют сервоприводами робота-паука для выполнения отжиманий и танцевальных движений. Они чередуют углы сервоприводов от 0 до 180 градусов для выбранных сервоприводов (myServo1, myServo3, myServo5, myServo7) для достижения эффекта танцевального движения и (myServo2, myServo4, myServo6, myServo8) для эффекта отжимания.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
// Spider Robot dance Function void dance(){ // Move the selected servos from 0 to 180 degrees for (int angle = 0; angle <= 180; angle += 2) { myServo1.write(angle); myServo3.write(angle); myServo5.write(angle); myServo7.write(angle); delay(10); // Delay between each angle change (adjust as needed) } // Move the selected servos from 180 to 0 degrees for (int angle = 180; angle >= 0; angle -= 2) { myServo1.write(angle); myServo3.write(angle); myServo5.write(angle); myServo7.write(angle); delay(10); // Delay between each angle change (adjust as needed) } } // Spider Robot pushup Function void pushup(){ // Move the selected servos from 0 to 180 degrees for (int angle = 0; angle <= 180; angle += 2) { myServo2.write(angle); myServo4.write(angle); myServo6.write(angle); myServo8.write(angle); delay(10); // Delay between each angle change (adjust as needed) } // Move the selected servos from 180 to 0 degrees for (int angle = 180; angle >= 0; angle -= 2) { myServo2.write(angle); myServo4.write(angle); myServo6.write(angle); myServo8.write(angle); delay(10); // Delay between each angle change (adjust as needed) } } |
Следующий блок кода включает четыре функции moveLeg_Left_Forward(), moveLeg_Right_Forward(), moveLeg_Left_Backward() и moveLeg_Right_Backward().
moveLeg_Left_Forward(): эта функция отвечает за перемещение левой ноги робота-паука вперед. В качестве параметров он принимает три сервообъекта: LiftServo, PivotServo и противоположный PivotServo. Функция сначала перемещает LiftServo от 90 до 180 градусов с шагом в 2 градуса. Затем он перемещает поворотный сервопривод от 90 до 0 градусов с тем же приращением. Наконец, он перемещает LiftServo назад со 180 до 90 градусов. Каждое движение сопровождается задержкой в 10 миллисекунд с использованием оператора задержки delay(10).
moveLeg_Right_Forward(): эта функция отвечает за перемещение правой ноги робота-паука вперед. Она имеет структуру, аналогичную moveLeg_Left_Forward(), но с добавлением дополнительного перемещения. После перемещения LiftServo и PivotServo, как описано выше, противоположный PivotServo перемещается от 0 до 90 градусов. Целью этого дополнительного движения является координация движений ног для движения вперед.
moveLeg_Left_Backward(): эта функция отвечает за перемещение левой ноги робота-паука назад. Она имеет структуру, аналогичную moveLeg_Left_Forward(), но с некоторыми изменениями в приращениях углов и направлениях. PivotServo перемещается с 90 на 180 градусов, а LiftServo со 180 на 90 градусов. Эти изменения приводят к тому, что нога движется в противоположном направлении.
moveLeg_Right_Backward(): эта функция отвечает за перемещение правой ноги робота-паука назад. Она имеет структуру, аналогичную moveLeg_Left_Backward(), с добавлением дополнительного перемещения. После перемещения LiftServo и PivotServo , как описано выше, противоположный PivotServo перемещается с 90 до 0 градусов.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
// Move Spider Robot Forward logic void moveLeg_Left_Forward(Servo& liftServo, Servo& pivotServo , Servo& oppositePivotServo) { // Move the lift servo from 90 to 180 for (int angle = 90; angle <= 180; angle += 2) { liftServo.write(angle); delay(10); } // Move the pivot servo from 90 to 0 for (int angle = 90; angle >= 0; angle -= 2) { pivotServo.write(angle); delay(10); } // Move the lift servo from 180 to 90 for (int angle = 180; angle >= 90; angle -= 2) { liftServo.write(angle); delay(10); } } void moveLeg_Right_Forward(Servo& liftServo, Servo& pivotServo , Servo& oppositePivotServo) { // Move the lift servo from 90 to 180 for (int angle = 90; angle <= 180; angle += 2) { liftServo.write(angle); delay(10); } // Move the pivot servo from 90 to 180 for (int angle = 90; angle <= 180; angle += 2) { pivotServo.write(angle); delay(10); } // Move the lift servo from 180 to 90 for (int angle = 180; angle >= 90; angle -= 2) { liftServo.write(angle); delay(10); } } // Move Spider Robot Backward logic void moveLeg_Left_Backward(Servo& liftServo, Servo& pivotServo, Servo& oppositePivotServo) { // Move the lift servo from 90 to 180 for (int angle = 90; angle <= 180; angle += 2) { liftServo.write(angle); delay(10); } // Move the pivot servo from 90 to 180 for (int angle = 90; angle <= 180; angle += 2) { pivotServo.write(angle); delay(10); } // Move the lift servo from 180 to 90 for (int angle = 180; angle >= 90; angle -= 2) { liftServo.write(angle); delay(10); } } void moveLeg_Right_Backward(Servo& liftServo, Servo& pivotServo, Servo& oppositePivotServo) { // Move the lift servo from 90 to 180 for (int angle = 90; angle <= 180; angle += 2) { liftServo.write(angle); delay(10); } // Move the pivot servo from 90 to 0 for (int angle = 90; angle >= 0; angle -= 2) { pivotServo.write(angle); delay(10); } // Move the lift servo from 180 to 90 for (int angle = 180; angle >= 90; angle -= 2) { liftServo.write(angle); delay(10); } } |
Этот блок кода включает две функции moveLeg_Right() и moveLeg_Left().
moveLeg_Right(): эта функция отвечает за перемещение правой ноги робота-паука в правильном направлении или поворот. В качестве параметров он принимает три сервообъекта: LiftServo, PivotServo и oppositePivotServo. Функция начинается с перемещения LiftServo от 90 до 180 градусов с шагом 2 градуса. Затем он перемещает поворотный сервопривод от 90 до 0 градусов с тем же приращением. Далее он перемещает oppositePivotServo от 0 до 90 градусов. Наконец, он перемещает LiftServo назад со 180 до 90 градусов. Каждое движение сопровождается задержкой в 10 миллисекунд с использованием оператора задержки delay(10).
moveLeg_Left(): эта функция отвечает за перемещение левой ноги робота-паука в левом направлении или поворот. Она имеет структуру, аналогичную moveLeg_Right(), но с некоторыми изменениями в приращениях углов и направлениях. PivotServo перемещается с 90 на 180 градусов, а oppositePivotServo со 180 на 90 градусов. Эти изменения приводят к тому, что нога движется в противоположном направлении.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
// Move Spider Robot Right logic void moveLeg_Right(Servo& liftServo, Servo& pivotServo , Servo& oppositePivotServo) { // Move the lift servo from 90 to 180 for (int angle = 90; angle <= 180; angle += 2) { liftServo.write(angle); delay(10); } // Move the pivot servo from 90 to 0 for (int angle = 90; angle >= 0; angle -= 2) { pivotServo.write(angle); delay(10); } // Move the opposite pivot servo from 0 to 90 for (int angle = 0; angle <= 90; angle += 2) { oppositePivotServo.write(angle); delay(10); } // Move the lift servo from 90 to 180 for (int angle = 180; angle >= 90; angle -= 2) { liftServo.write(angle); delay(10); } } // Move Spider Robot Left logic void moveLeg_Left(Servo& liftServo, Servo& pivotServo , Servo& oppositePivotServo) { // Move the lift servo from 90 to 180 for (int angle = 90; angle <= 180; angle += 2) { liftServo.write(angle); delay(10); } // Move the pivot servo from 90 to 180 for (int angle = 90; angle <= 180; angle += 2) { pivotServo.write(angle); delay(10); } // Move the opposite pivot servo from 180 to 90 for (int angle = 180; angle >= 90; angle -= 2) { oppositePivotServo.write(angle); delay(10); } // Move the lift servo from 180 to 90 for (int angle = 180; angle >= 90; angle -= 2) { liftServo.write(angle); delay(10); } } |
Следующий блок определяет функцию center_servos(), которая устанавливает все серводвигатели в их центральное положение, записывая угол 90 градусов для каждого сервопривода.
1 2 3 4 5 6 7 8 9 10 11 |
// All Servos Centor function void center_servos() { myServo1.write(90); myServo2.write(90); myServo3.write(90); myServo4.write(90); myServo5.write(90); myServo6.write(90); myServo7.write(90); myServo8.write(90); } |
В целом, код обеспечивает базовую основу для управления роботом-пауком с помощью микроконтроллера ESP32 и серводвигателей, позволяя ему выполнять различные движения и действия.
Код программы
Код №1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
#include <ESP32_Servo.h> // include servo library // Define 8 Servos Servo myServo1; // Front Left Pivot Servo Servo myServo2; // Front Left Lift Servo Servo myServo3; // Back Left Pivot Servo Servo myServo4; // Back Left Lift Servo Servo myServo5; // Back Right Pivot Servo Servo myServo6; // Back Right Lift Servo Servo myServo7; // Front Right Pivot Servo Servo myServo8; // Front Right Lift Servo void setup() { // Attach servos to Arduino Pins myServo1.attach(21); myServo2.attach(19); myServo3.attach(33); myServo4.attach(25); myServo5.attach(27); myServo6.attach(14); myServo7.attach(12); myServo8.attach(13); myServo1.write(90); myServo2.write(90); myServo3.write(90); myServo4.write(90); myServo5.write(90); myServo6.write(90); myServo7.write(90); myServo8.write(90); } void loop() { } |
Код №2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 |
#include <ESP32_Servo.h> // include servo library // Define the delay between function calls (in milliseconds) const unsigned long FUNCTION_DELAY = 2000; // 2 seconds const unsigned long t = 2; const unsigned long tt = 5; // Define 8 Servos Servo myServo1; // Front Left Pivot Servo Servo myServo2; // Front Left Lift Servo Servo myServo3; // Back Left Pivot Servo Servo myServo4; // Back Left Lift Servo Servo myServo5; // Back Right Pivot Servo Servo myServo6; // Back Right Lift Servo Servo myServo7; // Front Right Pivot Servo Servo myServo8; // Front Right Lift Servo void setup() { // Attach servos to Arduino Pins myServo1.attach(21); myServo2.attach(19); myServo3.attach(33); myServo4.attach(25); myServo5.attach(27); myServo6.attach(14); myServo7.attach(12); myServo8.attach(13); center_servos(); Serial.println("center"); delay(2000); } void loop() { //Move Forward 10 step for (int i = 0; i < 10; i++) { moveLegServos_Forward(); } center_servos(); delay(FUNCTION_DELAY); // Move Backward 10 step for (int i = 0; i < 10; i++) { moveLegServos_Backward(); } center_servos(); delay(FUNCTION_DELAY); // Move Right 10 step for (int i = 0; i < 10; i++) { moveLegServos_Right(); } center_servos(); delay(FUNCTION_DELAY); // Move Left 10 step for (int i = 0; i < 10; i++) { moveLegServos_Left(); } center_servos(); delay(FUNCTION_DELAY); // dance 10 step for (int i = 0; i < 5; i++) { dance(); } center_servos(); delay(FUNCTION_DELAY); // pushup 10 step for (int i = 0; i < 10; i++) { pushup(); } center_servos(); delay(FUNCTION_DELAY); } // Move Spider Robot Forward Function void moveLegServos_Forward() { // Control the servo actions for each leg // Left side leg - Leg 1 moveLeg_Left_Forward(myServo8, myServo7, myServo8); // Left side leg - Leg 4 moveLeg_Left_Forward(myServo2, myServo1, myServo2); // Left side leg - Legs 1 and 4 for (int angle = 0; angle <= 90; angle += 2) { myServo7.write(angle); myServo1.write(angle); delay(tt); } // Right side leg - Leg 2 moveLeg_Right_Forward(myServo6, myServo5, myServo6); // Right side leg - Leg 3 moveLeg_Right_Forward(myServo4, myServo3, myServo4); // Right side leg - Legs 2 and 3 for (int angle = 180; angle >= 90; angle -= 2) { myServo5.write(angle); myServo3.write(angle); delay(tt); } } // Move Spider Robot Backward Function void moveLegServos_Backward() { // Control the servo actions for each leg // Left side leg - Leg 1 moveLeg_Left_Backward(myServo2, myServo1, myServo2); // Left side leg - Leg 4 moveLeg_Left_Backward(myServo8, myServo7, myServo8); // Left side leg - Legs 1 and 4 for (int angle = 180; angle >= 90; angle -= 2) { myServo1.write(angle); myServo7.write(angle); delay(tt); } // Right side leg - Leg 2 moveLeg_Right_Backward(myServo4, myServo3, myServo4); // Right side leg - Leg 3 moveLeg_Right_Backward(myServo6, myServo5, myServo6); // Right side leg - Legs 2 and 3 for (int angle = 0; angle <= 90; angle += 2) { myServo3.write(angle); myServo5.write(angle); delay(tt); } } // Move Spider Robot Right Function void moveLegServos_Right() { // Control the Right turn servo actions for each leg moveLeg_Right(myServo8, myServo7, myServo5); // Leg 4 moveLeg_Right(myServo2, myServo1, myServo7); // Leg 3 moveLeg_Right(myServo4, myServo3, myServo1); // Leg 2 moveLeg_Right(myServo6, myServo5, myServo3); // Leg 1 } // Move Spider Robot Left Function void moveLegServos_Left() { // Control the Left turn servo actions for each leg moveLeg_Left(myServo8, myServo7, myServo1); // Leg 4 moveLeg_Left(myServo6, myServo5, myServo7); // Leg 3 moveLeg_Left(myServo4, myServo3, myServo5); // Leg 2 moveLeg_Left(myServo2, myServo1, myServo3); // Leg 1 } // Spider Robot dance Function void dance(){ // Move the selected servos from 0 to 180 degrees for (int angle = 0; angle <= 180; angle += 2) { myServo1.write(angle); myServo3.write(angle); myServo5.write(angle); myServo7.write(angle); delay(t); // Delay between each angle change (adjust as needed) } // Move the selected servos from 180 to 0 degrees for (int angle = 180; angle >= 0; angle -= 2) { myServo1.write(angle); myServo3.write(angle); myServo5.write(angle); myServo7.write(angle); delay(t); // Delay between each angle change (adjust as needed) } center_servos(); delay(100); lean_left(); delay(300); lean_right(); delay(300); lean_left(); delay(300); lean_right(); delay(300); lean_left(); delay(300); lean_right(); delay(300); lean_left(); delay(300); lean_right(); delay(500); center_servos(); delay(300); bow(); center_servos(); } // Spider Robot pushup Function void pushup(){ // Move the selected servos from 0 to 180 degrees for (int angle = 0; angle <= 180; angle += 2) { myServo2.write(angle); myServo4.write(angle); myServo6.write(angle); myServo8.write(angle); delay(10); // Delay between each angle change (adjust as needed) } // Move the selected servos from 180 to 0 degrees for (int angle = 180; angle >= 0; angle -= 2) { myServo2.write(angle); myServo4.write(angle); myServo6.write(angle); myServo8.write(angle); delay(10); // Delay between each angle change (adjust as needed) } } // Move Spider Robot Forward logic void moveLeg_Left_Forward(Servo& liftServo, Servo& pivotServo , Servo& oppositePivotServo) { // Move the lift servo from 90 to 180 for (int angle = 90; angle <= 180; angle += 2) { liftServo.write(angle); delay(tt); } // Move the pivot servo from 90 to 0 for (int angle = 90; angle >= 0; angle -= 2) { pivotServo.write(angle); delay(tt); } // Move the lift servo from 180 to 90 for (int angle = 180; angle >= 90; angle -= 2) { liftServo.write(angle); delay(tt); } } void moveLeg_Right_Forward(Servo& liftServo, Servo& pivotServo , Servo& oppositePivotServo) { // Move the lift servo from 90 to 180 for (int angle = 90; angle <= 180; angle += 2) { liftServo.write(angle); delay(tt); } // Move the pivot servo from 90 to 180 for (int angle = 90; angle <= 180; angle += 2) { pivotServo.write(angle); delay(tt); } // Move the lift servo from 180 to 90 for (int angle = 180; angle >= 90; angle -= 2) { liftServo.write(angle); delay(tt); } } // Move Spider Robot Backward logic void moveLeg_Left_Backward(Servo& liftServo, Servo& pivotServo, Servo& oppositePivotServo) { // Move the lift servo from 90 to 180 for (int angle = 90; angle <= 180; angle += 2) { liftServo.write(angle); delay(tt); } // Move the pivot servo from 90 to 180 for (int angle = 90; angle <= 180; angle += 2) { pivotServo.write(angle); delay(tt); } // Move the lift servo from 180 to 90 for (int angle = 180; angle >= 90; angle -= 2) { liftServo.write(angle); delay(tt); } } void moveLeg_Right_Backward(Servo& liftServo, Servo& pivotServo, Servo& oppositePivotServo) { // Move the lift servo from 90 to 180 for (int angle = 90; angle <= 180; angle += 2) { liftServo.write(angle); delay(tt); } // Move the pivot servo from 90 to 0 for (int angle = 90; angle >= 0; angle -= 2) { pivotServo.write(angle); delay(tt); } // Move the lift servo from 180 to 90 for (int angle = 180; angle >= 90; angle -= 2) { liftServo.write(angle); delay(tt); } } // Move Spider Robot Right logic void moveLeg_Right(Servo& liftServo, Servo& pivotServo , Servo& oppositePivotServo) { // Move the lift servo from 90 to 180 for (int angle = 90; angle <= 180; angle += 2) { liftServo.write(angle); delay(t); } // Move the pivot servo from 90 to 0 for (int angle = 90; angle >= 0; angle -= 2) { pivotServo.write(angle); delay(t); } // Move the opposite pivot servo from 0 to 90 for (int angle = 0; angle <= 90; angle += 2) { oppositePivotServo.write(angle); delay(t); } // Move the lift servo from 90 to 180 for (int angle = 180; angle >= 90; angle -= 2) { liftServo.write(angle); delay(t); } } // Move Spider Robot Left logic void moveLeg_Left(Servo& liftServo, Servo& pivotServo , Servo& oppositePivotServo) { // Move the lift servo from 90 to 180 for (int angle = 90; angle <= 180; angle += 2) { liftServo.write(angle); delay(t); } // Move the pivot servo from 90 to 180 for (int angle = 90; angle <= 180; angle += 2) { pivotServo.write(angle); delay(t); } // Move the opposite pivot servo from 180 to 90 for (int angle = 180; angle >= 90; angle -= 2) { oppositePivotServo.write(angle); delay(t); } // Move the lift servo from 180 to 90 for (int angle = 180; angle >= 90; angle -= 2) { liftServo.write(angle); delay(t); } } void bow() { center_servos(); delay(200); myServo2.write(15); myServo8.write(15); delay(700); myServo2.write(90); myServo8.write(90); delay(700); } void lean_left() { myServo2.write(15); myServo4.write(15); myServo6.write(150); myServo8.write(150); } void lean_right() { myServo2.write(150); myServo4.write(150); myServo6.write(15); myServo8.write(15); } // All Servos Centor function void center_servos() { myServo1.write(90); myServo2.write(90); myServo3.write(90); myServo4.write(90); myServo5.write(90); myServo6.write(90); myServo7.write(90); myServo8.write(90); } |