Роботизированная рука на Arduino Uno

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

Внешний вид роботизированной руки на Arduino Uno

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

Необходимые компоненты

Плата Arduino Uno
Конденсатор 1000 мкФ (4 шт.)
Конденсатор 100 нФ (4 шт.)
Сервомотор SG 90 (4 шт.)
Потенциометр (переменный резистор) 10 кОм (4 шт.)
Источник питания с напряжением 5 В (предпочтительно 2 шт.)

Что такое сервомоторы (серводвигатели)

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

Типы серводвигателей

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

Внешний вид серводвигателей

Серводвигатель справа представляет собой так называемый стандартный серводвигатель. Это наиболее распространенный тип серводвигателя. Такие серводвигатели достаточно часто имеют одинаковые размеры и монтажные расстояния между отверстиями. Намного меньший (и более легкий) серводвигатель слева предназначен для летательных аппаратов. Эти серводвигатели называются сервоприводами 9g .

Сервоприводы с более высоким качеством исполнения и более высоким крутящим моментом имеют редуктор с шестернями из металла, а не из нейлона. Большинство серводвигателей работают на номинальном напряжении питания около 5 В при допустимом диапазоне питающих напряжений от 4 до 7 В. Подключение любительских сервоприводов обычно осуществляется через провода, заканчивающиеся 3-контактным разъемом: питание +, питание — и управляющий сигнал.

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

Устройство сервопривода

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

Устрйство серводвигателя

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

Управление серводвигателем

Управляющий сигнал на серводвигатель — это не напряжение, как можно было бы ожидать, а сигнал широтно-импульсной модуляции (ШИМ). Этот сигнал является стандартным для всех любительских сервомашинок и выглядит так, как показано на следующем рисунке.

Импульсы для управления серводвигателем

Серводвигатель ожидает прихода импульса управления каждые 20 мс. Импульс длительностью 1,5 мс установит серводвигатель в центральное положение, соответствующее повороту выходного вала на 90°. Более короткие импульсы в 1,0 мс установят выходной вал в начальное положение — 0°, а импульсы в 2,0 мс — крайнее положение — 180°. В реальности этот диапазон может быть немного меньше, чем полные 180°, без укорочения импульсов на одном конце и удлинения на другом. Не редкость и ситуация, когда для 0° нужен импульс 0,5 мс, а для 180° — 2,5 мс.

Назначение контактов сервомотора

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

Назначение контактов сервомотора

1. Red (красный) = Положительное напряжение питания (от 4.8V до 6V)
2. Brown (коричневый) = Ground (земля)
3. Orange (оранжевый) = Control Signal – управляющий сигнал (PWM Pin – контакт ШИМ)

Для более лучшего понимания этого проекта можете прочитать статью про подключение сервомотора к плате Arduino.

Конструкция роботизированной руки

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

Сервомотор, который будет выполнять роль базы для нашей руки

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

Возьмите несколько кусков картона и вырежьте из них куски 3х11 см. Убедитесь в том, что эти куски картона на стали мягкими. Вырежьте прямоугольное отверстие на одном из концов этого куска картона (оставьте 0,8 см от низа) достаточное для того чтобы поместить в него наш третий сервомотор. Закрепите в нем третий сервомотор с помощью трения или клея (смотря насколько плотно входит сервомотор в это отверстие).

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

После этого приклейте 4-й (заключительный сервомотор) на край второго куска картона как показано на следующем рисунке.

Соедините эти два куска картона с приклеенными сервомоторами как показано на следующем рисунке.

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

Теперь у нас почти все сделано. Теперь нам просто нужно сделать крюк, которым мы будем захватывать и подбирать объект подобно руке робота. Для сооружения такого крюка вырежьте еще куска картона с размерами 1cmx7cm & 4cmx5cm. Склейте их вместе как показано на рисунке и приклейте на ее край последнюю вращающуюся часть сервомотора.

Поместите эти 2 склеенные куска на нашу основную конструкцию как показано на следующем рисунке и мы получим нашу роботизированную руку.

Внешний вид механической части нашей роботизированной руки

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

Внешний вид электронной части нашей роботизированной руки

Работа схемы

Схема устройства представлена на следующем рисунке.

Схема роботизированной руки на Arduino UnoНапряжение на выходах переменных резисторов не будет полностью линейным – оно будет зашумлено. Для фильтрации этого шума параллельно переменным резисторам подключены конденсаторы как показано на приведенной схеме.

Теперь нам нужно подать напряжение с выходов этих переменных резисторов на вход каналов АЦП (аналогово-цифрового преобразования) платы Arduino. Мы будем использовать четыре канала АЦП платы Arduino – с A0 по A3. После осуществления АЦП мы получим четыре числовых значения, представляющих собой углы поворота осей наших сервомоторов.

Плата Arduino имеет шесть каналов АЦП, мы для нашей роботизированной руки использовали 4 таких канала.

Для осуществления функций АЦП мы должны в программе сделать следующие вещи:

1. analogRead(pin);

2. analogReference();


3. analogReadResolution(bits);

Все каналы АЦП платы Arduino Uno имеют опорное напряжение 5В – то есть это максимальное значение входного напряжения, которое способны обрабатывать данные каналы. Поскольку, к примеру, некоторые датчики обеспечивают на своем выходе диапазон напряжений 0-2.5В, то использование опорного напряжения 5В в данном случае приведет к уменьшению точности измерений. Поэтому в подобных случаях для изменения опорного напряжения целесообразно использовать функцию “analogReference();”. Мы в рассматриваемом случае оставим значение опорного напряжения без изменений.

По умолчанию разрешающая способность каналов АЦП платы Arduino Uno составляет 10 бит. Однако в некоторых случаях (например, для увеличения скорости преобразования) можно уменьшить эту разрешающую способность с помощью команды “analogReadResolution(bits);”. Мы в нашем примере не будем изменять разрешающую способность каналов АЦП.

Если все необходимые настройки канала АЦП сделаны (или оставлены по умолчанию), то для чтения значения с выхода АЦП можно воспользоваться функцией “analogRead(pin);”, где pin обозначает контакт платы Arduino, который мы будем использовать для аналого-цифрового преобразования, в нашем случае это будет контакт “A0”. Для того чтобы сразу сохранить значение с выхода АЦП в переменной целого типа можно использовать команду вида ”int SENSORVALUE = analogRead(A0);”, в результате этой команды значение с выхода АЦП будет сохранено в переменной “SENSORVALUE”.

Управлять сервомотором с помощью платы Arduino достаточно просто если в программе мы подключим специальную библиотеку для работы с сервомоторами — Servo.h. С использованием данной библиотеки мы можем в программе просто указывать нужный нам угол поворота оси сервомотора, а функции данной библиотеки будут автоматически на основе этого угла рассчитывать необходимые параметры ШИМ сигнала для поворота оси сервомотора на нужный угол.

#include <Servo.h>
servo servo0;
servo0.attach(3);
servo0.write(degrees);

Первая строка в приведенном коде подключает нужную нам библиотеку для работы с сервомоторами. Во второй строке мы даем имя нашему сервомотору (servo0), которое в дальнейшем мы будем использовать для управления им. В третьей строке мы сообщаем плате Arduino к какому ее контакту подключен сигнальный контакт сервомотора (в нашем примере это PIN3). А в четвертой строке мы даем команду повернуть ось сервомотора на необходимый угол – параметр degrees. Если мы укажем в этой функции значение 30, то ось сервомотора повернется на 30 градусов.

То есть мы имеем позицию оси сервомотора от 0 до 180 градусов и значения с выходов АЦП от 0 до 1023. Мы будем использовать специальную функцию которая будет ставить в соответствие один параметр другому автоматически.

sensorvalue0 = map(sensorvalue0, 0, 1023, 0, 180);

Эта команда отображает (переводит, конвертирует) одно значение в другое автоматически и результат сохраняет в переменной целого типа ‘sensorvalue0’.

Исходный код программы

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

Далее приведен полный текст программы.

#include <Servo.h>
Servo servo0;
Servo servo1;
Servo servo2;
Servo servo3;
int sensorvalue0;
int sensorvalue1;
int sensorvalue2;
int sensorvalue3;
void setup()
{
pinMode(A0,INPUT);
pinMode(3,OUTPUT);
servo0.attach(3);
pinMode(A1,INPUT);
pinMode(5,OUTPUT);
servo1.attach(5);
pinMode(A2,INPUT);
pinMode(6,OUTPUT);
servo2.attach(6);
pinMode(A3,INPUT);
pinMode(9,OUTPUT);
servo3.attach(9);
}
void loop()
{
sensorvalue0 = analogRead(A0);
sensorvalue0 = map(sensorvalue0, 0, 1023, 0, 180);
servo0.write(sensorvalue0);
sensorvalue1 = analogRead(A1);
sensorvalue1 = map(sensorvalue1, 0, 1023, 0, 180);
servo1.write(sensorvalue1);
sensorvalue2 = analogRead(A2);
sensorvalue2 = map(sensorvalue2, 0, 1023, 0, 180);
servo2.write(sensorvalue2);
sensorvalue3 = analogRead(A3);
sensorvalue3 = map(sensorvalue3, 0, 1023, 0, 180);
servo3.write(sensorvalue3);
}

Видео, демонстрирующее работу схемы

(Проголосуй первым!)
Загрузка...
24 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *