Статьи

Создайте свой собственный манипулятор — программирование

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

Что вам нужно

Еще раз, вам понадобится дополнительное оборудование для параллельного управления сервоприводами и припой для сборки экрана.

Серво щит

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

серво-Шил-полной

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

серво-щит-деталь

Когда у вас будет готов щит, попробуйте подключить к нему один из сервоприводов. Имейте в виду, что вы должны согласовать выводы PWM, V + и GND с проводами, выходящими из вашего сервопривода.

серво-щит-серво

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

Чтобы использовать этот щит, мы должны иметь возможность обращаться с ним программно. Adafruit выпустил библиотеку, чтобы облегчить это доступно здесь . Я также предлагаю просмотреть библиотеку GitHub repo, а также посмотреть примеры использования.

Исследования и разработки

На данный момент некоторые исследования не требуется. Цель состоит в том, чтобы найти положение края каждого сервопривода или среднее, чтобы вы могли использовать их позже в качестве контрольной точки. Вам нужно опробовать несколько значений, чтобы найти подходящее место для вашей сборки. Исходя из характеристик сервопривода, частота работы этих сервоприводов составляет 50 Гц. Когда дело доходит до сервопривода, спектр, который вам нужно исследовать, находится в диапазоне от 0 до 4096. Значения, к которым вы придете, основаны на том, как вы собрали руку, поэтому они могут отличаться от моего.

На этом этапе вы можете использовать следующий метод, который упрощает управление сервоприводом:

Метод серво записи

01
02
03
04
05
06
07
08
09
10
11
float SERVOFREQ = 50;
float pulseconstant;
 
void setup() {
    pulseconstant = (1000000/SERVOFREQ)/4096;
}
 
void servoWrite(uint8_t n, float pulse) {
    float pulsetick = pulse/pulseconstant;
    pwm.setPWM(n, 0, pulsetick);
}

Ценности, которые работают для меня, следующие:

  • Базовый сервопривод
    • поворачивает руку вправо и влево
    • средняя позиция в 1 440
  • Высота сервопривода
    • изменяет высоту захвата
    • средняя позиция в 1 675
  • Длина сервопривода
    • меняет досягаемость руки
    • средняя позиция в 1 440
  • Сцепление сервопривод
    • открывает и закрывает захват
    • закрытая позиция на 2 115

Движение сервопривода — это просто изменение значения в зависимости от направления, в котором вы хотите переместить сервопривод.

Финальный код

Соединение всех частей приводит к простому эскизу как этот. Вся цель этого эскиза — установить руку в исходное положение.

Эскиз начальной позиции

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <Adafruit_PWMServoDriver.h>
 
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
 
#define BASE 0
#define HEIGHT 1
#define LENGTH 2
#define GRIP 3
 
float base_init = 1440;
float height_init = 1675;
float length_init = 1440;
float grip_init = 2155;
 
float SERVOFREQ = 50;
float pulseconstant;
 
void setup() {
    pulseconstant = (1000000/SERVOFREQ)/4096;
 
    pwm.begin();
    pwm.setPWMFreq(SERVOFREQ);
 
    servoWrite(BASE, base_init);
    servoWrite(HEIGHT, height_init);
    servoWrite(LENGTH, length_init);
    servoWrite(GRIP, grip_init);
}
 
void loop() {
}
 
void servoWrite(uint8_t n, float pulse) {
    float pulsetick = pulse/pulseconstant;
    pwm.setPWM(n, 0, pulsetick);
}

Что дальше?

В этот момент у вас должна быть рука робота в рабочем состоянии. Учитывая ваши навыки программирования, вы можете запрограммировать его на то, что вам нравится. Но этого мало (по крайней мере, для меня). Эта настройка классная и все, но в ней отсутствует элемент интерактивности. Итак, в моем следующем и последнем посте под названием «Создайте свою собственную руку робота — дистанционное управление» я рассмотрю варианты интерактивного управления рукой. Есть несколько вариантов, таких как настольное приложение или мобильное приложение, но, поскольку у меня есть PlayStation 4, я решил использовать свой беспроводной контроллер PS4 для управления рукой. И да, это очень весело 🙂

Фотографии, использованные в этом посте, были взяты с adafruit.com . Не стесняйтесь проверить их.