Найти тему

Простой робот-паук на Ардуино и сервоприводах SG 90. Вспоминаем школу)

421 прочитал

Всем привет!

Нашел у себя в публикациях упоминание про одного робота, которого мы делали с ребятами года 3 назад. Очень интересная поделка получилась и главное - простая и незатратная. Да все никак руки не доходили рассказать, пофотографировать. Ну-с, время настало!

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

Из этих формул и будет истекать дальнейшая работа робота
Из этих формул и будет истекать дальнейшая работа робота

Чтобы наш робот пошел в определенную сторону, нам нужно лишь менять начальную фазу для одной или нескольких серв. Начальные фазы могут быть: П/2, П, 3П/2, 2П. Или, если удобно, можно через период: T/4, Т/2, 3Т/4, Т. На этапе разбора программы мы увидим как это работает. Я накидал конспектик и в нескольких местах вставлю его, чтобы было понятнее. Ниже я отобразил варианты начальных фаз для сервоприводов. Движение робота будет напрямую от этого зависеть.

Начальные фазы на графике. Главное правильно выбрать отправную точку для движения)
Начальные фазы на графике. Главное правильно выбрать отправную точку для движения)

Что же нам понадобиться для сборки?

В обязательном порядке - сервоприводы SG90 (ну или какие есть)

  • Аккумулятор, батарейка, ну в общем питание данной машины
  • Стабилизатор на 5 В (у меня 7805) к нему нужно пару электролитических конденсаторов
  • Приемник ИК и какой-нибудь ИК пульт от телевизора
  • Макетная плата
  • Проводочки
  • Проволока для изготовления ног (хотя тут фантазия не имеет границ)

Вот такой он - чудо робо-паук был в оригинале.

Паук Ринго в оригинальном исполнении
Паук Ринго в оригинальном исполнении

А вот что получилось у меня.

Такого милого лица как в оригинале у меня конечно нет, но эта штука действительно ковыляет ходит.

Если все же хотите чтобы было один в один как в оригинале то вот ссылка на GitHub. Там есть все исходники проекта и чертежи ног.

Я же при сборке решил применить 3D печать, чтобы проще было скрутить данную поделку воедино, да и не было у меня большой платы Ардуино Уно. В своих проектах использую в основном только Нано.

Самое главное в конструкции этого робота это НОГИ. Точнее правильно их согнуть. Тот шаблон для сгибания ног, что приложен к проекту я с трудом разобрал. Абсолютно непонятно в каком направлении, должно торчать то или иное колено. Но с горем пополам разобрался. Самое главное - это одинаковость ног, чтобы паук ходил более менее прямолинейно.

Второй важный аспект при сборке это приделать ноги к сервоприводам так, чтобы они не отвалились. Термоклей вообще не помогает. После первых же дерганий по полу, ноги отпали сами собой. Решено было приделать их капитально и надолго - а именно припаять к медной пластине, последнюю же прикрутить к сервоприводам шурупом.

Крепление сделал из куска медной фольги. Проволоку припаял к пластине
Крепление сделал из куска медной фольги. Проволоку припаял к пластине

Электрическая часть

Для того чтобы это пошло, это нужно запитать. При этом так чтобы плата не зависала во время резких перемещений сервоприводов. Значит питание логической и силовой части нужно разделить. Я подыскал для питания маленький аккумулятор формата 18350. Хотя можно было бы еще меньше поставить, но тут вопрос, сколько времени нужно на автономную работу? На поиграться, не более. Далее с аккумулятора идет провод на выключатель, а с выключателя на повышайку MT3608, с которой выходит около 7 В. Далее это напряжение поступает на Vin Ардуино и на вход стабилизатора 7805. Последний нужен для запитывания сервоприводов. Ставим конденсаторы на входе и выходе стабилизатора.

Куда подключать управляющие линии сервоприводов решайте сами, тут без разницы. Если не хочется лезть в исходники программы, то подключаем к контактам:

  • левая серва - D2
  • правая серва - D6
  • центральная серва - D4

Для управления сервоприводами будет использоваться стандартная библиотека Servo. Для первоначальной настройки необходимо установить все сервоприводы в ноль (90 градусов). Затем приделать ноги. Если ноги стоят криво, можно программно подкорректировать "ноль", так чтобы робот изначально уверенно стоял на плоскости.

Дистанционное управление реализовано через ИК приемник. А для передачи команд можно использовать любой пульт от бытовой техники с ИК передатчиком. Можно даже настроить управление для нескольких пультов, так как коды хранятся в массиве. Для каждого движения можно сохранить несколько кодов. В качестве приемника я использую 1838B.

Распиновка 1838B
Распиновка 1838B

Его питание 5 В, сигнальный провод подключен к А0. Для управления используется библиотека IRremote.

Чтобы "приручить" свой пульт, необходимо получить коды кнопок. Для этого в исходниках есть скетч с названием ir_receiver. Подключаем ИК приемник, загружаем этот скетч и открываем монитор порта. Начаем тыкать по интересующим нас кнопкам и в мониторе появляются коды этих кнопок. Далее, копируем полученный код и вставляем его в файл с названием ir_command_codes.h. В этом файле хранятся массивы с кодами для определенных движений робота. Выбираем нужное движение и добавляем свой код кнопки. Названия движений по английски, но смысл будет понятен, даже для тех у кого в школе по английскому было "удовл." В крайнем случае - онлайн переводчик в помощь.

Программирование

Давайте вспомним формулу расчета углов сервоприводов. Я написал конспектик от руки, так как это просто быстрее и удобнее.

Приводим формулу в "рабочий" вид
Приводим формулу в "рабочий" вид

А теперь посмотрим как это реализуется в коде программы:

// RU: Получение угла для серводвигателя.
// Параметр amplitude - амплитуда колебаний,
// Параметр phaseMillis - текущая продолжительность колебания,
// Параметр shiftAngle- фаза колебаний.
int getAngle(long amplitude, long phaseMillis, float shiftAngle) {
float alpha = 2 * PI * phaseMillis / stepPeriod + shiftAngle;
float angle = amplitude * sin(alpha);
return (int)angle;
}


Для получения угла сервы создана отдельная функция. Расчет идет в два этапа. На выходе имеем угол с типом данный int.

Далее мы вычисляем угол для каждой из трех сервоприводов, исходя из их начальных углов, которые задаются в начале программы и расчетного угла по синусу. Вот как это происходит:

LeftServo.write(LEFT_SERVO_ZERO_VALUE + getAngle(amplitudeLeftServo, globalPhase, angleShiftLeftServo));

RightServo.write(RIGHT_SERVO_ZERO_VALUE + getAngle(amplitudeRightServo, globalPhase, angleShiftRightServo));

CentralServo.write(CENTRAL_SERVO_ZERO_VALUE + getAngle(CENTRAL_SERVO_AMPLITUDE, globalPhase, angleShiftCentralServo));

Это основа для правильного движения робота. Используя различные начальные фазы, мы сможем заставить ходить паука прямо, назад, с разворотом на месте. А меняя период мы можем ускорять или замедлять его движения.

Чтобы не перегружать статью, про настройку и программирование, напишу в продолжении (а может сниму видео, если получиться), не пропустите.

Скинул все исходники сюда, на Яндекс.Диск. Если, что пишите)

P.S. Скорей всего что-то забыл при написании, сильно не пинайте. Пишите в комменты, если что не понятно.