Arduino 3D电线弯曲机

在本教程中,我将向您展示我如何构建基于Arduino的3D电线弯曲机。这实际上是典型的机电调谐系统,因为它涉及机械,电气和计算机工程。因此,我相信许多工程学生或任何新的机电一体化的人发现这个项目有趣。

概述


这是这台3D折丝机的工作原理。首先,金属丝要经过一系列的轧辊或矫直机。使用步进电机,丝被精确地馈送到丝弯曲机构,也使用步进电机和一个小的伺服为弯曲过程。

Arduino 3D折线机工作原理。jpg还有另一个坐直电机,称为Z轴,实际上使机器能够创建三维形式。当然,机器的大脑是一个Arduino板,与其他电子元件一起连接在定制设计的PCB上。必威lol

星形DIY弯丝机

在程序方面,我做了一些定制功能来制作各种形状,比如一个星形,一个立方体,一个简单的支架,还有一个手动模式,我们可以通过串口显示器输入命令来制作线形。

DIY 3D电线弯曲机3D模型

和往常一样,我开始使用3D建模软件制作项目。你可以下载下面的3D模型。

弯丝机3D模型

设计灵感:YouTube视频

扎实的作品:

步文件:

3D打印的STL文件:

对于一些零件,如齿轮,轴承枕块和一些轴联轴器,我使用3D打印机来制作它们。这些零件用于3D打印的STL文件可以从上面的文件中下载。

我的新款3D打印机,CREALIS CR-10,做得很好,并以优质的质量印刷零件。这是一个链接这个3D打印机如果您想检查出来。

3D印刷轴承枕块

制作弯丝机

我继续准备其他部分,我使用了MDF和胶合板。所以一旦我从3D模型中提取出所有的尺寸,我就用圆锯把碎片切成合适的尺寸。我使用了8毫米的中密度纤维板和18毫米的胶合板。一旦我把它们准备好了,我就开始组装。首先,我用两块中密度纤维板和四根胶合板柱子做了基础。为了固定它们,我用了木胶和一些螺丝。

使基地出于MDF和胶合板

接下来,在顶部面板上,我用约8 mm螺栓和螺母连接了3D印花轴承枕块。我们可以在此发现我在顶部和枕头块之间添加了3 mm刻度MDF板,以便我得到适当的高度。现在在这些块中,我们可以适合6202轴承。

通过轴承插入轴

它们的外径是35毫米,内径是15毫米。现在,通过这些轴承,我们需要插入一个15毫米的空心轴,这样电线就可以通过它。这个轴实际上是z轴,它使弯曲机构能够绕着金属丝旋转,从而形成三维形式。我用了一个铜管的目的,它的长度需要大约30厘米。

在两个轴承之间,我还插入了3D印刷齿轮,模块为1.5和30齿。齿轮具有定制设计插槽,我们可以插入M3螺母,然后使用M3螺栓,我们可以将齿轮拧紧到轴上。

3D打印齿轮与集成槽轴紧固

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

3d打印齿轮轴夹NEMA 17步进电机

然后使用一个6毫米的钻头,我做了两个孔在上面安装支架将被固定。我们可以注意到支架而不是孔,有插槽,使两个齿轮适当地配对。

配对3d打印齿轮

我继续安装步进电机以供进给器机制。该电机将直接安装在顶板上,因此我钻了适当的孔。然后使用四个螺栓,我将步进到板上固定,如果你想知道那些坚果在这里做了什么,他们实际上充当距离螺母,因为我所拥有的螺栓较长并且不能融入电机线程。

固定给料电机

所以现在在这台步道的轴上,我们需要插入馈线。为此目的,我3D打印了一种定制轴联接器,在其上插入铜管,实际上是进料器的接触表面。

然后在电机的另一边,我插入了一个杠杆,在它上面我附加了一个轴承,它将压在馈线上。为了获得足够的抓地力,使馈线可以移动电线,我将附上一块带有t型螺母的胶合板,然后使用一个螺栓,我们将能够控制馈线的抓地力。

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

这边有三个滚轴,那边有两个滚轴。在另一边,我在胶合板上做了一个槽,以便螺栓保持同块齐平。现在只用两个螺栓,我们可以对两个边,并使用螺母,我们可以适当地拧紧矫直器。

一旦完成了这一步,我在前后添加了两块胶合板,其直挺器将用作电线导线。

好了,现在我们可以继续制作金属丝弯曲装置了。首先在一块中密度纤维板上,我们需要连接弯管机电机。在此之前,我需要对MDF进行一些塑形,因此使用手锯、压板锯和锉刀,我很容易就得到了想要的形状。然后使用38毫米的孔锯,我做了一个更大的步进,我们将用于弯曲,NEMA 23步进电机的开口。我还钻了一些较小的孔需要附加其他部分。

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

在环氧树脂干燥后,我配对的两个齿轮通过固定较大的齿轮在地方与M8螺栓和螺母。然后我插入机架和伺服在放置,并确保它使用螺丝提供在伺服包。然后我将小齿轮固定在伺服用两个M3螺栓和螺母的圆角上。

3d打印齿轮伺服电机齿轮齿条机构

最后,我把喇叭连接到伺服,并与此弯曲机构完成。

3d打印伺服电机齿轮齿条机构

现在剩下的事情是将弯曲弯曲到z轴。我用两个3D印刷轴夹子确实如此。首先,我使用M6螺栓和螺母将它们固定在弯曲板上,然后将它们插入Z轴。我将两个螺母插入到位,并使用螺栓将夹紧拧紧到轴上。所以现在所有移动部件都正常工作。

3d打印轴夹支持

实际上有两个更小的细节要添加。这是电线出来的轴上的3毫米喷嘴。

钢丝喷嘴

在Bender的底部,我放置了一个微限位开关,该开关将用于设置弯曲件的初始位置。

MIRCO限制开关,用于弯曲初始位置

就是这样,我们的3D电线弯曲机几乎完成了。我差不多说,因为现在我们需要将Live Live到这款机器,或连接电子组件并编程它。必威lol

线路图

这是这个项目的电路图。

Arduino 3D电线弯曲机电路图

因此,三台步进电机使用三个DRV8825步进驱动器进行控制。为步进器和整个项目供电,我们将使用至少3A电流速率的12V电源。

为伺服供电,我们可以使用来自Arduino的5V,但MG996R伺服可能耗电,Arduino的5V稳压器可能无法处理。因此,我决定使用一个单独的5V稳压器,LM7805,这足以为这个项目的伺服供电。还有一个极限开关的弯管有一个拉起电阻,它连接到Arduino板的数字引脚。

你可以从下面的链接获得这个项目所需的组件:

必威外围提钱披露:这些是联盟链接。作为亚马逊助理,我从合格购买中获得。

PCB设计

接下来,为了摆脱布线混乱和保持电子元件组织,我设计了一个定制的PCB使用EasyEDA免费在线电路设计软件。必威lol电路有很多连接,所以我同时使用了顶层和底层来组织它们。我还添加了用于选择步进器分辨率的引脚,添加了一个限制开关连接,并提供了来自Arduino的额外数字和模拟引脚,以防我们需要它们。

这里有一个链接到PCB设计的项目文件。因此,一旦完成了这种设计,我就会生成制造PCB所需的Gerber文件。

格柏文件:

然后我从JLCPCB订购PCB它实际上是这个项目的赞助商。

在这里,我们可以简单地拖放Gerber文件并一旦上传,我们可以在Gerber Viewer中查看我们的PCB。如果一切都正确,那么我们可以继续,选择我们为PCB的属性,然后我们可以以合理的价格订购我们的PCB。请注意,如果它是jlcpcb的第一个订单,您只需2美元即可获得10台PCB即可。

从JLCPCB定制pcb设计订单

几天后,PCB已经到了。PCB的质量很大,一切都与设计完全相同。

电路板arduino 3d折线机项目

所以现在我们可以继续前进并将电子组件安装到PCB上。必威lol我开始焊接针头标头到PCB。这使得能够在需要时更容易地连接和断开组件。至于较小的部件,如电容器,电阻器,电压调节器和接线端子,我将它们直接焊接到PCB上。

3D折线机的Arduino和DRV8822电路PCB

一旦完成了这一步,现在我们就可以将步进驱动程序和Arduino插入到位。然后,我们需要将电源插头和电源开关连接到端子块,将电缆连接到一侧的步进电机,并将其连接到另一侧的PCB。伺服连接到数字引脚编号2,并随来自LM7805电压调节器的5V供电。最后,我们可以通过将驱动程序下方的分辨率引脚连接来选择步进分辨率。

DRV8825步进分辨率选择

我决定使用16步分辨率,所以我们需要连接正确的引脚,而不是中间的,如上图所示。所以电子元件现在准备好了,我们可以继续编写弯丝机的程序。

Arduino代码3D线折弯机项目

由于代码更长,因此为了更好地理解,我将在每个部分的描述中发布程序的源代码。并且在本文的末尾,我将发布完整的源代码。

为了控制步进电机,我将使用AccelStepper库,作者Mike McCauley。所以我们需要包括这个库,以及控制伺服电机的伺服库。然后,我们需要定义步进器连接到的引脚和下面程序所需的一些变量。

#include  #include  #define limitSwitch 11 //定义步进电机和引脚将使用AccelStepper馈线步进(1,5,6);// (Type:driver, STEP, DIR)AccelStepper benderStepper(1,9,10);伺服servo01;String dataIn = "";String manualStatus = "";Int count = 0;int经销;

在设置部分,我们设置伺服或弯曲销的初始位置,也设置弯曲机齿轮的初始位置。这是通过限位开关来完成的。步进器旋转向开关,一旦它被压下,电机开始计数从零和位置自身为零度,准备弯曲。

void setup() {Serial.begin(9600);pinMode (limitSwitch INPUT_PULLUP);servo01.attach (2);servo01.write (40);//初始位置,折弯销向上//步进电机最大速度进给步进. setmaxspeed (2000);zAxisStepper.setMaxSpeed (2000);benderStepper.setMaxSpeed (2000);// home 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); }

现在在循环部分中,我们等待来自串行监视器的命令。如果我们键入手动,我们将进入手动弯曲模式或者我们键入例如star,将执行start()自定义功能,并且机器将自动为我们制作星形形式。

void循环(){string mode = serial.readstring();if(mode.startswith(“手册”)){手动();}如果(mode.startswith(“星星”)){star();}如果(mode.startswith(“立方体”)){cube();}如果(mode.startswith(“ack”)){task();}}

让我们来看看这个自定义函数。

void star(){while(count!= 5){int feed = 38;// mm int feeddistance = feed * 48;// 48-展示映射mm值到步进显示移动的步骤数(feedersepper.currentposition()!= efferdistance){//运行直到它到达距离值FeederStepper.setpeed(1200);feederStepper.run ();} feederStepper.setCurrentPosition (0);//将当前位置重置为0 servo01.write(40);//将BENDER引脚设置延迟(200);int angleconst = 18;//角度常数//在(benderstepper.currentposition()!= -52 * angleconst){benderstepper.setspeed(-700)时弯曲52度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++; } }

所以在这里,我们进入了一个循环,循环执行了5次,因为明显的明星有5分。我们首先设置馈送值,或者这是多少电线以毫米为送入。然后将该值乘以48,这将馈送值转换为步进电机移动的适当步骤。然后使用RUN()函数,我们将馈线电机旋转,速度由setSpeed()功能设置。当达到上述馈电值时,我们会停止,并且在此之后我们将步进零的当前位置值设置为之后。

int feed = 38;// mm int feeddistance = feed * 48;// 48-展示映射mm值到步进显示移动的步骤数(feedersepper.currentposition()!= efferdistance){//运行直到它到达距离值FeederStepper.setpeed(1200);feederStepper.run ();} feederStepper.setCurrentPosition (0);//将当前位置重置为0

下一步我们将金属丝弯曲52度。这是通过类似的方式如上所述。这里我们还有一个角常数乘以期望的角度。一旦电机达到该值,电机停止,重置其当前位置为0,然后在相反的方向运行相同的步数,这实际上返回电机到其初始位置。

//(Benderstepper.CurrentPosition()!= -52 * AngleConst){benderstepper.setspeed(-700);Benderstepper.Run();} benderStepper.setCurrentPosition (0);延迟(100);//返回52度(benderstepper.currentposition()!= 52 * angleconst){benderstepper.setspeed(1200);Benderstepper.Run();} benderStepper.setCurrentPosition (0);延迟(100);

然后,我们再次喂养相同的电线长度,我们将销钉放在下来,使得弯管可以移动到新的初始位置,用于沿另一个方向弯曲。然后升高弯针,因此我们在相反方向上弯曲线105度。命令重复5次,这就是我们获得明星形式的方式。

以类似的方式如上所述,我们使立方体形状或实际上我们可以提出的任何其他形状。至于手动模式,命令的工作原理是相同的,除了我们有很少的线路读取来自串行监视器的命令。例如,为了喂养电线,我们需要键入“f”,加上距离以毫米为单位,对于弯曲线,我们需要键入“b”,加上角度的角度,以及旋转z轴,我们需要要键入“z”,请加上角度。

if(datain.startswith(“f”)){datains = datain.substring(1,datain.length());//读取提要值dist = dataInS.toInt();serial.print(“Feed”);并同时(经销);serial.println(“mm导线”);Dist = Dist * 48;while (feedstep . currentposition () != dist) {feedstep . setspeed (1200);feederStepper.run ();} feederStepper.setCurrentPosition (0);延迟(100); }

这就是我制作的程序的方式,但当然,可以编码许多其他方式。以下是此3D电线弯曲机的完整Arduino代码:

/ * Arduino 3D电线弯曲机由Dejan Nedelkovski www.howtomechatronics.bet188官方网站com图书馆 -  Accelstepper由Mike McCauley:http://www.aircepayce.com/mikem/arduino/accelstepper/index.html * / #include #include  #define limitswitch 11 //定义步进电机和引脚将使用Accelstepper Feederstepper(1,5,6);// (Type:driver, STEP, DIR)AccelStepper benderStepper(1,9,10);伺服servo01;String dataIn = "";String manualStatus = "";Int count = 0;int经销;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; } }

最后我想指出的是,弯丝机的线材矫直系统实际上并没有像它应该的那样工作,因为如果我再拧紧的话,给料机就会失去抓地力,线材也不会移动。

为了解决这个问题,您可以尝试使用不同的更强大的材料而不是铜管或制作不同的馈线系统。

这就是它。我希望你喜欢这个视频,并学到一些新的东西。欢迎在评论区提出任何问题,并查看我的Arduino项bet188me目集合

65回复

  1. Brian Alley

    gerber文件在哪里?我有所有的印刷部分,现在正在切割木材。我没有设计pcb的经验,不知道在哪里找到我应该上传到pcb制造商的gerber文件。
    谢谢

    回复
    • 德扬

      嘿,我更新了这篇文章,并在上面的PCB设计部分包含了Gerber文件。你可以订购PCB就像在视频或在文本中解释。

      回复
  2. 大卫·史密斯

    嗨,德扬,
    什么是一个伟大的项目。我不能等待开始建造它。我注意到你的链接是arduino链接的一部分,表明Arduino Mega但PCB是为Arduino Nano制造的。你做了改变设计吗?

    此致
    大卫

    回复
  3. 巧妙

    嗨Dejan,Great Project!你打印了PLA的碎片吗?你用过多少填料?问候,

    回复
  4. 丹尼斯

    嘿德詹,

    我喜欢这个项目!就你的电线喂食器输掉抓地力而言,你可能会在铜上放置一个小的半径宽橡皮筋来增加抓握吗?

    回复
  5. Abok

    你好,

    伟大的项目。

    你用什么尺寸的滚珠轴承来制造滚轮?

    谢谢。
    Abok

    回复
  6. 杰罗姆·海克

    嗨,德扬,
    这是一个很棒的项目!谢谢你分享这个。
    您是否可以添加一个完整的材料列表,以使它更容易重建这个项目?
    如果你能提供相应的链接到亚马逊/ Banggood太棒了(如果可能的话)。
    此外:
    RAR文件中缺少伺服电机SDLPT。

    保持良好的工作

    回复
    • 德扬

      谢谢你!好吧,主要组件的列表可以在上面的文章中找到,在电路图所在的部分中。我猜你已经看到了它们,以及其他他们是常规普通组件,如电容器和LM7805电压调节器。我实际上在列表中添加了微限制开关。
      谢谢您对缺失部分的评论,我在STEP和Solidworks文件中都添加了。我刚刚更新了这篇文章。

      回复
  7. 米歇尔

    嗨,德扬,
    这是一个伟大的项目!我爱它。
    很好地解释(不太详细恰到好处)。
    谢谢你分享这个。

    不能等待你的其他东西!
    米歇尔

    回复
  8. 马特

    你的工作做得很好!例如,它允许学生混合不同方面的教学。非常感谢!如果有一个建议:一个完整的材料列表可以是有趣的av避免丢失一个组件。

    回复
  9. 标记

    嗨德国

    这个精彩的项目应该是所有工程学生的强制性。

    封面:力学,电子,CAD,PCB设计,必威lol嵌入式编程,手动工具和3D打印。

    希望看到你的3d打印视频/文章。

    谢谢

    回复
    • 德扬

      谢谢你!是的,我肯定会尽力创造内容,我喜欢做它,我喜欢当人们发现它有用而且喜欢它时。

      回复
  10. Jess R.

    In your photos, you have a plastic mount with gear attached, described as ” This gear will be paired with bigger 30 teeth gear which is a custom designed gear with integrated plate for mounting a MG996R servo” – I can’t find this object in the STL files anywhere, is it missing?

    回复
  11. Soni.

    嘿,德扬。
    我是mechanical eng的学生,这学期我选择了这个项目,你能把solidworks链接发给我吗?
    如果这对你没有任何意义的话//

    希望很快收到你的来信。

    回复
  12. 托尼

    你怎么知道饲料速率是多少?我想知道你是如何计算出将电线传送到整个装配过程中所需要的力的。

    回复
    • 德扬

      进给量取决于进给器的周长。如果它的直径是22mm,比如在我的情况下,周长是69.115mm,所以全旋转给料机将送出69.11mm的电线。但是,您应该简单地测试它并测量您的馈线得到了什么。

      回复
  13. 汉斯

    你好,德詹。
    我是机械教育学生,也为本学期选择了这个项目。您能将SolidWorks文件转换为DWG或DXF吗?

    提前致谢
    问候

    回复
  14. 彼得Watz

    嗨,德扬。

    我根据你的规格造了这台机器,但它毫无用处……
    或者我在施工过程中犯了一些严重的错误……

    它不会弯曲0,5mm黄铜电线,而不在某个点处停止尖端。
    Z轴不会超过5度,并且没有什么可以将电线保持在其自己的......
    我知道进料器行动从一开始就是值得怀疑的所以我不责怪你......

    你能马上想到是什么问题吗?

    彼得

    PS.我只使用了你们BOM中指定的组件…

    回复
    • 德扬

      嗨,彼得,
      事实上我也有同样的问题。这台机器还远远不够完美。
      尝试增加步进驱动器的电流限制。你可以用驱动器上的小螺丝来做。通过这种方式,步进器将吸取更多的电流,并将有足够的力量来弯曲导线和旋转z轴。
      这是真的,z轴电机是在它的极限转动轴,即使在更高的驱动电流限制,但它仍然工作,正如我在视频中看到的。至于弯管机尝试同样的事情,也试着增加距离从喷嘴到弯曲销,或缩短喷嘴或轴。
      同样的,导线也倾向于沿着z轴转动,这最终会干扰你所形成的形状。
      抱歉没有在视频中指出所有这些东西。但你知道,这些视频和教程不应该被视为理所当然。你总是需要修改一些东西。

      回复
  15. 安东尼

    我即将完成这个项目。我有丝网送料器的问题。如果它行进了我写入它的距离,但是当它弯曲电缆时,它会在z轴上意外转动。我不知道你或其他人是否有一个功能明确的想法,使机器正常工作。因为我必须意识到电缆,并且弯曲的是什么时候同时偏离

    回复
    • 德扬

      嘿,这也是我经历过的一个问题。你需要让导线保持直线或者不绕z轴旋转。这又和抓手机制有关,它必须更好地工作,不让金属丝旋转。这有点棘手,因为金属丝一开始是锡的,很容易变形。

      回复
  16. 你好,德扬,

    据我所知,这种编码使用的是特定的模型(如星形、立方体)。
    我想做复杂的模型(如样条,弹簧ec..)
    是否有可能在与Arduino Codes中的SolidWorks中创建的草稿?
    例如,静拉是由3D打印机使用的程序。我在卷曲程序中提供STL模型,它为3D打印机准备了适当的代码。
    有折丝的程序吗?

    回复
    • 德扬

      嘿,特定模型在Arduino IDE中手动编码。我制作的程序只能做这种形状,手动编码。所以没有,你不能在SolidWorks或任何其他软件中制作一些东西,因此机器将自动使其自动变形。当然是可能的,但它需要一些严重的编码来实现这一目标。

      回复
  17. 比尔E.

    这必须是我见过的最令人印象深刻的和记录的项目之一。bet188me哇。释放所有文件以构建它是特别有帮助的。我明白需要更多的发展工作,但就是一样的,真​​的很棒。谢谢你的分享。

    回复
  18. 加里

    很好的原型。轴承拖动问题可以通过使用组件从一个MIG焊机送丝组件纠正,我使用了一个来自全球速卖通。他们可以提供不同线径的滚花轮,我得到0.045″和1/8″线径。我根据其他youtube视频制作的,没有像你一样多的细节,还有我见过的数控弯管机。我也有一些缺点。我的有两个主要问题,头太弱了。另一个是编程,你比我做得更远。我想用你的方法看看我是否能更进一步,也许不会有任何进展但值得研究。非常令人印象深刻的工作。

    回复
    • 德扬

      谢谢你!好吧,我猜你更容易改善你的设计,因为你已经拥有了这个问题。我注意到那些尝试制作原型的人面临一些困难,这是真的,你需要做好易于做的事情,你需要准备好进行故障排除。毕竟,它只是一个原型或更像是学习新技能的教育项目。再次感谢输入!

      回复
  19. 卢卡斯科特齐

    如此棒的项目!我已经沉迷其中有一段时间了。在接下来的几天里,我将会根据这个来做我自己的工作。你介意张贴更多关于电气部分的信息吗?我的意思是,我愿意用直流12V 3A P4插座供电我的系统(使用3 NEMA17 3.5kgf/cm 1.2A),但我想知道你是如何为你的系统供电的,甚至你会如何把这个P4插座插到PCB上。谢谢你,祝贺你!

    回复
    • 德扬

      谢谢!虽然我已经说过了,3A电源可能还不够。每个步进器可以拉1A甚至1.5A。我的意思是,当然你可以限制驱动器的电流,例如每个都是0。5a之类的,但是你可能没有足够的扭矩。你可以使用P4插孔,简单地用两根线将其焊接到PCB上。

      回复
  20. 伊利克

    嗨,德扬,感谢您创建了这个3d弯曲机的操作指南。

    我的工程高级设计团队和我正在重新创建(W / SEY MODS)机器。

    我对您的代码有一些问题。angleconst是什么意思?我注意到,您将在整个不同的“形状”函数中分配给变量的int值。例如,对于'star'函数你的angleconst = 18,而且为'立方体'和'站立'它是16.为什么这些值?

    谢谢你!我期待着您的回复。

    回复
    • 德扬

      嘿,那些常量手动设置为适合我所做的形状。我已经提到代码并不是很好,可以改善一点。这些常数的想法是步进电机有200个步骤,工作的第16步分辨率总计3200步。因此,我们需要90度,我们需要50步,即800微秒。800STEPS / 90DEG = 8.88或者在第32步分辨率的情况下,大约为1600Steps / 90deg = 17.77。所以我可能一直在使用第32步分辨率,以便为什么这些数字大约为16-18。

      回复
  21. 伊利克

    嗨,德扬,

    感谢您在上一篇文章中的反馈。你有效地传达了“角度守恒”的概念。我还有一个问题。

    在之前的评论中,你说过,负责制作形状/模型如星星和立方体的代码是“在Arduino IDE中手动编码的”。你的意思是说1)你通过尝试和错误手动编码它们,还是你2)你在网上找到了一个代码库?我这么问是因为我对制作额外的形状很感兴趣。

    我期待着您的回复。

    回复
  22. 谢尔顿

    你好,德扬,

    Were是一群建筑专业的学生,他们正在学习如何制作和编程弯丝机。我们遇到的一些问题是步进电机不转,他们正在接收代码,但他们卡住了。我们不知道这是布线问题,还是编码问题。我们希望得到更多的信息如何布线完成。

    我希望很快能收到你的来信。

    回复
    • 德扬

      可能是线路出问题了。试着用一个简单的步进来做一个简单的例子,以确保它能正常工作。请尝试使用Arduino中使用步进器的单独专用教程中的示例。

      回复
      • 谢尔顿

        你好,
        我们跟随您的其他教程,它真的有助于两个NEMA 17步进电机,但我们难以确定限制开关如何连接到电路板。我们只是想知道您是否可能会解释它如何插入董事会。
        谢谢

      • 德扬

        嗯,您应该按照电路图连接限位开关。一个引脚进入地,另一个引脚进入Arduino的数字销,而同一引脚也通过电阻器到5V。When the limit switch will be pressed the input to this digital pin will drop LOW, otherwise it’s constantly HIGH, or maybe vice versa if you connect the other two pins of the limit switch, in case you have 3 pins limit switch as shown in the diagram.

  23. 阿南德

    非常有趣…
    什么尺寸的电线(直径)(和钢/铝?)可以弯曲吗?

    回复
  24. Sagar辛格

    你好,德扬,
    如果我用Arduino UNO代替NANO,需要做什么改变吗?
    如果是,我需要做什么改变?

    回复
    • 德扬

      当然,你可以用Arduino Uno代替Nano。您不需要更改任何特定内容,只需要确保正确连接所有内容并适当地定义Arduino引脚。

      回复
      • 谢赫Shoeb

        提供电容器规格

        我可以在该电路中使用12V 5A电源

      • 德扬

        可以,您可以使用12V 5A电源。至于步进电机的电容器,你应该使用100uF左右的额定电压为50V或以上的电容器。

  25. 戴夫罗宾逊

    嗨,我正在制作其中的一个&我们将用它作为一个项目与当地的大学。不幸的是,下载链接似乎已经不起作用了——它过去可以打开一个登录窗口,但现在页面变得灰暗,还有一个旋转的logo。你能把零件文件发邮件给我吗?

    回复
  26. 萨尔斯哈

    你好,德扬,
    这是一个伟大的项目,我建立了一些修改。
    我用3d打印机丝料机代替你的馈线,这是伟大的。
    但我仍然忍受着绕z轴旋转的导线。
    我正在打印另一个矫直器(垂直)添加后,你把它,我看到这个应用之前,我希望它走对了。
    到目前为止你得到解决方案了吗?

    回复
    • 德扬

      嘿,谢谢!听起来你已经升级不少了。也许立式矫直机可以解决这个问题。我没有试图找到一个解决这个问题的办法,但我一个良好的矫直系统将解决这个问题绝对。

      回复
  27. luis.

    嗨Dejan,我只是有一个审议,为什么在PCB上看起来有两个限位开关?一个是弯曲的限制,另一个是????

    回复
    • 德扬

      嘿,我仅用于这个项目的1个限制开关。我在PCB中添加了一个更限位的切换,以防我将来需要它,但我实际上没有使用它。

      回复
  28. 阿伯哈姆

    哇它是一个很棒的项目。我们可以使用其他arduino板,如arduino uno为这个项目吗?

    回复
  29. 艾哈迈德纳赛尔

    我想知道如何在扭矩,转弯,步骤等方面选择项目的电机。我想知道我依靠什么,建造使用的齿轮和铜管的直径
    我急切地等待着回复,感谢你分享这个项目

    回复
    • 德扬

      嘿,诚实地为电机,齿轮等的选择几乎就像是任意的。尽管如此,这只是一个简单的项目,展示了制作这样的机器的想法,同时没有进入设计甚至是正确的方式。

      回复
  30. David Finconen.

    嗨伟大的项目,我现在开始把零件在一起,因为我住在英国时,我需要考虑到这里的单个Faze电压是230V订购电气部件。

    回复

留下一个回复

您的电子邮件地址不会被公开。

受到推崇的

2019年初学者和爱好者的最佳进入级示波器

最适合初学者和爱好者的示波器

受到推崇的

2019年针对初学者的8个最佳Arduino入门工具包

8个最好的arduino初学者工具包

受到推崇的

用于初学者和爱好者的最佳3D打印机 -  3D打印

初学者和爱好者的最佳3D打印机