Arduino - робот с манипулятором через Интернет
Компоненты и расходные материалы
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Об этом проекте
Если вы новичок, рекомендую прочитать следующие уроки:
- Arduino - Мотор
- Arduino - сервомотор
- Arduino - Wi-Fi
1. Демонстрация
2. Пользовательский интерфейс
Рука робота имеет 6 двигателей.
- Зона A:управление двигателем 2, 3, 4 (управление тремя суставами рук)
- Зона B:управляющий двигатель 1 (управляющая база)
- Зона C:управляющий двигатель 5 (управление вращением захвата)
- Зона D:управляющий двигатель 6 (управляющий захват)
3. Архитектура системы
4. Рабочий процесс
Клиентская сторона (пользовательский веб-интерфейс - написан на JavaScript + HTML + CSS)
Когда пользователь касается пальцем или движется пальцем (либо щелкает, либо перемещает мышь), мы можем получить координаты (x, y). Рабочий процесс выглядит следующим образом:
В случае зоны A, чтобы рассчитать углы двигателя 2, 3, 4, нам нужно выполнить некоторые геометрические вычисления . . Вы можете сослаться на него в конце этой страницы.
На стороне сервера (Код Arduino) :
После получения набора углов от клиентов шесть двигателей постепенно перемещаются от текущих углов к новым. Шесть двигателей должны двигаться и одновременно достигать новых углов. Прежде чем подробно описывать, как управлять всеми двигателями, давайте посмотрим, как управлять одним двигателем. Предположим, мы хотим переместить двигатель с текущего угла (угла) на новый угол (new_angle). Поскольку скорость двигателя велика, мы должны его замедлить. Для этого повторяются два следующих шага, пока двигатель не достигнет нового угла:
- Двигайте мотор с небольшим шагом.
- Сделайте небольшую паузу, а затем сделайте еще один шаг.
Следующая диаграмма иллюстрирует вышеуказанную схему в случае, если новый угол больше текущего:
Wherestep_numis количество шагов, которые должен сделать двигатель. шаг и время
- предопределенные значения. Два последних определяют скорость и плавность. Вышеуказанное относится только к одному роботу. Чтобы заставить роботов начать движение и одновременно достичь пункта назначения, мы можем сделать следующее:Шесть двигателей занимают одинаковое step_num , но step
каждого двигателя отличается друг от друга. Итак, мы должны выбрать step_num в этом проекте максимум.
Обычно рабочий процесс Arduino выглядит следующим образом:
5. Геометрический расчет
Давайте превратим расчет манипулятора робота в следующую геометрическую задачу:
Известно
- C исправлен
- Известная точка - D - ввод пользователя
- Известная точка - CB, BA, AD (обозначается b, a, d соответственно)
- Длина каждого сегмента руки Найти: углы C, B, A Решение:
- Предположим, что угол B и A одинаковы.
- Добавьте дополнительные точки и сегмент
Расчет
- Мы знали точки C и D => мы можем вычислить длину DC (обозначена c)
- Мы также можем вычислить δ
- Взглянув на треугольник ABE, мы можем сделать вывод, что AE =BE и ∠E =π - 2α.
- Итак:
- Закон косинусов в треугольнике CDE:
- Заменим (1) и (2) на (3), мы получим:
Упростить
- Упростите сказанное выше:
- Поскольку мы знаем a, b, c и d, решаем вышеуказанное квадратное уравнение, мы можем вычислить значение α. - И β =π - α - До сих пор мы нашли β, давайте найдем γ - Закон косинусов в треугольниках BDC и BDA:
- Решив эту систему уравнений, мы можем вычислить γ.
- Итак, их требуемые углы:(δ + γ), β и β. Это углы двигателей 2, 3 и 4 соответственно.
6. Исходный код
Исходный код включает два файла:
- RobotArmWeb.ino :Код Arduino
- Remote_arm.php :Код веб-приложения, который загружается в PHPoC WiFi Shield или PHPoC Shield. (См. Инструкцию в этой статье.)
Вам также необходимо загрузить файл изображения flywheel.png в PHPoC Shield.
Лучший стартовый комплект Arduino для начинающих
Если вы ищете комплект Arduino, см. «Лучший комплект Arduino для начинающих»
Ссылки на функции
- Arduino - серво-библиотека
- Servo.attach ()
- Servo.write ()
- Servo.writeMicroseconds ()
- Servo.read ()
- Servo.attached ()
- Servo.detach ()
- Serial.begin ()
- Serial.println ()
Код
- RobotArmWeb
- remote_arm.php
RobotArmWeb Arduino
Это код Arduino#include#include int angle_init [] ={90, 101, 165, 153, 90, 120}; // когда мотор стоит прямо. В сети угол, когда двигатель стоит прямо, равен {0, 90, 130, 180, 0, 0}; int angle_offset [] ={0, 11, -15, -27, 0, 137}; // смещение между реальным серводвигателем и углом в webint cur_angles [] ={90, 101, 165, 153, 90, 120}; // текущие углы шести двигателей (градусы) int dest_angles [] ={0, 0, 0, 0, 0, 0}; // предполагаемые углы int angle_max [] ={180, 180, 160, 120, 180, 137}; int angle_min [] ={0, 0, 0, 20, 0, 75}; int direction [] ={1, 1 , 1, 1, 1, -1}; int angleSteps [] ={3, 2, 2, 2, 4, 4}; // шаги перемещения каждого двигателя (градусы) Servo servo1; Servo servo2; Servo servo3; Servo servo4; Servo servo5; Servo servo6; Servo servo [6] ={servo1, servo2, servo3, servo4, servo5, servo6}; Сервер PhpocServer (80); клиент PhpocClient; int stepNum =0; void setup () {Serial.begin (9600); Phpoc.begin (PF_LOG_SPI | PF_LOG_NET); server.beginWebSocket ("удаленная_арма"); servo1.attach (2); // подключает сервопривод на выводе 2 к сервообъекту servo2.attach (3); // подключает сервопривод на выводе 3 к сервообъекту servo3.attach (4); // подключает сервопривод на выводе 4 к сервообъекту servo4.attach (5); // подключает сервопривод на выводе 5 к сервообъекту servo5.attach (6); // присоединяет сервопривод на выводе 6 к сервообъекту servo6.attach (7); // подключает сервопривод на выводе 7 к сервообъекту для (int i =0; i <6; i ++) servo [i] .write (angle_init [i]);} void loop () {PhpocClient client =server.available (); если (клиент) {String angleStr =client.readLine (); если (angleStr) {Serial.println (angleStr); int commaPos1 =-1; int commaPos2; для (int i =0; i <5; i ++) {commaPos2 =angleStr.indexOf (',', commaPos1 + 1); int angle =angleStr.substring (commaPos1 + 1, commaPos2) .toInt (); dest_angles [i] =угол * направление [i] + angle_offset [i]; commaPos1 =commaPos2; } int angle5 =angleStr.substring (commaPos1 + 1) .toInt (); dest_angles [5] =angle5 * направление [5] + angle_offset [5]; stepNum =0; // двигать двигатели многими небольшими шагами, чтобы двигатель двигался плавно, избегая внезапного перемещения двигателя. Ниже приводится расчет шага для (int i =0; i <6; i ++) {int dif =abs (cur_angles [i] - dest_angles [i]); int step =dif / angleSteps [я]; если (stepNum 0) {for (int i =0; i <6; i ++) {int angleStepMove =(dest_angles [i] - cur_angles [i]) / stepNum; cur_angles [i] + =angleStepMove; если (cur_angles [i]> angle_max [i]) cur_angles [i] =angle_max [i]; иначе, если (cur_angles [i] remote_arm.php PHP
Этот код представляет собой веб-приложение.Arduino - Arm Robot - Web Arduino - робот с манипулятором через Интернет
WebSocket: null
Схема
Необходимо обеспечить внешний источник питания для 6 двигателей.Производственный процесс
- Простой робот Pi
- Центр управления Arduino
- Использование Интернета вещей для удаленного управления манипулятором
- Робот с сервомотором избегает препятствий
- Робот-последователь линии
- Управление увлажнителем Arduino
- Arduino - отправка температуры в Интернет через последовательный
- Littlearm 2C:создание напечатанной на 3D-принтере руки робота Arduino
- Автономный домашний робот-помощник
- Робот для супер-крутой навигации внутри помещений