В этой статье я покажу вам, как я построил 3D-станок для гибки проволоки на базе Arduino. На самом деле это типичная мехатронная система, поскольку она включает в себя механическую, электрическую и компьютерную инженерию. Поэтому я считаю, что этот проект был интересен многим студентам-инженерам или всем, кто плохо знаком с мехатроникой.
Вот принцип работы этого 3D станка для гибки проволоки. Итак, сначала проволока проходит через ряд роликов или выпрямителей. С помощью шагового двигателя проволока точно подается к механизму гибки проволоки, который также использует шаговый двигатель, а также небольшой сервопривод для процесса гибки.
Есть еще один шаговый двигатель, называемый осью Z, который фактически позволяет машине создавать трехмерные формы. Конечно, мозг машины — это плата Arduino, которая вместе с другими электронными компонентами прикреплена к специально разработанной печатной плате.
Что касается программы, я сделал несколько пользовательских функций для создания различных форм, таких как звезда, куб и простая подставка, а также ручной режим, в котором мы можем создавать проволочные формы, вводя команды через последовательный монитор.
DIY 3D гибочный станок проволоки 3D Модель
Как обычно, я начал с создания проекта с помощью программы для 3D-моделирования. Вы можете скачать и 3D модель ниже.
Для изготовления некоторых деталей, таких как шестерни, опорные блоки подшипников и некоторые соединители валов, я использовал лазерную резку. Файлы DXF этих деталей, которые используются для лазерной резки можно загрузить из файлов выше.
Изготовление машины для гибки проволоки
Принципиальная электрическая схема
Вот принципиальная схема этого проекта.
Таким образом, три шаговых двигателя управляются с помощью трех шаговых драйверов DRV8825. Для питания шаговых двигателей и всего проекта мы будем использовать блок питания 12 В с током не менее 3 А.
Для питания сервопривода мы могли бы использовать 5 В, поступающие от Arduino, но сервопривод MG996R может потреблять много энергии, и регулятор напряжения 5 В на Arduino может не справиться с этим. Поэтому я решил использовать отдельный стабилизатор напряжения 5 В, LM7805, который достаточно хорош для питания сервопривода в этом проекте. Также имеется концевой выключатель для гибочного станка с подтягивающим резистором, подключенным к цифровому выводу на плате Arduino.
Вы можете получить компоненты, необходимые для этого проекта, по ссылкам ниже:
- Stepper Motor – NEMA 17……… Amazon / Banggood
- Stepper Motor – NEMA 23 …….. Amazon / Banggood
- DRV8825 Stepper Driver…….…. Amazon / Banggood
- Micro Limit Switch ………..……… Amazon / Banggood
- 12V 2A Adapter…………………..…. Amazon / Banggood
- Power Jack…………….………….…… Amazon / Banggood
- Arduino Board ……………………… Amazon / Banggood
Дизайн печатной платы
Затем, чтобы избавиться от беспорядка с проводкой и упорядочить компоненты электроники, я разработал специальную печатную плату, используя бесплатное онлайн-программное обеспечение EasyEDA для проектирования схем. Схема имеет много соединений, поэтому я использовал как верхний, так и нижний слои, чтобы организовать их. Я также добавил контакты для выбора разрешения шаговых двигателей, добавил еще одно подключение концевого выключателя и предоставил дополнительные цифровые и аналоговые контакты, поступающие от Arduino на случай, если они нам для чего-то понадобятся.
Вот ссылка на файлы проекта этой конструкции печатной платы. Итак, закончив этот дизайн, я создал файл Gerber, необходимый для изготовления печатной платы.
Файл Gerber:
Заказ печатную плату.
Через несколько дней пришли печатные платы. Качество печатных плат отличное, все точно так же, как и в проекте
Итак, теперь мы можем двигаться дальше и устанавливать электронные компоненты на печатную плату. Я начал с припайки контактов к печатной плате. Это упрощает подключение и отключение компонентов при необходимости. Что касается более мелких компонентов, таких как конденсаторы, резисторы, регулятор напряжения и клеммные колодки, я припаял их непосредственно на печатную плату.
Завершив этот шаг, мы можем вставить драйверы шагового двигателя и Arduino на место. Затем нам нужно подключить вилку питания и выключатель питания к клеммным колодкам, подключить кабели к шаговым двигателям с одной стороны и подключить их к печатной плате с другой стороны. Сервопривод подключается к цифровому выводу № 2 и получает питание 5 В от регулятора напряжения LM7805. Наконец, мы можем выбрать шаговое разрешение, подключив контакты разрешения под драйверами.
Я решил использовать разрешение 16-го шага, поэтому нам нужно подключить правильные контакты вместо средних, как показано на фотографии выше. Итак, электронные компоненты готовы, и мы можем перейти к программированию станка для гибки проволоки.
Код Arduino для проекта 3D-гибочной машины
Поскольку код немного длиннее, для лучшего понимания я выложу исходный код программы в разделах с описанием каждого раздела. А в конце статьи я выложу полный исходный код.
Для управления шаговыми двигателями я буду использовать библиотеку AccelStepper Майка МакКоли. Поэтому нам нужно включить эту библиотеку, а также библиотеку сервомотора для управления серводвигателем. Затем нам нужно определить контакты, к которым подключены степперы, и некоторые переменные, необходимые для программы ниже.
#include <AccelStepper.h> #include <Servo.h> #define limitSwitch 11 // Define the stepper motors and the pins the will use AccelStepper feederStepper(1, 5, 6); // (Type:driver, STEP, DIR) AccelStepper zAxisStepper(1, 7, 8); AccelStepper benderStepper(1, 9, 10); Servo servo01; String dataIn = ""; String manualStatus = ""; int count = 0; int dist;
В разделе настройки мы устанавливаем начальное положение сервопривода или гибочного штифта, а также устанавливаем начальное положение шестерни гибочного станка. Делается это с помощью концевого выключателя. Шаговый двигатель поворачивается к переключателю, и после его нажатия двигатель начинает отсчет шагов от нуля и позиционируется до нуля градусов, готовый к изгибу.
void setup() { Serial.begin(9600); pinMode(limitSwitch, INPUT_PULLUP); servo01.attach(2); servo01.write(40); // Initial position, bending pin up // Stepper motors max speed feederStepper.setMaxSpeed(2000); zAxisStepper.setMaxSpeed(2000); benderStepper.setMaxSpeed(2000); // Homing while (digitalRead(limitSwitch) != 0) { benderStepper.setSpeed(1200); benderStepper.runSpeed(); benderStepper.setCurrentPosition(0); // When limit switch pressed set position to 0 steps } delay(40); // Move 1400 steps from the limit switch to starting position while (benderStepper.currentPosition() != -1400) { benderStepper.setSpeed(-1200); // if negative rotates anti-clockwise benderStepper.run(); } benderStepper.setCurrentPosition(0); }
Теперь в разделе цикла мы ждем команд, поступающих от последовательного монитора. Если мы введем manual, мы войдем в ручной режим гибки или, если мы введем, например, звездочку, будет выполнена пользовательская функция start (), и машина автоматически создаст для нас форму звезды.
void loop() { String mode = Serial.readString(); if (mode.startsWith("manual")) { manual(); } if (mode.startsWith("star")) { star(); } if (mode.startsWith("cube")) { cube(); } if (mode.startsWith("stand")) { stand(); } }
Давайте посмотрим на эту пользовательскую функцию.
void star() { while (count != 5) { int feed = 38; // mm int feedDistance = feed * 48; // 48- constats that map the mm value to number of steps the stepper show move while (feederStepper.currentPosition() != feedDistance) { // run until it reaches the distance value feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); // reset the current position to 0 servo01.write(40); // Set the bender pin up delay(200); int angleConst = 18; // angle constant // Bend the wire 52 degrees while (benderStepper.currentPosition() != -52 * angleConst) { benderStepper.setSpeed(-700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); // Go back 52 degrees to initial position while (benderStepper.currentPosition() != 52 * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); // Feed the same distance again while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); delay(100); servo01.write(130); // Set the bender pin down delay(200); // Set bender to new initial position, for bending in the other direction while (benderStepper.currentPosition() != -42 * angleConst) { benderStepper.setSpeed(-1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(200); servo01.write(40); // Bender pin up delay(200); while (benderStepper.currentPosition() != 105 * angleConst) { benderStepper.setSpeed(700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(50); while (benderStepper.currentPosition() != -63 * angleConst) { benderStepper.setSpeed(-1200); benderStepper.run(); } delay(100); servo01.write(130); benderStepper.setCurrentPosition(0); count++; } }
Итак, здесь мы вводим цикл while, который выполняется 5 раз, потому что, очевидно, у звезды 5 очков. Мы начинаем с установки значения подачи, то есть того, сколько проволоки будет подано в миллиметрах. Затем это значение умножается на 48, что переводит значение подачи в соответствующие шаги для движения шагового двигателя. Затем с помощью функции run () мы вращаем двигатель питателя со скоростью, установленной функцией setSpeed (). Мы останавливаемся, когда достигается указанное выше значение feedDistance, и сразу после этого мы устанавливаем текущее значение положения нуля шагового двигателя.
int feed = 38; // mm int feedDistance = feed * 48; // 48- constats that map the mm value to number of steps the stepper show move while (feederStepper.currentPosition() != feedDistance) { // run until it reaches the distance value feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); // reset the current position to 0
На следующем этапе сгибаем проволоку на 52 градуса. Это делается аналогично тому, как описано выше. Здесь у нас также есть постоянная угла, которая умножается на желаемый угол. Как только это значение достигается двигателем, двигатель останавливается, сбрасывает свое текущее положение на 0, а затем выполняет такое же количество шагов в обратном направлении, что фактически возвращает двигатель в его исходное положение.
// Bend the wire 52 degrees while (benderStepper.currentPosition() != -52 * angleConst) { benderStepper.setSpeed(-700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); // Go back 52 degrees to initial position while (benderStepper.currentPosition() != 52 * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100);
Затем мы снова подаем проволоку той же длины и устанавливаем штифт так, чтобы гибочный станок мог переместиться в новое исходное положение, которое используется для изгиба в другом направлении. Затем штифт гибочного станка поднимается, и мы сгибаем проволоку на 105 градусов в противоположном направлении. Команды повторяются 5 раз, и так мы получаем звездную форму.
Таким же образом, как описано выше, мы создаем форму куба или любую другую форму, которую можем придумать. Что касается ручного режима, принцип работы команд такой же, за исключением того, что у нас есть еще несколько строк для чтения команд, поступающих от последовательного монитора. Например, для подачи проволоки нам нужно ввести «f» плюс расстояние в миллиметрах, для сгибания проволоки нам нужно ввести «b», плюс угол в градусах, а для поворота оси Z нам понадобится набрать «z» плюс угол в градусах.
if (dataIn.startsWith("f")) { dataInS = dataIn.substring(1, dataIn.length()); // reads the feed value dist = dataInS.toInt(); Serial.print("Feed "); Serial.print(dist); Serial.println("mm wire."); dist = dist * 48; while (feederStepper.currentPosition() != dist) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); delay(100); }
Вот как работает созданная мной программа, но, конечно, есть много других способов ее кодирования. Вот полный код Arduino для этой 3D-гибочной машины:
/* Arduino 3D Wire Bending Machine by Dejan Nedelkovski www.HowToMechatronics.com Library - AccelStepper by Mike McCauley: http://www.airspayce.com/mikem/arduino/AccelStepper/index.html */ #include <AccelStepper.h> #include <Servo.h> #define limitSwitch 11 // Define the stepper motors and the pins the will use AccelStepper feederStepper(1, 5, 6); // (Type:driver, STEP, DIR) AccelStepper zAxisStepper(1, 7, 8); AccelStepper benderStepper(1, 9, 10); Servo servo01; String dataIn = ""; String manualStatus = ""; int count = 0; int dist; void setup() { Serial.begin(9600); pinMode(limitSwitch, INPUT_PULLUP); servo01.attach(2); servo01.write(40); // Initial position, bending pin up // Stepper motors max speed feederStepper.setMaxSpeed(2000); zAxisStepper.setMaxSpeed(2000); benderStepper.setMaxSpeed(2000); // Homing while (digitalRead(limitSwitch) != 0) { benderStepper.setSpeed(1200); benderStepper.runSpeed(); benderStepper.setCurrentPosition(0); // When limit switch pressed set position to 0 steps } delay(40); // Move 1400 steps from the limit switch to starting position while (benderStepper.currentPosition() != -1400) { benderStepper.setSpeed(-1200); // if negative rotates anti-clockwise benderStepper.run(); } benderStepper.setCurrentPosition(0); } void loop() { String mode = Serial.readString(); if (mode.startsWith("manual")) { manual(); } if (mode.startsWith("star")) { star(); } if (mode.startsWith("cube")) { cube(); } if (mode.startsWith("stand")) { stand(); } } void star() { while (count != 5) { int feed = 38; // mm int feedDistance = feed * 48; // 48- constats that map the mm value to number of steps the stepper show move while (feederStepper.currentPosition() != feedDistance) { // run until it reaches the distance value feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); // reset the current position to 0 servo01.write(40); // Set the bender pin up delay(200); int angleConst = 18; // angle constant // Bend the wire 52 degrees while (benderStepper.currentPosition() != -52 * angleConst) { benderStepper.setSpeed(-700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); // Go back 52 degrees to initial position while (benderStepper.currentPosition() != 52 * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); // Feed the same distance again while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); delay(100); servo01.write(130); // Set the bender pin down delay(200); // Set bender to new initial position, for bending in the other direction while (benderStepper.currentPosition() != -42 * angleConst) { benderStepper.setSpeed(-1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(200); servo01.write(40); // Bender pin up delay(200); while (benderStepper.currentPosition() != 105 * angleConst) { benderStepper.setSpeed(700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(50); while (benderStepper.currentPosition() != -63 * angleConst) { benderStepper.setSpeed(-1200); benderStepper.run(); } delay(100); servo01.write(130); benderStepper.setCurrentPosition(0); count++; } } void cube() { int feed = 40; // mm int feedDistance = feed * 48; int angleConst = 16; // Step 1 while (count != 3) { while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != -90 * angleConst) { benderStepper.setSpeed(-700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != 90 * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); count++; } count = 0; // Step 2 while (zAxisStepper.currentPosition() != 88 * angleConst) { zAxisStepper.setSpeed(500); zAxisStepper.run(); } zAxisStepper.setCurrentPosition(0); delay(100); //Step 3 while (count != 2) { while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != -90 * angleConst) { benderStepper.setSpeed(-700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != 90 * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); count++; } count = 0; // Step 4 while (zAxisStepper.currentPosition() != 85 * angleConst) { zAxisStepper.setSpeed(500); zAxisStepper.run(); } zAxisStepper.setCurrentPosition(0); delay(100); // Step 5 servo01.write(130); delay(200); while (benderStepper.currentPosition() != -42 * angleConst) { benderStepper.setSpeed(-1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); while (count != 3) { delay(100); servo01.write(40); delay(200); // Step 6 while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != 90 * angleConst) { benderStepper.setSpeed(700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != -90 * angleConst) { benderStepper.setSpeed(-1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); count++; } count = 0; } void stand() { int feed = 20; // mm int feedDistance = feed * 48; int angleConst = 16; // Step 1 while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != -90 * angleConst) { benderStepper.setSpeed(-700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != 90 * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); // Step 2 while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != -70 * angleConst) { benderStepper.setSpeed(-700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != 70 * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); // Step 3 feed = 80; // mm feedDistance = feed * 48; while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); delay(100); // Step 4 servo01.write(130); delay(200); while (benderStepper.currentPosition() != -42 * angleConst) { benderStepper.setSpeed(-1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); servo01.write(40); delay(200); while (benderStepper.currentPosition() != 108 * angleConst) { benderStepper.setSpeed(700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != -66 * angleConst) { benderStepper.setSpeed(-1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); //Step 5 servo01.write(130); delay(200); // Step 6 feed = 80; // mm feedDistance = feed * 48; while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); servo01.write(40); delay(200); // Step 7 while (zAxisStepper.currentPosition() != -90 * angleConst) { zAxisStepper.setSpeed(-500); zAxisStepper.run(); } zAxisStepper.setCurrentPosition(0); delay(100); // Step 8 while (benderStepper.currentPosition() != -90 * angleConst) { benderStepper.setSpeed(-700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != 90 * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); // Step 6 feed = 45; // mm feedDistance = feed * 48; while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); // Step 10 while (benderStepper.currentPosition() != -90 * angleConst) { benderStepper.setSpeed(-700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != 48 * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); // Step 11 while (zAxisStepper.currentPosition() != 90 * angleConst) { zAxisStepper.setSpeed(500); zAxisStepper.run(); } zAxisStepper.setCurrentPosition(0); delay(100); feed = 80; // mm feedDistance = feed * 48; while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); // Step 12 while (benderStepper.currentPosition() != 110 * angleConst) { benderStepper.setSpeed(700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != -68 * angleConst) { benderStepper.setSpeed(-1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); //Step 13 servo01.write(130); delay(200); feed = 80; // mm feedDistance = feed * 48; while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); servo01.write(40); delay(200); // Step 14 while (benderStepper.currentPosition() != -70 * angleConst) { benderStepper.setSpeed(-700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != 70 * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); //Step 15 feed = 25; // mm feedDistance = feed * 48; while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); delay(100); // Step 16 while (benderStepper.currentPosition() != -90 * angleConst) { benderStepper.setSpeed(-700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != 90 * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); // Step 17 while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); } void manual() { int sign; String dataInS; int angle; int angleConst; Serial.println(" // MANUAL MODE //"); while (!dataIn.startsWith("end")) { servo01.write(130); delay(200); dataIn = Serial.readString(); if (dataIn.startsWith("f")) { dataInS = dataIn.substring(1, dataIn.length()); // reads the feed value dist = dataInS.toInt(); Serial.print("Feed "); Serial.print(dist); Serial.println("mm wire."); dist = dist * 48; while (feederStepper.currentPosition() != dist) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); delay(100); } if (dataIn.startsWith("b")) { if (dataIn.charAt(1) == '-') { dataInS = dataIn.substring(2, dataIn.length()); ///reads the angle value angle = dataInS.toInt(); Serial.print("Bend -"); Serial.print(angle); Serial.println(" degrees."); angleConst = 16; // Set "negative" bending initial position while (benderStepper.currentPosition() != -43 * angleConst) { benderStepper.setSpeed(-1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); servo01.write(40); delay(200); // Bend the wire while (benderStepper.currentPosition() != angle * angleConst) { benderStepper.setSpeed(700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != (-1) * angle * angleConst) { benderStepper.setSpeed(-1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); servo01.write(130); delay(200); // Get back to original "positive" bending initial poistion while (benderStepper.currentPosition() != 43 * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); } else { dataInS = dataIn.substring(1, dataIn.length()); angle = dataInS.toInt(); Serial.print("Bend "); Serial.print(angle); Serial.println(" degrees."); angleConst = 16; servo01.write(40); delay(200); while (benderStepper.currentPosition() != (-1) *angle * angleConst) { benderStepper.setSpeed(-700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != angle * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); } dataInS = dataIn.substring(2, dataIn.length()); angle = dataInS.toInt(); angleConst = 16; while (benderStepper.currentPosition() != sign * angle * angleConst) { benderStepper.setSpeed(-700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != sign * angle * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); } // Z-Axis Control if (dataIn.startsWith("z")) { if (dataIn.charAt(1) == '-') { dataInS = dataIn.substring(2, dataIn.length()); angle = dataInS.toInt(); Serial.print("Move Z-Axis -"); Serial.print(angle); Serial.println(" degrees."); angleConst = 16; while (zAxisStepper.currentPosition() != angle * angleConst) { zAxisStepper.setSpeed(500); zAxisStepper.run(); } zAxisStepper.setCurrentPosition(0); delay(100); } else { dataInS = dataIn.substring(1, dataIn.length()); angle = dataInS.toInt(); Serial.print("Move Z-Axis "); Serial.print(angle); Serial.println(" degrees."); angleConst = 16; while (zAxisStepper.currentPosition() != (-1) *angle * angleConst) { zAxisStepper.setSpeed(-500); zAxisStepper.run(); } zAxisStepper.setCurrentPosition(0); delay(100); } } manualStatus = dataIn; } }