Сборка шагающего робота на Arduino.

Автор Владимир Бендик, Пятница, марта 03, 2023, 06:14:23

« предыдущая тема - следующая тема »
Вниз

Владимир Бендик

Пятница, марта 03, 2023, 06:14:23 Последнее редактирование: Понедельник, марта 06, 2023, 05:14:59 от Владимир Бендик
Автор: Владимир Бендик, группа 041-об.

Приветственным словом скажу, что разработка робота мною не ставилась как серьезная работа. Данная статья не пишется как научная работа и при ее создании я не имею научного руководителя. Робот создавался в развлекательных целях, а целью статьи является демонстрация личных достигнутых достижений и неудач.

Идея сделать подобного робота у меня появилась давно, при просмотре работы графического дизайнера Евгения Зубкова "Russia 2077". Среди множества рисунков, показывающих возможный вид России будущего, особый восторг вызвал вид автомобиля "УАЗ СГР" на механических ногах, все-таки машина, выпускаемая без каких-либо изменений уже почти 60 лет, вполне может выпускаться такой же и в 2077 году (половина пути как раз пройдена).



Парой быстрых поисковых запросов на GitHub'е удалось найти открытый проект Spider Open, основанный на библиотеке Servo, и предназначенный для создания различных робопауков на основе 12 сервоприводов. На русскоязычном форуме удалось найти подходящие 3D модели. К моделям были заказаны сервоприводы, размер которых, согласно документации, идеально подходил к сделанным на деталях пазам. Также в известном китайском магазине была заказана плата Arduino Nano, плата расширения для нее, радиомодуль для дистанционного управления, DC-DC преобразователь, 10 аккумулятором типа 18650 и еще всякая мелочь. Сами детали были заказаны к печати на 3D принтере у нас в городе.

Первая и главная неприятность возникла с приездом сервоприводов. Оказалось, что китайские подделки отличаются не только качеством, но и размером, от чего они просто отказались вставать в уже напечатанные детали (за которые была отдана большая часть декабрьской стипендии), пришлось полностью ограничить себя в новогодних праздниках и заказать уже оригинальные моторы (Рекламная пауза: продам 10 неоригинальных сервоприводов MG 996R).

Аккумулятор на 16,8 вольт был выполнен самостоятельно из купленных банок на 4,2 вольта и BMS платы. Так как инструментами для сварки аккумуляторов я не обладаю, пришлось импровизировать с кислотой и припоем. На удивление, способ оказался рабочий и вышло надежно спаять 4 банки без их перегрева.

С приездом уже оригинальных сервоприводов началась активная сборка, за день все было собрано и запущено. Каково же оказалось мое разочарование, когда робот после нескольких шагов неловко заваливался на бок, не в состоянии продолжить идти. Проблема оказалась в неправильно выставленных валах сервоприводов в начальном положении. Дело даже не в том, что они были установлены совсем не верно. Они стояли с погрешностью около 10 градусов, но алгоритм робота устроен так, что каждый поворот робота усиливал эту погрешность. Даже после полной переборки устранить проблему на 100% без изменения кода не удалось, хоть точность работы серв и значительно выросла. Полностью же удалось стабилизировать ходьбу после добавления в код программной стабилизации приводов.

Примерно в то же время радиомодуль приказал долго жить и испустил волшебный дым. Вместо того, чтобы снова мучиться с радиосвязью, было решено заказать модуль Bluetooth и переписать код под него. Для этого была подключена библиотека SerialCommand, способная вызывать функции С++ исходя из посланных в линию rx данных. Прикладываю эту часть кода с комментариями:



void action_cmd(void) //функция, вызываемая по прерыванию с пина rx
{
char *arg; //указатель на элементы типа char, поскольку именно их присылает bluetooth в rx линию
int action_mode, n_step; //объявление переменных, отвечающих за номер вызываемой команды и количество ее вызовов
Serial.println("Обработка:"); //ответ в линию tx о том, что запрос принят
arg = SCmd.next(); //выставляем указатель на первый элемент в присланном массиве
action_mode = atoi(arg); //первый элемент переводим в тип int и записываем в соответствующую ее переменную
arg = SCmd.next(); // выставляем указатель на следующий элемент в присланном массиве
n_step = atoi(arg); //второй элемент переводим в тип int и записываем в соответствующую ее переменную

switch (action_mode) /*обычный свитч, где, исходя из посланной команды, выбирается выполняемый пункт, уточню, что здесь кейсы расписаны полноценными названиями для удобства чтения,
а выбор происходит за счет переменной int, сделано это простым define'ом, пропишу его ниже этого кода, в реальном скетче, он, конечно же, выше.*/
{
case W_FORWARD:
   Serial.println("Шаг вперёд");
   if (!is_stand())
      stand();
   step_forward(n_step);
   break;
case W_BACKWARD:
   Serial.println("Шаг назад");
   if (!is_stand())
      stand();
   step_back(n_step);
   break;
case W_LEFT:
   Serial.println("Поворот влево");
   if (!is_stand())
      stand();
   turn_left(n_step);
   break;
case W_RIGHT:
   Serial.println("Поворот вправо");
   if (!is_stand())
      stand();
   turn_right(n_step);
   break;
case W_STAND_SIT:
   Serial.println("Встаем/Садимся");
   if (n_step)
      stand();
   else
      sit();
   break;
case W_SHAKE:
   Serial.println("Машем рукой");
   hand_shake(n_step);
   break;
case W_WAVE:
   Serial.println("Машем по-другому");
   hand_wave(n_step);
   break;
case W_TEST:
   do_test();
   break;
case W_SYNHRONITHATION:
   setup();
   break;
default:
   Serial.println("Ошибка");
   break;
}

#define W_STAND_SIT 0
#define W_FORWARD 1
#define W_BACKWARD 2
#define W_LEFT 3
#define W_RIGHT 4
#define W_SHAKE 5
#define W_WAVE 6
#define W_SYNHRONITHATION 7
#define W_TEST 8


Описывать, как работают остальные команды в скетче, не вижу особого смысла, так как все они похожи и представляют из себя что-то подобное:


set_site(2, x_default + x_offset, y_start, z_up);
wait_all_reach();
set_site(0, turn_x0 - x_offset, turn_y0, z_default);
set_site(1, turn_x1 - x_offset, turn_y1, z_default);
set_site(2, turn_x0 + x_offset, turn_y0, z_up);
set_site(3, turn_x1 + x_offset, turn_y1, z_default);
wait_all_reach();

То есть сервоприводам просто задается положение, на которое им нужно встать: ждем, пока они все встанут, повторяем команду кучу раз.
На текущий момент робот уверенно держится на ногах, поворачивает и приветливо машет конечностями. В дальнейших планах есть идея обучить его простейшему автопилоту, напечатать корпус и сделать фары, а то - что за автомобиль и без оптики.







Ссылка с видео работы робота на Youtube: https://youtu.be/QUeEM4MX7s4
Также видео прикреплено во вложения.

ran

#1
Воскресенье, марта 05, 2023, 09:01:58 Последнее редактирование: Воскресенье, марта 05, 2023, 09:03:34 от ran
Надо видео. Просто прикрепите файл(ы).

Владимир Бендик

Надо видео. Просто прикрепите файл(ы).
Добрый день, прикрепил видео

ran

Спасибо!
Собачку совсем запугали7

Владимир Бендик

Спасибо!
Собачку совсем запугали7
Это кошка была. Сперва побаивалась его, а сейчас не обращает внимание даже :)

Вверх