산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

Arduino 3D 와이어 벤딩 머신

<메인 클래스="사이트 메인" id="메인">

이 튜토리얼에서는 Arduino 기반 3D 와이어 벤딩 머신을 구축한 방법을 보여 드리겠습니다. 이것은 기계, 전기 및 컴퓨터 공학을 포함하기 때문에 실제로 일반적인 메카트로닉스 시스템입니다. 따라서 많은 엔지니어링 학생이나 메카트로닉스를 처음 접하는 사람이라면 누구나 이 프로젝트를 흥미롭게 여길 것입니다.

다음 비디오를 보거나 아래에 작성된 튜토리얼을 읽을 수 있습니다.

개요

이 3D 와이어 벤딩 머신의 작동 원리는 다음과 같습니다. 따라서 먼저 와이어가 시리즈 롤러 또는 스트레이트너를 통과합니다. 스테퍼 모터를 사용하여 와이어는 스테퍼 모터와 벤딩 공정을 위한 소형 서보를 사용하는 와이어 벤딩 메커니즘에 정밀하게 공급됩니다.

Z축이라고 하는 또 다른 스테퍼 모터가 있어 실제로 기계가 3차원 형태를 만들 수 있습니다. 물론, 기계의 두뇌는 다른 전자 부품과 함께 맞춤형으로 설계된 PCB에 부착되는 Arduino 보드입니다.

프로그램의 경우 별, 정육면체, 간단한 받침 등 다양한 모양을 만들기 위한 몇 가지 사용자 정의 기능과 직렬 모니터를 통해 명령을 입력하여 와이어 형태를 만들 수 있는 수동 모드를 만들었습니다.

DIY 3D 와이어 벤딩 머신 3D 모델

평소와 같이 3D 모델링 소프트웨어를 사용하여 프로젝트를 만드는 것으로 시작했습니다. 아래에서 3D 모델을 다운로드할 수 있습니다.

디자인 영감:YouTube 동영상

이 3D 모델을 찾아 다운로드할 수 있을 뿐만 아니라 Thangs의 브라우저에서 탐색할 수도 있습니다.

Thangs에서 어셈블리 3D 모델을 다운로드할 수 있습니다.

3D 인쇄용 STL 파일:

기어, 베어링 필로우 블록 및 일부 샤프트 커플러와 같은 일부 부품의 경우 3D 프린터를 사용하여 제작했습니다. 3D 프린팅에 사용되는 이들 부품의 STL 파일은 위의 파일에서 다운로드 가능합니다.

내 새 3D 프린터인 Creality CR-10은 훌륭한 작업을 수행했으며 우수한 품질로 부품을 인쇄했습니다. 이 3D 프린터를 확인하고 싶은 경우를 위해 여기 링크가 있습니다.

와이어 벤딩 머신 만들기

나는 MDF와 합판을 사용하여 다른 부품을 계속 준비했습니다. 그래서 원형 톱을 사용하여 3D 모델에서 모든 치수를 가져온 다음 크기에 맞게 조각을 자릅니다. 8mm 틱 MDF와 18mm 틱 합판을 사용했습니다. 일단 준비가 되면 조립을 시작했습니다. 먼저 2개의 MDF 판과 4개의 합판 기둥으로 베이스를 만들었습니다. 고정을 위해 목공풀과 나사를 사용했습니다.

다음으로 상단 패널에 8mm 볼트와 너트를 사용하여 3D 인쇄된 베어링 필로우 블록을 부착했습니다. 적절한 높이를 얻기 위해 상단과 필로우 블록 사이에 3mm 눈금 MDF 판을 추가했음을 알 수 있습니다. 이제 이 블록에서 6202 베어링을 장착할 수 있습니다.

외경은 35mm이고 내경은 15mm입니다. 이제 이 베어링을 통해 와이어가 통과할 수 있도록 15mm 중공 샤프트를 삽입해야 합니다. 이 샤프트는 실제로 Z축으로, 굽힘 메커니즘이 와이어를 중심으로 회전하여 3차원 형태를 만들 수 있습니다. 그 용도로 동관을 사용했는데 길이는 30cm 정도가 되어야 합니다.

두 베어링 사이에 1.5 및 30개의 톱니 모듈이 있는 3D 인쇄 기어도 삽입했습니다. 기어에는 M3 너트를 삽입한 다음 M3 볼트를 사용하여 기어를 샤프트에 조일 수 있는 맞춤형 디자인 슬롯이 있습니다.

다음으로 Z축 스테퍼 모터를 설치해야 합니다. 이를 위해 맞춤형 마운팅 브래킷을 3D 인쇄했습니다. 그래서 M3볼트로 스테퍼를 브라켓에 고정한 후 모터축에 톱니바퀴 18개를 끼웠습니다. 기어를 샤프트에 고정하기 위해 앞에서 설명한 것과 동일한 방법을 사용했습니다.

그런 다음 6mm 드릴을 사용하여 장착 브래킷을 고정할 상단에 두 개의 구멍을 만들었습니다. 구멍 대신 브래킷에 두 개의 기어가 적절하게 페어링될 수 있도록 하는 슬롯이 있음을 알 수 있습니다.

피더 메커니즘에 스테퍼 모터를 설치하는 작업을 진행했습니다. 이 모터는 상판에 직접 장착할 예정이므로 적절한 구멍을 뚫었습니다. 그런 다음 4개의 볼트를 사용하여 스테퍼를 플레이트에 고정했습니다. 이 너트가 여기서 어떤 역할을 하는지 궁금하시다면 제가 가지고 있는 볼트가 더 길고 모터 나사산에 맞지 않기 때문에 실제로는 디스턴스 너트 역할을 합니다.

이제 이 스테퍼의 샤프트에 피더를 삽입해야 합니다. 이를 위해 실제로 피더의 접촉면이 될 구리 튜브를 삽입한 맞춤형 샤프트 커플러를 3D로 인쇄했습니다.

그런 다음 모터의 반대쪽에 레버를 삽입하고 그 위에 피더를 누르는 베어링을 부착했습니다. 피더가 와이어를 움직일 수 있도록 충분한 그립을 얻기 위해 T-너트가 있는 합판 조각을 부착한 다음 볼트를 사용하여 피더의 그립을 제어할 수 있습니다.

다음 단계는 와이어 교정 시스템을 만드는 것입니다. 3개의 M8 볼트를 사용하여 3D 모델에 따라 이전에 뚫은 합판 조각을 고정했습니다. 이제 그 위에 롤러를 삽입했습니다. 베어링과 3D 인쇄된 홈이 있는 외부 링으로 롤러를 만들었습니다.

이 쪽에 세 개의 롤러가 있고 다른쪽에 두 개의 롤러가 있습니다. 반대쪽에는 볼트가 조각과 같은 높이를 유지하도록 합판 조각에 슬롯을 만들었습니다. 이제 두 개의 볼트만 사용하여 양쪽을 페어링할 수 있고 너트를 사용하여 교정기를 적절하게 조일 수 있습니다.

이 단계가 끝나면 와이어 가이드 역할을 할 교정기 앞뒤에 합판 두 장을 더 추가했습니다.

자, 이제 와이어 벤딩 메커니즘을 만들 수 있습니다. 먼저 MDF 조각에 벤더 모터를 부착해야 합니다. 그 전에 성형이 필요한 MDF 조각이 있었기 때문에 톱, 톱, 줄자를 사용하여 원하는 모양을 쉽게 얻을 수 있었습니다. 그런 다음 38mm 구멍 톱을 사용하여 굽힘에 사용할 더 큰 스테퍼인 NEMA 23 스테퍼 모터를 위한 구멍을 만들었습니다. 또한 다른 부품을 부착하는 데 필요한 작은 구멍도 뚫었습니다.

M4 볼트와 너트를 사용하여 NEMA 23 스테퍼를 고정하고 출력 샤프트에 2.5 및 18 톱니 모듈이 있는 기어를 부착했습니다. 이 기어는 MG996R 서보를 장착하기 위한 통합 플레이트가 있는 맞춤형 설계 기어인 더 큰 30개의 톱니 기어와 쌍을 이룹니다. 이 서보는 랙 및 피니언 메커니즘을 움직일 것입니다. 이것은 실제로 기어에서 튀어나와 와이어를 구부리는 역할을 하는 핀입니다. 5분 에폭시를 사용하여 기어에 베어링을 고정하고 와이어를 구부릴 때 접촉면이 될 랙에 구리 튜브 조각을 추가했습니다.

에폭시가 마른 후 M8 볼트와 너트로 더 큰 기어를 제자리에 고정하여 두 개의 기어를 페어링했습니다. 그런 다음 랙과 서보를 제자리에 삽입하고 서보 패키지에 제공된 나사를 사용하여 고정했습니다. 그런 다음 두 개의 M3 볼트와 너트를 사용하여 서보의 둥근 혼에 피니언 기어를 고정했습니다.

마지막으로 혼을 서보에 부착하고 이것으로 벤딩 메커니즘이 완성되었습니다.

이제 Z축에 벤더를 부착하는 일만 남았습니다. 저는 2개의 3D 인쇄된 샤프트 클램프를 사용하여 그렇게 했습니다. 먼저 M6 볼트와 너트를 사용하여 벤더 플레이트에 고정한 다음 Z축에 삽입했습니다. 두 개의 너트를 제자리에 삽입하고 볼트를 사용하여 클램프를 샤프트에 조였습니다. 이제 모든 움직이는 부품이 제대로 작동합니다.

실제로 추가해야 할 두 가지 작은 세부 사항이 더 있습니다. 와이어가 나오는 샤프트의 3mm 노즐입니다.

그리고 벤더 하단에 벤더의 초기 위치를 설정하는 데 사용할 마이크로 리미트 스위치를 배치했습니다.

이제 3D 와이어 벤딩 머신이 거의 완성되었습니다. 이제 거의 이 기계에 전원을 공급하거나 전자 부품을 연결하고 프로그래밍해야 하기 때문입니다.

회로도

다음은 이 프로젝트의 회로도입니다.

따라서 3개의 스테퍼 모터는 3개의 DRV8825 스테퍼 드라이버를 사용하여 제어됩니다. 스테퍼와 전체 프로젝트에 전원을 공급하기 위해 최소 3A의 전류 속도를 갖는 12V 전원 공급 장치를 사용합니다.

서보에 전원을 공급하기 위해 Arduino에서 오는 5V를 사용할 수 있지만 MG996R 서보는 전력이 부족할 수 있으며 Arduino의 5V 전압 조정기는 이를 처리하지 못할 수 있습니다. 따라서 이 프로젝트의 서보에 전원을 공급하기에 충분한 별도의 5V 전압 조정기인 LM7805를 사용하기로 결정했습니다. 아두이노 보드의 디지털 핀에 연결된 풀업 저항이 있는 벤더용 리미트 스위치도 있습니다.

아래 링크에서 이 프로젝트에 필요한 구성요소를 얻을 수 있습니다.

PCB 디자인

다음으로 배선 혼란을 없애고 전자 부품을 정리하기 위해 EasyEDA 무료 온라인 회로 설계 소프트웨어를 사용하여 맞춤형 PCB를 설계했습니다. 회로는 연결이 많기 때문에 상단 레이어와 하단 레이어를 모두 사용하여 구성했습니다. 또한 스테퍼 해상도를 선택하기 위한 핀을 추가하고, 리미트 스위치 연결을 하나 더 추가했으며, 필요한 경우 Arduino에서 오는 추가 디지털 및 아날로그 핀을 제공했습니다.

다음은 이 PCB 디자인의 프로젝트 파일에 대한 링크입니다. 그래서 이 디자인이 끝나면 PCB 제조에 ​​필요한 Gerber 파일을 생성했습니다.

거버 파일:

그런 다음 실제로 이 프로젝트의 스폰서인 JLCPCB에서 PCB를 주문했습니다.

여기에서 Gerber 파일을 간단히 끌어다 놓을 수 있으며 업로드되면 Gerber 뷰어에서 PCB를 검토할 수 있습니다. 모든 것이 정상이면 계속해서 PCB에 대해 원하는 속성을 선택한 다음 합리적인 가격에 PCB를 주문할 수 있습니다. JLCPCB에서 처음 주문하는 경우 단돈 2달러에 최대 10개의 PCB를 얻을 수 있습니다.

며칠 후 PCB가 도착했습니다. PCB의 품질이 우수하고 모든 것이 디자인과 동일합니다.

이제 계속해서 전자 부품을 PCB에 설치할 수 있습니다. 나는 핀 헤더를 PCB에 납땜하는 것으로 시작했습니다. 이를 통해 필요할 때 구성 요소를 더 쉽게 연결 및 분리할 수 있습니다. 커패시터, 저항, 전압 조정기 및 단자대와 같은 더 작은 구성 요소의 경우 PCB에 직접 납땜했습니다.

이 단계가 끝나면 이제 스테퍼 드라이버와 Arduino를 제자리에 삽입할 수 있습니다. 그런 다음 전원 플러그와 전원 스위치를 터미널 블록에 연결하고 케이블을 한 쪽의 스테퍼 모터에 연결하고 케이블을 다른 쪽의 PCB에 연결해야 합니다. 서보는 디지털 핀 번호 2에 연결되고 LM7805 전압 조정기에서 오는 5V로 전원이 공급됩니다. 마지막으로 드라이버 아래의 해상도 핀을 연결하여 스테퍼 해상도를 선택할 수 있습니다.

저는 16단계 해상도를 사용하기로 결정했기 때문에 위 사진처럼 가운데 핀 대신 오른쪽 핀을 연결해야 합니다. 이제 전자 부품이 준비되었으며 와이어 벤딩 머신 프로그래밍을 진행할 수 있습니다.

3D 와이어 벤딩 머신 프로젝트용 Arduino 코드

코드가 조금 더 길기 때문에 이해를 돕기 위해 프로그램의 소스 코드를 섹션별로 설명과 함께 게시하겠습니다. 그리고 이 기사의 끝에 완전한 소스 코드를 게시할 것입니다.

스테퍼 모터를 제어하기 위해 Mike McCauley의 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;Code language: Arduino (arduino)

설정 섹션에서는 서보 또는 벤딩 핀의 초기 위치를 설정하고 벤더 기어의 초기 위치도 설정합니다. 이것은 리미트 스위치의 도움으로 수행됩니다. 스테퍼가 스위치를 향해 회전하고 한번 누르면 모터가 0에서 걸음 수를 계산하기 시작하고 구부릴 준비가 된 0도에 위치합니다.

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을 입력하면 수동 굽힘 모드로 들어가고, 예를 들어 star를 입력하면 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)

그래서 여기에 우리는 5번 실행되는 while 루프를 입력합니다. 분명히 별에는 5개의 점이 있기 때문입니다. 피드 값을 설정하는 것으로 시작합니다. 즉, 밀리미터 단위로 공급되는 와이어의 양입니다. 그런 다음 이 값에 48을 곱하여 피드 값을 스테퍼 모터가 이동할 적절한 단계로 변환합니다. 그런 다음 run() 함수를 사용하여 setSpeed() 함수에서 설정한 속도로 피더 모터를 회전합니다. 위의 feedDistance 값에 도달하면 정지하고, 그 직후에 스테퍼의 현재 위치 값을 0으로 설정합니다.

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)

그래서 내가 만든 프로그램이 작동하는 방식이지만, 물론 이것을 코딩하는 다른 많은 방법이 있습니다. 이 3D 와이어 벤딩 머신의 전체 Arduino 코드는 다음과 같습니다.

/*
  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. Wire EDM:대만 금속 산업에 대한 간략한 설명
  7. 대만 최고의 와이어 방전가공기
  8. 멋진 CNC 튜브 벤딩 머신
  9. 사각 파이프 벤딩 머신에 대한 빠른 가이드
  10. 워크샵 용 유압 튜브 벤딩 머신