Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Бесшовное управление Arduino манипулятором на платформе с колесами Меканум

В этом уроке я покажу, как я заставил мою платформу-робота на колесах Меканум из предыдущего видео работать вместе и автоматически с моим 3D-печатаемым манипулятором, который также является Arduino-проектом из одного из моих предыдущих видео.

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

Обзор

Так, мы можем управлять роботом на колесах Меканум с помощью самодельного Android-приложения так же, как объяснялось в предыдущем видео. В дополнение к этому, теперь приложение также имеет кнопки для управления манипулятором.

Бесшовное управление Arduino манипулятором на платформе с колесами Меканум

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

Тем не менее, самой крутой функцией этого робота является способность запоминать движения и затем автоматически повторять их.

Бесшовное управление Arduino манипулятором на платформе с колесами Меканум

Используя кнопку Save (Сохранить), мы можем просто сохранять позиции моторов для каждого шага. Затем нам просто нужно нажать кнопку Run (Запуск), и робот будет автоматически повторять сохраненные движения снова и снова.

Сборка Arduino робота

Хорошо, так что здесь у меня уже собрана платформа на колесах Меканум, и вы можете найти все детали о ней в моем предыдущем видео.

Бесшовное управление Arduino манипулятором на платформе с колесами Меканум

Также здесь у меня есть 3D-печатаемые детали манипулятора и сервоприводы, и сейчас я покажу вам, как их собрать. Вот 3D-модель этого проекта.

Бесшовное управление Arduino манипулятором на платформе с колесами Меканум

Вы можете найти и скачать эту 3D-модель, а также изучить её в вашем браузере на Thangs.

Бесшовное управление Arduino манипулятором на платформе с колесами Меканум

Скачать 3D-модель на Thangs.

STL файлы для 3D печати:

Первый сервопривод манипулятора будет напрямую закреплен на верхней крышке платформы на колесах Меканум.

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

Бесшовное управление Arduino манипулятором на платформе с колесами Меканум

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

Бесшовное управление Arduino манипулятором на платформе с колесами Меканум

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

Бесшовное управление Arduino манипулятором на платформе с колесами Меканум

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

Бесшовное управление Arduino манипулятором на платформе с колесами Меканум

Далее у нас сервопривод плеча. Мы просто ставим его на место и закрепляем к 3D-печатаемой детали с помощью саморезов.

Бесшовное управление Arduino манипулятором на платформе с колесами Меканум

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

Бесшовное управление Arduino манипулятором на платформе с колесами Меканум

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

Бесшовное управление Arduino манипулятором на платформе с колесами Меканум

Точно так же я собрал остальную часть манипулятора.

Бесшовное управление Arduino манипулятором на платформе с колесами Меканум

Далее нам нужно собрать механизм захвата. Захват управляется сервоприводом SG90, на который сначала мы устанавливаем специально спроектированное зубчатое звено. Мы парируем это звено с другим зубчатым звеном на другой стороне, которое закрепляется с помощью болта M4 и гайки. На самом деле, все остальные звенья соединяются с помощью болтов M4 и гаек.

Бесшовное управление Arduino манипулятором на платформе с колесами Меканум

3D-модель захвата изначально имеет отверстия 3 мм, но у меня не было достаточно болтов M3, поэтому я расширил отверстия с помощью сверла 4 мм и использовал болты M4 вместо этого.

После того как я собрал механизм захвата, я закрепил его к последнему сервоприводу, и так манипулятор был завершен.

Бесшовное управление Arduino манипулятором на платформе с колесами Меканум

Далее я сделал некоторое кабельное управление. Я прошел провода сервоприводов через специально спроектированные отверстия манипулятора. Используя сверло 10 мм, я сделал отверстие на верхней плате, чтобы провода могли пройти через него.

Бесшовное управление Arduino манипулятором на платформе с колесами Меканум

Используя стяжку, я закрепил все провода вместе, и теперь что осталось — это подключить их к плате Arduino.

Схема подключения Arduino робота

Вот схема этого проекта и то, как все должно быть подключено.

Бесшовное управление Arduino манипулятором на платформе с колесами Меканум

Компоненты, необходимые для этого проекта, можно найти по ссылкам ниже:

  • Шаговый двигатель – NEMA 17 …………..…
  • Драйвер шагового двигателя DRV8825 ……….…….…
  • Сервопривод MG996R………………….….
  • Микросервопривод SG90 …………….….
  • Bluetooth модуль HC-05 …………….…
  • Li-Po батарея …………………………….……
  • Плата Arduino Mega ………….……….…

В предыдущем уроке я объяснил, как работает часть робота на колесах Меканум, и также показал, как я сделал для него собственную печатную плату.

Бесшовное управление Arduino манипулятором на платформе с колесами Меканум

Я включил стабилизатор напряжения 5В на эту печатную плату, чтобы мы могли сделать этот проект или подключить сервоприводы, потому что они работают на 5В. Стабилизатор напряжения — это LM350, который может выдерживать до 3 ампер тока. Все шесть сервоприводов манипулятора могут потреблять от 2 до 3 ампер тока, что означает, что он может их выдержать, но это заставит стабилизатор очень сильно нагреваться.

Бесшовное управление Arduino манипулятором на платформе с колесами Меканум

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

Я подключил сигнальные провода сервоприводов к цифровым выводам Arduino с 5 по 10, а для питания использовал пиновый заголовок 5В на печатной плате. Наконец, я засунул все провода внутрь платформы и закрепил верхнюю плату к ней с помощью двух гаек.

Бесшовное управление Arduino манипулятором на платформе с колесами Меканум

И это всё, теперь мы закончили с этим проектом.

Бесшовное управление Arduino манипулятором на платформе с колесами Меканум

Код Arduino

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

Итак, сначала нам нужно определить 6 сервоприводов, 4 шаговых двигателя и Bluetooth-соединение, а также определить некоторые переменные, необходимые для программы ниже. В разделе setup мы устанавливаем максимальную скорость шаговых, определяем выводы, к которым подключены сервоприводы, начинаем Bluetooth-соединение и устанавливаем манипулятор в начальную позицию.

#include <SoftwareSerial.h> #include <AccelStepper.h> #include <Servo.h> Servo servo01; Servo servo02; Servo servo03; Servo servo04; Servo servo05; Servo servo06; SoftwareSerial Bluetooth(A8, 38); // Arduino(RX, TX) - HC-05 Bluetooth (TX, RX) // Define the stepper motors and the pins the will use AccelStepper LeftBackWheel(1, 42, 43); // (Type:driver, STEP, DIR) - Stepper1 AccelStepper LeftFrontWheel(1, 40, 41); // Stepper2 AccelStepper RightBackWheel(1, 44, 45); // Stepper3 AccelStepper RightFrontWheel(1, 46, 47); // Stepper4 #define led 14 int wheelSpeed = 1500; int lbw[50], lfw[50], rbw[50], rfw[50]; // arrays for storing positions/steps int servo1Pos, servo2Pos, servo3Pos, servo4Pos, servo5Pos, servo6Pos; // current position int servo1PPos, servo2PPos, servo3PPos, servo4PPos, servo5PPos, servo6PPos; // previous position int servo01SP[50], servo02SP[50], servo03SP[50], servo04SP[50], servo05SP[50], servo06SP[50]; // for storing positions/steps int speedDelay = 20; int index = 0; int dataIn; int m = 0; void setup() { // Set initial seed values for the steppers LeftFrontWheel.setMaxSpeed(3000); LeftBackWheel.setMaxSpeed(3000); RightFrontWheel.setMaxSpeed(3000); RightBackWheel.setMaxSpeed(3000); pinMode(led, OUTPUT); servo01.attach(5); servo02.attach(6); servo03.attach(7); servo04.attach(8); servo05.attach(9); servo06.attach(10); Bluetooth.begin(38400); // Default baud rate of the Bluetooth module Bluetooth.setTimeout(5); delay(20); Serial.begin(38400); // Move robot arm to initial position servo1PPos = 90; servo01.write(servo1PPos); servo2PPos = 100; servo02.write(servo2PPos); servo3PPos = 120; servo03.write(servo3PPos); servo4PPos = 95; servo04.write(servo4PPos); servo5PPos = 60; servo05.write(servo5PPos); servo6PPos = 110; servo06.write(servo6PPos); }Code language: Arduino (arduino)

Затем в разделе loop мы начинаем с проверки, есть ли какие-либо входящие данные.

// Check for incoming data if (Bluetooth.available() > 0) { dataIn = Bluetooth.read(); // Read the dataCode language: Arduino (arduino)

Эти данные приходят от смартфона или Android-приложения, так давайте посмотрим, какие данные оно на самом деле отправляет. Android-приложение создано с помощью онлайн-приложения MIT App Inventor. Оно состоит из простых кнопок, у которых есть соответствующие изображения как фон.

Бесшовное управление Arduino манипулятором на платформе с колесами Меканум

Если мы посмотрим на блоки приложения, мы увидим, что все, что оно делает, — это отправляет однобайтовые числа при нажатии кнопок.

Бесшовное управление Arduino манипулятором на платформе с колесами Меканум

Так что в зависимости от нажатой кнопки мы говорим Arduino, что делать. Например, если мы получаем число '2', платформа на колесах Меканум будет двигаться вперед, используя пользовательскую функцию moveForward().

if (dataIn == 2) { m = 2; } // if (m == 2) { moveForward(); }Code language: Arduino (arduino)

Эта пользовательская функция устанавливает все четыре шаговых двигателя на вращение вперед.

void moveForward() { LeftFrontWheel.setSpeed(wheelSpeed); LeftBackWheel.setSpeed(wheelSpeed); RightFrontWheel.setSpeed(wheelSpeed); RightBackWheel.setSpeed(wheelSpeed); }Code language: Arduino (arduino)

Для движения в любом другом направлении нам просто нужно вращать колеса в соответствующих направлениях.

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

Бесшовное управление Arduino манипулятором на платформе с колесами Меканум

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

В этом варианте мы просто отправляем одно 1-байтовое число, когда нажимается определенная кнопка.

Бесшовное управление Arduino манипулятором на платформе с колесами Меканум

Код Arduino входит в цикл while этого числа и остается там, пока мы не отпустим кнопку, потому что в этот момент мы отправляем число 0, что означает, что робот должен ничего не делать.

// Move servo 1 in positive direction while (m == 16) { if (Bluetooth.available() > 0) { m = Bluetooth.read(); } servo01.write(servo1PPos); servo1PPos++; delay(speedDelay); } // Move servo 1 in negative direction while (m == 17) { if (Bluetooth.available() > 0) { m = Bluetooth.read(); } servo01.write(servo1PPos); servo1PPos--; delay(speedDelay); }Code language: Arduino (arduino)

Так что в зависимости от нажатых кнопок сервоприводы двигаются либо в положительном, либо в отрицательном направлении. Тот же принцип работы применяется для всех сервоприводов. Для изменения скорости движения мы используем значения, приходящие от ползунка, которые варьируются от 100 до 250.

// If arm speed slider is changed if (dataIn > 101 & dataIn < 250) { speedDelay = dataIn / 10; // Change servo speed (delay time) }Code language: Arduino (arduino)

Деля их на 10, мы получаем значения от 10 до 25, которые используются как задержка в микросекундах в циклах while для управления сервоприводами.

Для сохранения движений робота мы просто сохраняем текущие позиции сервоприводов и шаговых в массивы каждый раз, когда нажимается кнопка Save.

// If button "SAVE" is pressed if (m == 12) { //if it's initial save, set the steppers position to 0 if (index == 0) { LeftBackWheel.setCurrentPosition(0); LeftFrontWheel.setCurrentPosition(0); RightBackWheel.setCurrentPosition(0); RightFrontWheel.setCurrentPosition(0); } lbw[index] = LeftBackWheel.currentPosition(); // save position into the array lfw[index] = LeftFrontWheel.currentPosition(); rbw[index] = RightBackWheel.currentPosition(); rfw[index] = RightFrontWheel.currentPosition(); servo01SP[index] = servo1PPos; // save position into the array servo02SP[index] = servo2PPos; servo03SP[index] = servo3PPos; servo04SP[index] = servo4PPos; servo05SP[index] = servo5PPos; servo06SP[index] = servo6PPos; index++; // Increase the array index m = 0; }Code language: Arduino (arduino)

Затем, когда мы нажимаем кнопку Run, мы вызываем пользовательскую функцию runSteps(). Эта пользовательская функция выполняет все сохраненные шаги, используя некоторые циклы for и while.

if (m == 14) { runSteps(); // If button "RESET" is pressed if (dataIn != 14) { stopMoving(); memset(lbw, 0, sizeof(lbw)); // Clear the array data to 0 memset(lfw, 0, sizeof(lfw)); memset(rbw, 0, sizeof(rbw)); memset(rfw, 0, sizeof(rfw)); memset(servo01SP, 0, sizeof(servo01SP)); // Clear the array data to 0 memset(servo02SP, 0, sizeof(servo02SP)); memset(servo03SP, 0, sizeof(servo03SP)); memset(servo04SP, 0, sizeof(servo04SP)); memset(servo05SP, 0, sizeof(servo05SP)); memset(servo06SP, 0, sizeof(servo06SP)); index = 0; // Index to 0 } }Code language: Arduino (arduino)

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

Здесь вы можете скачать это приложение, а также редактируемый файл проекта:

Вот полный код Arduino для этого проекта Arduino робота:

/* Arduino Robot Arm and Mecanum Wheels Robot Smartphone Control via Bluetooth by Dejan, www.HowToMechatronics.com */ #include <SoftwareSerial.h> #include <AccelStepper.h> #include <Servo.h> Servo servo01; Servo servo02; Servo servo03; Servo servo04; Servo servo05; Servo servo06; SoftwareSerial Bluetooth(A8, 38); // Arduino(RX, TX) - HC-05 Bluetooth (TX, RX) // Define the stepper motors and the pins the will use AccelStepper LeftBackWheel(1, 42, 43); // (Type:driver, STEP, DIR) - Stepper1 AccelStepper LeftFrontWheel(1, 40, 41); // Stepper2 AccelStepper RightBackWheel(1, 44, 45); // Stepper3 AccelStepper RightFrontWheel(1, 46, 47); // Stepper4 #define led 14 int wheelSpeed = 1500; int lbw[50], lfw[50], rbw[50], rfw[50]; // arrays for storing positions/steps int servo1Pos, servo2Pos, servo3Pos, servo4Pos, servo5Pos, servo6Pos; // current position int servo1PPos, servo2PPos, servo3PPos, servo4PPos, servo5PPos, servo6PPos; // previous position int servo01SP[50], servo02SP[50], servo03SP[50], servo04SP[50], servo05SP[50], servo06SP[50]; // for storing positions/steps int speedDelay = 20; int index = 0; int dataIn; int m = 0; void setup() { // Set initial seed values for the steppers LeftFrontWheel.setMaxSpeed(3000); LeftBackWheel.setMaxSpeed(3000); RightFrontWheel.setMaxSpeed(3000); RightBackWheel.setMaxSpeed(3000); pinMode(led, OUTPUT); servo01.attach(5); servo02.attach(6); servo03.attach(7); servo04.attach(8); servo05.attach(9); servo06.attach(10); Bluetooth.begin(38400); // Default baud rate of the Bluetooth module Bluetooth.setTimeout(5); delay(20); Serial.begin(38400); // Move robot arm to initial position servo1PPos = 90; servo01.write(servo1PPos); servo2PPos = 100; servo02.write(servo2PPos); servo3PPos = 120; servo03.write(servo3PPos); servo4PPos = 95; servo04.write(servo4PPos); servo5PPos = 60; servo05.write(servo5PPos); servo6PPos = 110; servo06.write(servo6PPos); } void loop() { // Check for incoming data if (Bluetooth.available() > 0) { dataIn = Bluetooth.read(); // Read the data if (dataIn == 0) { m = 0; } if (dataIn == 1) { m = 1; } if (dataIn == 2) { m = 2; } if (dataIn == 3) { m = 3; } if (dataIn == 4) { m = 4; } if (dataIn == 5) { m = 5; } if (dataIn == 6) { m = 6; } if (dataIn == 7) { m = 7; } if (dataIn == 8) { m = 8; } if (dataIn == 9) { m = 9; } if (dataIn == 10) { m = 10; } if (dataIn == 11) { m = 11; } if (dataIn == 12) { m = 12; } if (dataIn == 14) { m = 14; } if (dataIn == 16) { m = 16; } if (dataIn == 17) { m = 17; } if (dataIn == 18) { m = 18; } if (dataIn == 19) { m = 19; } if (dataIn == 20) { m = 20; } if (dataIn == 21) { m = 21; } if (dataIn == 22) { m = 22; } if (dataIn == 23) { m = 23; } if (dataIn == 24) { m = 24; } if (dataIn == 25) { m = 25; } if (dataIn == 26) { m = 26; } if (dataIn == 27) { m = 27; } // Move the Mecanum wheels platform if (m == 4) { moveSidewaysLeft(); } if (m == 5) { moveSidewaysRight(); } if (m == 2) { moveForward(); } if (m == 7) { moveBackward(); } if (m == 3) { moveRightForward(); } if (m == 1) { moveLeftForward(); } if (m == 8) { moveRightBackward(); } if (m == 6) { moveLeftBackward(); } if (m == 9) { rotateLeft(); } if (m == 10) { rotateRight(); } if (m == 0) { stopMoving(); } // Mecanum wheels speed if (dataIn > 30 & dataIn < 100) { wheelSpeed = dataIn * 20; } // Move robot arm // Move servo 1 in positive direction while (m == 16) { if (Bluetooth.available() > 0) { m = Bluetooth.read(); } servo01.write(servo1PPos); servo1PPos++; delay(speedDelay); } // Move servo 1 in negative direction while (m == 17) { if (Bluetooth.available() > 0) { m = Bluetooth.read(); } servo01.write(servo1PPos); servo1PPos--; delay(speedDelay); } // Move servo 2 while (m == 19) { if (Bluetooth.available() > 0) { m = Bluetooth.read(); } servo02.write(servo2PPos); servo2PPos++; delay(speedDelay); } while (m == 18) { if (Bluetooth.available() > 0) { m = Bluetooth.read(); } servo02.write(servo2PPos); servo2PPos--; delay(speedDelay); } // Move servo 3 while (m == 20) { if (Bluetooth.available() > 0) { m = Bluetooth.read(); } servo03.write(servo3PPos); servo3PPos++; delay(speedDelay); } while (m == 21) { if (Bluetooth.available() > 0) { m = Bluetooth.read(); } servo03.write(servo3PPos); servo3PPos--; delay(speedDelay); } // Move servo 4 while (m == 23) { if (Bluetooth.available() > 0) { m = Bluetooth.read(); } servo04.write(servo4PPos); servo4PPos++; delay(speedDelay); } while (m == 22) { if (Bluetooth.available() > 0) { m = Bluetooth.read(); } servo04.write(servo4PPos); servo4PPos--; delay(speedDelay); } // Move servo 5 while (m == 25) { if (Bluetooth.available() > 0) { m = Bluetooth.read(); } servo05.write(servo5PPos); servo5PPos++; delay(speedDelay); } while (m == 24) { if (Bluetooth.available() > 0) { m = Bluetooth.read(); } servo05.write(servo5PPos); servo5PPos--; delay(speedDelay); } // Move servo 6 while (m == 26) { if (Bluetooth.available() > 0) { m = Bluetooth.read(); } servo06.write(servo6PPos); servo6PPos++; delay(speedDelay); } while (m == 27) { if (Bluetooth.available() > 0) { m = Bluetooth.read(); } servo06.write(servo6PPos); servo6PPos--; delay(speedDelay); } // If arm speed slider is changed if (dataIn > 101 & dataIn < 250) { speedDelay = dataIn / 10; // Change servo speed (delay time) } // If button "SAVE" is pressed if (m == 12) { //if it's initial save, set the steppers position to 0 if (index == 0) { LeftBackWheel.setCurrentPosition(0); LeftFrontWheel.setCurrentPosition(0); RightBackWheel.setCurrentPosition(0); RightFrontWheel.setCurrentPosition(0); } lbw[index] = LeftBackWheel.currentPosition(); // save position into the array lfw[index] = LeftFrontWheel.currentPosition(); rbw[index] = RightBackWheel.currentPosition(); rfw[index] = RightFrontWheel.currentPosition(); servo01SP[index] = servo1PPos; // save position into the array servo02SP[index] = servo2PPos; servo03SP[index] = servo3PPos; servo04SP[index] = servo4PPos; servo05SP[index] = servo5PPos; servo06SP[index] = servo6PPos; index++; // Increase the array index m = 0; } // If button "RUN" is pressed if (m == 14) { runSteps(); // If button "RESET" is pressed if (dataIn != 14) { stopMoving(); memset(lbw, 0, sizeof(lbw)); // Clear the array data to 0 memset(lfw, 0, sizeof(lfw)); memset(rbw, 0, sizeof(rbw)); memset(rfw, 0, sizeof(rfw)); memset(servo01SP, 0, sizeof(servo01SP)); // Clear the array data to 0 memset(servo02SP, 0, sizeof(servo02SP)); memset(servo03SP, 0, sizeof(servo03SP)); memset(servo04SP, 0, sizeof(servo04SP)); memset(servo05SP, 0, sizeof(servo05SP)); memset(servo06SP, 0, sizeof(servo06SP)); index = 0; // Index to 0 } } } LeftFrontWheel.runSpeed(); LeftBackWheel.runSpeed(); RightFrontWheel.runSpeed(); RightBackWheel.runSpeed(); // Monitor the battery voltage int sensorValue = analogRead(A0); float voltage = sensorValue * (5.0 / 1023.00) * 3; // Convert the reading values from 5v to suitable 12V i //Serial.println(voltage); // If voltage is below 11V turn on the LED if (voltage < 11) { digitalWrite(led, HIGH); } else { digitalWrite(led, LOW); } } void moveForward() { LeftFrontWheel.setSpeed(wheelSpeed); LeftBackWheel.setSpeed(wheelSpeed); RightFrontWheel.setSpeed(wheelSpeed); RightBackWheel.setSpeed(wheelSpeed); } void moveBackward() { LeftFrontWheel.setSpeed(-wheelSpeed); LeftBackWheel.setSpeed(-wheelSpeed); RightFrontWheel.setSpeed(-wheelSpeed); RightBackWheel.setSpeed(-wheelSpeed); } void moveSidewaysRight() { LeftFrontWheel.setSpeed(wheelSpeed); LeftBackWheel.setSpeed(-wheelSpeed); RightFrontWheel.setSpeed(-wheelSpeed); RightBackWheel.setSpeed(wheelSpeed); } void moveSidewaysLeft() { LeftFrontWheel.setSpeed(-wheelSpeed); LeftBackWheel.setSpeed(wheelSpeed); RightFrontWheel.setSpeed(wheelSpeed); RightBackWheel.setSpeed(-wheelSpeed); } void rotateLeft() { LeftFrontWheel.setSpeed(-wheelSpeed); LeftBackWheel.setSpeed(-wheelSpeed); RightFrontWheel.setSpeed(wheelSpeed); RightBackWheel.setSpeed(wheelSpeed); } void rotateRight() { LeftFrontWheel.setSpeed(wheelSpeed); LeftBackWheel.setSpeed(wheelSpeed); RightFrontWheel.setSpeed(-wheelSpeed); RightBackWheel.setSpeed(-wheelSpeed); } void moveRightForward() { LeftFrontWheel.setSpeed(wheelSpeed); LeftBackWheel.setSpeed(0); RightFrontWheel.setSpeed(0); RightBackWheel.setSpeed(wheelSpeed); } void moveRightBackward() { LeftFrontWheel.setSpeed(0); LeftBackWheel.setSpeed(-wheelSpeed); RightFrontWheel.setSpeed(-wheelSpeed); RightBackWheel.setSpeed(0); } void moveLeftForward() { LeftFrontWheel.setSpeed(0); LeftBackWheel.setSpeed(wheelSpeed); RightFrontWheel.setSpeed(wheelSpeed); RightBackWheel.setSpeed(0); } void moveLeftBackward() { LeftFrontWheel.setSpeed(-wheelSpeed); LeftBackWheel.setSpeed(0); RightFrontWheel.setSpeed(0); RightBackWheel.setSpeed(-wheelSpeed); } void stopMoving() { LeftFrontWheel.setSpeed(0); LeftBackWheel.setSpeed(0); RightFrontWheel.setSpeed(0); RightBackWheel.setSpeed(0); } // Automatic mode custom function - run the saved steps void runSteps() { while (dataIn != 13) { // Run the steps over and over again until "RESET" button is pressed for (int i = 0; i <= index - 2; i++) { // Run through all steps(index) if (Bluetooth.available() > 0) { // Check for incomding data dataIn = Bluetooth.read(); if ( dataIn == 15) { // If button "PAUSE" is pressed while (dataIn != 14) { // Wait until "RUN" is pressed again if (Bluetooth.available() > 0) { dataIn = Bluetooth.read(); if ( dataIn == 13) { break; } } } } // If speed slider is changed if (dataIn > 100 & dataIn < 150) { speedDelay = dataIn / 10; // Change servo speed (delay time) } // Mecanum wheels speed if (dataIn > 30 & dataIn < 100) { wheelSpeed = dataIn * 10; dataIn = 14; } } LeftFrontWheel.moveTo(lfw[i]); LeftFrontWheel.setSpeed(wheelSpeed); LeftBackWheel.moveTo(lbw[i]); LeftBackWheel.setSpeed(wheelSpeed); RightFrontWheel.moveTo(rfw[i]); RightFrontWheel.setSpeed(wheelSpeed); RightBackWheel.moveTo(rbw[i]); RightBackWheel.setSpeed(wheelSpeed); while (LeftBackWheel.currentPosition() != lbw[i] & LeftFrontWheel.currentPosition() != lfw[i] & RightFrontWheel.currentPosition() != rfw[i] & RightBackWheel.currentPosition() != rbw[i]) { LeftFrontWheel.runSpeedToPosition(); LeftBackWheel.runSpeedToPosition(); RightFrontWheel.runSpeedToPosition(); RightBackWheel.runSpeedToPosition(); } // Servo 1 if (servo01SP[i] == servo01SP[i + 1]) { } if (servo01SP[i] > servo01SP[i + 1]) { for ( int j = servo01SP[i]; j >= servo01SP[i + 1]; j--) { servo01.write(j); delay(speedDelay); } } if (servo01SP[i] < servo01SP[i + 1]) { for ( int j = servo01SP[i]; j <= servo01SP[i + 1]; j++) { servo01.write(j); delay(speedDelay); } } // Servo 2 if (servo02SP[i] == servo02SP[i + 1]) { } if (servo02SP[i] > servo02SP[i + 1]) { for ( int j = servo02SP[i]; j >= servo02SP[i + 1]; j--) { servo02.write(j); delay(speedDelay); } } if (servo02SP[i] < servo02SP[i + 1]) { for ( int j = servo02SP[i]; j <= servo02SP[i + 1]; j++) { servo02.write(j); delay(speedDelay); } } // Servo 3 if (servo03SP[i] == servo03SP[i + 1]) { } if (servo03SP[i] > servo03SP[i + 1]) { for ( int j = servo03SP[i]; j >= servo03SP[i + 1]; j--) { servo03.write(j); delay(speedDelay); } } if (servo03SP[i] < servo03SP[i + 1]) { for ( int j = servo03SP[i]; j <= servo03SP[i + 1]; j++) { servo03.write(j); delay(speedDelay); } } // Servo 4 if (servo04SP[i] == servo04SP[i + 1]) { } if (servo04SP[i] > servo04SP[i + 1]) { for ( int j = servo04SP[i]; j >= servo04SP[i + 1]; j--) { servo04.write(j); delay(speedDelay); } } if (servo04SP[i] < servo04SP[i + 1]) { for ( int j = servo04SP[i]; j <= servo04SP[i + 1]; j++) { servo04.write(j); delay(speedDelay); } } // Servo 5 if (servo05SP[i] == servo05SP[i + 1]) { } if (servo05SP[i] > servo05SP[i + 1]) { for ( int j = servo05SP[i]; j >= servo05SP[i + 1]; j--) { servo05.write(j); delay(speedDelay); } } if (servo05SP[i] < servo05SP[i + 1]) { for ( int j = servo05SP[i]; j <= servo05SP[i + 1]; j++) { servo05.write(j); delay(speedDelay); } } // Servo 6 if (servo06SP[i] == servo06SP[i + 1]) { } if (servo06SP[i] > servo06SP[i + 1]) { for ( int j = servo06SP[i]; j >= servo06SP[i + 1]; j--) { servo06.write(j); delay(speedDelay); } } if (servo06SP[i] < servo06SP[i + 1]) { for ( int j = servo06SP[i]; j <= servo06SP[i + 1]; j++) { servo06.write(j); delay(speedDelay); } } } } }Code language: Arduino (arduino)

Так что это практически всё для этого урока. Проект работает хорошо, но обратите внимание, что он далеко от идеала. Автоматические движения могут быть не такими точными из-за проскальзывания колес Меканум, а также плохой производительности сервоприводов. Эти дешевые сервоприводы также могут трястись или дребезжить даже когда не двигаются, просто потому что у них недостаточно силы, чтобы удержать вес 3D-печатаемых деталей.

Надеюсь, вам понравился этот урок, и вы узнали что-то новое. Не стесняйтесь задавать любые вопросы в разделе комментариев ниже и проверяйте мою коллекцию проектов Arduino.


Производственный процесс

  1. Создание интернет-управляемого видеostreaming-робота на Arduino и Raspberry Pi
  2. Simple Pi Robot — Сборка 2WD автономного ровера на Raspberry Pi
  3. Робот-ускользатор на сервоприводе: сборка на Arduino и HC-SR04
  4. Управление Roomba Create 2 через Arduino и Android: пошаговое руководство
  5. Точное управление сервоприводом через MPU6050 (Arduino, SG90, MG996R)
  6. Умная робо-рука на Arduino: простое DIY-руководство
  7. LittleArm 2C: 3D-печатаемый робот-манипулятор на Arduino для STEM-обучения
  8. DIY манипулятор, управляемый жестами руки: пошаговая сборка на Arduino
  9. Программируемый набор 3-осевой манипулятора — локальное и удаленное управление через Arduino и Bluetooth
  10. KUKA KMR iiwa: мобильный коллаборативный манипулятор для Индустрии 4.0