60

Собираем ШестиНог’а Часть 0

Предыстория (для тех кто не в кугсе, часть -1) : решили мы с коллегой пособирать что либо на ардуино, его выбор пал на шестинога (чаще встречается название гексапод, паук и т.д.).

Вступление. В этой части рассмотрим геометрию хождения «паучьих», терминологию (сразу оговорюсь я ее применять не буду, но для академического интереса опишу). Вспомним (для кого-то подтянем, может даже и для самих себя после каментов) тригонометрию, опишем ее, переложим в код и проверим все это в работе одной ноги.

Железо по прежнему 1 arduino nano, 18 сервоприводов tower pro MG996R (точнее их дешевые клоны-уже писал что это никак не сопоставимо с оригиналом, но дешево) 4 аккумулятора 18650 2х2 (7.4В 4.8 Ач) несколько преобразователей напряжения. И шилд расширения шим выводов или еще одна arduino nano (не решено, но опробовано и так и так).

Обещанная терминология лап.

Чаще применяются 3 части Coxa, Femur, Tribia. Я назову Плечо, Предплечье и Лапа.

Про код. Чаще встречаешь в сети из легко доступного код который может совершить конкретные действия в конкретном механизме заранее известного размера, что весьма печалит ибо всегда хочется совершать и свои движения. Постараемся написать именно такую функцию которая может передвигать лапу в любом направлении по «рисунку» на координатной плоскости (по сути по описанию промежуточных точек, в массиве, с координатами X Y Z)

Про термины. Нам понадобятся функции sin(A), cos(A), tan(A).

sin(A) отношение противолежащего (относительно угла) катета к гипотенузе

cos(A) отношение прилежащего (относительно угла) катета к гипотенузе

tan(A) отношение противолежащего катета к прилежащему или синуса к косинусу угла.


Еще нам понадобится формула отыскания угла в непрямоугольном треугольнике .


Про переменные. Переменные которые мы заведем (что то будет заведено не переменными а "задефайнено"=#define эта штука запоминает первую часть описания и меняет на вторую во всем коде, не занимает место в оличии от переменных и в нее удобно поместить вещи которые не нужно менять, наши габаритные параметры лап). Первые из переменных это координаты в пространстве x, y, z, по ним зададим точки в пространстве по которым будем перемещать лапы.

Углы которые будем считать q_0 угол плеча, q_1, q_2-угол сервопривода лапы, A-угол сервопривода предплечья, F.

Еще величины использующиеся при расчете r_1 длина предплечья, r_2 длина лапы, vinos_r_1 расстояние от оси Z (оси поворота плеча, корневой сервы) до оси поворота предплечья (второго сервопривода). Дело в том что эта величина всегда перпендикулярна оси Z и она не участвует в геометрии треугольника, не учесть мы ее не можем, так как точки 1 и 2 сервопривода (плечо и предплечье) нельзя совместить в одной точке, но учесть ее оказалось не сложно.

Вот так я для себя отобразил углы и стороны треугольника сопоставив с размерами между осями сервоприводов

Для чего я это выписал величины в начале, первое чтобы изучить то на чем мы будем строить расчет нашего движения, второе чтобы заранее подумать как мы это будем «засовывать» в ардуино. Функции синус и косинус в ардуино есть и тут ничего сверх сложного нет, но нужно понимать какого порядка будут величины, в чем их можно хранить (имеется введу типы переменных) а где они могут потеряться если их присвоить в другой тип данных. Еще один нюанс, нельзя забывать что расчет всех величин как в эксель так и в ардуино ведется в радианах. Полученные углы нужно будет переводить в градусы.


Пишем код. Все что нам нужно определить заранее (известные величины: длина предплечья, лапы, вынос) выставим это все в начале скетча


#define PI 3.1416

#define rad2deg(x) ((180.0/PI)*(x))// перевод в градусы

#define r_1 56 //мм

#define r_2 90 //мм

#define vinos_r_1 30 //мм

#define Plecho_1_pin 3

#define PredPlecho_1_pin 4

#define Lapa_1_pin 5

Заведем перменные

float x_mass[]={-40,-30,-20,-10,0,10,20,30,40}; //перемещение вперед, назад координата X

float z_mass[]={-15,-25,-40,-65,-75}; //перемещение вверх, вниз назад координата Z

float y_mass[]={90,90,90,90,90,90,90}; //расстояние от оси поворота плеча до точки касания лапой земли не будем пока что менять

Инициализируем приводы

Servo Lapa1;

Servo Plecho1;

Servo PredPlecho1;

Заводим первую функцию сетап

void setup() {

Plecho1.attach(Plecho_1_pin ); // к ардуино 3

PredPlecho1.attach(PredPlecho_1_pin); // к ардуино 4

Lapa1.attach(Lapa_1_pin); // к ардуино 5

}

void loop () {

raschet_uglov (); //функция расчета углов

ugol_per_prav (); //функция вывода углов в сервоприводы

delay(1000); //для тестов поставим задержку чтобы лихорадочно не дергаться

}

Посмотрим теорию по расчету углов треугольника.

Смотрим сюда Вики и на картинки


Для проверки формул (вживую не хочется жечь сервы, когда они зависают в крайних углах) я завел таблицу excel и вбил туда все эти формулы для проверки возможности перемещения ноги в заданные координаты. Ее прикладывать не буду (не жалко, но кто хочет сами потренируйтесь)


Теперь пишем сами функции расчета углов и вывода их в сервоприводы.

void raschet_uglov ()

{q_0 = atan((x_mass[0])/( y_mass[0])); // угол плеча

float L = sqrt(sq(x_mass[0])+sq(y_mass[0]));

float _V_ = L-vinos_r_1;

float _L = sqrt(sq(_V_)+sq(z_mass[0]));

float q_2 = acos(z_mass[0]/_L);

float r_1sq=sq(r_1);

float r_2sq=sq(r_2);

float _Lsq=sq(_L);

F = (r_1sq+r_2sq-_Lsq)/(2*r_1*r_2); // расчет угла смотрим вики, расчет углов треугольников

q_1 = (r_1sq-r_2sq+_Lsq)/(2*r_1*_L); // смотрим вики, расчет углов треугольников

F = acos(F); // угол лапа

q_1 = acos(q_1);

A = (rad2deg(q_2)-rad2deg(q_1));} // предплечье

Теперь выводим эти углы в сервоприводы

void ugol_per_lev ()

{ Plecho1.write(90+rad2deg(q_0));

PredPlecho1.write (A);

Lapa1.write(rad2deg(F));}


На этом все. Двигать лапами мы в этот раз не будем никакими воздействиями, думаю и так уже дым из ушей, просто заняли положение крайнее вперед из наших матриц. Если ходите попередвигать то просто перебирайте координатой х (опять таки из массива) настоящее движение мы будем писать в следующей статье…

П.С. Прямо этот текст не проверял, но все рабочее 100% (просто выдернуто из общего скетча) пишите в комментариях если что не так.

П.П.С. В следующей части будет железо и подключение всего что связано с лапами. Чтобы не было дыма из ардуино, 3 мощных привода нужно запитывать уже от отдельного источника.

Arduino & Pi

1.5K постов20.9K подписчиков

Правила сообщества

В нашем сообществе запрещается:

• Добавлять посты не относящиеся к тематике сообщества, либо не несущие какой-либо полезной нагрузки (флуд)

• Задавать очевидные вопросы в виде постов, не воспользовавшись перед этим поиском

• Выкладывать код прямо в посте - используйте для этого сервисы ideone.com, gist.github.com или схожие ресурсы (pastebin запрещен)

• Рассуждать на темы политики

• Нарушать установленные правила Пикабу

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества