Управление роботом-рукой через Web-интерфейс

Демонстрация

Интерфейс пользователя

Робот-рука содержит в себе 6 моторов-сервоприводов:

  • Зона A: Управление моторами 2, 3, 4 (3 шарнирных соединения руки)
  • Зона B: Управление мотором 1 (поворотная основа)
  • Зона C: Управление мотором 5 (управление поворотом захвата)
  • Зона D: Управление мотором 6 (Управление захватом)

Архитектурное решение

Структура программы

Сторона клиента (Web-интерфейс, написанный на JavaScript)

Когда пользователь воздействует на экран: прикасается пальцами или двигает мышью, мы можем получить координату точки прикосновения (x, y). При этом структура программы выглядит следующим образом:

В случае расположения курсора или пальца на экране в зоне А, необходимо рассчитать углы поворота для двигателей 2, 3, 4. При этом нужно выполнить геометрический расчет. Вернемся к этому чуть позже.

Сторона сервера (код Arduino):

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

  • Мотор поворачивается на небольшой угол.
  • Делается пауза и снова поворот на небольшой угол.

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

Здесь step_num — число шагов двигателя, которые необходимо сделать до поворота на заданный угол. step и time — предопределенные значения, которые определяют плавность и скорость перемещения.

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

Структура программы при этом может выглядеть следующим образом:

Геометрические вычисления

Ранее мы указывали о необходимости производить геометрические вычисления. Рассмотрим следующую задачу:

Известно следующее:

  • Точка С фиксирована;
  • Известно положение точки D — вводит пользователь;
  • Известно расстояние CB, BA, AD (обозначим соответственно b, a, d);
  • Обозначим углы между сегментами руки-робота C, B, A;
  • Предположим что углы B и A равны;
  • Добавим дополнительные точки с сегмент.

Вычисление:

  • Мы знаем точки C и D => мы можем вычислить длину отрезка DC (обозначим ее буквой c);
  • Мы также можем вычислить угол δ;
  • Рассмотрим треугольник ABE, можно сказать, что он равнобедренный и AE = BE, ∠E = π — 2α;
  • Таким образом, получаем:

  • По теореме косинусов для треугольника имеем:

  • Подставив выражения (1) и (2) в (3), мы получаем:

  • Упростив выражение, получаем:

  • Поскольку мы знаем значения a, b, c и d, решаем квадратичное уравнение относительно α и β = π — α. Таким образом мы нашли β. Теперь найдем γ. По закону косинусов в треугольниках BDC и BDA:

  • Решив систему уравнений, можем вычислить γ;
  • Таким образом, вычисленные углы (δ + γ), β и β и являются нашими искомыми углами. Это углы для двигателей 2, 3 и 4 соответственно.

Код прошивки

Код прошивки включает два файла:

  • RobotArmWeb.ino: код Arduino
  • remote_arm.php: код веб-приложения, который загружается в плату PHPoC WiFi Shield или PHPoC Shield.

Вам также необходимо загрузить файл изображения flywheel.png в PHPoC Shield

flywheel.png

RobotArmWeb.ino

remote_arm.php


Схемное решение

Для работы устройства необходимо обеспечить все 6 двигателей внешним питанием:

Подписка
Уведомлять, если есть
guest

1 Комментарий
oldest
newest
Inline Feedbacks
View all comments
карик
карик
1 год назад

очень крутой проект