Всем привет!
Нашел у себя в публикациях упоминание про одного робота, которого мы делали с ребятами года 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.
Его питание 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. Скорей всего что-то забыл при написании, сильно не пинайте. Пишите в комменты, если что не понятно.