Бесшовное управление Arduino манипулятором на платформе с колесами Меканум
В этом уроке я покажу, как я заставил мою платформу-робота на колесах Меканум из предыдущего видео работать вместе и автоматически с моим 3D-печатаемым манипулятором, который также является Arduino-проектом из одного из моих предыдущих видео. Вы можете посмотреть следующее видео или прочитать письменный урок ниже. Так, мы можем управлять роботом на колесах Меканум с помощью самодельного Android-приложения так же, как объяснялось в предыдущем видео. В дополнение к этому, теперь приложение также имеет кнопки для управления манипулятором. Оригинальное приложение для управления манипулятором на самом деле имело ползунки для управления суставами робота, но это вызывало некоторые проблемы со стабильностью манипулятора. В этом варианте манипулятор работает намного лучше, поэтому я предоставлю эту обновленную версию приложения для управления манипулятором и код Arduino для оригинального проекта манипулятора тоже. Тем не менее, самой крутой функцией этого робота является способность запоминать движения и затем автоматически повторять их. Используя кнопку Save (Сохранить), мы можем просто сохранять позиции моторов для каждого шага. Затем нам просто нужно нажать кнопку Run (Запуск), и робот будет автоматически повторять сохраненные движения снова и снова. Хорошо, так что здесь у меня уже собрана платформа на колесах Меканум, и вы можете найти все детали о ней в моем предыдущем видео. Также здесь у меня есть 3D-печатаемые детали манипулятора и сервоприводы, и сейчас я покажу вам, как их собрать. Вот 3D-модель этого проекта. Вы можете найти и скачать эту 3D-модель, а также изучить её в вашем браузере на Thangs. Скачать 3D-модель на Thangs. STL файлы для 3D печати: Первый сервопривод манипулятора будет напрямую закреплен на верхней крышке платформы на колесах Меканум. Я отметил место, и, используя сверло 10 мм, сделал несколько отверстий. Затем, используя наждач, я вырезал через отверстия и затем точно подогнал отверстие для сервопривода. Я закрепил сервопривод к верхней плате с помощью четырех болтов M3 и гаек. Затем на выходной вал этого сервопривода, используя круглую рожку, которая идет в комплекте как аксессуар с сервоприводом, нам нужно закрепить следующую деталь или талию манипулятора. Однако мы можем заметить, что таким образом деталь остается примерно на 8 мм над платой. Поэтому я прикрепил два куска МДФ-плит толщиной 8 мм, так чтобы деталь талии могла скользить по ним, и так сустав будет более стабильным. Круглая рожка закреплена к детали талии с помощью саморезов, идущих в комплекте с сервоприводом, а затем круглая рожка закрепляется к валу сервопривода с помощью соответствующих болтов, которые также идут с сервоприводом. Далее у нас сервопривод плеча. Мы просто ставим его на место и закрепляем к 3D-печатаемой детали с помощью саморезов. Круглая рожка идет на следующую деталь, а затем две детали закрепляются друг к другу с помощью болта на выходном валу сервопривода. Мы должны отметить, что перед закреплением деталей нам нужно убедиться, что деталь имеет полный диапазон движения. Здесь я также добавил резиновую ленту к суставу плеча, чтобы она немного помогала сервоприводу, потому что этот сервопривод несет вес остальной части манипулятора, а также полезную нагрузку. Точно так же я собрал остальную часть манипулятора. Далее нам нужно собрать механизм захвата. Захват управляется сервоприводом SG90, на который сначала мы устанавливаем специально спроектированное зубчатое звено. Мы парируем это звено с другим зубчатым звеном на другой стороне, которое закрепляется с помощью болта M4 и гайки. На самом деле, все остальные звенья соединяются с помощью болтов M4 и гаек. 3D-модель захвата изначально имеет отверстия 3 мм, но у меня не было достаточно болтов M3, поэтому я расширил отверстия с помощью сверла 4 мм и использовал болты M4 вместо этого. После того как я собрал механизм захвата, я закрепил его к последнему сервоприводу, и так манипулятор был завершен. Далее я сделал некоторое кабельное управление. Я прошел провода сервоприводов через специально спроектированные отверстия манипулятора. Используя сверло 10 мм, я сделал отверстие на верхней плате, чтобы провода могли пройти через него. Используя стяжку, я закрепил все провода вместе, и теперь что осталось — это подключить их к плате Arduino. Вот схема этого проекта и то, как все должно быть подключено. Компоненты, необходимые для этого проекта, можно найти по ссылкам ниже: В предыдущем уроке я объяснил, как работает часть робота на колесах Меканум, и также показал, как я сделал для него собственную печатную плату. Я включил стабилизатор напряжения 5В на эту печатную плату, чтобы мы могли сделать этот проект или подключить сервоприводы, потому что они работают на 5В. Стабилизатор напряжения — это LM350, который может выдерживать до 3 ампер тока. Все шесть сервоприводов манипулятора могут потреблять от 2 до 3 ампер тока, что означает, что он может их выдержать, но это заставит стабилизатор очень сильно нагреваться. Поэтому я прикрепил к нему радиатор, а также маленький вентилятор 12В DC, чтобы дуть немного воздуха, потому что сам радиатор не был достаточно для охлаждения стабилизатора. Я подключил сигнальные провода сервоприводов к цифровым выводам Arduino с 5 по 10, а для питания использовал пиновый заголовок 5В на печатной плате. Наконец, я засунул все провода внутрь платформы и закрепил верхнюю плату к ней с помощью двух гаек. И это всё, теперь мы закончили с этим проектом. Что осталось, это взглянуть, как работают код Arduino и Android-приложение. Поскольку код немного длиннее, для лучшего понимания я буду публиковать исходный код программы по секциям с описанием для каждой секции. И в конце этой статьи я опубликую полный исходный код. Итак, сначала нам нужно определить 6 сервоприводов, 4 шаговых двигателя и Bluetooth-соединение, а также определить некоторые переменные, необходимые для программы ниже. В разделе setup мы устанавливаем максимальную скорость шаговых, определяем выводы, к которым подключены сервоприводы, начинаем Bluetooth-соединение и устанавливаем манипулятор в начальную позицию. Затем в разделе loop мы начинаем с проверки, есть ли какие-либо входящие данные. Эти данные приходят от смартфона или Android-приложения, так давайте посмотрим, какие данные оно на самом деле отправляет. Android-приложение создано с помощью онлайн-приложения MIT App Inventor. Оно состоит из простых кнопок, у которых есть соответствующие изображения как фон. Если мы посмотрим на блоки приложения, мы увидим, что все, что оно делает, — это отправляет однобайтовые числа при нажатии кнопок. Так что в зависимости от нажатой кнопки мы говорим Arduino, что делать. Например, если мы получаем число '2', платформа на колесах Меканум будет двигаться вперед, используя пользовательскую функцию moveForward(). Эта пользовательская функция устанавливает все четыре шаговых двигателя на вращение вперед. Для движения в любом другом направлении нам просто нужно вращать колеса в соответствующих направлениях. Для управления манипулятором мы используем тот же метод. Опять же, у нас есть кнопки в приложении, и когда мы удерживаем кнопки, суставы манипулятора двигаются в определенном направлении. Как я упоминал ранее, в оригинальном приложении для управления манипулятором мы использовали ползунки для управления позициями сервоприводов, но это вызывало некоторые проблемы, потому что таким образом нам приходилось отправлять Текст в Arduino вместо 1-байтового числа. Проблема в том, что Arduino иногда пропускает Текст, приходящий из Приложения, и делает ошибку или манипулятор трясется и ведет себя аномально. В этом варианте мы просто отправляем одно 1-байтовое число, когда нажимается определенная кнопка. Код Arduino входит в цикл while этого числа и остается там, пока мы не отпустим кнопку, потому что в этот момент мы отправляем число 0, что означает, что робот должен ничего не делать. Так что в зависимости от нажатых кнопок сервоприводы двигаются либо в положительном, либо в отрицательном направлении. Тот же принцип работы применяется для всех сервоприводов. Для изменения скорости движения мы используем значения, приходящие от ползунка, которые варьируются от 100 до 250. Деля их на 10, мы получаем значения от 10 до 25, которые используются как задержка в микросекундах в циклах while для управления сервоприводами. Для сохранения движений робота мы просто сохраняем текущие позиции сервоприводов и шаговых в массивы каждый раз, когда нажимается кнопка Save. Затем, когда мы нажимаем кнопку Run, мы вызываем пользовательскую функцию runSteps(). Эта пользовательская функция выполняет все сохраненные шаги, используя некоторые циклы for и while. Мы должны отметить, что он начинает с первой позиции и идет до последней позиции, и повторяет это снова и снова. Поэтому, когда мы сохраняем шаги, нам на самом деле нужно позиционировать робота так, чтобы первый шаг имел ту же позицию, что и последний шаг. Во время выполнения шагов мы также можем менять скорость как платформы, так и манипулятора, а также ставить на паузу и сбрасывать все шаги. Здесь вы можете скачать это приложение, а также редактируемый файл проекта: Вот полный код Arduino для этого проекта Arduino робота: Так что это практически всё для этого урока. Проект работает хорошо, но обратите внимание, что он далеко от идеала. Автоматические движения могут быть не такими точными из-за проскальзывания колес Меканум, а также плохой производительности сервоприводов. Эти дешевые сервоприводы также могут трястись или дребезжить даже когда не двигаются, просто потому что у них недостаточно силы, чтобы удержать вес 3D-печатаемых деталей. Надеюсь, вам понравился этот урок, и вы узнали что-то новое. Не стесняйтесь задавать любые вопросы в разделе комментариев ниже и проверяйте мою коллекцию проектов Arduino.Обзор


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














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





Код Arduino
#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)// Check for incoming data if (Bluetooth.available() > 0) { dataIn = Bluetooth.read(); // Read the dataCode language: Arduino (arduino)

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)

// 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)// If arm speed slider is changed if (dataIn > 101 & dataIn < 250) { speedDelay = dataIn / 10; // Change servo speed (delay time) }Code language: Arduino (arduino)// 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)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 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)
Производственный процесс
- Создание интернет-управляемого видеostreaming-робота на Arduino и Raspberry Pi
- Simple Pi Robot — Сборка 2WD автономного ровера на Raspberry Pi
- Робот-ускользатор на сервоприводе: сборка на Arduino и HC-SR04
- Управление Roomba Create 2 через Arduino и Android: пошаговое руководство
- Точное управление сервоприводом через MPU6050 (Arduino, SG90, MG996R)
- Умная робо-рука на Arduino: простое DIY-руководство
- LittleArm 2C: 3D-печатаемый робот-манипулятор на Arduino для STEM-обучения
- DIY манипулятор, управляемый жестами руки: пошаговая сборка на Arduino
- Программируемый набор 3-осевой манипулятора — локальное и удаленное управление через Arduino и Bluetooth
- KUKA KMR iiwa: мобильный коллаборативный манипулятор для Индустрии 4.0