来自DC伺服电机和木制酒盒的自制CNC机

16.,452

126.

16.

简介:直流伺服电机和木制葡萄酒箱自制数控机床

关于:PLC,Arduino-自己动手项目

今天,我想和大家分享一下如何在家里用现有的或废弃的材料制造一台3轴数控机床。特别是在这个项目中,我重用了2个旧直流伺服电机和2个木制酒盒,以及,利用我女儿的未使用的学习用品。

第1步:用品

The main materials are used in this project:

  • 1pcs xBig Wooden Wine Box, dimension W x L x H x T: 350 x 400 x 80 x 8mm.
  • 1pcs xSmall Wooden Wine Box, dimension W x L x H x T: 220 x 340 x 100 x 10mm.
  • 1pcs xarduino.Uno R3.
  • 1pcs xArduino Mega 2560..
  • 1pcs xArduino CNC屏蔽V3 GRBL.
  • 1pcs xStepper Motor Driver A4988.
  • 1pcs xArduino L293D电机护罩.
  • 2.pcs x DC Servo Motor NISCA NF5475E.
  • 1pcs xOld CD/DVD Rom Player Drive.
  • 2.pcs x 50 mm L Stepper Motor Support.
  • 2.pcs x GT2 6mm Closed Timing Belt 200mm.
  • 2个60齿GT2正时皮带轮。
  • 4件x圆棒轴直径8mm,长度400mm。
  • 2.pcs x T8 Lead Screw 2mm Pitch, 8mm Lead , Length 400mm with Copper Nut.
  • 1pcs x铝合金柔性轴联轴器,内孔尺寸:10mm x 10毫米. 用来夹住钢笔/铅笔。
  • 1.2.pcs x Horizontal Ball Bearing Bracket.
  • 4个垂直滚珠轴承支架。
  • 2.pcs x F608ZZ Ball Flanged Shielded Bearings 8 x 22 x 7mm.
  • 1pcs xSingle/ Double Sided Printed Prototyping Board.
  • 2件x 2.54mm节距40长销钉单可堆叠屏蔽内割台。
  • 2件x 40针2.54毫米凸头和凹头。
  • 1PCS X电源12VDC - 10A。
  • 1pcs xPower Supply 5VDC – 5A.
  • 3pcs x 5mm dc插孔公连接器。
  • 1件x 5毫米直流插孔母接头。
  • 2米x 8p彩虹色带电缆。
  • 2件x透明/白色亚克力,A4尺寸,厚度5mm。
  • 1pcs xBlack and White Board 2 in 1, A4 Size for Kids. It is used for Y axis plotting surface in my case.
  • 8pcs x Copper Brass Pillars L-10mm.
  • 16PCS X小尺寸钕磁铁。
  • 2.pcs x Threaded Rod Hangers and Nuts M10 x 500mm. I used threaded bolt to reinforce my CNC frame.
  • 一些小型电缆扎带,电缆螺旋缠绕,M3/M4螺栓和螺母,一些钢支架。

工具:

  • 钻头孔为20mm的钻机。
  • 烙铁机。

第二步:项目示意图

您可以下载PDF格式的项目示意图HERE.我的CNC是由2个DC伺服电机构建的X,Y轴和Z轴的1个步进电机。

There are 3 groups in the schematic, I'd like to clarify as follow:

  • Group 1 - Red:包括使用GRBL固件预装和数控屏蔽的Arduino Uno。Arduino UNO负责发送控制信号:步进/方向直流伺服电机驱动器X,Y和步进电机驱动器Z.
  • Group 2 - Blue:包括Arduino Mega 2560和L293D电机屏蔽,如直流伺服电机驱动器。它收到了来自Arduino UNO的命令步骤/目录,对x和y轴执行p.i.d控件。在这种情况下,DC伺服电机的P.I.D设置点是来自GRBL固件的步骤加方向信号。
  • 第3组 - 棕色:包括DC伺服电机X,Y.(步进电机Z未显示在我的原理图上)。

第三步:尼斯卡直流伺服电机

主直流伺服电机NF5475E参数用红色矩形标记如下:

笔记:

  • Motor voltage: 24 VDC, 38 VDC (E-type). In my case, I used 12VDC power supply to the motor because this voltage level is compatible with L293D Motor Shield. If you want to use a 24VDC power supply, the motor control module must have a higher voltage level, such as L298N.
  • 编码器需要由5VDC供电,它有两个通道A、B。编码器分辨率200 P/R(每转200个脉冲)意味着:当电机完成一转时,编码器将产生200个脉冲。

步骤4:数控机床装配

1.构建Y轴

首先,我测量了电机、同步带和滑轮的尺寸,以便在一个大的木制酒盒上找到最合适的布局。正如你所看到的,旧的直流伺服电机有一个20齿皮带轮预装,我使用了额外的60齿皮带轮和200毫米封闭同步带来驱动丝杠。

我使用了5个pcs x水平滚珠轴承支架和1件x球法兰屏蔽轴承用于丝杠和轴杆。数控机床的工作面将安装到4个x垂直滚珠轴承支架.我使用水平和垂直的滚珠轴承括号,因为我可以在钻井工作可能不正确的情况下进行一些对齐。

2.安装工作表面在Y轴上

我用别的东西使用了大酒盒的封面,所以我用另一个木板为工作面。

To clamp copper nut of lead screw, I used a L stepper motor support and 2 acrylic plate, like picture below. The hole diameter as well as thickness of the L support and copper nut are fit together and strong enough by this way.

Connecting working platform to 4 pcs x vertical ball bearing brackets and lead screw.

对准丝杠和轴,确保手动操作平台平稳工作。

3. Build X axis

我用剩下的一个小盒子来构建X轴结构。和Y轴一样,我使用了一个额外的60齿滑轮和200mm的封闭式同步带来驱动丝杠。

The X axis servo motor was hidden inside the box. One acrylic sheet dimension 100 x 230 mm was installed on the X axis and later one CD drive will be mounted on it for Z axis.

通过L形马达支撑件和2个小丙烯酸片与Y轴相同的2个小丙烯酸片夹紧螺旋螺母。

The X and Y axis of CNC machine were finished, then I put them together to align and mark drilling holes.

4.建立Z轴并加固数控框架。

我使用了一个CD播放器作为Z轴,笔/铅笔由一个10 x 10mm的铝制挠性联轴器夹紧。

我把所有的数控轴框架连接在一起,准备好所有的布线,并用一些钢支架加固数控结构。

对于绘图平台,我使用了黑色(顶部)和白色(底部)板,A4大小的儿童。我把黄色的塑料边框从板上取下来,然后把这个塑料边框粘在Y轴上。

Finally, I did alignment and clamped the black and white board into the plastic border. By this way, I can remove the board from its plastic border if I need to align or tighten the Y-axis bolts.

第五步:控制板焊接工作

1.Arduino巨型适配器屏蔽。

跟随在里面g the schematic on第2步,我剪出一个PCB原型板尺寸60 x 90mm并焊接所有导线连接。适配器屏蔽用于将Arduino Mega 2560连接到L293D电机屏蔽,直流伺服电机编码器和来自GRBL固件的控制信号(步骤和方向) as follow:

  • Top female headers: connecting to L293D Motor Shield.
  • 底部公头:连接到Arduino Mega 2560。
  • 4 pins - top male headers: connecting to X Encoders servo motor (5V, GND, Channel A, Channel B).
  • 4引脚 - 顶部公头:连接到Y编码器伺服电机(5V,GND,通道A,通道B)。
  • 2.pins - top male header: connecting to X.STEP and X.DIR signals.
  • 2.pins - top male header: connecting to Y.STEP and Y.DIR signals.

请注意伺服电机NF5475E上的编码器标题的引脚,如下所示:

如果您有PCB项目,您可以访问下一步website to get exciting discounts and coupons.

2.。Control Board Assembly.

我把所有的木板从下到下依次堆放起来:

  • Arduino Mega 2560。
  • Adapter Shield.
  • L293D电机护罩。
  • 阿杜伊诺。
  • CNC屏蔽。

3.将控制板装入箱中。

我在小盒子里安装了控制板和电源(5VDC - 12VDC)并将所有连接插入。

一个电源开关安装在CNC背面。

准备打印用的A4纸。完成!

第6步:编程

Arduino Mega 2560代码如下:

/*在这个项目中,直流伺服电机可以模拟步进电机一样,他们可以控制通过GRBL固件数控应用程序。*///Timer2库#include“FlexiTimer2.h”//PID库#include//AFMotor库#include//正交编码器库#include“Encoder.h”//创建电机驱动器实例AFŠDCMotor motorX(1,MOTOR12Š8KHZ);自动对焦电机(2,电机12 8KHZ);//设置正交编码器引脚-Arduino MEGA2560有6个中断引脚#define EncoderX_ChannelA 18//中断5#define EncoderX_ChannelB 22#define EncoderY_ChannelA 20//中断3#define EncoderY_ChannelB 24//设置X轴和Y轴的步进和方向引脚#define STEP_XPIN 19//中断4#define STEP_YPIN 21//中断2#define DIR_XPIN 23#define DIR YPIN 25//打开/关闭X/Y伺服的调试电机#define DEBUGŠX 0//用于X伺服电机Šdefine DEBUGŠY 0//用于Y伺服电机//用于计算实际运动Šdefine stepmŠu X 300.0//步长/mm用于直流伺服电机X轴的GRBL固件#定义死区宽度\u X 30.0//死区宽度=30.0-->定位的可接受误差(mm):0.10mm#define stepm\u Y 300.0//STEP/mm用于直流伺服电机Y轴的GRBL#define DEADBW_Y 30.0//Deadband width=30.0-->定位可接受误差(单位:mm):0.10mm//设置输入双输入X;双输入Y;双旧\u输入\u X=0;双旧\u输入\u Y=0;//设置实际值双倍实际值×毫米;实际直径的两倍;双倍旧\u实际\u X \u MM;双旧\u实际\u Y \u MM;//PID控制器常数双KP\u X=10.0;//P表示X伺服电机双KI_X=0.03;//I用于X伺服电机双KD_X=0.01;//D表示X伺服电机双KP\u Y=10.0;//P表示Y伺服电机双KI_Y=0.03;//Y伺服电机双KD_Y=0.01;//D为Y伺服电机//输出可变电机转速至电机驱动器双输出_X;双输出;双旧输出\u X=0;双旧输出\u Y=0;//设定点双设定点\u X=0;双设定点_Y=0;双旧设定点\u X=0;双旧设定点\u Y=0;双误差_X=0;双误差_Y=0;//方向int directionX;int方向;//PID控制器PID myPID\ux(&INPUT\ux,&OUTPUT\ux,&SETPOINT\ux,KP\ux,KI\ux,KD\ux,DIRECT);PID myPID_Y(&INPUT_Y,&OUTPUT_Y,&SETPOINT_Y,KP_Y,KI_Y,KD_Y,DIRECT);//设置光学编码器编码器XEncoder(EncoderX\u ChannelA,EncoderX\u ChannelB);编码器YEncoder(EncoderY\u ChannelA,EncoderY\u ChannelB);void setup(){//用于调试if(DEBUG|X | | DEBUG|Y){Serial.begin(115200);}pinMode(步进,输入);pinMode(步进输入);pinMode(DIR\u XPIN,输入);pinMode(DIR_YPIN,输入);//步进模拟器连接中断(4,doXstep,上升);//引脚19(中断4)-上升沿脉冲附加中断(2,doYstep,上升);//引脚21(中断2)-上升沿脉冲中断Y步进//输出PWM限制myPID\u X.设置输出限制(-255,255);myPID_Y.SetOutputLimits(-255,255);//每1ms计算一次输出myPID×SetSampleTime(1);myPID_Y.设置采样时间(1);//设置PID模式myPID\u X.SetMode(自动);myPID_Y.SetMode(自动);//FlexiTimer2 FlexiTimer2::set(1,1.0/1000,doPID)每1ms应用一次PID;FlexiTimer2::start();}void loop(){//Read X和Y轴伺服编码器输入_X=XEncoder.Read();INPUT_Y=YEncoder.read();//计算误差X=(输入X-设定点X);错误_Y=(输入_Y-设定点_Y);//用于调试if(DEBUG_X){ACTUAL_X_MM=INPUT_X/stepm_X;//调试X电机实际位置(单位:mm)(旧\u实际\u X \u mm!=实际X(MM){Serial.print(“实际X(MM):”);Serial.println(实际×毫米);OLD_ACTUAL_X_MM=ACTUAL_X_MM;}//调试位置X编码器if(旧的\u输入\u X!=输入X){Serial.print(“位置X:”);Serial.println(输入X);旧的\u INPUT \u X=输入\u X;}//调试X步进输入if(设定点\u X!=旧设定点{Serial.print(“设定点X:”);Serial.println(设定点X);旧设定点\u X=设定点\u X;}//调试X电机PWM输出if(输出X!=旧的输出{Serial.print(“OUTPUT X:”);Serial.println(输出X);旧的输出if(DEBUG_Y){ACTUAL_Y_MM=INPUT_Y/stepsermm_Y;//调试Y电机实际位置(单位:mm)(旧\u实际\u Y \u mm!=实际Y(MM){Serial.print(“实际Y(MM):”);Serial.println(实际值);OLD_ACTUAL_Y_MM=实际值_Y_MM;}//调试Y步进输入if(设定点\u Y!=旧设定点{Serial.print(“设定点Y:”);Serial.println(设定点Y);旧设定点\u Y=设定点\u Y;}//调试位置Y编码器if(旧\u输入\u Y!=输入Y){Serial.print(“位置Y:”);Serial.println(输入);旧的\u INPUT \u Y=INPUT \u Y;}//调试Y电机PWM输出if(输出Y!=旧的输出{Serial.print(“输出Y:”);Serial.println(输出);旧的输出=输出void doXstep(){if(digitalRead(DIR_XPIN)==高)设定点_X--;else设定点X++;}void doYstep(){if(digitalRead(DIR_YPIN)==高)设定点\u Y--;其他设定值++; } void doPID() { interrupts(); myPID_X.Compute(); myPID_Y.Compute(); if (abs(ERROR_X) < DEADBW_X) // If servo motor X is in position within the deadband width (acceptable error) { motorX.setSpeed(0); // Turn off servo motor X } else { motorX.setSpeed(abs(int(OUTPUT_X))); // Servo motor X is regulated by PID controller ouput } if (abs(ERROR_Y) < DEADBW_Y) // If servo motor Y is in position within the deadband width (acceptable error) { motorY.setSpeed(0); // Turn off servo motor Y } else { motorY.setSpeed(abs(int(OUTPUT_Y))); // Servo motor Y is regulated by PID controller ouput } int directionX; int directionY; if(OUTPUT_X > 0) { directionX = FORWARD; } if(OUTPUT_X < 0) { directionX = BACKWARD; } if(OUTPUT_Y > 0) { directionY = FORWARD; } if(OUTPUT_Y < 0) { directionY = BACKWARD; } motorX.run(directionX); motorY.run(directionY); }

1.本项目使用的库:

  • b brett beauregard(pid_v1)pid:

https://playground.arduino.cc/code/pidlibrary/

https://github.com/br3ttb/arduino-pid-library/

  • Adafruit Motor Shield Library (AFMotor):

https://github.com/adafruit/adafruit-motor-shield -...

  • 正交编码器库:

https://github.com/PaulStoffregen/Encoderhttps://playground.arduino.cc/code/pidlibrary/

  • FlexTimer2库:

https://playground.arduino.cc/Main/FlexiTimer2/

2.正交编码器:

对于读取的编码器,您可以参考我的帖子://www.sledutah.com/3-AXIS-CNC-PLOTTER-...4.

我们应该注意这个词”quadrature encoder“。我们可以通过计算两个通道的上升和下降边缘来增加编码器分辨率。

第7步:GRBL参数

我的CNC的GRBL参数如下:

$0 1.0.000 步骤脉冲时间
$1 25 步闲延迟
$2 0.000 步骤脉冲反转
$3 0.000 Step direction invert
$4 0.000 反转步骤使能引脚
$5 0.000 反转限位销
$6 0.000 反转探针引脚
$10 1 状态报告选项
$11 0.010 交叉口偏差
$12 0.002 电弧公差
$13

0.000

以英寸为单位报告
$20

0.000

软限制使能
$21

0.000

硬限制启用
$22

0.000

归位循环使能
$23

0.000

归位方向反转
$24 25 归位定位进料速率
$25 500.000. 归巢搜索率
$26 250 复位开关反弹跳延迟
$27 1 Homing switch pull-off distance
$30 1000.000 最大主轴速度
$31 0.000 最小主轴速度
$32 0.000 激光模式启用
$100 300.000 X-axis travel resolution
$101. 300.000 Y轴旅行分辨率
$102. 53.333 Z轴移动分辨率
$110 20000.000 X轴最大速率
$111. 20000.000 Y轴最大速率
$112. 2000 Z轴最大速率
$120 20.000 X-axis acceleration
$121. 20.000 Y轴加速度
$122. 1.0.000 Z轴加速度
$130 2.1.0.000 X轴最大行程
$131. 2.97.000 Y-axis maximum travel
$132. 40 Z轴最大行程

上表突出显示了我进行校准的重要参数。

在Arduino Mega 2560计划中,“X4编码" was applied so both the rising and falling edges of channels A and B were counted. My X & Y servo motors have a2.00PPRencoders and they areX4编码值.I have tested on Arduino Mega 2560 serial monitor by commanding X/Y axis to move a specific distance (ex: 10mm) and counting how many pulses feedback from encoder (around 3000 counting pulses for 10mm).

这让我有点奇怪,因为我假设200PPR是X1编码的值,当使用X4编码时,它将编码器分辨率提高了四倍:200x4=800PPR,但这是不正确的。在这种情况下,伺服电机铭牌上的200PPR用于通道A或B的上升和下降边缘。

从理论上讲,Leadscrew驱动系统的步骤/ mm计算如下:

  • 伺服电机编码器:每转200步或每转脉冲。
  • 传动比:60-丝杠齿轮/20-伺服电机齿轮(或3/1)。
  • 铅螺旋间距:2mm。

步骤/ mm =(200 x 3)/ 2 = 300。

第8步:P.I.D Tuning

我的p.i.d根据上一步中的GRBL设置值的最佳参数进行了微调。通过这些价值,我的CNC工作得很好。

// PID参数双kp_x = 10.0;// p for x伺服电机双ki_x = 0.03;// i for x伺服电机双kd_x = 0.02;// d对于X伺服电机双kp_y = 10.0;// y伺服电机P双ki_y = 0.03;// i for y伺服电机双kd_y = 0.02;// d为Y伺服电机

我也申请了“Deadband" function into PID controller. The DC servo motors worked smoothly. They didn't get hot or overheat even if we kept them working continuously in many hours without "死亡带" function.

#define STEPSPERMM_X 300.0 // STEP/mm ($100) is used in the GRBL firmware for DC servo motor X axis. #define DEADBW_X 30.0 // Deadband width in pulses = 30.0 --> Acceptable error for positioning in mm: 0.10mm. #define STEPSPERMM_Y 300.0 // STEP/mm ($101) is used in the GRBL firmware for DC servo motor Y axis. #define DEADBW_Y 30.0 // Deadband width in pulses = 30.0 --> Acceptable error for positioning in mm: 0.10mm.

步骤9:图案填充图像测试

一些测试图像由我的CNC机器执行,如上所示。

本项目使用的软件和扩展:

第十步:结论

Thank you very much for reading my work and hope you enjoyed my article this time!

Box Challenge

Second Prize in the
Box Challenge

是第一个分享

    建议

    • Backyard Contest

      Backyard Contest
    • 暑期趣味:学生设计挑战

      暑期趣味:学生设计挑战
    • arduino.Contest

      arduino.Contest

    16评论

    0
    M.C.兰杰

    6天前

    太棒了!谢谢分享这个好主意!

    0
    Tuenhidiy.

    6天前回复

    非常感谢。

    0
    Xyzaidan.

    9天前

    做得好!谢谢你做出如此彻底的指导。

    0
    Tuenhidiy.

    9天前回复

    谢谢!!!

    0
    Serman Redha

    11天前

    谢谢分享,天才

    0
    Tuenhidiy.

    10天前回复

    谢谢你对我的项目感兴趣。

    0
    Tuenhidiy.

    10天前回复

    谢谢!

    1.
    阿莫特

    小费12天前

    好项目!对于任何one else looking to do this, there's a great library on github called DCServo (https://github.com/misan/dcservo)使用计算机进行PID调整。这样,您可以在每次更改数字时都可以使用值而无需重新加载代码。如果事情进展顺利,我会在学期完成一项类似的项目。

    0
    Tuenhidiy.

    回复12天前

    太好了!谢谢你的信息。

    0
    Tuenhidiy.

    回复12天前

    谢谢!

    0
    Tuenhidiy.

    回复12天前

    是的。它可以画一个圆圈。

    1.
    SmartTronix.

    14天前

    惊人的 -:)

    0
    Tuenhidiy.

    13天前回复

    非常感谢。