Arduino的3D电线弯曲机

在本教程中,我将向您展示如何构建一个基于Arduino的3D线折弯机。这实际上是一个典型的机电系统因为它涉及到机械,电子和计算机工程。所以我相信很多工程专业的学生或者任何一个刚接触机电一体化的人都觉得这个项目很有趣。

概要


这是该3D电线弯曲机的工作原理。首先,电线通过串联滚子或矫直器。使用步进电机,电线精确地送入电线弯曲机构,该电线弯曲机构还使用步进电机以及用于弯曲过程的小伺服。

Arduino 3D折线机工作原理。jpg还有另一个步进电机,叫做z轴,它能让机器创建三维形状。当然,机器的大脑是一个Arduino板,它和其他电子元件一起被连接在一个定制设计的PCB上。yabo7. com

星形 -  DIY电线弯曲机

至于该程序,我缩短了自定义功能,用于制作各种形状,如明星,立方体和一个简单的立场,以及通过串行监视器进入命令,我们可以通过串行监视器进行线材形式的手动模式。

DIY 3D折线机3D模型

像往常一样,我首先使用3D建模软件制作项目。您可以下载和下面的3D模型。

电线弯曲机3D模型

设计灵感:YouTube视频

Solidworks:

步骤文件:

3D打印STL文件:

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

我的新3D打印机Creality CR-10做得很好,打印出的零件质量很好。这是链接这种三维打印机如果你想去看看的话。

3D印刷轴承枕块

建造电线弯曲机

我继续准备另一个部分,我使用了MDF和胶合板。因此,一旦我从3D模型中取出了所有尺寸,使用圆锯,我将碎片切割成尺寸。我使用了8毫米蜱mdf和18毫米滴滴胶合板。一旦我让他们准备好了我开始了大会。首先,我用两个MDF板和4个胶合板柱。为了保护它们,我用木材胶水和一些螺丝。

使基出密度纤维板和胶合板

接下来,在顶部面板上,我使用一些8毫米螺栓和螺母附上3D打印轴承枕块。我们可以注意到,我在顶部和枕头块之间添加了3毫米的中密度纤维板,这样我就得到了合适的高度。在这些块里我们可以装6202个轴承。

通过轴承将轴插入

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

在两个轴承之间我还插入有1.5和30个齿模块三维印刷齿轮。该齿轮具有定制设计的槽,其中我们可以插入M3坚果,然后使用螺栓M3我们可以收紧齿轮到轴。

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

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

3D打印齿轮有轴夹的NEMA 17步进电机

然后使用6毫米钻,我在顶部制成两个孔,安装支架将固定。我们可以注意到支架而不是孔,具有使两个齿轮能够正确配对的槽。

配对3D印刷齿轮

我安装了步进电机的进给机构继续前行。该马达将被直接安装在顶板,所以我钻在其上的适当的孔。然后用四个螺栓紧固我步进到板上,并且如果你想知道那些螺母在这里做,他们实际上充当距离坚果,因为我有螺栓时间较长,可能不适合进入马达线程。

固定馈线电机

现在在步进器的轴上我们需要插入进料器。为了这个目的,我3D打印了一个定制的轴耦合器,在上面我插入了一个铜管,这实际上是馈线的接触面。

然后在电动机的相对侧插入杠杆,在该杠杆上,我附着在该杠杆上,该杠杆在其上安装了一个轴承,该轴承将压在馈线上。为了获得足够的握把,所以进料器可以移动电线,我将用T型螺母连接一块胶合板,然后使用螺栓,我们将能够控制进料器的握把。

下一步是制造电线矫直系统。使用三个M8螺栓,我确保了一块我以前钻过的胶合板,我以前根据3D模型钻。现在在它的顶部,我插入了滚轮。我使滚轮从轴承外面的轴承和3D印刷的沟槽外圈。

三个滚筒在这一侧去,另一侧有两个滚筒。对于另一边,我在胶合板件中制作了一个槽,使得螺栓与件齐平。现在只使用两个螺栓,我们可以配对两侧,并使用坚果我们可以适当地拧紧直挺器。

一旦这一步完成后,我加胶合板的两个片在前面,这将作为导线导向器的直后。

好的,所以现在我们可以继续进行导线弯曲机制。首先,在一块MDF上,我们需要附上弯曲电机。在我这样做之前,我需要一些塑造的MDF件,所以使用手锯,一个应对锯和锉刀,我很容易得到所需的形状。然后使用38毫米孔锯,我为更大的步进器开放,我们将用于弯曲,NEMA 23步进电机。此外,我钻了一些较小的孔,用于连接其他部件。

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

在环氧干燥后,通过用M8螺栓和螺母将更大的齿轮固定到适当位置,将两个齿轮配对。然后我将机架和伺服插入放置,并使用伺服包装中提供的螺钉固定它。然后我使用两个M3螺栓和螺母将小齿轮固定到伺服圆角上。

3D伺服电机架和小齿轮机构的印刷齿轮

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

3D印刷伺服电机架和小齿轮机构

剩下的是什么,现在要做的就是拉弯机连接到Z轴。我这样做,使用两个3D打印轴夹。首先,我固定他们使用M6螺栓和螺母的弯曲板,然后将它们插入到Z轴。我插入到位两个螺母,并使用I紧固夹具在轴上的螺栓。所以,现在所有运动部件是否工作正常。

3D印刷轴夹具支撑

实际上还有两个小细节需要添加。这是这个3毫米的喷嘴在轴上,在电线出来的地方。

电线喷嘴

并在弯曲我放置将被用于设置弯曲的初始位置的微限位开关的底部。

微型限位开关用于弯曲机初始位置

就这样,我们的3D线折弯机差不多完成了。我说几乎,是因为现在我们需要给这台机器赋予活力,或者连接电子元件并给它编程。yabo7. com

电路图

这是这个项目的电路图。

Arduino的3D电线弯曲机电路图

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

伺服供电,我们可以使用Arduino的5V,但是MG996R伺服会很耗电,Arduino的5V稳压器可能无法处理。所以我决定使用一个单独的5V电压调节器LM7805,它足够为这个项目的伺服供电。还有一个极限开关,它有一个上拉电阻,它连接到Arduino板的数字引脚。

您可以从下面的链接获取此项目所需的组件:

yaboAG娱乐城披露:这些是附属链接。作为一个亚马逊助理,我从合格的购买中赚取。

PCB设计

接下来,为了摆脱接线混乱并保持电子元件组织我设计了使用Easyeda免费在线电路设计软件的自定义PCB。yabo7. com该电路具有许多连接,因此我使用顶部和底层来组织它们。我还添加了针用于选择脚步的引脚,添加一个更多的限位开关连接,并提供来自Arduino的额外数字和模拟引脚,以防我们需要一些东西。

这是一个链接此PCB设计的项目文件.所以一旦完成了这个设计,我生成了制造PCB所需的Gerber文件。

Gerber文件:

然后我从jlcpcb命令pcb该公司实际上是这个项目的赞助商。

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

从JLCPCB定制pcb设计订单

几天后pcb就到了。pcb的质量是伟大的,一切都是完全相同的设计。

用于Arduino 3D电线弯曲机项目的PCB

现在我们可以继续,将电子元件安装到PCB上。yabo7. com我开始焊接引脚头到PCB。这使得在需要时更容易连接和断开组件。至于较小的组件,如电容器,电阻,稳压器和端子块,我直接焊接到PCB上。

Arduino和DRV8822电路PCB用于3D电线弯曲机

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

DRV8825步进分辨率选择

我决定使用第16个步骤分辨率,因此我们需要将正确的引脚连接到上面的照片上看到的中间销。因此,电子元件现已准备就绪,我们可以继续进行编程电线弯曲机。

三维折线机项目Arduino代码

由于代码较长,为了更好地理解,我将在小节中发布程序的源代码,并对每个小节进行说明。在本文的最后,我将发布完整的源代码。

为了控制步进电机,我将使用Mike McCauley的Accelstepper库.因此,我们需要包含此库,以及用于控制伺服电机的伺服库。然后,我们需要定义脚步计算机连接的引脚以及下面的程序所需的一些变量。

#include  #include  #define limitSwitch 11 //定义将使用AccelStepper feedderstepper(1,5,6)的步进电机和引脚;// (Type:driver, STEP, DIR) AccelStepper zAxisStepper(1,7,8);加速步进弯曲步进器(1,9,10);伺服servo01;String dataIn = "; ";String手动状态= ";";Int count = 0;int经销;

在设置部分中,我们设置伺服或弯曲引脚的初始位置,并设置弯曲齿轮的初始位置。这是在限位开关的帮助下完成的。步进旋转朝向开关,一旦它按下电机开始从零计算台阶并且将自身定位到零度,准备弯曲。

void setup(){serial.begin(9600);Pinmode(LimitsWitch,Input_Pullup);servo01.attach(2);servo01.write (40);//初始位置,弯曲引脚UP //步进电机Max SpeedEstepper.setmaxspeed(2000);zaxisstepper.setmaxspeed(2000);benderstepper.setmaxspeed(2000);//归巢(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); }

现在,在环部分,我们等待来自串口监视器来命令。如果我们输入手册中,我们将进入手动弯曲模式,或者如果我们输入例如明星,开始()自定义函数将被执行,机器就会自动赚了星型我们。

空隙环(){字符串模式= Serial.readString();如果(mode.startsWith( “手册”)){手册();}如果(mode.startsWith( “星形”)){星();}如果(mode.startsWith( “立方体”)){立方体();}如果(mode.startsWith( “站”)){支架();}}

让我们来看看这个定制功能。

Void * () {while (count != 5) {int feed = 38;// mm int feedDistance = feedDistance * 48;// 48-将mm值映射到步进的步数的常量显示移动,同时(feedderstepper . currentposition () != feedDistance){//运行直到它达到距离值feedderstepper . setspeed (1200);feederStepper.run ();} feederStepper.setCurrentPosition (0);//将当前位置置零servo01.write(40);//设置弯管销延迟(200);int angleConst = 18;//将电线弯曲52度,而(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++; } }

所以在这里我们输入时执行5次,因为很明显,星有5个百分点,而环。我们通过设置饲料价值开始,或者说的多少丝会以毫米为单位的饲料。这个值然后由48这转化饲料值成用于步进电机移动适当步骤相乘。然后,使用run()函数,我们旋转由setSpeed()函数的速度设定送料用马达。我们将停止在达到上述feedDistance值,之后我们设置步进零的当前位置值。

Int feed = 38;// mm int feedDistance = feedDistance * 48;// 48-将mm值映射到步进的步数的常量显示移动,同时(feedderstepper . currentposition () != feedDistance){//运行直到它达到距离值feedderstepper . setspeed (1200);feederStepper.run ();} feederStepper.setCurrentPosition (0);//重置当前位置为0

在接下来的步骤中,我们将铁丝弯曲52度。这与上面解释的方法类似。这里我们也有一个角常数,它与期望的角相乘。一旦电机达到这个值,电机停止,将其当前位置重置为0,然后在相反的方向运行相同数量的步骤,实际上使电机返回到初始位置。

//弯曲电线52度,而(benderStepper.currentPosition()= -52 * angleConst!){benderStepper.setSpeed(-700);benderStepper.run ();} benderStepper.setCurrentPosition (0);延迟(100);//返回52度到初始位置while (benderStepper.currentPosition() != 52 * angleConst) {benderStepper.setSpeed(1200);benderStepper.run ();} benderStepper.setCurrentPosition (0);延迟(100);

然后,我们再次喂相同长度的电线,我们设置销,使弯曲器可以移动到一个新的初始位置,这是用于在其他方向弯曲。然后将弯管销抬起,我们将金属丝向相反的方向弯曲105度。这些命令重复了5次,这就是我们形成恒星的方式。

就像上面解释的那样,我们可以做出立方体形状或者其他我们能想到的形状。在手动模式下,命令的工作原理是一样的,只是我们多了一些行来读取来自串行监视器的命令。例如,为了送电线,我们需要输入“f”,加上毫米的距离,为了弯曲电线,我们需要输入“b”,加上角度,为了旋转z轴,我们需要输入“z”,加上角度,以度表示。

如果(dataIn.startsWith( “F”)){dataInS = dataIn.substring(1,dataIn.length());//读取馈送值DIST = dataInS.toInt();Serial.print( “进给”);Serial.print(DIST);Serial.println( “毫米线。”);DIST = DIST * 48;而(feederStepper.currentPosition()= DIST!){feederStepper.setSpeed(1200);feederStepper.run ();} feederStepper.setCurrentPosition (0);延迟(100); }

这样的程序如何,我做的作品,当然,还有很多其他的方面,这是编码。下面是这个3D电线弯曲机的完整Arduino的代码:

/ * Arduino的3D电线弯曲机由德扬Nedelkovski www.HowToMechatronics.com图亚搏手机版官方下载书馆 - 迈克麦考AccelStepper:http://www.airspayce.com/mikem/arduino/AccelStepper/index.html * /#包括的#include 的#define LimitSwitch使用11 //定义步进电机和所述销将使用AccelStepper feederStepper(1,5,6);// (Type:driver, STEP, DIR) AccelStepper zAxisStepper(1,7,8);加速步进弯曲步进器(1,9,10);伺服servo01;String dataIn = "; ";String手动状态= ";";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项足彩网女欧洲杯目集合

65年响应

  1. 布莱恩巷

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

    回复
    • 德扬

      嘿,我更新了文章,并将Gerber文件纳入上面的PCB设计部分。您可以按照视频或文本中解释的那样订购PCB。

      回复
  2. 大卫史密斯

    嗨Dejan,
    多么伟大的项目。我等不及要开始建造它了。我注意到,你的链接部分Arduino链接显示Arduino MEGA,但PCB是为Arduino NANO制作的。你对设计做了改动吗?

    致以最亲切的问候
    大卫

    回复
    • 德扬

      嘿,谢谢!对不起,我把错误的链接放了。现在,零件清单更新,Arduino Nano是您确定的。

      回复
  3. 法布里

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

    回复
  4. 丹尼斯

    嘿,德扬,

    我喜欢这个项目!至于你的电线馈线失去抓地力,你也许可以把一个小半径宽橡皮带铜增加抓地力?

    回复
  5. Abok.

    嗨,

    伟大的项目。

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

    谢谢。
    Abok.

    回复
  6. JeromeHäckel.

    嗨Dejan,
    这是一个伟大的项目!谢谢分享。
    你有没有可能添加一个完整的列表,所有的材料使用,使它更容易重建这个项目?
    如果您可以提供与亚马逊/ anggood的相应链接(如果可能)提供相应的链接会很棒。
    此外:
    rar文件中缺少伺服电机SDLPRT。

    继续干好工作

    回复
    • 德扬

      谢谢你!主要部件的列表可以在上面的文章中找到,在电路图所在的部分。我猜你已经见过它们,至于其他的,它们是常规的普通组件,如电容器和LM7805电压调节器。我实际上在列表中添加了微限位开关。
      并且感谢您对缺少部分的评论,我在步骤和solidWorks文件中添加了它。我刚刚更新了这篇文章。

      回复
  7. 米歇尔

    嗨Dejan,
    这是一个很棒的项目!我喜欢它。
    解释得很好(不是太详细,只是恰到好处)。
    谢谢分享。

    等不及你的其他东西了!
    米歇尔

    回复
  8. 你的工作真的很好!它允许学生例如混合他们教学的不同方面。非常感谢!如果有建议:AV OID缺少组件的完整材料列表可能是有趣的。

    回复
  9. 马克

    嗨,德扬

    这个很棒的项目应该是所有工程专业学生的必修项目。

    涵盖:机械,电子,CAD, pcb设计yabo7. com,嵌入式编程,手动工具和3d打印。

    很乐意在3D打印上看到你的视频/文章。

    谢谢

    回复
    • 德扬

      谢谢你!是的,我一定会继续创造这样的内容,我喜欢制作它,我喜欢人们发现它有用并喜欢它。

      回复
  10. 杰斯R

    在你的照片中,有一个塑料山与齿轮连接,称为“这个装置将搭配大30牙齿齿轮是一个定制的设计与集成板齿轮安装MG996R伺服”——我找不到这个对象在STL文件,这是失踪吗?

    回复
  11. 索尼

    嘿,德詹。
    我是Mechanical enng的学生,我已经选择了这个项目,为Thiz学期,你能把SolidWorks链接发给我吗?
    如果这对你没什么//的话

    希望很快听到你。

    回复
  12. 托尼

    你是如何知道进料率的是什么?我想知道你如何计算通过整个组件发送电线所需的力。

    回复
    • 德扬

      嗯,进料速率取决于馈线的圆周。如果它是22mm的直径,例如在我的情况下,圆周为69.115mm,因此送料器的全旋转将喂69.11mm。但是,您应该简单地测试它并测量您使用的馈线的内容。

      回复
  13. 汉斯

    你好,德扬。
    我是一名机械教育的学生,也选择了这个项目为本学期。你能将Solidworks文件转换成dwg或dxf吗?

    提前致谢
    问候

    回复
  14. Peter Watz.

    嗨,德扬。

    我根据你的规格建造了这款机器,它是无用的......
    或者在建造期间我做了一些严重的错误......

    它不会弯曲0.5毫米黄铜线没有在尖端的一些点失速。
    z轴不会旋转超过5度,没有什么能阻止电线自己旋转(z轴)…
    我从一开始就知道馈线行动是有问题的,所以我不会为此责怪你……

    对可能是问题的任何直接思考吗?

    彼得

    PS。我只使用BOM中指定的组件...

    回复
    • 德扬

      嗨,彼得,
      实际上我有同样的问题。机器远非完美。
      尝试增加步进驱动器电流限制。您可以使用驾驶员上的小螺钉来做。以这种方式,脚步者将吸引更多的电流,并且将有足够的电量来弯曲电线并转动z轴。
      这是真的,Z轴电机在其上转动轴的限制,即使在较高的驾驶电流限制,但它仍然有效,如我视频上所见。至于BENDER尝试同样的事情,并尝试将距离喷嘴到弯曲销增加的距离,或缩短喷嘴或轴。
      这也是如此,电线往往会与z轴一起转动,最终会扰乱您所做的形式。
      抱歉没有指向视频中的所有这些东西。但是你知道,不应该被视为理所当然的这些视频和教程。您将始终需要修改某些内容。

      回复
  15. 安东尼

    我马上就要完成这个项目了。我的送丝器出了点问题。如果它移动了我写的距离但是当它弯曲电缆时它在z轴上意外地转动。我不知道你或其他人是否有一个明确的想法,使机器正常工作。因为我必须注意到缆绳弯曲的同时不能偏离

    回复
    • 德扬

      嘿,那么我也遇到的问题。您需要以某种方式使电线直线直接或不在Z轴周围旋转。再次与夹持机构有关,必须更好地工作,并且不允许电线旋转。当电线在第一位置是锡时,它有点棘手,并且可以容易地变形。

      回复
  16. Furkan.

    你好,德扬,

    据我所知,编码用于特定模型(如星形,立方体)。
    我想做复杂的模型(如样条,弹簧ec..)
    是否有可能在与Arduino Codes中的SolidWorks中创建的草稿?
    例如,CURA是3d打印机使用的程序。在CURA程序中给出STL模型,为3d打印机编写相应的代码。
    是否有这样一个用于电线弯曲的程序?

    回复
    • 德扬

      具体型号都是在Arduino IDE中手工编码的。我做的程序只能做这样的形状,手工编码。不,你不能用Solidworks或其他软件做东西所以机器会自动做出那种形状。当然,这是可能的,但需要一些认真的编码才能实现。

      回复
  17. 比尔E

    这一定是最令人印象深刻和有据可查的项目,我所见过的一个。足彩网女欧洲杯哇。这是特别有帮助,你发布的所有文件来构建它。据我所知,有更多的开发工作需要的,但一样的,真​​是太好了。谢谢你分享。

    回复
  18. 加里

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

    回复
    • 德扬

      谢谢你!我想对你和这个设计进行改进会更容易,因为你已经有过这方面的经验了。我注意到那些尝试制作原型的人遇到了一些困难,确实,让它工作起来并不容易,你需要为故障排除做好准备。毕竟,这只是一个原型,或者更像是一个学习新技能的教育项目。再次感谢您的输入!

      回复
  19. 卢卡斯Kotzie

    这样一个令人敬畏的项目!我已经又上瘾了一段时间了..我将在接下来的几天内尝试根据这个完成自己的。你介意发布更多关于电气部件的信息吗?I mean, I’m willing to power my system (which uses 3 NEMA17 of 3.5kgf/cm 1.2A) with a DC 12V 3A P4 Jack power supply, but I’m wondering how did you power supplied your system or even how would you plug this P4 jack on the PCB. Thank you and congrats!

    回复
    • 德扬

      谢谢!虽然我已经说过,但是3a电源可能还不够。每个步进可以拉1A甚至1.5A。我的意思是,确保您可以使用驱动程序限制电流,例如每次0.5A或其他东西,但是您可能没有足够的扭矩。您可以使用P4插孔,只需使用两根线将其焊接到PCB。

      回复
  20. 埃里克

    嗨Dejan,感谢您为此3D弯曲机械创建操作指南。

    我的工程高级设计团队和我正在重建(w/一些mod)机器的过程中。

    我对你的代码有些疑问。angleConst是什么意思?我注意到你给变量赋的int值在不同的shape函数中会发生变化。例如,对于' star '函数,你的角度= 18,而对于' cube '和' stand ',它是16。为什么这些值?

    谢谢。期待您的回复。

    回复
    • 德扬

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

      回复
  21. 埃里克

    嗨Dejan,

    感谢您在上一篇文章中的反馈。您有效地传达了“盎格格康斯特”的概念。有了这一说,我还有一个额外的问题。

    在以前的评论中,您说负责制作Shark和Cube等形状/模型的代码是“手动编码在Arduino IDE”中。你的意思是说1)你通过试验和错误手动编码它们2)你在线找到了一个代码的库?我问,因为我有兴趣制作额外的形状。

    期待您的回复。

    回复
  22. 谢尔登

    你好德州,

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

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

    回复
    • 德扬

      嘿,这可能是接线问题。尝试使用仅限步进器进行更简单的示例,以确保它正常工作。尝试使用带有Arduino的Seperpers的单独专用教程中的示例。

      回复
      • 谢尔登

        你好,
        我们遵循了你的其他教程,它真的帮助了两个NEMA 17步进电机,但我们有困难计算如何限制开关连接到板。我们只是想知道你能否解释一下它是如何连接到电路板上的。
        谢谢

      • 德扬

        你应该按照电路图连接限位开关。一个引脚接地,另一个引脚连接Arduino的数字引脚,同时同样的引脚也通过一个电阻到5V。当限位开关将被按下时,这个数字引脚的输入将下降低,否则它是持续高,或者反之,如果你连接限位开关的其他两个引脚,如果你有3引脚限位开关如图所示。

  23. Sagar辛格

    你好,德扬,
    如果我使用Arduino Uno而不是Nano,我必须进行任何改变吗?
    如果是,那么我必须改变什么?

    回复
    • 德扬

      嘿,当然,你可以使用Arduino Uno而不是Nano。您无需更改任何特殊情况,您只需确保正确连接所有内容并适当地将引脚定义到Arduino。

      回复
      • 谢赫Shoeb

        给电容器规格

        我可以在这个电路中使用12v 5a电源吗

      • 德扬

        是的,您可以使用12V 5A电源。至于步进电机的电容器,您应该使用大约100uf的东西,电压等级为50V或更高。

  24. 大卫罗宾逊

    嗨,我是通过生产其中一个的方式,我们即将将其作为一个与当地大学的项目用作。不幸的是,下载链接不再工作 - 它用于打开登录窗口,但现在只是灰色页面并具有旋转标志。您是否可能会给我发电子邮件零件文件?

    回复
  25. 萨利赫

    你好,德扬,
    这是一个伟大的项目,我建立它与一些修改。
    我把你的喂食器换成3d打印机的灯丝喂食器,它很棒。
    但我仍然忍受着绕z轴旋转的电线。
    我正在打印另一个矫直机(垂直),在你把它放到它之后,我在我希望它希望它之前看到这个应用程序。
    到目前为止,你有没有得到解决方案?

    回复
    • 德扬

      嘿,谢谢!听起来你已经升级了。也许垂直矫直器将解决问题。我没有试图找到解决这个问题的解决方案,但我肯定会解决这个问题的良好矫直系统。

      回复
  26. luis.

    嗨德扬,我只是有一个cuestion,为什么在PCB出现两个限位开关?一个是用于弯管机的极限,并且其它????

    回复
    • 德扬

      嘿,这个项目我只用了一个限位开关。我在PCB上增加了一个限位开关,以防我将来需要它,但我实际上没有使用它。

      回复
  27. abreham

    哇,这是一个伟大的项目。这个项目我们可以使用arduino UNO等其他arduino板吗?

    回复
  28. 艾哈迈德·纳赛尔

    我想知道如何在转矩,匝数,步长等方面为项目选择电机. ....我想知道我是依靠什么来建造所用的齿轮以及铜管的直径
    我急切地等待回复并感谢您分享项目

    回复
    • 德扬

      嘿,好,说实话选择这里的马达,齿轮等,几乎就是随心所欲。不过,这仅仅是展示制作这样一台机器的想法一个简单的项目,而不是进入在设计细节,甚至编码它的正确方法。

      回复
  29. 大卫Fincken

    你好大的项目,我开始得到部分组合在一起,现在,我住在英国将我需要在这里占单扰电压为230V订购电气部件时。

    回复

留下回复

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

推荐

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

为初学者和爱好者最好的示波器

推荐

2019年初学者的8个最佳Arduino Starter Kits

初学者的8个最佳Arduino Starter Kits

推荐

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

最好的3d打印机为初学者和爱好者