Инструкция по сборке робота-манипулятора meArm

Робот-манипулятор meArm

Робот meArm

meArm — это трёх-осевой робот манипулятор с эффектором типа схват (он же — клешня). Проект meArm создан в идеологии OpenHardware, так что его чертежи находятся в свободном доступе (ссылка в конце инструкции).

Робот meArm был разработан специально для образовательных целей. Механизм легко собирается руками юных инженеров, а использование Arduino Uno позволяет оживить его, не углубляясь в дебри теории управления роботами манипуляторами.

Узлы робота приводятся в движение распространенными сервомоторами SG90 или их аналогами. В качестве контроллера используется отладочная плата Arduino Uno R3 или аналог. Ручное управление осуществляется при помощи специального модуля расширения с двумя джойстиками.

Примечание

Как правило, встречается две версии робота из разных материалов: фанера или оргстекло. Робот из фанеры стоит чуть дешевле, чем из оргстекла. Фанера выглядит оригинально, но материал склонен к деформации (хотя для meArm это не критично). Также, для сборки робота из фанеры почти каждый узел необходимо фиксировать самоконтрящейся гайкой.

Предупреждение

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

Набор для сборки робота-манипулятора meArm можно приобрести в каталоге AlashEd.

Состав набора

  • отладочная плата Arduino Uno с USB кабелем;

  • плата расширения для подключения сервоприводов, с двумя джойстиками;

  • 4 сервомотора с комплектом крепежа;

  • набор деталей конструкции;

  • набор крепежа (винты M3*6, винты М3*12, гайки, латунные стойки).

Состав набора meArm

Конструкция

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

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

Эффектор представляет собой схват, которым можно фиксировать предметы и переносить их. Конструкция схвата и его люфты не позволяют ему удерживать предмет сдавливанием, но можно использовать схват для подхватывания чего-нибудь Т-образной формы.

Манипулятор meArm. Схема

Сборка механики

Перед началом сборки необходимо установить сервомоторы в центральное положение. Это можно сделать тремя способами.

Настройка вручную

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

Предупреждение

Большой минус этого способа — высокая вероятность сломать редуктор сервомотора!

Настройка с помощью тестера

Тестер сервомотора — это такой прибор для проверки работоспособности. Подойдёт 1-канальный тестер серводвигателей из каталога AlashEd.

У тестера есть три режима которые меняются по нажатию кнопки:

  • Manual — устанавливает положение вала соответственно положению ручки;

  • Neutral — поворачивает вал в среднюю (нейтральную) позицию;

  • Auto — полностью поворачивает вал сервомотора сначала в одну сторону, а потом в другую.

Выбираем режим Neutral и подключаем тестер к сервомотору. Вал мотора автоматически поворачивается в центральное положение. После этого отключаем мотор и ставим его на место.

Настройка с помощью Arduino Uno

Здесь нам потребуется написать простую программу, которая будет выполнять всего одно действие при запуске — устанавливать положение вала сервомотора в центральное положение:

#include <Servo.h>

Servo myservo;

void setup() {
    myservo.attach(11);
    myservo.write(90);
}

void loop() {
}

Загружаем программу на Arduino. Подключаем сервомотор к контакту D11 на модуле джойстиков (см. главу «Сборка электроники»). После подачи питания на Arduino, мотор повернется в центральное положение. Отключаем мотор и ставим его на место.

Сборка основания

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

Детали основания

Устанавливаем сервомотор на опору.

Сервомотор на опоре

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

Предупреждение

Слишком сильно гайки не следует закручивать, иначе детали могут лопнуть.

Планка крепления

Устанавливаем латунные стойки, с нижней стороны вкручиваем винты М3*6.

Латунные стойки

Сверху ставим опору с сервомотором и закручиваем винты.

Основание собрано

Левая половина корпуса

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

Крепёж сервомотора

Вставляем пластиковое плечо в фанерную деталь ТЛ1 системы тяг.

Установка плеча в ТЛ1

Через отверстие в фанерной детали видны отверстия в пластиковом плече. Саморез нужно вкрутить в одно из этих отверстий.

Вкручивание самореза

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

Соединение ТЛ1 и ТЛ2

Теперь берем детали боковой панели, изображенные на фото: сервомотор с планкой крепления, левая панель корпуса КЛ, два винта и две гайки.

Детали боковой панели

Ставим сервомотор на боковую панель по знакомой нам схеме.

Сервомотор на боковой панели

Важно

Убедимся, что сервомотор установлен так, что его шестерня находится ближе к правому краю детали.

Положение шестерни

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

Левая половина манипулятора собрана

Левая половина манипулятора собрана.

Правая половина корпуса

Подготавливаем необходимые элементы: сервомотор с планкой крепления, правая панель корпуса КП (самая большая деталь), тяга правая ТП1 и правая же часть первого плеча — П1П.

Детали правой половины

Устанавливаем элемент тяги ТП1. Не забываем, что затягивать «на смерть» не нужно.

Установка ТП1

Устанавливаем сервомотор. С обратной стороны это должно выглядеть так.

Сервомотор с обратной стороны

Закрепляем плечо сервомотора на детали П1П.

Плечо сервомотора на П1П

Важно

Насаживаем деталь на шестерню двигателя так, чтобы деталь встала строго вертикально, под 90 градусов к детали ТЛ1.

Центральная часть корпуса

В нижнюю панель корпуса КН устанавливаем плечо сервомотора.

Плечо сервомотора в КН

Далее, нам нужно будет соединить левую и правую половину корпуса с помощью ребер жесткости КЖ. А в центре корпуса установим переборку КР, к которой будет крепиться левая часть первого плеча П1Л.

Ребра жесткости и переборка Детали корпуса

Собираем из указанных деталей корпус манипулятора.

Сборка корпуса

Поворачиваем получающуюся коробочку на бок и вставляем снизу панель КН.

Установка КН снизу

Должно получиться так:

Корпус собран

Аналогичным образом устанавливаем правую панель корпуса КП. Стягиваем половинки и центральную переборку с помощью гаек которые располагаются в углублениях в стенках и винтов которые вставляются через боковые стороны манипулятора.

Корпус полностью собран

Сборка плечей

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

Сборка первого плеча

Собираем второе плечо робота и соединяем его с первым. При этом используем детали: левая часть второго плеча П2Л (самая длинная деталь), шарнирный узел тяг второго плеча ШУ (треугольник), правая часть второго плеча П2П и вторая правая тяга ТП2.

Манипулятор meArm. Механика

Сборка схвата

В одну из рамок механизма схвата, в два крайних отверстия вставляем два винта М3*12. Надеваем на них «клешни» и затягиваем гайки.

Совет

Туго затягивать не нужно, клешни должны свободно вращаться.

Рамка схвата с клешнями

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

Установка штанги

Берем вторую рамку схвата, сервомотор и детали через которые схват будет закреплен на манипуляторе.

Вторая рамка и сервомотор

Собираем как на фото ниже:

Сборка схвата

Вид с другой стороны.

Схват с другой стороны

Соединяем обе рамки винтами, закрепляем плечо на сервомоторе.

Соединение рамок

Вид снизу.

Схват вид снизу

Вид сверху.

Схват вид сверху

Можно проверить работу клешни тестером.

Проверка тестером — открыто Проверка тестером — закрыто

Остается только установить схват на манипулятор и сборка механической части завершена!

Манипулятор meArm в сборе

Сборка электроники

Для управления сервомоторами робота используется контроллер Arduino Uno R3. Ручное управление осуществляется при помощи специального модуля расширения с двумя джойстиками.

Манипулятор meArm. Электроника

Закрепляем Arduino Uno на платформе при помощи трех стоек и шести винтов.

Arduino Uno на платформе

Сверху вставляем модуль расширения с джойстиками.

Важно

Внимательно следим за тем, чтобы штыревые контакты модуля чётко вошли в соответствующие гнезда контроллера Arduino Uno.

Модуль расширения с джойстиками

Наконец, подключаем кабели сервомоторов к разъёмам на модуле расширения. Группа контактов D6, D7, D9, D10, D11 напрямую подключена к соответствующим контактам Arduino Uno.

Подключение кабелей сервомоторов

Подключим кабели по такой схеме:

  • основание/ось 1 — D11;

  • ось 2 — D10;

  • ось 3 — D9;

  • схват — D5.

Переходим к программе.

Программа

Для управления сервомоторами робота используем стандартную библиотеку Servo. Движение сервомоторов на заданный угол осуществляется при помощи функции write. Для управления сервомоторов, необходимо подать на него ШИМ сигнал управления с помощью функции attach. А функция detach отключит сервомотор.

Совет

Ознакомиться с основами работы с сервомоторами в среде Arduino IDE можно в уроках по управлению сервоприводом из каталога AlashEd.

Вращение сервомоторов

Напишем программу, которая сначала повернёт моторы в исходное положение — угол 90 градусов. Затем последовательно повращает все четыре мотора. В конце — отключит моторы.

#include "Servo.h"

// основание, первый узел, второй узел, захват
byte servoPins[4] = {11,10,9,5};
Servo srv[4];

void setup() {
    for(byte i=0; i<4; i++){
        srv[i].attach(servoPins[i]);
    }

    // сброс сервомоторов в центральное положение
    for(byte i=0; i<4; i++){
        srv[i].write(90);
    }

    delay(3000);

    // вращение в стороны
    for(byte i=0; i<4; i++){
        srv[i].write(80); // движение против часовой на 10 градусов
       delay(1000);
        srv[i].write(100); // движение по часовой на 10 градусов
        delay(1000);
        srv[i].write(90); // возвращение в исходное
        delay(1000);
    }

    delay(3000);

    // отключение сервомоторов
    for(byte i=0; i<4; i++){
        srv[i].detach();
    }
}

void loop() {
}

Движение по программе

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

#include <Servo.h>

Servo js[4];

// основание, первый узел, второй узел, захват
int jpins[4] = {11,10,9,5};

// начальные углы
int angles[4] = {90,90,90,90};

// скорость
int sp = 10;

void movej( int jn, int a, int t ){
  int d, cnt, ca;
  int i = 0;
  ca = angles[jn];
  d = ca - a;
  cnt = abs(d);
  while( i<cnt ){
    js[jn].write(ca);
    if( d<0 )
      ca++;
    else
      ca--;
    i++;
    delay(t);
  }
  angles[jn] = ca;
}

void setup() {
  for(int i=0; i<4; i++)
    js[i].attach(jpins[i]);

  for(int i=0; i<4; i++){
    js[i].write(angles[i]);
    delay(500);
  }
}

void loop() {
  movej( 0, 130, sp ); // влево
  movej( 3, 90, sp ); // открыть клешню
  movej( 1, 20, sp ); // вперед
  movej( 2, 150, sp ); // вниз
  movej( 3, 130, sp ); // закрыть клешню

  movej( 2, 90, sp ); // вверх
  movej( 1, 110, sp ); // назад

  movej( 0, 30, sp ); // вправо

  movej( 1, 20, sp ); // вперед
  movej( 2, 150, sp ); // вних
  movej( 3, 90, sp ); // открыть клешню
  movej( 3, 130, sp ); // закрыть клешню

  movej( 2, 90, sp ); // вверх
  movej( 1, 110, sp ); // назад
}

Загружаем программу на Arduino и подаём питание.

Управление джойстиками

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

#include <Servo.h>

#define MAX_J 768
#define MIN_J 256

uint8_t pos[4] = {90,90,90,90}; // начальные углы сервомоторов
// контакты джойстиков по порядку:
// левый вертикальный, левый горизонтальный
// правый горизонтальный, правый вертикальный
uint16_t pot_pins[4] = {A0,A1,A2,A3};  // lv, lh, rh, rv

uint8_t sn = 255;
int8_t sd = 0;
uint32_t st_next = 0;
uint16_t st_to = 10;
// таймаут отключения моторов
uint32_t idle_next = 0;
uint16_t idle_to = 500;

uint8_t servo_pins[4] = {11,10,9,5}; // контакты сервомоторов
uint8_t servo_inv[4] = {-1,-1,-1,1}; // инверсия управления
// предельные углы поворота
uint8_t servo_minmax[4][2] = {{45,135},{45,135},{45,135},{70,135}};

Servo arm[4];

void handleIdle(){
    uint32_t t = millis();
    if( idle_next && idle_next < t ){
        idle_next = 0;
        for( uint8_t i=0; i<4; i++ ){
            arm[i].detach();
        }
    }
}

void handleServo(){
    uint32_t t = millis();
    if( sn!=255 ){
        if( st_next && t < st_next )
            return;
        idle_next = t + idle_to;
        st_next = t + st_to;

        pos[sn] += servo_inv[sn]*sd;
        if( pos[sn]<servo_minmax[sn][0] )
            pos[sn] = servo_minmax[sn][0];
        else
        if( pos[sn]>servo_minmax[sn][1] )
            pos[sn] = servo_minmax[sn][1];

        if( !arm[sn].attached() )
            arm[sn].attach(servo_pins[sn]);

        arm[sn].write( pos[sn] );

    } else {
        arm[sn].detach();
        st_next = 0;
    }
}

void setup() {
    //Serial.begin(115200);
    for( uint8_t i=0; i<4; i++ ){
        pinMode(pot_pins[i], INPUT);
    }

    // движение в начальные позиции
    for( uint8_t i=0; i<4; i++ ){
        arm[i].attach(servo_pins[i]);
        arm[i].write(pos[i]);
        delay(1000);
        arm[i].detach();
    }
}

void loop() {
    sn = 255;
    uint16_t v;
    for( uint8_t i=0; i<4; i++ ){
        v = analogRead( pot_pins[i] );
        if (v > MAX_J || v < MIN_J){
            sn = i;
            sd = (v > MAX_J) ? 1 : -1;
        }
    }

    handleServo();
    handleIdle();
}