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

3D-гибочный станок для проволоки Arduino

<основной класс="главный сайт" id="главный">

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

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

Обзор

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

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

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

3D-модель станка для гибки проволоки своими руками

Как обычно, я начал с создания проекта с помощью программного обеспечения для 3D-моделирования. Вы можете скачать и 3D-модель ниже.

Вдохновение для дизайна:видео на YouTube

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

Вы можете скачать 3D-модель сборки на Thangs.

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

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

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

Сборка машины для гибки проволоки

Я продолжил подготовку других деталей, для которых использовал МДФ и фанеру. Поэтому, как только я снял все размеры с 3D-модели, с помощью циркулярной пилы я вырезал детали по размеру. Я использовал МДФ толщиной 8 мм и фанеру толщиной 18 мм. Как только я их подготовил, я приступил к сборке. Сначала я сделал основу из двух плит МДФ и 4-х фанерных стоек. Для их крепления я использовал столярный клей и несколько шурупов.

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

Их внешний диаметр составляет 35 мм, а внутренний – 15 мм. Так что теперь через эти подшипники нам нужно вставить полый вал на 15 мм, чтобы через него могла пройти проволока. Этот вал на самом деле является осью Z, которая позволяет гибочному механизму вращаться вокруг проволоки и таким образом создавать трехмерные формы. Я использовал для этой цели медную трубку, и ее длина должна быть около 30 см.

Между двумя подшипниками я также вставил напечатанную на 3D-принтере шестерню с модулем 1,5 и 30 зубьев. Шестерня имеет специально разработанные прорези, в которые мы можем вставить гайки M3, а затем с помощью болтов M3 мы можем закрепить шестерню на валу.

Далее нам нужно установить шаговый двигатель оси Z. Для этой цели я напечатал на 3D-принтере специальный монтажный кронштейн. Поэтому я прикрепил шаговый двигатель к кронштейну с помощью болтов M3, а затем вставил шестерню с 18 зубьями на вал двигателя. Я использовал тот же метод крепления шестерни к валу, как показано ранее.

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

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

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

Затем с противоположной стороны двигателя вставил рычаг, на который прикрепил подшипник, который будет давить на кормушку. Чтобы получить достаточное сцепление, чтобы кормушка могла перемещать проволоку, я прикреплю кусок фанеры с Т-образной гайкой, и тогда с помощью болта мы сможем контролировать захват кормушки.

Следующим шагом является изготовление системы выпрямления проволоки. С помощью трех болтов М8 я закрепил кусок фанеры, который предварительно просверлил по 3D-модели. Теперь поверх него вставил ролики. Я сделал ролики из подшипников и рифленых наружных колец, напечатанных на 3D-принтере.

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

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

Итак, теперь мы можем перейти к созданию механизма изгиба проволоки. Сначала на кусок МДФ нам нужно прикрепить двигатель трубогиба. Прежде чем я это сделал, кусок МДФ, которому я нуждался в некоторой обработке, поэтому с помощью ручной пилы, пилы и рашпиля я легко придал желаемую форму. Затем с помощью кольцевой пилы диаметром 38 мм я сделал отверстие для более крупного шагового двигателя, который мы будем использовать для гибки, — шагового двигателя NEMA 23. Также я просверлил несколько небольших отверстий, необходимых для крепления других частей.

Шаговый двигатель NEMA 23 я закрепил с помощью болтов и гаек М4, а на его выходной вал прикрепил шестерню с модулем 2,5 и 18 зубьями. Эта шестерня будет соединена с более крупной шестерней с 30 зубьями, которая представляет собой специально разработанную шестерню со встроенной пластиной для установки сервопривода MG996R. Этот сервопривод будет перемещать реечный механизм, который на самом деле представляет собой штифт, который выскочит из шестерни и будет служить для сгибания проволоки. Используя 5-минутную эпоксидную смолу, я закрепил подшипник на шестерне, а также добавил кусок медной трубки на рейку, которая будет контактной поверхностью при изгибе провода.

После высыхания эпоксидной смолы я соединил две шестерни, закрепив большую шестерню на месте с помощью болта M8 и гаек. Затем я вставил стойку и сервопривод на место и закрепил его винтами, входящими в комплект сервопривода. Затем я закрепил шестерню на круглом кольце сервопривода с помощью двух болтов M3 и гаек.

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

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

На самом деле есть еще две маленькие детали, которые нужно добавить. Вот эта насадка 3 мм на валу, откуда выходит проволока.

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

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

Схема цепи

Вот принципиальная схема этого проекта.

Таким образом, три шаговых двигателя управляются с помощью трех драйверов шаговых двигателей DRV8825. Для питания степперов и всего проекта мы будем использовать блок питания 12В с током не менее 3А.

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

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

Дизайн печатной платы

Затем, чтобы избавиться от беспорядка в проводке и сохранить порядок электронных компонентов, я разработал собственную печатную плату, используя бесплатное онлайн-программное обеспечение для проектирования схем EasyEDA. Схема имеет много соединений, поэтому для их организации я использовал как верхний, так и нижний слои. Я также добавил контакты для выбора разрешения шаговых двигателей, добавил еще одно подключение концевого выключателя и предоставил дополнительные цифровые и аналоговые контакты, идущие от Arduino, на случай, если они нам понадобятся для чего-то.

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

Гербер-файл:

Затем я заказал печатную плату у JLCPCB, которая фактически является спонсором этого проекта.

Здесь мы можем просто перетащить файл Gerber, и после загрузки мы можем просмотреть нашу плату в средстве просмотра Gerber. Если все в порядке, мы можем продолжить, выбрать свойства, которые мы хотим для нашей печатной платы, а затем мы можем заказать нашу печатную плату по разумной цене. Обратите внимание:если это ваш первый заказ в JLCPCB, вы можете получить до 10 печатных плат всего за 2 доллара США.

Через несколько дней печатные платы прибыли. Качество печатных плат отличное и все точно так же, как и в дизайне.

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

Закончив с этим шагом, теперь мы можем вставить драйверы шагового двигателя и Arduino на место. Затем нам нужно подключить вилку питания и выключатель питания к клеммным колодкам, подключить кабели к шаговым двигателям с одной стороны и подключить их к печатной плате с другой стороны. Сервопривод подключен к цифровому контакту номер 2 и питается напряжением 5 В, поступающим от регулятора напряжения LM7805. Наконец, мы можем выбрать разрешение шагового двигателя, подключив контакты разрешения под драйверами.

Я решил использовать разрешение 16-го шага, поэтому нам нужно подключить правые контакты, а не средние, как показано на фото выше. Итак, электронные компоненты готовы, и мы можем приступить к программированию станка для гибки проволоки.

Код Arduino для проекта 3D-гибочного станка

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

Для управления шаговыми двигателями я буду использовать библиотеку AccelStepper от Mike McCauley. Поэтому нам нужно включить эту библиотеку, а также библиотеку сервоприводов для управления серводвигателем. Затем нам нужно определить контакты, к которым подключены степперы, и некоторые переменные, необходимые для программы ниже.

#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;Code language: Arduino (arduino)

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

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);
}Code language: Arduino (arduino)

Теперь в секции цикла мы ждем команд, поступающих от последовательного монитора. Если мы введем 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();
  }
}Code language: Arduino (arduino)

Давайте взглянем на эту пользовательскую функцию.

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++;
  }
}Code language: Arduino (arduino)

Итак, здесь мы вводим цикл 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 0Code language: Arduino (arduino)

На следующем шаге сгибаем проволоку на 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);Code language: Arduino (arduino)

Затем снова подаем ту же длину проволоки и опускаем штифт, чтобы трубогиб мог перейти в новое исходное положение, которое используется для гибки в другом направлении. Затем штифт гибочного станка поднимается, и таким образом мы сгибаем проволоку на 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);
    }Code language: Arduino (arduino)

Вот как работает программа, которую я сделал, но, конечно, есть много других способов ее закодировать. Вот полный код 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;
  }
}
Code language: Arduino (arduino)

At the end I would like to point out that the wire straightening system of the wire bending machine is actually not working like it should work, because if I tighten it more, the feeder loses grip and the wire doesn’t move.

For solving this issue you could try to use different, stronger material than the copper tube or make a different feeder system.

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


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

  1. Швейная машина
  2. Колючая проволока
  3. Шестиугольная машина для плетения проволочной сетки
  4. Чем может помочь станок для резки проволоки?
  5. Что такое листогибочный станок?
  6. Проволочная электроэрозионная обработка:взгляд на металлургическую промышленность Тайваня
  7. Ultimate Wire EDM Machine на Тайване
  8. Потрясающий трубогибочный станок с ЧПУ
  9. Краткое руководство по станку для гибки квадратных труб
  10. Гидравлический трубогибочный станок для мастерских