Введение:
Робот-платформа «Манипулятор» - позволяет собрать манипулятор для захвата и перемещения небольших предметов. В набор входит подробная инструкция по его сборке и наладке, а также пример скетча для управления манипулятором при помощи не входящих в состав набора, одной Arduino UNO, одного Trerma-Power Shield и четырёх Trema-потенциометров.
Видео:
Подключение:
Если Вы собрали детали манипулятора в соответствии с инструкцией, то можно приступить к сборке электронной схемы. Мы предлагаем подключить сервоприводы манипулятора к Arduino UNO через Trerma-Power Shield, а управлять сервоприводами используя Trema-потенциометры.
- Сервоприводы подключаются к выводам D10-D7 на Trerma-Power Shield (можно менять в скетче).
- Trema-потенциометры подключаются к выводам A2-A5 на Trerma-Power Shield (можно менять в скетче).
- Джампер (перемычка) выбора схемы питания на плате Trerma-Power Shield устанавливается в положение «Общ.Vin».
- Источник питания на 7 - 12 В постоянного тока подключается к клеммнику на Trerma-Power Shield.
- Подключать питание к Arduino UNO не нужно, так как на Trerma-Power Shield установлен джампер «Общ.Vin», значит, на вход Vin Arduino UNO подается питание со входа «VinS» Trerma-Power Shield.
Питание:
У Trerma-Power Shield есть возможность выбора схемы питания установкой джампера (перемычки) на его плате в одно из двух положений: «Общ.Vin» или «Общ.5V». Манипулятор будет работать при любой схеме подключения питания:
- Если у Вас имеется источник питания на 7 - 12 В с проводом на конце которого имеется штекер, то его нужно подключить к Arduino UNO и установить джампер в положение «Общ.Vin».
- Если у Вас имеется источник питания на 7 - 12 В с проводом без штекера, то его нужно подключить к коннектору Trerma-Power Shield и установить джампер в положение «Общ.Vin».
- Если у Вас имеется источник питания на 7 - 30 В с проводом без штекера, то его нужно подключить к коннектору Trerma-Power Shield и установить джампер в положение «Общ.5V».
- Если Вы собираетесь манипулировать относительно тяжёлыми грузами, или используете более мощные сервоприводы (не из набора), то снимите джампер и подключите два источника питания (7 - 30 В к Trerma-Power Shield, а 7 - 12 В к Arduino UNO).
В приведённом выше примере подключения, используется вторая схема выбора питания: источник питания на 7 - 9 В подключён к клеммнику Trerma-Power Shield, а джампер (перемычка) установлен в положение «Общ.Vin».
Работа манипулятора:
Алгоритм программы (скетча) прост: поворот ручки Trema-потенциометра приводит в движение сервопривод.
- Поворот ручки первого Trema-потенциометра приведёт к повороту основания.
- Поворот ручки второго Trema-потенциометра приведёт к повороту левого плеча.
- Поворот ручки третьего Trema-потенциометра приведёт к повороту правого плеча.
- Поворот ручки четвёртого Trema-потенциометра приведёт в движение захват.
В коде программы (скетче) предусмотрена защита сервоприводов, которая заключается в том, что диапазон их вращения ограничен интервалом (двумя углами) свободного хода. Минимальный и максимальный угол вращения указываются в качестве двух последних аргументов функции map() для каждого сервопривода. А значение этих углов определяется в процессе калибровки, которую нужно выполнить до начала работы с манипулятором.
Код программы:
Если вы подадите питание, до калибровки, манипулятор может начать двигаться неадекватно! Сначала выполните все шаги калибровки.
#include <Servo.h> // Подключаем библиотеку Servo для работы с сервоприводами Servo servo1; // Объявляем объект servo1 для работы с сервоприводом основания Servo servo2; // Объявляем объект servo2 для работы с сервоприводом левого плеча Servo servo3; // Объявляем объект servo3 для работы с сервоприводом правого плеча Servo servo4; // Объявляем объект servo4 для работы с сервоприводом захвата int valR1, valR2, valR3, valR4; // Объявляем переменные для хранения значений потенциометров // Назначаем выводы: const uint8_t pinR1 = A2; // Определяем константу с № вывода потенциометра управл. основанием const uint8_t pinR2 = A3; // Определяем константу с № вывода потенциометра управл. левым плечом const uint8_t pinR3 = A4; // Определяем константу с № вывода потенциометра управл. правым плечом const uint8_t pinR4 = A5; // Определяем константу с № вывода потенциометра управл. захватом const uint8_t pinS1 = 10; // Определяем константу с № вывода сервопривода основания const uint8_t pinS2 = 9; // Определяем константу с № вывода сервопривода левого плеча const uint8_t pinS3 = 8; // Определяем константу с № вывода сервопривода правого плеча const uint8_t pinS4 = 7; // Определяем константу с № вывода сервопривода захвата void setup(){ // Код функции setup выполняется однократно: Serial.begin(9600); // Инициируем передачу данных в монитор последовательного порта servo1.attach(pinS1); // Назначаем объекту servo1 управление сервоприводом 1 servo2.attach(pinS2); // Назначаем объекту servo2 управление сервоприводом 2 servo3.attach(pinS3); // Назначаем объекту servo3 управление сервоприводом 3 servo4.attach(pinS4); // Назначаем объекту servo4 управление сервоприводом 4 } void loop(){ // Код функции loop выполняется постоянно: valR1=map(analogRead(pinR1), 0, 1024, 10, 170); servo1.write(valR1); // Вращаем основанием Указанные в данной строке углы: 10 и 170 возможно потребуется изменить (откалибровать) valR2=map(analogRead(pinR2), 0, 1024, 80, 170); servo2.write(valR2); // Управляем левым плечом Указанные в данной строке углы: 80 и 170 возможно потребуется изменить (откалибровать) valR3=map(analogRead(pinR3), 0, 1024, 60, 170); servo3.write(valR3); // Управляем правым плечом Указанные в данной строке углы: 60 и 170 возможно потребуется изменить (откалибровать) valR4=map(analogRead(pinR4), 0, 1024, 40, 70); servo4.write(valR4); // Управляем захватом Указанные в данной строке углы: 40 и 70 возможно потребуется изменить (откалибровать) Serial.println((String) "A1 = "+valR1+",\t A2 = "+valR2+", \t A3 = "+valR3+", \t A4 = "+valR4); // Выводим углы в монитор }
Калибровка:
Перед началом работы с манипулятором, его нужно откалибровать!
- Калибровка заключается в указании крайних значений угла поворота для каждого сервопривода, так чтобы детали не мешали их движениям.
- Отсоедините все сервоприводы от Trema-Power Shield, загрузите скетч и подключите питание.
- Откройте монитор последовательного порта.
- В мониторе будут отображаться углы поворота каждого сервопривода (в градусах).
- Подключите первый сервопривод (управляющий вращением основания) к выводу D10.
- Поворот ручки первого Trema-потенциометра (вывод A2) приведёт к повороту первого сервопривода (вывод D10), а в мониторе изменится значение текущего угла этого сервопривода (значение: A1 = ... ). Крайние положения первого сервопривода будут лежать в диапазоне, от 10 до 170 градусов (как написано в первой строке кода loop). Этот диапазон можно изменить, заменив значения последних двух аргументов функции map() в первой строке кода loop, на новые. Например, заменив 170 на 180, Вы увеличите крайнее положение сервопривода в данном направлении. А заменив 10 на 20, Вы уменьшите другое крайнее положение того же сервопривода.
- Если Вы заменили значения, то нужно заново загрузить скетч. Теперь сервопривод будет поворачиваться в новых, заданных Вами, пределах.
- Подключите второй сервопривод (управляющий поворотом левого плеча) к выводу D9.
- Поворот ручки второго Trema-потенциометра (вывод A3) приведёт к повороту второго сервопривода (вывод D9), а в мониторе изменится значение текущего угла этого сервопривода (значение: A2 = ...). Крайние положения второго сервопривода будут лежать в диапазоне, от 80 до 170 градусов (как написано во второй строке кода loop скетча). Этот диапазон изменяется так же как и для первого сервопривода.
- Если Вы заменили значения, то нужно заново загрузить скетч.
- Подключите третий сервопривод (управляющий поворотом правого плеча) к выводу D8. и аналогичным образом осуществите его калибровку.
- Подключите четвертый сервопривод (управляющий захватом) к выводу D7. и аналогичным образом осуществите его калибровку.
Калибровку достаточно выполнить 1 раз, после сборки манипулятора. Внесённые Вами изменения (значения предельных углов) сохранятся в файле скетча.
Обсуждение