1、数字化制造
![08f5d2997ee95b85e0dc889a26aba9f8.png](https://i-blog.csdnimg.cn/blog_migrate/0766e89b3f7bacb6703e40df8467d5f4.png)
前几年,数字化制造很火,挨上这三个字的,都是资本青睐的对象。我记得刚开始入行的时候,单位在申报项目的时候总喜欢在项目书里反复提及这个词,还要在全文的各个地方反复加黑、放大。
我比较迟钝,直至很晚(大概是距离初次接触3、4年后)才理解这个词到底是怎么回事儿。当然,我也不是从概念炒作的角度去理解的,而是回归它的本来 - 技术本质去理解的。
不过说实话,要从技术角度理解“数字化制造”其实蛮困难的。因此本章内容,我尝试用一个比较简单的方式去解释。
这里牵扯到太多的专业知识了,作为通俗科普文章,我把该略的全略了,只保留了让大家能看到技术脉络和思路的内容。专业人员看起来可能不够严谨,它只是一篇科普短文,以精简为义。
2、3D打印使用的 RepRap G-Code简介
![08f5d2997ee95b85e0dc889a26aba9f8.png](https://i-blog.csdnimg.cn/blog_migrate/0766e89b3f7bacb6703e40df8467d5f4.png)
理解数字化要从Gcode开始,我认为这是个捷径。
什么是Gcode?3D打印的Gcode长什么样呢?
GCode是用来描述和控制加工路径的,有时候也叫“G语言”。没错,它是一种计算机语言,是给芯片(计算机、PCB)认的。
G代码非常复杂,像大家常听到的直线插补、圆弧插补、样条插补都属于这个范围。研究领域非常广阔,如果不是这个领域的人员不用了解那么深入。但是,作为3D行业的从业者,我们需要知道它是怎么工作的,特别是在3D打印技术中,它是怎么工作的。也不需要知道细节,知道处理过程就够了。
目前3D打印的G代码,基本上是Marlin风格,它的定义见这里:
《RepRap - Gcode》
https://reprap.org/wiki/G-code
我们来看看:
![41e3604d9f9dfca461f7f642799c9428.png](https://i-blog.csdnimg.cn/blog_migrate/1f54406f99e47c9fd03b5da57418d5c4.png)
就这么两段代码,就能让机器做那么多动作吗?怎么做到的?
3、单独的G代码什么都没用
![08f5d2997ee95b85e0dc889a26aba9f8.png](https://i-blog.csdnimg.cn/blog_migrate/0766e89b3f7bacb6703e40df8467d5f4.png)
“G1 X100 Y120”的意思是移动到(100,120)这个点,怎么做到的呢?喷头的移动是一个物理过程,本质上是电机的运动。这段代码如果要控制电机的运动,那么就要把它转化为电机的运动信号。那么基本架构应该是这样:
![6960cd2e93c3386b754dae8f67102354.png](https://i-blog.csdnimg.cn/blog_migrate/4f6fccee3c3fac887439c2e3f3615cc7.png)
大家在桌面机里看到的电路板,就是中间的那个部分,上面有一块CPU。小型机器的电机驱动也被集成在上面。
步进电机的运动是靠脉冲驱动的:一个脉冲转一个角度。CPU(PCB)通过控制发向电机驱动的脉冲的频率来控制电机的转速,转速通过螺杆将旋转运动转化为直线运动。
这样才能使得系统动作。
4、最重要的其实是PCB怎么解析G Code
![08f5d2997ee95b85e0dc889a26aba9f8.png](https://i-blog.csdnimg.cn/blog_migrate/0766e89b3f7bacb6703e40df8467d5f4.png)
大家一定听过一个词:固件。什么是固件呢?3D打印机里运行在主板上的软件,就是固件,通常用C语言编写。
FDM机器的固件起源于GRBL,它的程序和硬件都是开源的。大家可以搜索和下载它的源代码去研究,当然直接去研究Marlin系统也可以,基于GRBL开发的。
千万不要以为GRBL是唯一的,全世界用的G代码都一样的。但是你要知道,高端机床上千万的价格、低端桌面机床数百数千。他们的区别不只是丝杠、支撑架构这些硬件上的,更重要的还有固件。世界上有很多很多固件,有好有坏,每个厂家可能都有自己的固件,独有的技术往往就集成在这里面。
我把GRBL解析Gcode的一部分代码和注释截出来了,像这样:
![d4aed51891d03d6abe35f67b27aec5b4.png](https://i-blog.csdnimg.cn/blog_migrate/979af8ecab5c1dadb866fd945b7da0ab.jpeg)
还有这样:
![01d1c60b78d890e05bb75c1b32ba2eb5.png](https://i-blog.csdnimg.cn/blog_migrate/82d65a88ffaf6b8df99bbfac063e77de.jpeg)
很长,有兴趣自己慢慢把GRBL下载来研究,我们把最重要的地方翻译一下:
The Stepper Driver Interrupt" - This timer interrupt is the workhorse of Grbl. Grbl employs the venerable Bresenham line algorithm to manage and exactly synchronize multi-axis moves. Unlike the popular DDA algorithm, the Bresenham algorithm is not susceptible to numerical round-off errors and only requires fast integer counters.
不手动翻了,直接上google大家也能看懂:“步进驱动器中断”-此定时器中断是Grbl的主力军。Grbl使用古老的Bresenham线算法来管理和精确同步多轴运动。与流行的DDA算法不同,Bresenham算法不易受数字舍入误差的影响。
这里提到了DDA和Bresenham。
注意:理解它们俩,基本上最核心的那点东西也就懂了。
5、Bresenham算法与DDA算法
假设有这样的装置:
![9265020f459fdea83156dfef6cf0c58a.png](https://i-blog.csdnimg.cn/blog_migrate/3875b4b77cab4ef25ac84884c65473af.png)
有两个滑块分别位于X轴和Y轴上,移动两个滑块我们就能在XY平面上得到很多点。假如现在让你用一只手分别拨动这两个滑块,在XY平面上画一条直线L。方程是:
Y = 5X + 10
请问你会怎么做?
做法很简单:X每拨1个单位长度,然后停下来,Y拨5个单位长度。
所以最终的曲线是“折线”,是一条近似直线。当然这条近似直线可以做的非常光滑:比如X每次移动5微米,Y每次移动25um。宏观上肉眼察觉不到它是锯齿状的。
所以我们对这一条直线的处理,有两种方法。
第一种:标记像素法(DDA)
![e81f74dcf591b011015aeba5e0ce0a4a.png](https://i-blog.csdnimg.cn/blog_migrate/75d4ff633e519d2ba999edb4fb2d2b93.png)
第二种:近似法(Bresenham)
![e5268d2f463798a26cb513638928470f.png](https://i-blog.csdnimg.cn/blog_migrate/8e9948ae38d81c995dfe5c51fcfabd7e.png)
6、Gcode的解析过程
![08f5d2997ee95b85e0dc889a26aba9f8.png](https://i-blog.csdnimg.cn/blog_migrate/0766e89b3f7bacb6703e40df8467d5f4.png)
上面看到的GRBL代码截图,哪些代码是C语言写的。写好了这个程序之后,就跟手机刷系统一样,通过数据线把它烧到PCB上,CPU就可以执行了。
那么解析的过程呢?主要是这样:
Gcode被以字符串的形式发到PCB上,PCB把里面的G、X、Y、E这些标记字母全部去掉(字符串处理函数),留下有意义的数值。
比如:
G1 X10 Y60 F3600
G1 X30 Y50
这两行读进去以后,(10,60)、(30,50)这两个点将确定一条线,用上面的Bresenham算法,转化为X、Y电机运动的脉冲。CPU负责产生脉冲,经电路发给电机驱动器。
F3600将被解析成脉冲频率,这中间将需要电机的步进角(一个脉冲转多少度)、同步带或者丝杠的螺距等等进行转换。
那么类似加热怎么办呢?加热指令(一般M是指令)将被解析成一个开关信号(如5v电压信号)给加热棒的开关。
怎么发形成脉冲呢?以Arduino为例,生成脉冲的C代码是这样:
void pause(int num){for (int count = 0; count < num; count++) {for (int i = 5; i > 1; i--) { digitalWrite(8, HIGH); delay(30); #注意这里的30 digitalWrite(8, LOW); } }}
这个digitalWrite(8, HIGH)的作用,就是把6号管脚的电压设置成5v(HIGH),间隔30ms以后设置成低电压(LOW),不断循环重复这个过程,一会儿高、一会儿低,这就是脉冲,就能发给步进电机了,让它转动。
调整高低脉冲之间的间隔,例如把30ms设置成100ms,频率就低了,相应的电机转速慢了,喷头也就移动的慢了。
![73b13b871213dfc2b3aa0977dce9a18d.png](https://i-blog.csdnimg.cn/blog_migrate/d6ab66218e45d396afbf355e30a6136b.jpeg)
平常大家见到的主板上集成了步进电机的驱动。
7、你以为基于振镜的激光3D打印扫描方法有什么不同吗?
![08f5d2997ee95b85e0dc889a26aba9f8.png](https://i-blog.csdnimg.cn/blog_migrate/0766e89b3f7bacb6703e40df8467d5f4.png)
激光3d打印像SLM、SLA、SLS这些使用振镜的,有X、Y两个振动电机。振动电机也是靠脉冲运动的,一个脉冲振一点点。所以只要底层固件解析合适,用GCODE完全可以控制振镜。
甚至我们可以自己构建自己的代码,自己设计主板解析它们,比如:
J X100 Y200 D10 S600
这个代码的意思可以这么定义:
跳空(Jump,激光关闭)到(100,200)点,延迟(Delay)10ms,速度(Speed)600mm/s。
PCB板接收到这段代码,就会跟上面的FDM一样,去解析成振镜的运动脉冲、激光器的启闭信号(高低电压)、延迟信号。
所以你看,使用什么样的代码格式并不重要,最重要的是在固件端你怎么解析它,把它转化为动作部件的运动信号。
8、Gcode的解析和Gcode的生成
![08f5d2997ee95b85e0dc889a26aba9f8.png](https://i-blog.csdnimg.cn/blog_migrate/0766e89b3f7bacb6703e40df8467d5f4.png)
Gcode能解析了,那么还有个问题:Gcode怎么来?
在FDM中,我们用Cura等软件切片填充而来。填充软件上层还有个设计软件,比如Solidworks、UG、犀牛等等。
有读者后台问过我在哪里找关于切片、填充的知识,在3D打印技术上,领域上有着极其明显的分野:
设计、切片、填充 :属于计算机图形学内容
Gcode解析 :属于嵌入式
所以我告诉他,填充相关的技术和知识得去计算机图形学领域里寻找,在3d打印界,很难找到。这里我推荐几个Python图形库,大家可以看看图形处理是怎么实现的。这个内容跟当下的人脸识别、图形填充、修复都有关系,研究起来没完没了。
* python几何网络处理程序1:[vtkplotter](https://vtkplotter.embl.es/content/vtkplotter/)* python几何网络处理程序2:[Pymesh](https://pymesh.readthedocs.io/en/latest/index.html)* python几何库3:[shapely](https://www.osgeo.cn/shapely/)* python几何库4:[turtle](https://docs.python.org/zh-cn/3.7/library/turtle.html)* python几何库5:[openmesh](http://www.openmesh.org/)* Cura开发介绍:[Cura PPA](https://thopiekar.eu/cura/ppa/)* Cura CDK:[cura cdk](https://thopiekar.eu:5443/cura/cdk/)* 非免费图形处理库:Autodesk Dynamo* 计算几何:开源几何计算数学库:[开源计算几何库](https://blog.csdn.net/dfdfdsfdfdfdf/article/details/52105952)
我就觉得Cura Engine使用的图形库不够好,虽然它简单,但是处理之后的路径通常非常莫名其妙,而且无理数的舍入处理的真不是一般的差。
9、再看数字化制造
![08f5d2997ee95b85e0dc889a26aba9f8.png](https://i-blog.csdnimg.cn/blog_migrate/0766e89b3f7bacb6703e40df8467d5f4.png)
现在回过头再看数字化制造,终于有点眉目了。不管一个系统是不是用了Gcode,或者用了Hcode、Xcode,它们都是通过定义运动、动作,再使用芯片+固件的形式解析成硬件的动作而实现的。
所谓的数字化,在下面这半部分确实体现的淋漓尽致:所有的信号都通过CPU处理,转换为数字信号控制电机、开关等硬件的动作。
这是下半部分,下半部分这些东西我们叫“下位机”。
上半部分怎么办呢?怎么得到 某Code 呢?我们管这部分叫“上位机”。
数字化制造只讲下面半部分肯定是不行的,还要讲全上半部分。
受篇幅的限制,这部分内容我们放在下次。