在本教程中,我将向您展示我如何构建基于Arduino的3D电线弯曲机。这实际上是典型的机电调谐系统,因为它涉及机械,电气和计算机工程。因此,我相信许多工程学生或任何新的机电一体化的人发现这个项目有趣。
这是该3D电线弯曲机的工作原理。首先,电线通过串联滚子或矫直器。使用步进电机,电线精确地送入电线弯曲机构,该电线弯曲机构还使用步进电机以及用于弯曲过程的小伺服。
还有另一个坐直电机,称为Z轴,实际上使机器能够创建三维形式。当然,机器的大脑是一个Arduino板,与其他电子元件一起连接在定制设计的PCB上。必威lol
至于该程序,我缩短了自定义功能,用于制作各种形状,如明星,立方体和一个简单的立场,以及通过串行监视器进入命令,我们可以通过串行监视器进行线材形式的手动模式。
DIY 3D电线弯曲机3D模型
和往常一样,我开始使用3D建模软件制作项目。你可以下载下面的3D模型。
设计灵感:YouTube视频
扎实的作品:
步骤文件:
3D打印的STL文件:
对于一些部件,如齿轮,轴承枕块和一些轴耦合器,我使用3D打印机制作它们。可以从上面的文件下载这些部件的STL文件,用于3D打印。
我的新款3D打印机,CREALIS CR-10,做得很好,并以优质的质量印刷零件。这是一个链接这个3D打印机如果您想检查出来。
建造电线弯曲机
我继续准备另一个部分,我使用了MDF和胶合板。因此,一旦我从3D模型中取出了所有尺寸,使用圆锯,我将碎片切割成尺寸。我使用了8毫米蜱mdf和18毫米滴滴胶合板。一旦我让他们准备好了我开始了大会。首先,我用两个MDF板和4个胶合板柱。为了保护它们,我用木材胶水和一些螺丝。
接下来,在顶部面板上,我用约8 mm螺栓和螺母连接了3D印花轴承枕块。我们可以在此发现我在顶部和枕头块之间添加了3 mm刻度MDF板,以便我得到适当的高度。现在在这些块中,我们可以适合6202轴承。
它们的外径为35mm,内径为15mm。所以现在,通过这些轴承,我们需要插入一个15毫米的空心轴,使得电线可以通过它。该轴实际上是Z轴,这使得能够弯曲机构以围绕电线旋转并以这种方式制造三维形式。我用铜管为此目的,其长度需要约30厘米。
在两个轴承之间,我还插入了3D印刷齿轮,模块为1.5和30齿。齿轮具有定制设计插槽,我们可以插入M3螺母,然后使用M3螺栓,我们可以将齿轮拧紧到轴上。
接下来,我们需要安装z轴步进电机。为此目的,我3D打印了定制安装支架。因此,我使用M3螺栓将步进器固定到支架上,然后将18个齿轮插入电机轴上。我用相同的方法将齿轮固定到轴上,如前所述。
然后使用6毫米钻,我在顶部制成两个孔,安装支架将固定。我们可以注意到支架而不是孔,具有使两个齿轮能够正确配对的槽。
我继续安装步进电机以供进给器机制。该电机将直接安装在顶板上,因此我钻了适当的孔。然后使用四个螺栓,我将步进到板上固定,如果你想知道那些坚果在这里做了什么,他们实际上充当距离螺母,因为我所拥有的螺栓较长并且不能融入电机线程。
所以现在在这台步道的轴上,我们需要插入馈线。为此目的,我3D打印了一种定制轴联接器,在其上插入铜管,实际上是进料器的接触表面。
然后在电动机的相对侧插入杠杆,在该杠杆上,我附着在该杠杆上,该杠杆在其上安装了一个轴承,该轴承将压在馈线上。为了获得足够的握把,所以进料器可以移动电线,我将用T型螺母连接一块胶合板,然后使用螺栓,我们将能够控制进料器的握把。
下一步是制作钢丝矫直系统。使用三个M8螺栓,我固定了一块胶合板,我之前根据3D模型钻孔。现在我在上面插入滚轴。我做了滚轮轴承和3D打印槽外圈。
这边有三个滚轴,那边有两个滚轴。在另一边,我在胶合板上做了一个槽,以便螺栓保持同块齐平。现在只用两个螺栓,我们可以对两个边,并使用螺母,我们可以适当地拧紧矫直器。
一旦完成了这一步,我在前后添加了两块胶合板,其直挺器将用作电线导线。
好了,现在我们可以继续制作金属丝弯曲装置了。首先在一块中密度纤维板上,我们需要连接弯管机电机。在此之前,我需要对MDF进行一些塑形,因此使用手锯、压板锯和锉刀,我很容易就得到了想要的形状。然后使用38毫米的孔锯,我做了一个更大的步进,我们将用于弯曲,NEMA 23步进电机的开口。我还钻了一些较小的孔需要附加其他部分。
我使用M4螺栓和螺母和螺母和其输出轴固定了NEMA 23步进,我安装了2.5和18齿的模块的齿轮。该齿轮将与更大的30个齿的齿轮,其是定制设计的齿轮与用于安装MG996R伺服集成板配对。这伺服将移动齿条和小齿轮机构,这实际上是一个引脚,将弹出齿轮出来,它将成为用于弯曲的线。使用5分钟的环氧树脂,我将轴承固定在齿轮上,并在弯曲线时将一块铜管添加到架子上,这将是接触表面。
在环氧干燥后,通过用M8螺栓和螺母将更大的齿轮固定到适当位置,将两个齿轮配对。然后我将机架和伺服插入放置,并使用伺服包装中提供的螺钉固定它。然后我使用两个M3螺栓和螺母将小齿轮固定到伺服圆角上。
最后,我将喇叭附着到伺服,并用这种弯曲机制完成。
现在剩下的事情是将弯曲弯曲到z轴。我用两个3D印刷轴夹子确实如此。首先,我使用M6螺栓和螺母将它们固定在弯曲板上,然后将它们插入Z轴。我将两个螺母插入到位,并使用螺栓将夹紧拧紧到轴上。所以现在所有移动部件都正常工作。
实际上有两个更小的细节要添加。这是电线出来的轴上的3毫米喷嘴。
在Bender的底部,我放置了一个微限位开关,该开关将用于设置弯曲件的初始位置。
就是这样,我们的3D电线弯曲机几乎完成了。我差不多说,因为现在我们需要将Live Live到这款机器,或连接电子组件并编程它。必威lol
电路图
这是这个项目的电路图。
因此,使用三个DRV8825步进驱动器控制三个步进电机。为推动脚步和整个项目,我们将使用12V电源,至少有3A电流速率。
为了供电,我们可以使用来自Arduino的5V,但MG996R伺服可以是电源饥饿,Arduino的5V电压调节器可能无法处理。因此,我决定使用单独的5V电压调节器,LM7805,这足以为该项目供电。弯曲箱还有一个限位开关,其具有拉动电阻,它连接到Arduino板的数字销。
你可以从下面的链接获得这个项目所需的组件:
- 步进电机 - NEMA 17 .........亚马逊/Banggood/aliexpress.
- 步进电机 - Nema 23 ...... ..亚马逊/Banggood/aliexpress.
- DRV8825步进驱动器...... ...... ......亚马逊/Banggood/aliexpress.
- 微限制开关.......... .........亚马逊/Banggood/aliexpress.
- 12V 2A适配器..................... ...... ......亚马逊/Banggood/aliexpress.
- 电源插孔……………。…………。……亚马逊/Banggood/aliexpress.
- Arduino Board ...........................亚马逊/Banggood/aliexpress.
必威外围提钱披露:这些是联盟链接。作为亚马逊助理,我从合格购买中获得。
PCB设计
接下来,为了摆脱接线混乱并保持电子元件组织我设计了使用Easyeda免费在线电路设计软件的自定义PCB。必威lol该电路具有许多连接,因此我使用顶部和底层来组织它们。我还添加了针用于选择脚步的引脚,添加一个更多的限位开关连接,并提供来自Arduino的额外数字和模拟引脚,以防我们需要一些东西。
这是一个链接PCB设计的项目文件。因此,一旦完成了这种设计,我就会生成制造PCB所需的Gerber文件。
格柏文件:
然后我从JLCPCB订购PCB,这实际上是这个项目的赞助商。
在这里,我们可以简单地拖放Gerber文件并一旦上传,我们可以在Gerber Viewer中查看我们的PCB。如果一切都正确,那么我们可以继续,选择我们为PCB的属性,然后我们可以以合理的价格订购我们的PCB。请注意,如果它是jlcpcb的第一个订单,您只需2美元即可获得10台PCB即可。
几天后,PCB已经到了。PCB的质量很大,一切都与设计完全相同。
所以现在我们可以继续前进并将电子组件安装到PCB上。必威lol我开始焊接针头标头到PCB。这使得能够在需要时更容易地连接和断开组件。至于较小的部件,如电容器,电阻器,电压调节器和接线端子,我将它们直接焊接到PCB上。
一旦完成了这一步,现在我们就可以将步进驱动程序和Arduino插入到位。然后,我们需要将电源插头和电源开关连接到端子块,将电缆连接到一侧的步进电机,并将其连接到另一侧的PCB。伺服连接到数字引脚编号2,并随来自LM7805电压调节器的5V供电。最后,我们可以通过将驱动程序下方的分辨率引脚连接来选择步进分辨率。
我决定使用第16个步骤分辨率,因此我们需要将正确的引脚连接到上面的照片上看到的中间销。因此,电子元件现已准备就绪,我们可以继续进行编程电线弯曲机。
3D电线弯曲机项目的Arduino代码
由于代码更长,因此为了更好地理解,我将在每个部分的描述中发布程序的源代码。并且在本文的末尾,我将发布完整的源代码。
用于控制步进电机,我将使用Mike McCauley的Accelstepper库。因此,我们需要包含此库,以及用于控制伺服电机的伺服库。然后,我们需要定义脚步计算机连接的引脚以及下面的程序所需的一些变量。
#include#include #define limitswitch 11 //定义步进电机和引脚将使用Accelstepper Feederstepper(1,5,6);//(类型:驱动程序,步骤,dir)Accelstepper Zaxisstepper(1,7,8);Accelstepper Benderstepper(1,9,10);伺服伺服01;字符串数据=“”;String manualstatus =“”;int count = 0;int dist;
在设置部分中,我们设置伺服或弯曲引脚的初始位置,并设置弯曲齿轮的初始位置。这是在限位开关的帮助下完成的。朝向开关,一旦它的步进旋转压马达开始计数的步骤从零和位置本身为零度,准备弯曲。
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); }
现在在循环部分中,我们等待来自串行监视器的命令。如果我们键入手动,我们将进入手动弯曲模式或者我们键入例如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());//读取Feed Value Dist = datain.toint();serial.print(“Feed”);serial.print(dist);serial.println(“mm导线”);dist = dist * 48;而(FeederStepper.currentPosition()!= dist){feederstepper.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);//(类型:驱动程序,步骤,dir)Accelstepper Zaxisstepper(1,7,8);Accelstepper Benderstepper(1,9,10);伺服伺服01;字符串数据=“”;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; } }
最后我想指出,电线弯曲机的钢丝矫直系统实际上不起作用,因为如果我拧紧更多,则饲养者失去握把并且线不会移动。
为了解决这个问题,您可以尝试使用不同的更强大的材料而不是铜管或制作不同的馈线系统。
这就是它。我希望你喜欢这个视频,并学到一些新的东西。欢迎在评论区提出任何问题,并查看我的Arduino项bet188me目集合。
格伯文件在哪里?我有所有印刷部件,现在正在切割木头。我没有设计PCB的经验,不知道在哪里找到我应该上传到PCB制造商的格柏文件。
谢谢
嘿,我更新了文章,并将Gerber文件纳入上面的PCB设计部分。您可以按照视频或文本中解释的那样订购PCB。
嗨Dejan,
什么是一个伟大的项目。我不能等待开始建造它。我注意到你的链接是arduino链接的一部分,表明Arduino Mega但PCB是为Arduino Nano制造的。你做了改变设计吗?
此致
大卫
嘿,谢谢!对不起,我把错误的链接放了。现在,零件清单更新,Arduino Nano是您确定的。
嗨Dejan,Great Project!你打印了PLA的碎片吗?你用过多少填料?问候,
嘿,谢谢!是的,我印在PLA中的零件,我认为35%的填充物。
嘿德詹,
我喜欢这个项目!就你的电线喂食器输掉抓地力而言,你可能会在铜上放置一个小的半径宽橡皮筋来增加抓握吗?
谢谢!我想到了,但我担心橡胶会很快撕裂。
你好,
伟大的项目。
你用什么尺寸的球轴承制作滚筒?
谢谢。
Abok.
滚轮的滚珠轴承是608Z,22mm OD,8mm ID,7mm W.
嗨Dejan,
这是一个很棒的项目!谢谢你分享这个。
您是否有可能添加所有材料的完整列表,以便更容易重新创建此项目?
如果你能提供相应的链接到亚马逊/ Banggood太棒了(如果可能的话)。
此外:
RAR文件中缺少伺服电机SDLPT。
保持良好的工作
谢谢!好吧,主要组件的列表可以在上面的文章中找到,在电路图所在的部分中。我猜你已经看到了它们,以及其他他们是常规普通组件,如电容器和LM7805电压调节器。我实际上在列表中添加了微限制开关。
并且感谢您对缺少部分的评论,我在步骤和solidWorks文件中添加了它。我刚刚更新了这篇文章。
嗨Dejan,
这是一个很棒的项目!我喜欢它。
很好地解释(不太详细恰到好处)。
谢谢你分享这个。
不能等待你的其他东西!
米歇尔
谢谢!
你的工作真的很好!它允许学生例如混合他们教学的不同方面。为此非常感谢!如果有建议:AV OID缺少组件的完整材料列表可能是有趣的。
嗨德国
这个精彩的项目应该是所有工程学生的强制性。
封面:力学,电子,CAD,PCB设计,必威lol嵌入式编程,手动工具和3D打印。
很乐意在3D打印上看到你的视频/文章。
谢谢
谢谢!是的,我肯定会尽力创造内容,我喜欢做它,我喜欢当人们发现它有用而且喜欢它时。
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?
这是文件“Bender Gear修改”。
嘿,德詹。
我是Mechanical enng的学生,我已经选择了这个项目,为Thiz学期,你能把SolidWorks链接发给我吗?
如果这不会为您提供任何东西//
希望很快收到你的来信。
嘿,3D模型文件已经在上面的文章中提供,您可以自由下载它们。
你是如何知道进料率的是什么?我想知道你如何计算通过整个组件发送电线所需的力。
进给量取决于进给器的周长。如果它的直径是22mm,比如在我的情况下,周长是69.115mm,所以全旋转给料机将送出69.11mm的电线。但是,您应该简单地测试它并测量您的馈线得到了什么。
你好,德詹。
我是机械教育学生,也为本学期选择了这个项目。您能将SolidWorks文件转换为DWG或DXF吗?
提前致谢
问候
嘿,您可以使用.step文件并使用Autodesk Fusion 360打开它。
嗨Dejan。
我已经按照你的规格建造这台机器,这是无用的...
或者我在施工过程中犯了一些严重的错误……
它不会弯曲0,5mm黄铜电线,而不在某个点处停止尖端。
Z轴不会超过5度,并且没有什么可以将电线保持在其自己的......
我知道进料器行动从一开始就是值得怀疑的所以我不责怪你......
对可能是问题的任何直接思考吗?
彼得
PS。我只使用BOM中指定的组件...
嗨彼得,
实际上我有同样的问题。机器远非完美。
尝试增加步进驱动器电流限制。您可以使用驾驶员上的小螺钉来做。以这种方式,脚步者将吸引更多的电流,并且将有足够的电量来弯曲电线并转动z轴。
这是真的,z轴电机是在它的极限转动轴,即使在更高的驱动电流限制,但它仍然工作,正如我在视频中看到的。至于弯管机尝试同样的事情,也试着增加距离从喷嘴到弯曲销,或缩短喷嘴或轴。
这也是如此,电线往往会与z轴一起转动,最终会扰乱您所做的形式。
抱歉没有指向视频中的所有这些东西。但是你要知道,这些类型的影片和教程不应该被认为是理所当然的。您将始终需要修改某些内容。
惊人的!!!!
我对你的设计做了一点调整......使电线变得更大,以便更好的力量和信号......仍然如此酷的项目!
我即将完成这个项目。我有丝网送料器的问题。如果它行进了我写入它的距离,但是当它弯曲电缆时,它会在z轴上意外转动。我不知道你或其他人是否有一个功能明确的想法,使机器正常工作。因为我必须意识到电缆,并且弯曲的是什么时候同时偏离
嘿,这也是我经历过的一个问题。你需要让导线保持直线或者不绕z轴旋转。这又和抓手机制有关,它必须更好地工作,不让金属丝旋转。这有点棘手,因为金属丝一开始是锡的,很容易变形。
你好德州,
这编码的具体型号用途(如星,立方体),按我的理解。
我想做复杂的模型(如样条曲线,春季ec ..)
是否有可能在与Arduino Codes中的SolidWorks中创建的草稿?
例如,静拉是由3D打印机使用的程序。我在卷曲程序中提供STL模型,它为3D打印机准备了适当的代码。
是否有这样一个用于电线弯曲的程序?
嘿,特定模型在Arduino IDE中手动编码。我制作的程序只能做这种形状,手动编码。所以没有,你不能在SolidWorks或任何其他软件中制作一些东西,因此机器将自动使其自动变形。当然是可能的,但它需要一些严重的编码来实现这一目标。
这必须是我见过的最令人印象深刻的和记录的项目之一。bet188me哇。释放所有文件以构建它是特别有帮助的。我明白需要更多的发展工作,但就是一样的,真的很棒。谢谢你的分享。
谢谢!
非常好的原型。可以通过使用来自MIG焊接机的电线馈电器组件的组件来校正轴承拖动问题,我使用一个来自AliExpress的组件。它们可以提供不同的电线尺寸的滚花轮,我得到0.045“和1/8”线尺寸。我基于其他YouTube视频构建的那个,没有与您的详细信息,以及我看到的数控管道弯道。我也有一些弱点。我有两个主要问题,头部太弱了。另一个是编程,你比我更进一步。我想用你的方法看看我是否可以进一步拍摄,可能无法得到任何地方,但值得研究。再次,非常令人印象深刻的工作。
谢谢!好吧,我猜你更容易改善你的设计,因为你已经拥有了这个问题。我注意到那些尝试制作原型的人面临一些困难,这是真的,你需要做好易于做的事情,你需要准备好进行故障排除。毕竟,它只是一个原型或更像是学习新技能的教育项目。再次感谢输入!
这样一个令人敬畏的项目!我已经又上瘾了一段时间了..我将在接下来的几天内尝试根据这个完成自己的。你介意发布更多关于电气部件的信息吗?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上。
您能告诉您使用哪个版本的SolidWorks?
这是2017年版。
嗨Dejan,感谢您为此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。
嗨Dejan,
感谢您在上一篇文章中的反馈。您有效地传达了“盎格格康斯特”的概念。有了这一说,我还有一个额外的问题。
在以前的评论中,您说负责制作Shark和Cube等形状/模型的代码是“手动编码在Arduino IDE”中。你的意思是说1)你通过试验和错误手动编码它们2)你在线找到了一个代码的库?我问,因为我有兴趣制作额外的形状。
我期待着您的回复。
你好德州,
是一群建筑学生,学习如何制作和编程电线弯曲。我们运行的一些问题是步进电机没有转动,他们正在收到代码,但它们被卡住了。我们不知道它是否是一个接线问题,或者如果它是编码问题。我们希望了解接线完成的更多信息。
我希望能很快收到你的回信。
可能是线路出问题了。试着用一个简单的步进来做一个简单的例子,以确保它能正常工作。请尝试使用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.
非常有趣…
什么尺寸的电线(直径)(和钢/铝?)可以弯曲吗?
我使用了2毫米钢丝。任何思想家都需要不同的设计或更强大的电机进行弯曲。
你好德州,
如果我使用Arduino Uno而不是Nano,我必须进行任何改变吗?
如果是,那么我必须改变什么?
当然,你可以用Arduino Uno代替Nano。您不需要更改任何特定内容,只需要确保正确连接所有内容并适当地定义Arduino引脚。
提供电容器规格
和
我可以在该电路中使用12V 5A电源
是的,您可以使用12V 5A电源。至于步进电机的电容器,您应该使用大约100uf的东西,电压等级为50V或更高。
嗨,我正在制作其中的一个&我们将用它作为一个项目与当地的大学。不幸的是,下载链接似乎已经不起作用了——它过去可以打开一个登录窗口,但现在页面变得灰暗,还有一个旋转的logo。你能把零件文件发邮件给我吗?
嘿,试着用不同的浏览器。
和LM7805电压调节器的电容器规格,
谢谢
你好德州,
这是一个很棒的项目,我用一些修改来建立它。
我用3D打印机长丝送料器更换喂料器,它很棒。
但我仍然遭受围绕Z轴旋转的电线。
我正在打印另一个矫直器(垂直)添加后,你把它,我看到这个应用之前,我希望它走对了。
到目前为止,你有没有得到解决方案?
嘿,谢谢!听起来你已经升级不少了。也许立式矫直机可以解决这个问题。我没有试图找到一个解决这个问题的办法,但我一个良好的矫直系统将解决这个问题绝对。
嗨Dejan,我只是有一个审议,为什么在PCB上看起来有两个限位开关?一个是弯曲的限制,另一个是????
嘿,我仅用于这个项目的1个限制开关。我在PCB中添加了一个更限位的切换,以防我将来需要它,但我实际上没有使用它。
哇它是一个很棒的项目。我们可以使用其他arduino板,如arduino uno为此项目吗?
是的,当然,您可以使用任何Arduino Board来项目。
我想知道如何在扭矩,转弯,步骤等方面选择项目的电机。我想知道我依靠什么,建造使用的齿轮和铜管的直径
我急切地等待回复并感谢您分享项目
嘿,诚实地为电机,齿轮等的选择几乎就像是任意的。尽管如此,这只是一个简单的项目,展示了制作这样的机器的想法,同时没有进入设计甚至是正确的方式。
嗨伟大的项目,我现在开始把零件在一起,因为我住在英国时,我需要考虑到这里的单个Faze电压是230V订购电气部件。