Содержание статьи
Содержание

Главная / Проекты с Arduino / Манипулятор с 2-мя степенями свободы из фанеры на Arduino

Манипулятор с 2-мя степенями свободы из фанеры на Arduino

Реализуем идею двухстепенного манипулятора с управлением от Arduino. В манипуляторе использовано два серводвигателя, фанера, болты-гайки. Проект появился после долгого серфинга в интернете, просмотра различных ресурсов и идей, которые люди генерируют и которыми делятся по всему миру.

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

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

Конструкция робота-художника из фанеры

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

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

Жутковатого вида конструкция была вырезана для установки маркера. Опять таки, можно использовать эпоксидный клей для крепежа деталей. Обратите внимание, что держатель для маркера состоит из трех горизонтально установленных полок и делался под размеры конкретного маркера.

Математическая часть проекта

Основной трюк данного робота - преобразование двух движений вращения от приводов в координаты x, y на базовой плоскости. Например, сне необходимо указать: робот, перемещайся в координату 0.5 по x и 1.3 по y. Мне необходима управляющая программа, в которой это выражение преобразуется в вид: 30 градусов на серве A, 72 градуса на серве B. Проблема в том, что рассчитать координаты x, y в зависимости от углов и длин звеньев просто, а вот обратную задачу решить сложнее. То есть , узнать углы, на которые необходимо совершить поворот при заданных координатах x, y сложнее, а именно это нам необходимо для полноценной системы управления.

Расчет необходимых углов поворота в зависимости от заданных координат называется "обратной задачей кинематики". Необходимые математические расчеты приведены на рисунке ниже.

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

Электроника

Для управления используется Arduino.

Серводвигатели имеют три кабеля для подключения: желтый: ШИМ-сигнал; Черный - земля; красный - питание 5 вольт. Теоретически вы можете питать обе сервы от Arduino, так как усилия, неоьходимые для перемещения небольшие. Встроенные в Arduini IDE библиотеки обеспечивают конвертирование ШИМ-сигнала в команды углов поворота приводов, так что проблем вообще никаких нет.

Необходимые поянения для программы для Arduino

Шапка программы - набор констант, которые характеризуют робот. Некоторые пояснения к ним:

MYBASE_PIN - серва установлена на основании, номер шим-пина;

MYFLOAT_PIN - серва установлена на конце подвижного звена, номер шим-пина;

BASE_INIANG=0 - начальный угол сервы в основании;

FLOATINIANG=90 - начальный угол сервы на конце подвижного звена;

CloseEnough=0.010 - робот будет перемещаться, пока рабочий орган не подойдет достаточно близко;

StepSize - расстояние, на которое будет перемещаться робот за один шаг;

rbc=1.0 - расстояние от точки b (подвижная серва) до точки c (звено возле нашего раьочего органа - маркера;

rb=0.9739 - расстояние от точки a (серва на основании) до точки b;

rcd=0.114 - расстояние от точки c до маркера (точка c);

x_1, y_1 - начальное положение маркера (x, y);

n_jacIters - количество итераций, за которое можно выйти к заданным углам;

BASE_LOWLIM - наименьший угол поворота сервы на основании;

BASE_HIGHLIM - максимальный угол поворота сервы;

BASE_0DEGOFFSET=70 - 0 градусов в системе координат стола соответствует 70 градусам поворота сервы

VERBOSE - отображение средних значений для дебагинга (0 - не отображается; 1 - отображается)

setup() - инициализация некоторых переменных;

loop() - главный цикл;

getCoord() - считывает данные от пользователя;

charToFloat(…) - преобразование данных от пользователя в тип данных float;

Cmnd_A_and_B(…) - управление сервами;

initialize_A_and_B - инициализация серводвигателей при запуске;

refresh_A_and_B() - обновление положения серводвигателей, когда они не двигаются;

Type1ToStart() - ожидает от пользователя  нажатия 1 для начала работы.

Ссылка на исходник программы в текстовом формате

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