Инструкция по сборке робота-манипулятора meArm
Робот meArm
meArm — это трёх-осевой робот манипулятор с эффектором типа схват (он же — клешня). Проект meArm создан в идеологии OpenHardware, так что его чертежи находятся в свободном доступе (ссылка в конце инструкции).
Робот meArm был разработан специально для образовательных целей. Механизм легко собирается руками юных инженеров, а использование Arduino Uno позволяет оживить его, не углубляясь в дебри теории управления роботами манипуляторами.
Узлы робота приводятся в движение распространенными сервомоторами SG90 или их аналогами. В качестве контроллера используется отладочная плата Arduino Uno R3 или аналог. Ручное управление осуществляется при помощи специального модуля расширения с двумя джойстиками.
Примечание
Как правило, встречается две версии робота из разных материалов: фанера или оргстекло. Робот из фанеры стоит чуть дешевле, чем из оргстекла. Фанера выглядит оригинально, но материал склонен к деформации (хотя для meArm это не критично). Также, для сборки робота из фанеры почти каждый узел необходимо фиксировать самоконтрящейся гайкой.
Предупреждение
Оргстекло имеет более технологичный внешний вид, но с ним надо быть осторожным при сборке — материал хрупкий. Деталь может сломаться даже во время вкручивания винтов.
Набор для сборки робота-манипулятора meArm можно приобрести в каталоге AlashEd.
Состав набора
отладочная плата Arduino Uno с USB кабелем;
плата расширения для подключения сервоприводов, с двумя джойстиками;
4 сервомотора с комплектом крепежа;
набор деталей конструкции;
набор крепежа (винты M3*6, винты М3*12, гайки, латунные стойки).
Конструкция
На основании робота установлен сервомотор первой оси, которая служит для вращения робота влево и вправо. Ось 2 наклоняет первое плечо. Ось 3 — наклоняет второе плечо через систему рычагов.
Узел крепления эффектора связан с манипулятором так, что при его движении плечей он всегда остается параллельным основанию.
Эффектор представляет собой схват, которым можно фиксировать предметы и переносить их. Конструкция схвата и его люфты не позволяют ему удерживать предмет сдавливанием, но можно использовать схват для подхватывания чего-нибудь Т-образной формы.
Сборка механики
Перед началом сборки необходимо установить сервомоторы в центральное положение. Это можно сделать тремя способами.
Настройка вручную
Для такой настройки нужно надеть на шестерню сервомотора пластиковое плечо. Повернуть до упора в одну сторону, затем в другую. Понять, где ориентировочно находится центр и повернуть в это положение.
Предупреждение
Большой минус этого способа — высокая вероятность сломать редуктор сервомотора!
Настройка с помощью тестера
Тестер сервомотора — это такой прибор для проверки работоспособности. Подойдёт 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 системы тяг.
Через отверстие в фанерной детали видны отверстия в пластиковом плече. Саморез нужно вкрутить в одно из этих отверстий.
Берем из набора следующую деталь тяги — ТЛ2 и соединяем их вместе при помощи винта и самоконтрящейся гайки. После затягивания гайки, детали должны свободно вращаться относительно друг друга.
Теперь берем детали боковой панели, изображенные на фото: сервомотор с планкой крепления, левая панель корпуса КЛ, два винта и две гайки.
Ставим сервомотор на боковую панель по знакомой нам схеме.
Важно
Убедимся, что сервомотор установлен так, что его шестерня находится ближе к правому краю детали.
Насаживаем конструкцию из двух тяг так, чтобы деталь ТЛ1 оказалась параллельной основанию робота.
Левая половина манипулятора собрана.
Правая половина корпуса
Подготавливаем необходимые элементы: сервомотор с планкой крепления, правая панель корпуса КП (самая большая деталь), тяга правая ТП1 и правая же часть первого плеча — П1П.
Устанавливаем элемент тяги ТП1. Не забываем, что затягивать «на смерть» не нужно.
Устанавливаем сервомотор. С обратной стороны это должно выглядеть так.
Закрепляем плечо сервомотора на детали П1П.
Важно
Насаживаем деталь на шестерню двигателя так, чтобы деталь встала строго вертикально, под 90 градусов к детали ТЛ1.
Центральная часть корпуса
В нижнюю панель корпуса КН устанавливаем плечо сервомотора.
Далее, нам нужно будет соединить левую и правую половину корпуса с помощью ребер жесткости КЖ. А в центре корпуса установим переборку КР, к которой будет крепиться левая часть первого плеча П1Л.
Собираем из указанных деталей корпус манипулятора.
Поворачиваем получающуюся коробочку на бок и вставляем снизу панель КН.
Должно получиться так:
Аналогичным образом устанавливаем правую панель корпуса КП. Стягиваем половинки и центральную переборку с помощью гаек которые располагаются в углублениях в стенках и винтов которые вставляются через боковые стороны манипулятора.
Сборка плечей
Поворачиваем элементы первого плеча так, чтобы они оказались параллельными друг другу, затем соединяем их ребром жесткости. Фиксируем на винты также, как и половинки манипулятора.
Собираем второе плечо робота и соединяем его с первым. При этом используем детали: левая часть второго плеча П2Л (самая длинная деталь), шарнирный узел тяг второго плеча ШУ (треугольник), правая часть второго плеча П2П и вторая правая тяга ТП2.
Сборка схвата
В одну из рамок механизма схвата, в два крайних отверстия вставляем два винта М3*12. Надеваем на них «клешни» и затягиваем гайки.
Совет
Туго затягивать не нужно, клешни должны свободно вращаться.
В одной из клешней есть отверстие. Вставляем в него винт, устанавливаем шайбу и штангу. Затягиваем гайку. Затем, устанавливаем плечо сервомотора.
Берем вторую рамку схвата, сервомотор и детали через которые схват будет закреплен на манипуляторе.
Собираем как на фото ниже:
Вид с другой стороны.
Соединяем обе рамки винтами, закрепляем плечо на сервомоторе.
Вид снизу.
Вид сверху.
Можно проверить работу клешни тестером.
Остается только установить схват на манипулятор и сборка механической части завершена!
Сборка электроники
Для управления сервомоторами робота используется контроллер Arduino Uno R3. Ручное управление осуществляется при помощи специального модуля расширения с двумя джойстиками.
Закрепляем 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();
}