给数控铣DIY刚性攻丝功能

来自工场百科
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!!!