给数控铣DIY刚性攻丝功能:修订间差异

来自工场百科
标签visualeditor
标签visualeditor
 
(未显示同一用户的11个中间版本)
第1行: 第1行:
[[文件:刚性攻丝高速摄影.gif|无|缩略图|Rigid Tapping!!!]]
[[文件:刚性攻丝高速摄影中的一帧.jpg|无|缩略图|刚性攻丝高速摄影中的一帧,可以用于推送题图]]
==Intro==
==Intro==
我们都在金工实习时学过攻丝(Tapping),就是用一个带有螺纹形切削刃的工具在工件上切出螺纹来。做内螺纹的工具叫丝锥,做外螺纹的叫板牙。
我们都在金工实习时学过攻丝(Tapping),就是用一个带有螺纹形切削刃的工具在工件上切出螺纹来。做内螺纹的工具叫丝锥,做外螺纹的叫板牙。
[[文件:12Tapping copper nut.JPG|无|缩略图|用T形扳手和丝锥攻丝]]
[[文件:12Tapping copper nut.JPG|无|缩略图|用T形扳手和丝锥攻丝]]
与手工工作相比,数控机床在批量制造零件时具有较高的效率和一致性。数控铣床自动攻丝(Rigid Tapping)的过程有三步:主轴正转将丝锥旋入预先钻好的孔,到达预定深度后主轴停止,最后反转将丝锥退出工件。
与手工工作相比,数控机床在批量制造零件时具有较高的效率和一致性。数控铣床刚性攻丝(Rigid Tapping)的过程有三步:主轴正转将丝锥旋入预先钻好的孔,到达预定深度后主轴停止,最后反转将丝锥退出工件。
[[文件:Milling-machine-spindle-rigid-tapping-2.jpg|无|缩略图|自动攻丝(Rigid Tapping)过程示意]]
[[文件:Milling-machine-spindle-rigid-tapping-2.jpg|无|缩略图|刚性攻丝(Rigid Tapping)过程示意]]
值得注意的是,丝锥在工件内时,包括中间的减速和反转,Z轴的平动和主轴的转动要同步:主轴转一圈,Z轴运动一个螺距,不然丝锥分分钟断给你看。这就需要一个传感器不停地给数控系统报告主轴的转动角度,一般我们会用光电编码器或者磁编码器。正因为多了这么个传感器,数控机床厂就有理由把自动攻丝当作一个高附加值的Feature,能够自动攻丝的数控铣要贵很多。我手上的小破数控铣就没有这个功能,经过一番调研,我决定DIY一个光电编码器。
值得注意的是,丝锥在工件内时,包括中间的减速和反转,Z轴的平动和主轴的转动要同步:主轴转一圈,Z轴运动一个螺距,不然丝锥分分钟断给你看。这就需要一个传感器不停地给数控系统报告主轴的转动角度,一般我们会用光电编码器或者磁编码器。正因为多了这么个传感器,数控机床厂就有理由把刚性攻丝当作一个高附加值的Feature,能够刚性攻丝的数控铣要贵很多。实验室的小破数控铣就没有这个功能,经过一番调研,我决定DIY一个光电编码器。


可能有同学想问,主轴的转速不是预先设定好的吗?按照转速移动Z轴不就行了?嘿嘿,我想说,有个东西叫累计误差(或者积分误差、累积误差,随你怎么叫),而且中间的加减速过程不好解决。
可能有同学想问,主轴的转速不是预先设定好的吗?按照转速移动Z轴不就行了?嘿嘿,我想说,有个东西叫累计误差(或者积分误差、累积误差,随你怎么叫),而且中间的加减速过程不好解决。
第12行: 第16行:
=== 关于光电编码器 ===
=== 关于光电编码器 ===
正交光电旋转编码器(Optical Quadrature Rotary Encoder)由三个红外对射光电传感器和一个码盘组成。码盘圆周上有等分的空缺,光电传感器会因为空缺打通了光路而发出信号。
正交光电旋转编码器(Optical Quadrature Rotary Encoder)由三个红外对射光电传感器和一个码盘组成。码盘圆周上有等分的空缺,光电传感器会因为空缺打通了光路而发出信号。
[[文件:Encoder.jpg|无|缩略图|一个只有AB相的编码器,这种编码器无法测量绝对角位移。]]
[[文件:正交光电旋转编码器正在工作.gif|无|缩略图|这是完成后的主轴编码器。左上的锯片被当作镜子,用来看到B相传感器的指示灯。Z相传感器比另外两个要靠近中心,所以只有那个较深的缺口能触发它。]]
我们把三个光电传感器分别叫做A、B和Z。A和B的光路放置在等分空缺经过的圆周上,相位差为90°或-90°(“正交”即为此意)。Z的光路放置在码盘一周唯一的空缺会经过的圆周上,给每一圈旋转确定起始位置。这样,主轴旋转时A、B、Z的输出信号应该长这样儿:
我们把三个光电传感器分别叫做A、B和Z。A和B的光路放置在等分空缺经过的圆周上,相位差为90°或-90°(“正交”即为此意)。Z的光路放置在码盘一周唯一的空缺会经过的圆周上,给每一圈旋转确定起始位置。这样,主轴旋转时A、B、Z的输出信号应该长这样儿:
[[文件:Incremental pulse-diagrama-b-z.jpg|无|缩略图|正交信号。/A、/B、/Z分别是A、B、Z取反。]]
[[文件:Incremental pulse-diagrama-b-z.jpg|无|缩略图|正交信号。/A、/B、/Z分别是A、B、Z取反。]]
这样,我们不仅可以从信号脉冲的个数中推断主轴的角位移,还可以从AB相的相位差中推测主轴的旋转方向。
这样,我们不仅可以根据信号脉冲的个数推断主轴的角位移,还可以根据AB相的相位差推测主轴的旋转方向。


调研后我决定使用欧姆龙的EE-SX-677-WR/EE-SX-676-WR传感器,并且把码盘安装在主轴上方,也就是这里:
调研后我决定使用欧姆龙的EE-SX-677-WR/EE-SX-676-WR传感器,并且把码盘安装在主轴上方,也就是这里:
 
[[文件:Where-spindle-encoder-will-be-installed.jpg|无|缩略图|即将安装主轴编码器的地方]]
【图】
 
因为这篇文章是事后诸葛亮,图里可以看见大螺母上已经被我做了两个M4的螺纹孔,用于安装码盘。
因为这篇文章是事后诸葛亮,图里可以看见大螺母上已经被我做了两个M4的螺纹孔,用于安装码盘。


=== 测量尺寸 ===
=== 测量尺寸 ===
从上图可以看出安装编码器的位置比较狭小,要用游标卡尺测出各个需要的尺寸非常困难,所以这里我们使用试错法:画一个模板,用天空工场的激光切割机做出来,与实物比对后调整尺寸:
从上图可以看出安装编码器的位置比较狭小,要用游标卡尺测出各个需要的尺寸非常困难,所以这里我们使用试错法:画一个模板,用天空工场的激光切割机做出来,与实物比对后调整尺寸:
 
[[文件:切光电编码器模板.gif|无|缩略图|用天空工场的激光切割机切模板]]
【切割视频】
 
试了几次后,终于做出了正确的模板。模板装上以后长这样儿:
试了几次后,终于做出了正确的模板。模板装上以后长这样儿:
 
[[文件:How-it-looks-like-when-the-correct-template-is-installed.jpg|无|缩略图|尺寸正确的模板装上以后应该长这样儿]]
【图】
 
于是我们的设计有了一个草图做参照。用自顶向下设计方法的语言来讲,这个草图就是设计的骨架(Skeleton)
于是我们的设计有了一个草图做参照。用自顶向下设计方法的语言来讲,这个草图就是设计的骨架(Skeleton)
 
[[文件:主轴编码器骨架草图.PNG|无|缩略图|主轴编码器骨架草图]]
【图】


==Making==
==Making==


=== 机械部分 ===
=== 机械部分 ===
完成后的CAD模型如下:
[[文件:主轴编码器CAD模型.gif|无|缩略图|完成后的CAD模型。因为使用了参数化的设计方法,作出的修改能够立刻传播到整个模型。]]
找了一块尺寸合适的不锈钢板,把它做成了编码器底座。这块不锈钢板是天空工场2018年女生节礼物iPhone X里的配重。(什么?工场女生节送iPhone X?iPhone包装盒里有配重?)
[[文件:主轴编码器基板.jpg|无|缩略图|这个底座使用即将安装编码器的铣床加工而成。这种自己加工自己零件的过程叫什么来着?自举?(抱歉加工过程没有录下来)]]
码盘是用3mm厚亚克力板经激光切割而成。[[文件:切光电编码器码盘.gif|无|缩略图|用天空工场的激光切割机做码盘]]
经过一些比较,最终选用了一圈9个脉冲(9 Pulses per Revolution)的码盘,这样AB相传感器的相位差最接近±90°,并且脉冲频率不至于过高。
机械部分全部安装好是这个样子的:
[[文件:主轴编码器机械部分完成图.jpg|无|缩略图|装好长这样儿]]


=== 电气部分 ===
=== 电气部分 ===
欧姆龙EE-SX677-WR的原理图如下:
[[文件:EE-SX677-WR IO Circuit diagram.jpg|无|缩略图|EE-SX677-WR原理图]]
可以看出把Load替换成几个kΩ的上拉电阻就可以将OUT线接到电脑并口的引脚上了(当然,电源也是要接的)。随手拿洞洞板做了个电路,装进机床的控制柜:
[[文件:主轴编码器临时接线板.jpg|无|缩略图|用洞洞板随便搭的电路]]


=== 数控系统 ===
=== 数控系统 ===
小破铣床的数控系统是用[http://linuxcnc.org/ LinuxCNC]自制的。LinuxCNC本质上就是一个实时版的Simulink或Labview,但模块之间的连接不是图形化的表示,而是用一种叫'''H'''ardware '''A'''bstraction '''L'''ayer的语言描述。在LinuxCNC的配置文件中加入以下HAL代码:<syntaxhighlight lang="bash">
#添加一个encoder实时模块,并把这个实例命名为spindle-encoder
loadrt encoder names=spindle-encoder
#按照文档指示将所有encoder实例的这两个函数添加到对应的实时线程中
addf encoder.update-counters base-thread #base-thread是一个执行周期为25μs的线程
addf encoder.capture-position servo-thread #servo-thread是一个执行周期为1ms的线程
#设置spindle-encoder实例的一些参数
setp spindle-encoder.position-scale 36 #因为x4-mode是1(true),码盘一周9个周期,所以这里是9×4=36
setp spindle-encoder.x4-mode 1
#将该连的信号连上
net spindle-a parport.0.pin-15-in => spindle-encoder.phase-B #并口15脚输入到spindle-encoder的B相
net spindle-b parport.0.pin-13-in => spindle-encoder.phase-A #并口13脚输入到spindle-encoder的A相
net spindle-z parport.0.pin-12-in-not => spindle-encoder.phase-Z #并口12脚取反后输入到spindle-encoder的Z相
#motion是LinuxCNC中执行G代码、协调机床运动的模块,按照文档连接信号使motion知道主轴的位置和转速
net spindle-index-enable spindle-encoder.index-enable motion.spindle-index-enable
net spindle-revs spindle-encoder.position => motion.spindle-revs
net spindle-true-speed spindle-encoder.velocity => motion.spindle-speed-in
</syntaxhighlight>


==Outcome==
==Outcome==
让主轴以1500转每分钟的速度正转,在LinuxCNC的虚拟示波器中看到各个信号的波形是这样的:
[[文件:LinuxCNC虚拟示波器中查看主轴编码器波形.png|无|缩略图|主轴转速为1500转每分钟时的编码器信号]]
攻M6×1螺纹的效果就是题图的动画啦,这是用实验室的高速摄像机以725帧每秒的帧率拍摄的。想看完整高清的攻丝过程慢动作可以移步[http://v.youku.com/v_show/id_XMzUzNDMyMTQyMA==.html 优酷网]。[[文件:刚性攻丝高速摄影.gif|无|缩略图|Rigid Tapping!!!]]

2018年4月12日 (四) 23:24的最新版本

Rigid Tapping!!!
刚性攻丝高速摄影中的一帧,可以用于推送题图

Intro

我们都在金工实习时学过攻丝(Tapping),就是用一个带有螺纹形切削刃的工具在工件上切出螺纹来。做内螺纹的工具叫丝锥,做外螺纹的叫板牙。

用T形扳手和丝锥攻丝

与手工工作相比,数控机床在批量制造零件时具有较高的效率和一致性。数控铣床刚性攻丝(Rigid Tapping)的过程有三步:主轴正转将丝锥旋入预先钻好的孔,到达预定深度后主轴停止,最后反转将丝锥退出工件。

刚性攻丝(Rigid Tapping)过程示意

值得注意的是,丝锥在工件内时,包括中间的减速和反转,Z轴的平动和主轴的转动要同步:主轴转一圈,Z轴运动一个螺距,不然丝锥分分钟断给你看。这就需要一个传感器不停地给数控系统报告主轴的转动角度,一般我们会用光电编码器或者磁编码器。正因为多了这么个传感器,数控机床厂就有理由把刚性攻丝当作一个高附加值的Feature,能够刚性攻丝的数控铣要贵很多。实验室的小破数控铣就没有这个功能,经过一番调研,我决定DIY一个光电编码器。

可能有同学想问,主轴的转速不是预先设定好的吗?按照转速移动Z轴不就行了?嘿嘿,我想说,有个东西叫累计误差(或者积分误差、累积误差,随你怎么叫),而且中间的加减速过程不好解决。

Planning

关于光电编码器

正交光电旋转编码器(Optical Quadrature Rotary Encoder)由三个红外对射光电传感器和一个码盘组成。码盘圆周上有等分的空缺,光电传感器会因为空缺打通了光路而发出信号。

这是完成后的主轴编码器。左上的锯片被当作镜子,用来看到B相传感器的指示灯。Z相传感器比另外两个要靠近中心,所以只有那个较深的缺口能触发它。

我们把三个光电传感器分别叫做A、B和Z。A和B的光路放置在等分空缺经过的圆周上,相位差为90°或-90°(“正交”即为此意)。Z的光路放置在码盘一周唯一的空缺会经过的圆周上,给每一圈旋转确定起始位置。这样,主轴旋转时A、B、Z的输出信号应该长这样儿:

正交信号。/A、/B、/Z分别是A、B、Z取反。

这样,我们不仅可以根据信号脉冲的个数推断主轴的角位移,还可以根据AB相的相位差推测主轴的旋转方向。

调研后我决定使用欧姆龙的EE-SX-677-WR/EE-SX-676-WR传感器,并且把码盘安装在主轴上方,也就是这里:

即将安装主轴编码器的地方

因为这篇文章是事后诸葛亮,图里可以看见大螺母上已经被我做了两个M4的螺纹孔,用于安装码盘。

测量尺寸

从上图可以看出安装编码器的位置比较狭小,要用游标卡尺测出各个需要的尺寸非常困难,所以这里我们使用试错法:画一个模板,用天空工场的激光切割机做出来,与实物比对后调整尺寸:

用天空工场的激光切割机切模板

试了几次后,终于做出了正确的模板。模板装上以后长这样儿:

尺寸正确的模板装上以后应该长这样儿

于是我们的设计有了一个草图做参照。用自顶向下设计方法的语言来讲,这个草图就是设计的骨架(Skeleton)

主轴编码器骨架草图

Making

机械部分

完成后的CAD模型如下:

完成后的CAD模型。因为使用了参数化的设计方法,作出的修改能够立刻传播到整个模型。

找了一块尺寸合适的不锈钢板,把它做成了编码器底座。这块不锈钢板是天空工场2018年女生节礼物iPhone X里的配重。(什么?工场女生节送iPhone X?iPhone包装盒里有配重?)

这个底座使用即将安装编码器的铣床加工而成。这种自己加工自己零件的过程叫什么来着?自举?(抱歉加工过程没有录下来)

码盘是用3mm厚亚克力板经激光切割而成。

用天空工场的激光切割机做码盘

经过一些比较,最终选用了一圈9个脉冲(9 Pulses per Revolution)的码盘,这样AB相传感器的相位差最接近±90°,并且脉冲频率不至于过高。

机械部分全部安装好是这个样子的:

装好长这样儿

电气部分

欧姆龙EE-SX677-WR的原理图如下:

EE-SX677-WR原理图

可以看出把Load替换成几个kΩ的上拉电阻就可以将OUT线接到电脑并口的引脚上了(当然,电源也是要接的)。随手拿洞洞板做了个电路,装进机床的控制柜:

用洞洞板随便搭的电路

数控系统

小破铣床的数控系统是用LinuxCNC自制的。LinuxCNC本质上就是一个实时版的Simulink或Labview,但模块之间的连接不是图形化的表示,而是用一种叫Hardware Abstraction Layer的语言描述。在LinuxCNC的配置文件中加入以下HAL代码:<syntaxhighlight lang="bash">

  1. 添加一个encoder实时模块,并把这个实例命名为spindle-encoder

loadrt encoder names=spindle-encoder

  1. 按照文档指示将所有encoder实例的这两个函数添加到对应的实时线程中

addf encoder.update-counters base-thread #base-thread是一个执行周期为25μs的线程 addf encoder.capture-position servo-thread #servo-thread是一个执行周期为1ms的线程

  1. 设置spindle-encoder实例的一些参数

setp spindle-encoder.position-scale 36 #因为x4-mode是1(true),码盘一周9个周期,所以这里是9×4=36 setp spindle-encoder.x4-mode 1

  1. 将该连的信号连上

net spindle-a parport.0.pin-15-in => spindle-encoder.phase-B #并口15脚输入到spindle-encoder的B相 net spindle-b parport.0.pin-13-in => spindle-encoder.phase-A #并口13脚输入到spindle-encoder的A相 net spindle-z parport.0.pin-12-in-not => spindle-encoder.phase-Z #并口12脚取反后输入到spindle-encoder的Z相

  1. motion是LinuxCNC中执行G代码、协调机床运动的模块,按照文档连接信号使motion知道主轴的位置和转速

net spindle-index-enable spindle-encoder.index-enable motion.spindle-index-enable net spindle-revs spindle-encoder.position => motion.spindle-revs net spindle-true-speed spindle-encoder.velocity => motion.spindle-speed-in </syntaxhighlight>

Outcome

让主轴以1500转每分钟的速度正转,在LinuxCNC的虚拟示波器中看到各个信号的波形是这样的:

主轴转速为1500转每分钟时的编码器信号

攻M6×1螺纹的效果就是题图的动画啦,这是用实验室的高速摄像机以725帧每秒的帧率拍摄的。想看完整高清的攻丝过程慢动作可以移步优酷网

Rigid Tapping!!!