Arduino 3D 线材折弯机
在本教程中,我将向您展示如何构建基于 Arduino 的 3D 线材折弯机。这实际上是一个典型的机电一体化系统,因为它涉及机械、电气和计算机工程。因此,我相信许多工科学生或任何刚接触机电一体化的人都觉得这个项目很有趣。
您可以观看以下视频或阅读下面的书面教程。
概览
这是这款 3D 线材折弯机的工作原理。因此,首先,线材通过一系列滚轮或矫直机。使用步进电机,线材被精确地送入线材弯曲机构,该机构也使用步进电机以及小型伺服进行弯曲过程。

还有另一个步进电机,称为 Z 轴,它实际上使机器能够创建三维形状。当然,机器的大脑是一块 Arduino 板,它与其他电子元件一起连接在定制设计的 PCB 上。

至于程序,我做了一些自定义函数来制作各种形状,如星形、立方体和简单的支架,以及手动模式,我们可以通过串行监视器输入命令来制作电线形式。
DIY 3D线材折弯机3D模型
像往常一样,我首先使用 3D 建模软件制作项目。您可以下载下面的3D模型。

设计灵感:YouTube 视频
您可以找到并下载此 3D 模型,也可以在 Thangs 上的浏览器中进行探索。

您可以在 Thangs 下载组装 3D 模型。
用于 3D 打印的 STL 文件:
对于某些零件,例如齿轮、轴承座和一些联轴器,我使用 3D 打印机制作它们。这些零件的STL文件,用于3D打印,可以从上面的文件中下载。
我的新 3D 打印机 Creality CR-10 做得很好,打印出的零件质量很高。这是这台 3D 打印机的链接,以备不时之需。

制造线材弯曲机
我继续准备其他部分,为此我使用了 MDF 和胶合板。因此,一旦我使用圆锯从 3D 模型中获取所有尺寸,我就将这些碎片切割成合适的尺寸。我使用了 8 毫米刻度 MDF 和 18 毫米刻度胶合板。一旦我准备好它们,我就开始组装。首先,我用两个 MDF 板和 4 个胶合板柱制作了底座。为了固定它们,我使用了木胶和一些螺丝。

接下来在顶部面板上,我使用一些 8 毫米的螺栓和螺母连接了 3D 打印的轴承座。我们可以注意到,我在顶部和枕块之间添加了 3 毫米刻度 MDF 板,以便获得适当的高度。现在我们可以在这些块中安装 6202 轴承。

它们的外径为 35 毫米,内径为 15 毫米。所以现在,通过这些轴承,我们需要插入一个 15 毫米的空心轴,以便电线可以穿过它。这个轴实际上是Z轴,它使弯曲机构能够绕线旋转,从而形成三维形状。为此我使用了一根铜管,它的长度需要在 30 厘米左右。
在两个轴承之间,我还插入了一个模数为 1.5 和 30 齿的 3D 打印齿轮。齿轮有定制设计的插槽,我们可以在其中插入 M3 螺母,然后使用 M3 螺栓将齿轮拧紧到轴上。

接下来我们需要安装Z轴步进电机。为此,我 3D 打印了一个定制的安装支架。因此,我使用 M3 螺栓将步进器固定到支架上,然后将 18 齿齿轮插入电机轴上。我使用与前面所示相同的方法将齿轮固定到轴上。

然后使用 6 毫米钻头,我在顶部打了两个孔,用于固定安装支架。我们可以注意到,支架不是孔,而是有槽,可以使两个齿轮正确配对。

我继续为进纸机构安装步进电机。该电机将直接安装在顶板上,因此我在其上钻了适当的孔。然后我用四个螺栓将步进器固定在板上,如果你想知道这些螺母在这里做什么,它们实际上充当了距离螺母,因为我的螺栓更长,无法装入电机螺纹。

所以现在在这个步进器的轴上,我们需要插入进纸器。为此,我 3D 打印了一个定制的联轴器,在该联轴器上插入了一根铜管,该铜管实际上是进料器的接触面。

然后在电机的另一侧插入一个杠杆,在其上安装一个轴承,该轴承将压在进料器上。为了获得足够的抓地力,以便馈线器可以移动电线,我将附上一块带有 T 形螺母的胶合板,然后使用螺栓我们将能够控制馈线器的抓地力。

下一步是制作线材矫直系统。我使用三个 M8 螺栓固定了一块我之前根据 3D 模型钻孔的胶合板。现在在它上面我插入了滚轮。我用轴承和 3D 打印的带槽外圈制作了滚子。

三个滚轮在这一侧,两个滚轮在另一侧。在另一边,我在胶合板上开了一个槽,使螺栓与胶合板保持齐平。现在只需使用两个螺栓就可以将两侧配对,使用螺母我们可以适当地拧紧矫直机。

完成这一步后,我在矫直机前后添加了两块胶合板,用作导线。
好的,现在我们可以继续制作线材弯曲机构了。首先在一块 MDF 上,我们需要连接弯曲电机。在我这样做之前,我需要一些形状的 MDF 片,所以使用手锯、顶锯和锉刀,我很容易得到想要的形状。然后使用一个 38 毫米的孔锯,我为我们将用于弯曲的更大的步进电机(NEMA 23 步进电机)开了一个口。我还钻了一些连接其他部件所需的小孔。

我使用 M4 螺栓和螺母固定 NEMA 23 步进器,并在其输出轴上连接了一个模数为 2.5 和 18 齿的齿轮。该齿轮将与更大的 30 齿齿轮配对,该齿轮是定制设计的齿轮,带有集成板,用于安装 MG996R 伺服。该伺服将移动齿条和小齿轮机构,该机构实际上是一个从齿轮中弹出的销,它将用于弯曲电线。我使用 5 分钟的环氧树脂将轴承固定在齿轮上,并在机架上添加了一根铜管,这将是弯曲电线时的接触面。

环氧树脂干透后,我用 M8 螺栓和螺母将较大的齿轮固定到位,从而将两个齿轮配对。然后我将机架和伺服器插入到位,并使用伺服器包装中提供的螺钉将其固定。然后我用两个 M3 螺栓和螺母将小齿轮固定到伺服的圆角上。

最后我将喇叭连接到伺服器上,这样弯曲机构就完成了。

现在剩下要做的就是将折弯机连接到 Z 轴。我使用两个 3D 打印轴夹做到了这一点。首先,我使用 M6 螺栓和螺母将它们固定在折弯板上,然后将它们插入 Z 轴。我将两个螺母插入到位,并使用螺栓将夹子拧紧到轴上。所以现在所有的运动部件都正常工作了。

其实还有两个小细节要补充。就是轴上的这个 3 毫米喷嘴,电线从这里出来。

在折弯机底部放置了一个微型限位开关,用于设置折弯机的初始位置。

就是这样,我们的 3D 线材折弯机几乎完成了。我说差不多了,因为现在我们需要给这台机器供电,或者连接电子元件并对其进行编程。
电路图
这是这个项目的电路图。

因此,使用三个 DRV8825 步进驱动器控制三个步进电机。为了给步进器和整个项目供电,我们将使用至少 3A 电流的 12V 电源。
为了给伺服器供电,我们可以使用来自 Arduino 的 5V,但 MG996R 伺服器可能很耗电,而 Arduino 的 5V 稳压器可能无法处理它。因此,我决定使用一个单独的 5V 稳压器 LM7805,它足以为该项目的伺服供电。弯管机还有一个限位开关,它有一个上拉电阻,连接到 Arduino 板的数字引脚。
您可以从以下链接获取此项目所需的组件:
- 步进电机 – NEMA 17…………
- 步进电机 – NEMA 23 ……..
- DRV8825 步进驱动器……....
- 微型限位开关…………..…………
- 12V 2A 适配器……………………..…….
- 电源插孔……………….………….……
- Arduino 板…………………………
PCB设计
接下来,为了摆脱布线混乱并保持电子元件井井有条,我使用 EasyEDA 免费在线电路设计软件设计了一个定制的 PCB。电路有很多连接,所以我使用顶层和底层来组织它们。我还添加了用于选择步进器分辨率的引脚,增加了一个限位开关连接,并提供了来自 Arduino 的其他数字和模拟引脚,以防我们需要它们。

这是此 PCB 设计的项目文件的链接。所以一旦完成这个设计,我就生成了制造 PCB 所需的 Gerber 文件。
格柏文件:
然后我从JLCPCB订购了PCB,实际上是这个项目的赞助商。

在这里,我们可以简单地拖放 Gerber 文件,上传后,我们可以在 Gerber 查看器中查看我们的 PCB。如果一切正常,那么我们可以继续,为我们的 PCB 选择我们想要的属性,然后我们可以以合理的价格订购我们的 PCB。请注意,如果这是您从 JLCPCB 订购的第一个订单,您只需 2 美元即可获得多达 10 个 PCB。

几天后,多氯联苯已经到货了。 PCB的质量很好,一切都与设计中的完全一样。

所以现在我们可以继续将电子元件安装到 PCB 上。我首先将排针焊接到 PCB 上。这使得在需要时更容易连接和断开组件。至于较小的元件,如电容器、电阻器、稳压器和接线端子,我将它们直接焊接到 PCB 上。

完成此步骤后,现在我们可以将步进驱动器和 Arduino 插入到位。然后我们需要将电源插头和电源开关连接到接线端子,将电缆连接到一侧的步进电机,并将它们连接到另一侧的 PCB。伺服器连接到数字引脚 2 并由来自 LM7805 稳压器的 5V 供电。最后我们可以通过连接驱动器下方的分辨率引脚来选择步进分辨率。

我决定使用第 16 步分辨率,因此我们需要连接正确的引脚,而不是如上图所示的中间引脚。所以现在电子元件已经准备好了,我们可以继续对折线机进行编程了。
3D Wire Bending Machine Project 的 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)
在设置部分我们设置了舵机或折弯销的初始位置,还设置了折弯机齿轮的初始位置。这是在限位开关的帮助下完成的。步进器朝开关方向旋转,一旦按下,电机就会开始从零开始计算步数并将自身定位到零度,准备弯曲。
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 值时我们停止,然后我们将步进器的当前位置值设置为零。
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
Code 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. I hope you enjoyed this video and learned something new. Feel free to ask any question in the comments section below and check my Arduino Projects Collection.
制造工艺