热门标签: 松湖塑机3D打印机3D打印产品开发3D打印机3D打印煎饼
发贴
投稿
 3D打印教程
当前位置: 首页 > 教程 > 3D打印教程 > 正文

【打印虎原创】RepRap_Prusa_i3_3D打印机固件Marlin_firmware配置

发布时间:2014-10-06 09:21 来源:打印虎 作者: 打印虎 点击: 我要评论 条评论)

本文转载至“打印虎网站“,是打印虎精心制作的教程,希望各位喜欢。原文链接:http://www.dayinhu.com/tutorial/431.html




上次打印虎介绍了Repetier-firmware的配置方法(见【打印虎原创】Repetier-firmware深度配置图解教程),一部分网友表示抗议,表示自己使用的是Marlin固件,看那个文档有很多地方对不上。没关系,打印虎今天这篇文章,就详细解说了Marlin firmware的配置方法。希望大家喜欢。

Marlin固件和Repetier-firmware固件类似,都由原始的Sprinter固件派生而来。Sprinter固件已经超过1年没有人维护了,但Marlin和Repetier-firmware目前(2014年9月)仍然非常活跃,是国内用户很常用的两款固件。实际上相比于Repetier-firmware,Marlin的使用更加普遍。对于常见的3D打印机控制软件Cura来说,Marlin固件兼容程度也更高。虽然有人报告说Marlin在打印过程中有很小的机会会出现计算溢出错误,但它毕竟是更加通用的固件,这种问题一定会很快被修正。

Marlin固件的github地址,在https://github.com/ErikZalm/Marlin,我写这篇文章的时候,最新的版本是2014年8月30日提交的1d62309,如图。

打印虎教程,RepRap,3D沙虫网



我们就在这个版本的基础上,说明如何对它进行配置,让它在你的3D打印机上转起来。

第一节,准备环境

想使用Marlin,首先第一步是把它从github上下载下来。完成这一步很简单,打开上面给出的github地址,可以看到页面右侧栏最下面的一个按钮打印虎教程,RepRap,3D沙虫网


。按下这个按钮就可以把整个源代码ZIP包下载下来了。如果怕麻烦,也可以直接从这里下载(打印虎本地下载百度云下载)。

编译、上传这套源代码到3D打印机,需要Arduino环境的支持。Arduino环境如何使用,我们就不详细介绍了。目前Arduino的最新版本,是1.0.5 r2版,只要下载、安装好这个版本的Arduino环境,把Marlin源代码包载入,应该就可以编译成功了。如果你还没有安装Arduino,可以从这里下载(打印虎本地下载百度云下载)。当然,对于使用不同硬件的朋友,Arduino的设置会稍有不同。

Marlin的缺省配置,是针对Ultimaker的。因此如果你用的是Arduino Mega 2560或者兼容的电路板,那么不需要做任何事情了,在菜单Tools-Board中选择Arduino Mega 2560 or Mega ADK,然后按下工具栏最左边的对勾按钮“Verify”,就可以完成编译了。如下图。

打印虎教程,RepRap,3D沙虫网

但如果你和我一样,使用的电路板是Melzi,那你需要先把Marlin压缩包中解压出来的文件夹Marlin-Marlin_v1\ArduinoAddons\Arduino_1.x.x\hardware\Sanguino拷贝到Arduino下面。我的Arduino安装在C:\Program files (x86)下面,因此要拷贝到这个目录:C:\Program Files (x86)\Arduino\hardware\Sanguino。

重新启动Arduino,菜单Tools-Board下面会出现几项Sanguino相关的选项。对于Melzi来说,选择Sanguino W/ATmega1284p 16mhz就对了。

在Arduino环境中选择好主板之后,还要在源代码的配置文件Configuration.h中进行对应的修改。找到

#define MOTHERBOARD 7

这一行,将数字7改为63,根据上面的注释,这样就把目标主板型号从缺省的Ultimaker改为Melzi。全部搞定之后,同样是按下工具栏最左边的对勾按钮“Verify”,就可以完成编译了。如下图。

打印虎教程,RepRap,3D沙虫网



确认编译没有问题之后,我们把3D打印机打开,把USB线连好,确认驱动程序已经安装好了,并且3D打印机所在的串口号我们已经知道了(比如我这里是COM3),就使用菜单Tools-Serial Port,配置好3D打印机所在的端口。

打印虎教程,RepRap,3D沙虫网



端口也配置好之后就可以进行上传,也就是刷固件。按下工具栏的Upload按钮,等一会,上传工作就完成了。完成上传时,可以看到消息栏上面的提示(红圈中)Done uploading。如果出了问题,检查一下窗口的右下角,看看电路板类型和端口号是否都选对了。

打印虎教程,RepRap,3D沙虫网



如果一切顺利,现在固件就已经刷入3D打印机了。下一步我们就用Printrun手动测试3D打印机,观察固件是否能够正常工作。看到这里有朋友要问了,Repetier-Host也有手动控制功能,为什么用Printrun而不是Repetier-host呢?这是因为Repetier-Host和Repetier-firmware在普通3D打印机协议的基础上,增加了些特别的东西。这一方面当然是两者配合更加好用了,但另一方面兼容性就打了折扣。为了保证我们的操作不被奇怪的问题打扰,我认为还是用最普通最规范的软件来测试是最好的。基于这样的原因,我会使用Printrun进行下面的测试工作。最新版的Printrun可以从这里下载(打印虎本地下载百度云下载)。

在Printrun的主界面上,选择好端口(Port),波特率(@后面的数字,Marlin缺省是250000,这和其他的固件比如Repetier-Host可能不同)之后,按下连接(Connect),等一会,右侧信息窗口内就会出现PC与3D打印机之间的通信信息。从下图可以看到,我们成功的连接了PC和3D打印机,但3D打印机不能正常工作,原因是达到了挤出头的最大温度MAXTEMP!可现在明明是室温啊,这是为什么呢?想一想,应该还是配置的原因。估计是由于挤出头温度传感器的配置,导致3D打印机误以为现在达到了很高的温度,强制停机了。

打印虎教程,RepRap,3D沙虫网



既然这样,我们第一轮的初始试验就只能到这里为止了。我们完成了PC和3D打印机之间的连接,但很遗憾3D打印机完全不能工作。下面,让我们开始研究配置文件,争取让3D打印机尽快工作起来。

第二节,基础配置

如果你对3D打印机固件配置有些经验,或者读过我们之前的Repetier-firmware配置教程,你就会知道对于一台3D打印机而言最关键的几项配置,都是关于3D打印机基础硬件的。这些配置项目如果没有正确配置,3D打印机很可能完全不能工作。其他配置项目就不是那么关键了,即使配置有些问题,也是局部问题,顶多是某个功能不能正常工作,不影响3D打印机的整体。

其他下面的表格列出了最重要的基础配置项目。与这个表格类似的内容,曾经在Repetier-firmware的配置教程中出现过,我再把它列在这里,以强调这个表格的重要性。

编号 项目 说明
1 主板 一定要改为自己使用的主板类型
2 XYZ轴长度 应该改为实际的尺寸
3 XYZ轴步进电机分辨率 重要,一定要根据自己使用的步进电机参数以及打印机的机械设计进行修改
4 限位开关的连接方式 按照实际情况选择选项
5 挤出头步进电机分辨率 同上,要根据具体情况修改
6 挤出头步进电机方向 有些机械设计方案,需要步进电机反向运行
7 挤出头温度感应器 要根据具体情况修改
8 热床温度感应器 要根据具体情况修改

相比于其他固件,我认为Marlin的一个特色,就是它的配置文件Configuration.h有相当好的结构。从主到次,每个模块相关的参数都放在一个段落中,这本身就为我们对3D打印机的配置工作提供了很好的线索。下面,我们就从这个配置文件出发,逐步配置好整个3D打印机。当然,在这一节里,我们还是把精力集中在最基础的配置项上。

从开始看Configuration.h文件,最开始的两行非注释(在C语言里,注释由//开始,因此所有的以//开始的行都是注释,不会影响到代码的行为)行,指明了固件的版本和作者。

#define STRING_VERSION_CONFIG_H __DATE__ " " __TIME__ #define STRING_CONFIG_H_AUTHOR "(none, default config)"

可以看出,缺省的版本号就是编译的日期和时间,这个就不用改动了。我们只要把第二行作者,一对引号里面的内容,改为自己的名字就好了。为了避免麻烦,就不要用中文了,还是写拼音就好:

#define STRING_CONFIG_H_AUTHOR "www.dayinhu.com"

接下来,为了让3D打印机和PC机顺利通讯,要定义好串行口的端口号和波特率。串口号不是指PC端的串口号,而是3D打印机端的串口号,因此保持缺省的0就对了。Marlin的缺省波特率是250000,这不是一个标准的ANSI标准波特率,如果你的PC端不支持这个波特率,需要修改到一个标准的ANSI波特率值,比如115200。经过试验,我的PC机支持这个波特率是没有问题的,所以我就不修改了:

#define SERIAL_PORT 0 #define BAUDRATE 250000

再下来就是选择3D打印机主板种类了,其实第一节我们已经修改过这个值。因为不同的硬件,决定了不同的接口名称、数量,所以如果这个值和Arduino环境中定义的硬件类型不匹配,就会导致编译不通过。因为硬件的种类很多,这里不建议通过试验的方法确定,比较靠谱的方法还是向卖家咨询。我这里使用的是Melzi电路板,因此这几行要被改为这样:

#ifndef MOTHERBOARD #define MOTHERBOARD 63 #endif

再往下还有两个选项,分别定义了挤出头的个数和电源种类。我的3D打印机就只有一个挤出头,用的电源也是普通电源,因此这两个选项就保持原样不变了:

#define EXTRUDERS 1 #define POWER_SUPPLY 1

到此为止,Configuration.h配置文件的第一段我们已经完成了。这些设置,是3D打印机硬件最基础的一组设置。对应到上面的表格,这里解决的主要问题,就是上面表格中(1)主板类型的问题。这里处理好了之后,我们继续往下看配置文件。

第三节,温度控制与温度感应

Configuration.h配置文件的下面一段,是关于加热与温度感应的设置。开始的一组设置,是关于温度感应器的。根据代码上面的注释,可以看出这里既可以使用温度测量芯片,也可以使用热敏电阻。虎哥我自己的经验,目前的3D打印机主要使用热敏电阻,没见过使用高级的温度测量芯片的情况。在使用热敏电阻的情况下,有一大堆选择,这时候就得询问你的卖家,到底使用的是哪种热敏电阻了。如果你的卖家也说不清楚(很不幸我就遇到了这样的卖家),那选择1就好。看上面的注释部分,可以知道1代表的是:

// 1 is 100k thermistor - best choice for EPCOS 100k (4.7k pullup)

经过我的仔细对比,实际上各种热敏电阻的输出值都是很接近的,就算选择了不同型号的热敏电阻,最后得到的温度值也相差不大。在挤出头工作状态下(200℃左右),通常上下相差不到10℃,对于我们比较粗略的测量够用了。另外,根据RepRap wiki,几乎所有3D打印机都使用了4.7K的热敏电阻上拉电阻。我还检查了Melzi的电路图(如下图),确实使用了4.7K电阻,这个地方是很确定的,不用犹豫了。

打印虎教程,RepRap,3D沙虫网



我的3D打印机只有一个挤出头,因此TEMP_SENSOR_1和TEMP_SENSOR_2(第二个、第三个挤出头的温度感应器)应该设为0,代表不存在。而同时我的3D打印机热床是有温度感应器的,因此这里应该不是0。因为我不知道我的热敏电阻的具体型号,就填1了,如下:

#define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_BED 1

下面的这些选项,就是温度控制算法的一些参数了。没有特殊要求的情况下,这些参数保持缺省的值就好,这样3D打印机的温度控制既能快速高效,又能保持相对稳定的温度。

#define TEMP_RESIDENCY_TIME 10 #define TEMP_HYSTERESIS 3 #define TEMP_WINDOW 1

再下面的选项是最低、最高温度。如果当前温度在这些温度范围之外,3D打印机就会自动保护停止工作。这些值也不需要再修改,保持原样就好。

#define HEATER_0_MINTEMP 5 #define HEATER_1_MINTEMP 5 #define HEATER_2_MINTEMP 5 #define BED_MINTEMP 5 #define HEATER_0_MAXTEMP 275 #define HEATER_1_MAXTEMP 275 #define HEATER_2_MAXTEMP 275 #define BED_MAXTEMP 150

温度段落最后一组设置,是关于PID温度控制模式(算法)的。首先

#definePIDTEMP

决定了目前的温度控制模式使用PID模式。如果把这行注释掉,就代表不用PID,而是用简单控制模式(Bang bang)。简单控制模式的特点就是简单,没有控制参数,基本上加热器的工作方式就是当前温度小于目标温度就打开,反之就关闭。

而PID模式(PID controller,比例-积分-微分控制器)是历史悠久的温控方式,相比于简单控制模式,PID模式温度比较稳定。但我觉得可能是因为3D打印机的加热器的热容量都不大,因此这个好处不太能体现出来。

了解PID模式的话就会知道,虽然PID模式有三个关键参数(Kp, Ki, Kd),以及很多周边的参数,但这些参数的值主要是影响了温度控制曲线的形状。基本上不论这些参数如何设置,最终都会达到目标温度,区别只是速度和稳定性。因为我的目标是把3D打印机转起来,所以这里我也不再细调PID模式的控制参数了,不论是挤出头还是热床,都保持缺省值就可以了。

略过了一大段关于PID的设置之后,我们可以看到

#define PREVENT_DANGEROUS_EXTRUDE #define PREVENT_LENGTHY_EXTRUDE #define EXTRUDE_MINTEMP 170 #define EXTRUDE_MAXLENGTH (X_MAX_LENGTH+Y_MAX_LENGTH)

这几个选项作用主要是保护挤出机,在温度不够的情况下不要工作,在遭遇到有问题的指令(特别长的挤出命令)时也不要工作。这种有问题的指令,有可能是指令在传输过程中出错导致的。虽然几率很低,但一旦出现,3D打印机也严格执行的话就很麻烦了。

好,到这里为止,与温度控制相关的一段就结束了。对应到第二节的表格,这里解决的主要问题,就是(7)和(8)两项已经完成。这里处理好了之后,我们继续往下看配置文件。

第四节,限位开关机械设定

Configuration.h下面的一组配置项,都是关于限位开关的。如果是最常见的上拉电阻形式的电路,如图:

打印虎教程,RepRap,3D沙虫网



限位开关连接在常闭触点上。这样连接的限位开关,在未触发情况下(图中状态),保持低电位;触发情况下,切换为高电位。这样的情况下,下面的配置行

#define ENDSTOPPULLUPS

就保持原状就好了。这样,紧接着的一段代码

#ifdef ENDSTOPPULLUPS #define ENDSTOPPULLUP_XMAX #define ENDSTOPPULLUP_YMAX #define ENDSTOPPULLUP_ZMAX #define ENDSTOPPULLUP_XMIN #define ENDSTOPPULLUP_YMIN #define ENDSTOPPULLUP_ZMIN #endif

就能起作用,代表所有XYZ轴限位开关全部是这样的连接方式。

同时,限位开关这样的连接方式,也就意味着触发信号是正向而非反向的。所谓正向,就是说当未触发时单片机得到低电位信号0,触发时单片机得到高电位信号1。因此对限位开关并不需要取反,这里的缺省值设置需要改成这样:

const bool X_MIN_ENDSTOP_INVERTING = false; const bool Y_MIN_ENDSTOP_INVERTING = false; const bool Z_MIN_ENDSTOP_INVERTING = false; const bool X_MAX_ENDSTOP_INVERTING = true; const bool Y_MAX_ENDSTOP_INVERTING = true; const bool Z_MAX_ENDSTOP_INVERTING = true;

看到这里又有一个问题了,我的3D打印机,并没有6个限位开关,而是只有3个,处于XYZ轴的最小值处(MIN)。这种情况下,上面的六行设置,只有前三行是有必要修改的,后三行没有意义。同时,需要修改下面的配置行:

//#define DISABLE_MAX_ENDSTOPS //#define DISABLE_MIN_ENDSTOPS

因为限位开关位于最小值处,我们要把这两行的第一行的注释//去除。变为:

#define DISABLE_MAX_ENDSTOPS //#define DISABLE_MIN_ENDSTOPS

这时,XYZ轴三个最大值处(MAX)限位开关都被忽略(DISABLE)了,这样我们就得到了正确的配置。

这一小节的限位开关设置,让我们完成了第二节表格中的第(4)项设置。现在只剩下最后(2)(3)(5)(6)这四项与步进电机相关的设置了。下面我们会继续完成这些设置。

第五节,步进电机机械设定

步进电机的设置段,Configuration.h中上来就是一组开关选项。因为我的3D打印机很普通,XYZ轴以及挤出头步进电机E轴都存在,而且都是普通的连接方式,因此就使用缺省的设置就好了:

#define X_ENABLE_ON 0 #define Y_ENABLE_ON 0 #define Z_ENABLE_ON 0 #define E_ENABLE_ON 0 #define DISABLE_X false #define DISABLE_Y false #define DISABLE_Z false #define DISABLE_E false #define DISABLE_INACTIVE_EXTRUDER true

下面的一组正、反设置,就和具体的3D打印机设计相关了。

#define INVERT_X_DIR false #define INVERT_Y_DIR true #define INVERT_Z_DIR false #define INVERT_E0_DIR false #define INVERT_E1_DIR false #define INVERT_E2_DIR false

因为我的3D打印机是RepRap Prusa i3,按照注释,我就把这几个选项改成了上面的样子。但实际测试表明,这个设置是不对的,Y轴的步进电机运动方向与预期相反。改正这个问题也很简单,只要再把第二行由true改回false即可:

#define INVERT_Y_DIR false

紧接着是归零(HOME)的方向。XYZ都向小值方向做归零动作就好了。这样我就不用修改这组配置了:

#define X_HOME_DIR -1 #define Y_HOME_DIR -1 #define Z_HOME_DIR -1

再来,是关于固件如何确定步进电机已经达到边界的设置。如果设置为软件限位(software endstops),则根据单片机运行起来之后内部计算得到的值确定是否已经越界。否则就根据硬件开关的指示确定是否已经越界。很明显,因为我的限位开关安装在每个轴的最小值位置处,这两个配置项应该这样选择:

#define min_software_endstops false #define max_software_endstops true

接下来,为了软件比较目前是否已经超过最大限位值,我们必须指定好3D打印机的XYZ轴范围大小,把三个MAX_POS改为实际的值就可以了。比如,我的3D打印机是20cm * 20cm * 18cm的工作空间,换算为毫米(mm)填在下面:

#define X_MAX_POS 200 #define X_MIN_POS 0 #define Y_MAX_POS 200 #define Y_MIN_POS 0 #define Z_MAX_POS 180 #define Z_MIN_POS 0

这样就全部搞定了。再下面是一大组跟自动找平(Auto leveling)相关的配置项。我的3D打印机比较土,没这功能,所以就都略过了。再往下就是与步进电机运动相关的配置项了。首先是两行:

#define NUM_AXIS 4 #define HOMING_FEEDRATE {50*60, 50*60, 4*60, 0}

这两行说明了步进电机的个数是4个(分别对应于XYZE轴,E轴是挤出头步进电机),并且列出了四个轴的归零速度。这些缺省值都没什么问题,不用修改了。再下面是关键的一行,单列出来:

#define DEFAULT_AXIS_STEPS_PER_UNIT {100, 100, 407, 95}

这一行里面,给出了XYZE四个轴的分辨率。所谓分辨率,就是在真实世界中前进1毫米,所对应的步进电机步数。步进电机的分辨率设置,是需要计算的一个问题。如果你购买的是3D打印机套件,那直接采用卖家直接告诉你的数值就好了。如果你想用自己购买的散件,那就得自己计算这个数值了。计算的方法可以参考【打印虎原创】RepRap_Prusa_i3_3D打印机步进电机设置图解,我们这里就不再重复了。

我这里列出的,就是我的3D打印机,经过我计算得出的数值。这个值不能乱设。如果和真实值差别太大的话,特别是Z轴的值与所需的真实值差别太大的话,有可能会损坏硬件,尝试时一定要小心谨慎才行。万一你的硬件真的损坏了,请自行购买配件维修,千万不要和打印虎联系……

再下面的一组配置值,因为都是使用mm或者mm/s^2进行描述的,只要你上面的分辨率没有设错,直接使用缺省值就好,不会有什么问题了。

#define DEFAULT_MAX_FEEDRATE {500, 500, 5, 25} #define DEFAULT_MAX_ACCELERATION {9000, 9000, 100, 10000} #define DEFAULT_ACCELERATION 3000 #define DEFAULT_RETRACT_ACCELERATION 3000 #define DEFAULT_XYJERK 20.0 #define DEFAULT_ZJERK 0.4 #define DEFAULT_EJERK 5.0

到此为止,Configuration.h中所有重要的配置项都已经配置完成,第二节开始处表格中的所有重要配置项也都有了对应的配置。如果你跟着我完成了上面所有的设置步骤,就可以开动3D打印机,把修改过配置文件的Marlin固件重新刷入了。第一节中准备好的Arduino环境不用重新配置了,只要再次按下上传Upload按钮就可以了。

第六节,测试与改进

上传完成之后,建议再使用第一节中介绍的Printrun软件手动控制3D打印机的每个功能进行测试。如果每个功能都可以用了,说明这里的配置已经基本上完成,没什么大问题了。我自己的测试结果,表明我的3D打印机的各种基础功能都已经可以正常工作了,包括XYZ轴步进电机的移动距离和方向、限位开关的工作、挤出头和热床的加热这些功能。注意我在这里没有测试挤出机步进电机的方向和挤出的塑料量的多少,因为我需要先保证温度感应器的正常工作,再在合适的温度下操作挤出机步进电机。否则,不论是温度太低还是温度太高,都有可能对挤出机造成损坏。

再提示一下:上面的两节,关于限位开关和步进电机的设置,特别是关于方向的设置,由于可能的选择很少,基本上只有正、反两种设置,如果不太清楚需要选择哪种的话,完全可以用试验的方法确定。这么简单的东西就不用麻烦卖家了,哈哈。

当然,在我们的配置过程中,还是略过了不少可以精细调整的参数的。这些参数的设定,一方面要对我们所使用的硬件有更多的了解(可以通过卖家了解,也可以自己亲手测定),另一方面也需要在使用中根据具体的表现不断优化。3D打印机可以做的参数调整非常丰富,如果真的深入下去,可以说是一条漫漫不归路。如果大家有什么心得,欢迎大家找我深入交流。

回顾一下,这篇文章中需要的软件包包括:

文件名 描述
Marlin-Marlin_v1.zip Marlin固件包,2014年8月30日版本
arduino-1.0.5-r2-windows.exe Arduino环境,刷固件工具包
Printrun-Win-Slic3r-10Mar2014.zip 3D打印机控制软件Printrun

所有的这些软件包,都可以在这里下载到(打印虎本地下载百度云下载)。

最后,祝大家玩机愉快,想查看本教程的最新版本,或是想看更多的打印虎教程,请访问打印虎原创教程专区。有任何相关的问题,请

联系打印虎 QQ2404959972

(责任编辑:admin)
3D沙虫网微信公众号 3D沙虫网(www.3dsc.com),最具价值的3D打印网站。第一时间分享业界资讯、专业教程,提供相关商业机会。如果您想及时获得有关本站的信息,请在微信公众号中搜索“3D沙虫”或者“SDSCWWW”,也可直接扫描微信二维码添加。官网QQ群:282726694。3D打印-3D沙虫网
如果您喜欢这篇文章的话,请分享转载一下:
相关文章
热门文章

3D打印机推荐

1 2 3 4

费丝3D打印机 FS-250A

本公司专业研发3D打印机及周边产品 出售产品有 打印机机壳 内部小部件零件 3D打印耗材 打印样品等等,请亲们将需求和需要 直接Q或者旺我哦,客服MM将为您......阅读全文
¥ 4000.00
购买

3D模型下载

牙膏牙刷架龙猫潜水艇.
友情链接
3D中国滇中恒达3D打印材料点客社区3D打印3D造打印平台3D打印爱好网长月科技3D打印之家3D打印模型库虚拟现实3D扣扣网模型库3D打印在线成都3D打印服务中心3D打印南极熊3D打印网3D打印咨询网海量3D模型免费下载中国3D打印技术3D打印工场3D风社区三达网3D打印模型网魔猴网日照3D打印网彩猫3D打印三多网中国3D打印网打印派打印猫武汉迪万3D打印机模典雕塑3D模型三迪时空网3d打印模型3D打印资讯中科大阿巴赛3D教育3D邦打印虎乐彩3D打印机3dke打印网中国3D打印网太平洋3D打印网成都弘晟电子
上海复翔
当前位置:首页 > 教程 > 3D打印教程 > 正文