2

3D打印+创客+IDEA!:3D打印机的Gcode代码详解,以及一款好用的gcode在线模拟器

 9 months ago
source link: https://www.taholab.com/26658
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

3D打印+创客+IDEA!:3D打印机的Gcode代码详解,以及一款好用的gcode在线模拟器

简介: 玩过一段时间3D打印机的朋友,都会接触到G-code文件。所谓G-code文件, 指的是3D模型在进入3D打印机实际打印之前,必须要经过切片器处理而成的一种中间格式文件。

玩过一段时间3D打印机的朋友,都会接触到G-code文件。所谓G-code文件, 指的是3D模型在进入3D打印机实际打印之前,必须要经过切片器处理而成的一种中间格式文件。这种中间格式文件的内容,实际上每一行都是3D打印机固件所能理解的命令。而这些命令,也被称为G-code命令,是3D打印机和电脑之间最重要的命令交互界面。

既然所有3D打印机都使用G-code作为对外联系的唯一信息交互方式,那么这种“语言”的标准就很重要了。不幸的是,虽然所有的3D打印机,都使用G-code作为与计算机的交互语言,但实际上每种3D打印机“说出”的G-code,都多多少少有些不同。这也可以说,每种3D打印机都有自己的“方言”。我们要研究G-code,就要从一种最常见的“方言”,也可以说是“普通话”开始,先了解一种,然后再学习其他类似的语言,相互对比,就很容易了。

基础运动

既然G-code是计算机指挥3D打印机干活用的一套语言,那么其中最重要的就是运动类的指令。

G0/G1 直线移动

虽然从名字上看,G0叫做“快速直线移动”,而G1叫做“直线移动”,但实际上在Repetier-firmware里面,G0和G1指令是完全等价的,没有任何区别。移动是否快速,完全是靠参数F来决定的(下面会详细介绍)。这条指令的作用也很简单,就是将挤出头线性移动到一个特定的位置。这条指令带有不少参数,完整的形式是这样的:

G0 Xnnn Ynnn Znnn Ennn Fnnn Snnn

G1 Xnnn Ynnn Znnn Ennn Fnnn Snnn

使用时,不需要所有的参数全部存在,但至少要有一个参数。其中,

  • Xnnn表示X轴的移动位置;
  • Ynnn表示Y轴的移动位置;
  • Znnn表示Z轴的移动位置;
  • Ennn表示E轴(挤出头步进电机)的移动位置;
  • Fnnn表示速度,单位是毫米/每分钟;
  • Snnn表示是否检查限位开关,S0不检查,S1检查,缺省值是S0;

举例来说,

G1 F1500

G1 X50 Y25.3 E22.4

这样两行G-code,表示了首先将速度设置为1500mm/min,也就是25mm/s,然后将挤出头移动至x=50mm, y=25.3mm的位置上,z轴高度不变,并且将挤出头步进电机移动至22.4mm的位置上。这里,速度、xyz位置都比较好理解,但挤出头步进电机的位置怎么理解呢?移动至22.4mm处,代表着挤出了多少耗材呢?实际上,这里挤出头的具体动作,要根据之前挤出头步进电机所在的状态(也就是位置)而定。比如在这两条语句之前,挤出头步进电机已经处于20mm的位置处,那么这里挤出头步进电机只要再前进2.4mm就可以了。

仔细想想,其实挤出头步进电机的工作方式,与xyz轴完全一样。xyz轴之所以比较好理解,是因为我们清楚的知道原点(0, 0, 0)的位置在哪里。而对于e轴来说原点的位置也会在打印开始处被初始化到0的位置。知道了原点的位置,就可以正确理解挤出头步进电机的工作方式了。实际上,挤出头步进电机仍然是以原点为基础,只不过是在整个打印过程中持续增加的。(思考:切片器的挤出头回抽动作,对应了什么样的G-code代码?)

再举一例,

G1 F1500

G1 X50 Y25.3 E22.4 F3000

这个例子与上面的例子非常类似,唯一的区别,就是F参数了。而这两条语句的意义,除了对XYZE的移动之外,还会将打印速度,从语句执行开始时的1500mm/min,提高到语句执行结束时的3000mm/min。这里有两点需要注意。

第一点,F参数与XYZE参数一样,在语句执行的过程中线性插值;

第二点,在预先知道第一点的前提下,F参数使得计算机对3D打印机的控制更加深入和精准了。计算得当的情况下,切片器可以精确控制3D打印机的加速和减速过程,使得整个3D打印过程更加顺滑。

G2/G3 圆弧移动

这两条命令中,G2是顺时针圆弧移动,G3是逆时针圆弧移动。命令的完整形式是:

G2 Xnnn Ynnn Innn Jnnn Rnnn Ennn Fnnn

G3 Xnnn Ynnn Innn Jnnn Rnnn Ennn Fnnn

  • Xnnn表示移动目标点的X坐标;
  • Ynnn表示移动目标点的Y坐标;
  • Innn表示圆心位置,值是圆心距离当前位置的X分量;
  • Jnnn表示圆心位置,值是圆心距离当前位置的Y分量;
  • Rnnn表示圆形的半径长度;
  • Ennn表示E轴(挤出头步进电机)的移动位置;
  • Fnnn表示速度,单位是毫米/每分钟;

根据勾股定理,R2 = I2 + J2。因此,如果提供了圆心位置参数,就不需要提供半径参数了。反之,如果提供了半径参数,也可以根据当前点和目标点计算出圆心位置,就不需要提供I/J参数了。其他几个的参数用法,与G0/G1是完全一样的。

G2/G3命令面临的最尴尬的问题,是常用的上位机切片器软件,包括Slic3r以及Cura engine,并不会生成这两条指令。所有3D模型中的圆弧,在STL文件中已经被转化为使用大量小线段拟合而成的曲线。这样,切片器自然也不会把这些小线段当做圆弧处理。最终的G-code输出结果,也只会存在G0/G1指令,而不会存在G2/G3指令。当然,据打印虎所知,如果你使用的是比较小众的上位机软件,比如artCAM等,因为这些软件的输入并不是STL文件,因此它们的输出G-code是很有可能出现G2/G3命令的。

如果确定了你的3D打印机只会接收到G0/G1直线移动命令,那么我们完全可以在3D打印机固件配置中,定义

#define ARC_SUPPORT 0

这样,所有与G2/G3指令相关的代码,就都不会编译,也不会包含在最终的固件代码中了。可以节省一些固件的空间,同时并不会影响任何3D打印机的功能。

还有一个问题留给大家思考:在上位机切片软件输出G2/G3命令的情况下,相比于上位机切片软件输出G0/G1命令的情况,是否3D打印机打印圆形物体时会更圆呢?(答案是不会。)那么其中的原理是什么?

G4 暂停移动

这条命令让挤出机在当前位置停止一段时间。可能的参数包括:

  • Pnnn表示停止移动的时间,以毫秒为单位,1000毫秒等于1秒。
  • Snnn也表示停止移动的时间,以秒为单位。

因此,G4 P2000命令与G4 S2命令是完全等价的。

G10/G11 回抽/反回抽

这两条命令使挤出头执行一个回抽(G10)或者相反的动作(G11)。所谓回抽,就是让E轴步进电机反转一小段。而反回抽则让E轴步进电机正转一小段。参数只有一个:

  • Snnn表示回抽的距离。
  • S1表示长回抽,S0表示短回抽。

实际上,目前的切片器并不太依赖于G10/G11指令执行回抽动作,而是利用G1 Ennn命令直接命令挤出头步进电机前进或倒退到某一个位置。因此,与G2/G3命令类似,G10/G11命令基本上是个摆设,除非未来有专门的切片器可以生成这两条指令,否则完全可以将这两条指令关闭,节省内存空间。在固件配置中,定义

#define FEATURE_RETRACTION 0

可以关闭G10/G11功能,在编译期去除这段相关的代码。

G20/G21 设置距离单位

这两条命令非常简单,用于设置当前距离单位为英寸(G20)或者毫米(G21)。没有参数。

未设置时缺省值是毫米。

G28 归零

这条命令使3D打印机XYZ轴以及挤出头E轴归零。参数包括:

  • X表示使X轴归零
  • Y表示使Y轴归零
  • Z表示使Z轴归零

E表示重置E轴的位置为0,与XYZ轴不同的是,如果使用了E参数,E轴步进电机并不运动,而是将当前的E轴位置直接设置为0,这样下面对E轴的运动指令,都会解释为相对0点的运动。

如果使用时没有任何参数,直接使用G28,等价于G28 XYZ命令。这时并不会对E轴进行重置为0的操作。

XYZ轴归零的顺序,由固件配置HOMEING_ORDER决定,比如定义为

#define HOMING_ORDER HOME_ORDER_XYZ

就代表着先归零X轴,然后是Y轴,最后是Z轴。

T 设置当前挤出头

对于拥有多个挤出头的3D打印机来说,需要使用T命令选择当前工作的挤出头。这条命令有一个无名参数,参数值直接跟在T后面。例如:

  • T0表示选择第一个挤出头;
  • T1表示选择第二个挤出头;

参数是T命令最特殊的一点。这与其他所有的G-code命令都不相同。

Z轴高度测试与自动调平

三角洲类型的3D打印机,由于其打印速度更快,受到很多3D打印用户的欢迎。与XYZ式3D打印机最大的一个不同,在于三角洲类型3D打印机的运动计算更加复杂,很难依赖人工调平达到较好的打印效果。因此,对Z轴的自动高度测试,以及自动调平相关的功能,就显得更加重要了。以下G-code命令,是Repetier-firmware对这方面进行支持的一组命令。当然,这些功能并不仅限于三角洲类型的3D打印机。如果是包含了Z轴高度测试微动开关的XYZ式3D打印机,也同样可以使用这些功能。

G29 Z轴高度三点测试

这条命令测试打印平面上三个点的Z轴高度,并在串口上输出结果。参数包括:

Snnn 测试结果的处理方式。S1表示更新内存中的Z轴高度值(重置系统会丢失),S2表示更新内存以及EEPROM中的Z轴高度值(重置系统不会丢失)。

无参数时,G29命令表示只从串口上输出结果,不更新内存或EEPROM中的Z轴高度值。

一般来说,只有使用高位限位开关(也就是说,Z轴的限位开关位于Z轴坐标最大处),且在挤出头上附带有Z轴高度测试微动开关的机型,适合使用G29命令测试Z轴高度。其他机械配置的机型,不适合使用G29命令。G29命令由固件配置

#define FEATURE_Z_PROBE 1

决定是否开启。如果这个配置项定义为0,则编译时会去除对G29命令的支持,节省内存的使用。

命令执行时,打印平面上的三个点,其XY坐标由以下固件配置参数决定:

#define Z_PROBE_X1 -52

#define Z_PROBE_Y1 -30

#define Z_PROBE_X2 52

#define Z_PROBE_Y2 -30

#define Z_PROBE_X3 0

#define Z_PROBE_Y3 60

命令执行的开始和结束,分别会执行一段预定义的G-code。缺省的固件配置定义为:

#define Z_PROBE_START_SCRIPT “G28”

#define Z_PROBE_FINISHED_SCRIPT “”

可以看出,在缺省状态下,开始执行G29时,系统会自动对挤出头进行复位(G28命令)。结束执行G29时,没有特殊的动作。

G29命令的Z轴高度测试,通常由一个微动开关控制触发。这个开关的端口号,由Z_PROBE_PIN单独指定。

G29命令的输出,格式为:

X:0.00 Y:0.00 Z:200.00 E:0.00

Z-probe:5.01 X:-52.00 Y:-30.00

Z-probe:13.04 X:52.00 Y:-30.00

Z-probe:12.77 X:0.00 Y:60.00

X:0.00 Y:60.00 Z:-98.48 E:0.00

从以上例子的输出可以看出,G29命令一共测试了三个坐标点,分别在(-52, -30), (53, 30)以及(0, 60)的位置,形成一个正三角形。三个点的Z轴高度相差比较悬殊,在第一个点正好是5mm的情况下,后两个点分别是13.04mm以及12.77mm。第一行和最后一行,是测试开始时以及测试结束时的挤出头坐标位置。

G30 Z轴高度单点测试(单步)

这条命令作为一个完整Z轴高度测试过程的一步,测试打印平面上一个点的Z轴高度,并在串口上输出结果。这个完整的Z轴高度测试过程,通常是由3D打印机控制软件连续发出的,通过参数控制G30的执行状态。因此在手动工作方式下,G30命令只适合不带参数运行(等价于G30 P3,见下面的参数说明)。

G30命令的参数包括:

Pnnn表示测试的状态,P1表示当前这步是整个Z轴高度测试过程的第一步;P2表示当前这步是整个Z轴高度测试过程的最后一步;P3表示当前这步是Z轴高度测试过程的唯一一步,也就是说既是第一步也是最后一步;P0表示当前这步是Z轴高度测试过程中的中间一步。无参数情况下,P的缺省值是3。

与G29命令类似,G30命令同样由固件配置

#define FEATURE_Z_PROBE 1

决定是否开启。

G30命令的输出,与上面的G29输出格式一致,但只有其中的一行,需要上位机软件多次发出G30命令,再综合处理所有的输出结果。

G31 输出Z轴高度测试微动开关状态

这条命令非常简单,没有参数。执行后会输出当前Z轴高度测试微动开关的当前状态:

Z-probe state:L

其中L表示微动开关没有触发。如果是处于触发状态,这里会输出H。

G29命令、G30命令、G31命令只进行Z轴的高度测试,并不进行自动调平。有些上位机3D打印机控制软件,会通过这一组命令配合自动跳屏算法实现(上位机)热床自动调平功能。如果希望不通过上位机,只由3D打印机自身完成自动调平功能,需要使用G32命令。

G32 热床自动调平

这条命令在G29命令的基础上,不仅测试打印平面上三个点的Z轴高度,而且还会根据测试的结果,对3D打印机的机械参数进行调整,实现热床自动调平。G32命令使用的参数与G29命令是一致的:

Snnn测试结果的处理方式。S1表示更新内存中的相关参数值(重置系统会丢失),S2表示更新内存以及EEPROM中的相关参数值(重置系统不会丢失)。

G32命令执行完成时,不仅Z轴高度参数发生了改变,而且还会根据3D打印机的硬件配置,对热床进行相应的调平处理。

如果热床本身是使用步进电机进行高度控制的,那么程序会自动调整步进电机的位置,使热床自动调整为平整的状态;如果热床本身不能移动(这个应该是更常见的情况),那么G32命令会在3D打印机内存中构建一个转换矩阵(Transformation matrix),让未来3D打印机所处理的所有三维空间位置,都先经过这个矩阵的变换,保证在Z=0的情况下,正好与热床平面完全吻合。由于这里涉及到高深的计算机图形学知识,我们就不详细介绍了。有修改这方面代码需求的朋友,可以直接与打印虎进行联系。

G32命令,由固件配置

#define FEATURE_AUTOLEVEL 1

决定是否开启。

G32命令的输出,格式与G29命令类似:

X:0.00 Y:0.00 Z:200.00 E:0.00

Z-probe:5.00 X:-52.00 Y:-30.00

Z-probe:12.97 X:52.00 Y:-30.00

Z-probe:12.76 X:0.00 Y:60.00

Info: 0.99709 -0.00319 -0.07628 0.00000 0.99912 -0.4191 0.07634 0.004179 0.99621

Info: Autoleveling enabled

X:7.32 Y:64.08 Z:-95.66 E:0.00

X:0.00 Y:0.00 Z:200.00 E:0.00

除了与G29命令相似的测量信息之外,G32命令还输出了计算得到的自动调平矩阵,并且打开了自动调平功能。需要注意的一点是,G32命令虽然生成了自动调平矩阵,但并没将其保存在EEPROM中,因此下次开机这个信息将会丢失。可以配合M320 S1命令,将自动调平矩阵保存在EEPROM中。

M251 将当前Z轴位置保存为Z轴高度值

这条命令可以将当前的Z轴位置保存为Z轴高度值,以使前面的Z轴高度手动/自动测量的结果起作用。通常,M251命令只工作在三角洲机型上,并且应该与G29命令联合使用(自动测量Z轴高度)。这条命令没有相关的参数。

当3D打印机打开EEPROM支持时,这条命令还会将Z轴高度值同时保存在EEPROM中。

只有当固件配置定义

#define Z_HOME_DIR -1

也就是Z轴向正方向归位,并且定义

#define MAX_HARDWARE_ENDSTOP_Z true

也就是存在硬件的Z轴高位限位开关时,M251命令才会在编译中包含相关的代码。

通常,只有三角洲类型的3D打印机才能满足这两个条件限制。

M320/M321 开启/关闭自动调平

开启(M320)或者关闭(M321)自动调平功能,使自动调平转换矩阵起作用或不起作用。命令参数为

Snnn表示是否保存于EEPROM,没有S参数或者S0表示不保存于EEPROM,S1表示保存于EEPROM,在关闭自动调平(M321)命令中S3表示将自动调平矩阵清零且保存于EEPROM中;

M320的输出结果为:

Info:Autoleveling enabled

表示自动调平已经打开。

M321的输出结果为:

Info:Autoleveling disabled

表示自动调平已经关闭。

M322 清零自动调平转换矩阵

清零(M322)自动调平转换矩阵。显然,清零这个动作的同时自动调平功能也关闭了。命令参数为

Snnn表示是否保存于EEPROM,S0表示不保存于EEPROM,S1表示保存于EEPROM;

也就是说,

M321 S3

命令等价于

M322 S1

命令,两者都是清零自动调平矩阵,关闭自动调平功能,并且将这个设置保存于EEPROM之中。

以上三条命令,与G32命令相同,由固件配置

#define FEATURE_AUTOLEVEL 1

决定是否开启。

M322的输出结果为:

Info:Autolevel matrix reset

表示自动调平转换矩阵已经被清零。

第三节,坐标模式与坐标位置

G90/G91 设置坐标模式

这两条命令用于设置当前坐标模式为绝对坐标模式(G90)或者相对坐标模式(G91)。没有参数。

未设置时缺省值是绝对坐标模式。我们在这篇教程中,所有的例子也都是以绝对坐标模式给出的。

在相对坐标模式下,每次步进电机XYZE移动之后,当前位置都会重置为0。对于以下两条G-code命令

G0 X-1

如果3D打印机当前处于相对坐标模式下,那么X轴步进电机会先向正方向移动一个单位,再向反方向移动一个单位。第二条语句,实际移动距离是1个单位(向X轴反方向)。

而如果3D打印机当前处于绝对坐标模式下,那么X轴步进电机会先移动到X=1的位置处,再移动到X=-1的位置处。第二条语句,实际移动距离是2个单位(向X轴反方向)。

G92 设置位置

设置3D打印机内存中XYZE的位置值。不移动对应的步进电机。参数包括:

  • Xnnn表示X轴的位置值;
  • Ynnn表示Y轴的位置值;
  • Znnn表示Z轴的位置值;
  • Ennn表示E轴(挤出机步进电机)的位置值;

辅助步进电机

一些3D打印机的机械设计,会在XYZE四个步进电机轴之外,使用更多的辅助步进电机。Repetier-firmware提供了一套辅助步进电机指令,让用户(以及上位机软件)可以操作这些辅助步进电机。由于辅助步进电机的用途、参数各异,为了让这套指令更加通用,这些指令被设计为非常简单的形式。

G201 移动步进电机位置

将步进电机P的位置移动到X位置处。参数包括:

  • Pnnn表示第P个辅助步进电机;
  • Xnnn表示这个步进电机的目标位置;

这条命令与G1命令非常类似。

G202 设置当前位置

将X位置设置为步进电机P的当前位置。不实际移动步进电机。参数包括:

  • Pnnn表示第P个辅助步进电机;
  • Xnnn表示这个步进电机的当前位置;

这条命令与G92命令非常类似。

G203 报告当前位置

报告步进电机P的当前位置。参数包括:

  • Pnnn表示第P个辅助步进电机;

这条命令与M114命令非常类似。

G203 开启/关闭步进电机

用于开启/关闭步进电机P。参数包括:

  • Pnnn表示第P个辅助步进电机;
  • Snnn表示开闭标志,S0表示关闭步进电机,S1表示开启步进电机;

步进电机开启后,有两种可能的状态。一种是“运动”状态,也就是正在进行正向或反向的旋转。另一种是“保持位置”状态,也就是保持当前的位置不变。虽然步进电机关闭也不会主动移动位置,但“保持位置”状态与步进电机关闭状态仍有显著的区别。“保持位置”状态下,当步进电机受力时,会产生一个反向的力矩,使步进电机位置保持不变。

这条命令与“节能管理”一节中的M84命令有关。M84命令用于关闭XYZE步进电机,但不能打开这些步进电机。

SD卡管理

M20 列目录

显示SD卡所有目录内容。没有相关的参数。

M20命令的输出,格式为:

Begin file list

a.gcode

TEST/

TEST/c.gcode

b.gcode

End file list

这个目录内容清单,说明了这张SD卡上目前有3个文件,分别是a.gcode,b.gcode以及c.gcode,其中,a.gcode和b.gcode都保存于根目录下,而c.gcode保存于一个名称为TEST的文件夹里面。

M21 加载SD

尝试加载SD卡,也就是执行Mount动作。没有相关的参数。

M22 卸载SD

卸载SD卡,也就是执行Unmount动作。没有相关的参数。

M23 选择文件

选择一个SD卡上的文件。参数为

  • filename 表示被选择的文件名(包含目录名,以/分隔);

文件选择之后,可以执行打印、删除等动作。例如命令

M23 TEST/c.gcode

选定了SD卡TEST文件夹里面的c.gcode文件作为当前文件。

同时输出格式为:

File opened:c.gcode Size:1127565

File selected

表示文件已经顺利打开。

M24 开始SD卡打印

打印当前选定的SD卡文件。逐行读入SD卡文件内容G-code代码,并执行。没有相关参数。

M25 暂停SD卡打印

暂停当前的SD卡打印。没有相关参数。

M26 设置当前文件当前位置

设置当前文件的当前位置。参数为

  • Snnn表示当前位置的字节数。

M27 获取SD卡打印进度

获取SD卡打印进度。没有相关参数。

M27命令的输出,格式为:

SD printing byte 11518/1127578

这条命令供上位机获取当前的3D打印进度信息,用于显示在电脑界面上。

M28 SD卡文件

写一个SD卡文件。参数为:

  • filename 表示待写入的文件名(包含目录名,以/分隔);

从执行M28命令开始,所有3D打印机接收到的G-code,除了M29命令以外,都会保存至指定的SD卡文件中,而不会被实际执行。这条命令可以将一个G-code文件从上位机3D打印控制软件复制到3D打印机的SD卡上,以供未来执行。

M29 结束写SD卡文件

结束以M28开始的“保存至SD卡文件”状态,将3D打印机恢复到正常状态。从此,所有接收到的G-code命令,都会被直接解释执行。没有相关参数。

M30 删除文件

删除一个SD卡中的文件。参数为:

  • filename 表示待删除的文件名(包含目录名,以/分隔);

M32 创建子目录

在SD卡上创建一个子目录。参数为:

filename表示待创建的子目录(包含目录名,以/分隔);

以上所有SD卡相关指令,都由固件配置

define SDSUPPORT 1

决定是否开启。如果固件不需要支持SD卡,关闭这项固件配置,可以节省不少内存空间。

节能管理

M84 设置步进电机自动关闭时间

当3D打印机一段时间没有接收到步进电机运动指令之后,3D打印机(为了节能)会自动关闭步进电机。使用M84指令,可以设置这个自动关闭步进电机的时间。参数包括:

  • Snnn表示步进电机关闭的时间,以秒为单位。

如果使用M84时没有指定S参数,则步进电机会立即关闭。

M84命令的缺省值是360秒。在固件配置中,缺省值由

#define STEPPER_INACTIVE_TIME 360L

M85 设置3D打印机自动关闭时间

当3D打印机一段时间没有接收到指令之后,3D打印机(为了节能)会自动关闭步进电机以及挤出头、热床等设备。使用M85指令,可以设置这个自动关闭3D打印机的时间。参数包括:

  • Snnn表示在关闭步进电机之前步进电机没有活动的时间,以秒为单位。

如果使用M85时没有指定S参数,或者使用了S0参数,则代表取消3D打印机自动关闭功能,挤出头、热床等在工作完成之后,一直会处于当前状态,而不会被自动关闭。

M85命令的缺省值是0(不自动关闭)。在固件配置中,缺省值由

#define MAX_INACTIVE_TIME 0L

温度管理

M104 设置挤出头目标温度

设置挤出头的目标温度。执行这条命令后,不需要等待达到这个温度,立即开始执行下一条G-code语句。相关参数包括:

  • Snnn表示目标温度;
  • Tnnn表示对应的挤出头;
  • P表示要等待前面的指令完成之后,再开始设置挤出头温度;
  • Fnnn表示到达目标温度之后,是否触发蜂鸣器。F1表示要触发;

如果执行命令时没有带T参数,则针对当前挤出头设置目标温度。

M140 设置热床目标温度

设置热床的目标温度。执行这条命令后,不需要等待达到这个温度,立即开始执行下一条G-code语句。相关参数包括:

  • Snnn表示目标温度;
  • Fnnn表示到达目标温度之后,是否触发蜂鸣器。F1表示要触发;

M105 获取当前的温度

获取当前温度值,包括挤出头和热床的温度。相关参数包括:

X表示输出AD转换输入的原始值;

M105命令的输出,格式为:

T:18.97 /0 B:18.75 /0 B@:0 @:0

可以看到,T:之后的部分,代表挤出头的当前温度/目标温度;B:之后的部分代表热床的当前温度/目标温度。

在PID温度控制模式下,B@:后面的数字代表热床当前的输出强度,是一个0255的值,@:后面的数字,代表挤出头当前的输出强度,也是一个0255的值。例子中,挤出头、热床都处于关闭状态,所以这个位置的值都是0。

M109 等待挤出头加热达到目标温度

设置挤出头的目标温度,并等待达到这个温度。相关参数包括:

  • Snnn表示目标温度;
  • Tnnn表示对应的挤出头;
  • Fnnn表示到达目标温度之后,是否触发蜂鸣器。F1表示要触发;

如果执行命令时没有带T参数,则针对当前挤出头设置目标温度。

M190 等待热床加热达到目标温度

设置热床的目标温度,并等待达到这个温度。相关参数包括:

  • Snnn表示目标温度;
  • Fnnn表示到达目标温度之后,是否触发蜂鸣器。F1表示要触发;

M116 等待温度达到目标温度

等待所有挤出头/热床到达由之前的M104/M140指令所指定的目标温度。没有相关参数。

其他常用指令

M92 设置分辨率

设置3D打印机内存中XYZE步进电机的分辨率。参数包括:

  • Xnnn表示X轴的分辨率;
  • Ynnn表示Y轴的分辨率;
  • Znnn表示Z轴的分辨率;
  • Ennn表示E轴(挤出机步进电机)的分辨率;

M106/M107 打开/关闭风扇

这两条命令用于打开(M106)或关闭(M107)风扇。相关的参数包括:

  • Snnn表示打开风扇时风扇的转速,取值范围在0~255之间;
  • P表示要等待前面的指令完成之后,再开始调整风扇转速;

在固件配置中,定义

#define FEATURE_FAN_CONTROL 1

表示支持风扇控制功能,在编译中会包含相关的代码。

M114 输出当前位置

输出挤出头当前位置。没有相关的参数。

M114命令的输出,格式为:

X:20.00 Y:30.00 Z:10.000 E:0.0000

M115 输出3D打印机信息

输出3D打印机信息。没有相关的参数。

M115命令的输出,格式为:

FIRMWARE_NAME:Repetier_0.92.3 FIRMWARE_URL:…

Printed filament:0.00m Printing time:0 days 0 hours 0 min

SpeedMultiply:100

FlowMultiply:100

第一行是固件的版本信息,很长,我没有列完整。第二行是已经打印了多少米耗材,打印时间是几天几小时几分钟。第三行是速度系数,参考M220命令。第四行是流率系数,参考M221命令。

M119 输出限位开关状态

将当前限位开关状态输出。没有相关的参数。

M119命令的输出,格式为:

endstops hit: x_min:L y_min:L z_min:L

列出了XYZ三个轴的低位限位开关的当前状态。L代表限位开关没有触发。H代表限位开关被触发了。

M201/M202 设置最大加速度

这两条命令设置打印加速度。包括挤出头工作时(打印中)的运动加速度(M201),以及挤出头不工作时(移动中)的运动加速度(M202)。参数为

  • Xnnn表示X轴的加速度;
  • Ynnn表示Y轴的加速度;
  • Znnn表示Z轴的加速度;
  • Ennn表示E轴的加速度;

在固件配置中,定义

#define RAMP_ACCELERATION 1

表示支持加速度功能,在编译中会包含相关的代码。

M203 监控温度

使用串口输出监控3D打印机的温度。参数为

  • Snnn表示是否监控,S0关闭监控,S1打开监控;

当监控处于打开状态,可以从串口定时获取当前的温度信息。

监控输出格式与M105命令的输出结果完全一致。

M204 设置PID参数

设置挤出头温度控制的PID参数,命令参数为

  • Snnn表示对应的挤出头,无S参数表示使用当前挤出头;
  • Xnnn表示P参数;
  • Ynnn表示I参数;
  • Znnn表示D参数;

M207 修改抖动(Jerk)

修改当前的最大抖动值。命令参数为

  • Xnnn表示XY轴的最大抖动值;
  • Znnn表示Z轴的最大抖动值;
  • Ennn表示E轴的最大抖动值;

XY轴抖动指的是3D打印机同时在X轴和Y轴上移动时,产生的和速度最大值。比如,3D打印机加热头正在向X轴正方向全速移动,下一条指令变为向Y轴正方向移动。如果同时在X轴和Y轴上改变速度,那么实际产生的速度是X方向的速度和Y方向的速度的向量和,这个比较大的速度变化值,会对3D打印机的机械部件产生不利的影响,而且会造成比较大的噪音。这里的设置,就限制了这个XY轴上和速度的最大值。当然这个值也不能设置的太小,太小的话,首先打印速度会变得很慢,而且打印会产生更多的瑕疵。

Z轴抖动与XY轴抖动意义类似,不同点是Z-Jerk是Z轴方向不为0的抖动速度值。因为这项涉及到Z轴的运动,因此最大速度就低多了。

M207命令的输出,格式为:

Jerk:20.00 ZJerk:0.30

这个输出意义很简单,表示XY轴抖动速度为20mm/s,Z轴抖动速度为0.3mm/s。

M220 设置速度

设置3D打印机运行速度系数。命令参数为

  • Snnn表示系数,是一个百分数,如果S参数不存在,则使用缺省值100;

3D打印机运行速度系数,是一个在2

M220命令的输出,格式为:

SpeedMultiply:100

M221 设置流率

设置3D打印机的流率系数(Flow rate)。命令参数为

  • Snnn表示系数,是一个百分数,如果S参数不存在,则使用缺省值100;

3D打印机流率系数,是在上位机切片软件通过耗材直径、喷头直径、层高以及3D打印速度等因素综合计算得到的E轴运动速度的基础上,叠加的一个E轴运动速度系数。简单地说,就是控制挤出头耗材挤出量的多少。这个系数可以在2

M221命令的输出,格式为:

FlowMultiply:100

M302 设置是否允许冷挤出

为了保护3D打印机的挤出头,通常设置下,E轴的运动必须在挤出头加热到一定温度之后才被允许。在挤出头冷却的情况下,所有的E轴运动命令是被3D打印机固件忽略的。但有些情况下我们需要在挤出头冷却的情况下运动E轴,这时可以通过M302命令进行设置。命令参数为

  • Snnn表示是否允许冷挤出,S0表示不允许,S1表示允许,没有S参数缺省表示允许;

M302命令的输出,为当前是否允许冷挤出。允许时会输出:

Cold extrusion allowed

不允许时会输出:

Code extrusion disallowed

较不常用指令

这些指令实在无法归类了,只能以“较不常用指令”为名字,放在了一起。

M42直接读写端口

此命令直接读/写一个Arduino端口,为3D打印控制软件上位机扩展程序功能提供基础。参数包括:

  • Pnnn表示Arduino的输入/输出端口;输出时固件程序会同时输出到数字端口和模拟端口;输入时固件程序会从数字端口输入;
  • Snnn表示写入输出端口的值,0到255之间是合法的数字;当S参数不存在的时候,M42指令起输入作用;

Repetier-firmware固件中预先定义了一个表格,称为“敏感端口表格”,所有位于这个表格内的端口,也就是当前已经被步进电机、限位开关以及热敏电阻占用的端口,都不能被M42命令影响。其他当前未占用的端口,可以由这条命令进行IO操作。

M82/M83 设置挤出头步进电机坐标模式

与G90/G91命令类似,这两条命令用于设置挤出头当前坐标模式为绝对坐标模式(M82)或者相对坐标模式(M83)。没有参数。

未设置时缺省值是绝对坐标模式。

需要注意的是,G90/G91设置的坐标模式,同时对XYZE四个轴起作用,但M82/M83设置的坐标模式,只对E轴(挤出头步进电机)起作用。

M99 暂时关闭步进电机

M99命令可以暂时关闭XYZ轴步进电机一段时间。命令参数包括:

  • Snnn表示所需暂时关闭步进电机的时间,以秒为单位;
  • X表示暂时关闭X轴步进电机;
  • Y表示暂时关闭Y轴步进电机;
  • Z表示暂时关闭Z轴步进电机;

如果S参数没有指定,则暂时关闭10秒钟时间。暂时关闭时间到达之后,重新打开相应轴的步进电机。

M111 允许/禁止运行时调试标志

运行时调试标志是一组布尔值,一共有6个不同的标志,使用位域(Bit Field)的表示方式。用户可以利用M111指令修改这些标志的值。相关参数包括:

  • Snnn表示直接将调试标志设置为S值;
  • Pnnn表示以位操作的方式,将P值与当前调试标志做某种操作。如果P值是正数,则进行按位或操作(增加P参数所带的标志位);如果P值是负数,则忽略P的符号,进行取反后按位与操作(去除P参数所带的标志位);

调试标志的位域,由以下6个布尔值组成:

  • 第1位,值为1,表示是否回显(Echo)由上位机发送至下位机的命令;
  • 第2位,值为2,表示是否输出信息(Info),实际在固件代码中并未使用;
  • 第3位,值为4,表示是否输出错误(Error),在固件出错时会将出错信息发送回上位机;
  • 第4位,值为8,表示是否进入模拟执行模式(Dry run),在模拟执行模式下,3D打印机不实际执行上位机发送的命令,只修改3D打印机的内存状态;
  • 第5位,值为16,表示是否进入调试通讯模式(Communication),实际在固件代码中似乎并未使用;
  • 第6位,值为32,表示是否进入禁止移动模式(No Move),在这个模式下,所有对步进电机的移动命令,都会被忽略;

M117 发送消息至LCD屏幕

将一条详细发送至LCD屏幕,显示为当前状态信息。参数为

message表示待显示在LCD屏幕上的文本;

M120 测试蜂鸣器

使蜂鸣器发出蜂鸣声。参数为

  • Snnn表示发出声音/不发出声音的时间,以毫秒为单位;
  • Pnnn表示重复的次数;

如果3D打印机有蜂鸣器,而且是无源蜂鸣器,那么通过S参数和P参数的组合,可以得到不同频率的声音。比如

M120 S24 P8

可以得到一个较长的蜂鸣声。如果3D打印机的蜂鸣器是有源蜂鸣器,那么M120指令只能控制蜂鸣时间,不能控制蜂鸣器的声音频率。

M200 设置体积挤出模式

将3D打印机设置为“体积挤出模式”,同时设定挤出头直径参数。相关参数包括

  • Tnnn表示对应的挤出头,无T参数表示使用当前挤出头;
  • Dnnn表示挤出头的实际直径,无D参数表示关闭体积挤出模式;

体积挤出模式,是相对于缺省的“长度挤出模式”而言的另一种挤出模式。在常见的“长度挤出模式”下,G-code中的使E轴运动的G0/G1命令,其参数都是以长度单位mm作为单位的。这样确实比较简单,但问题是我们在切片的时候,就必须知道要使用的喷头直径,否则无法计算出耗材前进的实际长度。

为了使G-code在生成之后适用于多种不同喷头直径的3D打印机机型,我们可以在上位机切片时,将E轴参数变为以体积单位mm3作为单位,然后在下位机固件中,再设定正在使用的喷头直径,以达到最终正确输出的目的。为了以体积单位mm3作为E轴的参数单位,上位机需要将喷头直径设定为1.128mm(这样,耗材每前进1mm,会喷出1mmπ(1.128mm/2)2约等于1mm3的耗材。)同时,下位机要使用下面的语句:

M200 T0 D0.4

将实际的挤出头喷头直径设置为0.4mm。同时在上位机和下位机进行这样的操作之后,3D打印机可以在E轴参数单位为mm3的情况下,正确完成打印操作。

M209 开启/关闭自动回抽

开启/关闭自动回抽功能。命令参数为

  • Snnn表示是否开启自动回抽功能,1表示开启,0表示关闭;

通常上位机切片器负责在合适的位置处加入回抽指令。如果你的切片器功能比较弱,不能加入合适的回抽指令,那么可以打开这个特性,由固件自动回抽。

在固件配置中,定义

#define FEATURE_RETRACTION 1

表示支持自动回抽功能,在编译中会包含相关的代码。

M280 多头重复打印模式设置

有些特殊配置的3D打印机,允许2~4个挤出头同时工作,并且这些挤出头动作完全一致,同时打印出多件完全一样的打印件,这种工作模式叫做多头重复打印模式(Ditto mode)。M280命令对这个模式进行设置。命令参数为

  • Snnn表示这个模式下的挤出头个数;S0表示关闭多头重复打印模式;S1S3表示工作在多头重复打印模式下,并且3D打印机拥有额外的13个挤出头。

在固件配置中,定义

#define FEATURE_DITTO_PRINTING 1

表示支持多头重复打印模式功能,在编译中会包含相关的代码。

M281 测试硬件看门狗功能

这条命令用于测试CPU硬件中的看门狗功能。实际上,就是造成一个死循环,不再执行“喂狗”动作,从而触发CPU硬件看门狗,最终(故意地)造成3D打印机重启。这条命令只是用于3D打印机固件开发测试。

M303 自动测试PID参数

自动测试PID参数值。命令参数为

  • Pnnn表示待测试的挤出头编号,从0开始,P<挤出头个数>代表待测试的是热床;
  • Snnn表示打印温度;
  • Rnnn代表重复测试次数;

X代表是否保存于EEPROM中;

由于加热、散热需要较多时间,这条命令执行时间很长。

M330 测试蜂鸣器

测试(无源)蜂鸣器,产生一个特定频率的声音。命令参数为

  • Snnn表示声音的频率;
  • Pnnn表示声音持续的时间,以毫秒为单位;

如果命令没有包含S参数或者P参数,则会使用缺省值S1以及P1000。

保存与恢复当前位置

M400 等待当前所有移动指令完成

等待在3D打印机内存中待处理的移动命令执行完成。没有相关的参数。

执行这条语句之后,可以保证在下一条G-code命令执行时,所有步进电机都不处于运动状态中。

M401 保存当前的位置

将当前位置,包括XYZE步进电机,保存于内存的一组专用变量中。未来可以用M402命令恢复这组位置。没有相关的参数。

M402 恢复之前保存的位置

恢复之前由M401命令保存的位置值。命令参数为

  • X表示恢复X位置;
  • Y表示恢复Y位置;
  • Z表示恢复Z位置;
  • E表示恢复E位置;
  • Fnnn表示使用参数给定的速度,无F参数时使用当前速度值;

暂停与更换耗材

M600 更换耗材

在拥有显示屏的3D打印机上,启动更换耗材向导界面。没有相关的参数。

通常,这个向导界面是从显示屏界面上触发的。M600命令提供一个接口,使更换耗材向导界面可以从上位机软件触发。

M601 暂停/恢复挤出头

暂停或者恢复挤出头。命令参数为

  • Snnn表示暂停或者恢复,S1表示暂停挤出头,S0表示恢复挤出头工作;

暂停挤出头包括停止挤出头加温以及停止挤出头步进电机工作。恢复则相反,加热挤出头到原来的温度。

设置与EEPROM管理

固件的设置,是一个比较有趣的话题,很多玩3D打印机的朋友,在遇到设置相关的问题时都会犯迷糊。实际上,对于某一项特定的设置,比如说X轴的步进电机分辨率,在3D打印机主板上,有三个不同的位置(也是三种不同的存储器)保存了这项内容,而它们的值还有可能不同。让我们先来了解一下这些保存设置内容的位置,以方便大家的理解。

首先,是固件配置文件(configuration.h)中的设置值。配置文件中的值,会跟随固件一起编译,之后在刷机过程中,保存在了3D打印机的静态存储区(Flash ROM)中。除了刷机之外,静态存储区的内容不会发生变动,可以认为是只读的。每次开机的时候,都是一样的值在等待着我们。

第二份设置值,保存在电可擦写静态存储区(EEPROM)。EEPROM的读写代价,比静态存储区要小。因此,3D打印机允许在刷机之后,修改设置值,而这些修改之后的设置值,就存储在EEPROM之中。每次开机,程序会先检查EEPROM,如果EEPROM中是空白的,则将静态存储区的第一份设置值复制到EEPROM之中。而如果EEPROM中已经有保存好的设置值,则程序会直接使用EEPROM中的值。有些朋友在玩3D打印机过程中可能会有这样的经验,就是明明修改了固件配置文件中的设置值,但刷机之后竟然没有发生变化。这种情况,往往就是EEPROM在捣鬼了。我们完全可以使用G-code M502 M500两条指令(指令的具体含义可以参考下面),重写EEPROM,解决这样的问题。

第三份设置,保存在内存(RAM)中。实际用户使用的值,就是内存中的值。由于内存只在加电情况下能够保持其中的内容,因此每次开机时,3D打印机会根据上面描述的逻辑,重建内存中的设置值。如果某条指令修改的是内存中的设置值,那么这也代表着这次修改是一个临时修改,下次开机这个值就会消失了。

总的来说,三份固件设置,使用的优先级是

内存 > EEPROM > 配置文件

但设置的持久性,就要反过来了。明确了解了这些,特别有助于我们解决一些与设置相关的问题,自然,看下面这些命令描述的时候,也就不会迷糊了。

M205 输出EEPROM设置

输出EEPROM的当前设置值表格。没有相关的参数。

M205命令的输出,格式为:

EPR:2 75 115200 Baudrate

EPR:3 129 0.000 Filament printed [m]

EPR:2 125 0 Printer active [s]

这是一个很长的输出,我们这里只截取了前三行。每行中,EPR:后面的第一个数字,是这个设置项值的类型。0代表8bit整数类型,1代表16bit整数类型,2代表32bit整数类型,3代表32bit浮点类型。第二个数字,是设置项值的位置(即EEPROM中的地址)。第三个数字,是设置项的值。最后,是设置项的意义。

以第一行为例,第一行设置的是通讯波特率(Baudrate),当前值是115200。波特率设置项,在EEPROM中的位置(地址)是75,这个值是一个32bit整数类型,因此占据了从位置75开始的连续4个字节(也就是位置75, 76, 77, 78)。

M206 修改EEPROM设置

修改EEPROM中的某个值。命令参数为

  • Pnnn表示待修改的值的位置(即EEPROM中的地址);
  • Tnnn表示值的类型,0代表8bit整数类型,1代表16bit整数类型,2代表32bit整数类型,3代表32bit浮点类型;
  • Snnn表示值,只能带整数,用于T为0, 1, 2的情况;
  • Xnnn表示值,只能带浮点数,用于T为3的情况;

可以看出,M206指令的使用是很复杂的,需要了解EEPROM中数值的存储位置以及数值类型,才能进行有效的修改。因此打印虎建议除非你完全理解M206指令的含义,否则不要使用这个指令。

M360 输出固件配置信息

输出固件配置信息。没有相关参数。

M360命令的输出,格式为:

Config:Baudrate:115200

Config:InputBuffer:127

Config:NumExtruder:1

这是一个很长的输出,我们这里只截取了前三行。每行中,都有一项配置信息的名称,以及对应的值。

M500 保存内存中的设置值到EEPROM

将3D打印机内存中的设置值保存到EEPROM中。没有相关的参数。

M501 读取EEPROM的设置值到内存

将EEPROM中的设置值读取到3D打印机内存中。没有相关的参数。

M502 将内存中的设置值重置

将内存中的设置值重置为固件配置(configuration.h)中的值。没有相关的参数。

由于每次系统掉电后,内存中的值都会消失,重新启动时从EEPROM中读取,因此单独使用M502命令将只对3D打印机掉电重启之前起作用。如果想起长期作用,需要配合M500,将设置值保存到EEPROM中。

步进电机参考电压调节

目前市面上支持软件设置步进电机参考电压的3D打印机主板很少。大部分3D打印机主板只能通过调整微调电位器来控制步进电机参考电压。在这些3D打印机上,这一组命令是无效的。

M907 设置步进电机参考电压(百分比值)

设置步进电机参考电压。命令参数为

  • Snnn表示对所有步进电机进行统一设置;
  • Xnnn表示对X轴步进电机进行设置;
  • Ynnn表示对Y轴步进电机进行设置;
  • Znnn表示对Z轴步进电机进行设置;
  • Ennn表示对E轴步进电机进行设置;

所有的参数值,都是一个0~100之间的百分比数值。

M908 设置步进电机参考电压

与M907命令类似,设置步进电机参考电压。命令参数为

  • Pnnn表示步进电机编号;
  • Snnn表示步进电机参考电压设置值,要求为0~255之间的一个数值;

这个命令与M907命令类似,同样要求3D打印机主板支持。在不支持软件调整参考电压的3D打印机主板上,M908命令无效。

M909 输出步进电机参考电压值

输出当前的步进电机参考电压值。没有相关的参数。

M910 将步进电机参考电压值保存至EEPROM

将M907/M908命令设置的步进电机参考电压值保存至EEPROM。没有相关的参数。

需要辅助硬件支持的指令

M80/M81 打开/关闭ATX电源

在配置了ATX电源的3D打印机上,打开(M80)或者关闭(M81)ATX电源。没有相关的参数。

M340 伺服电机控制

伺服电机控制功能。命令参数为

  • Pnnn表示伺服电机编号,从0开始,最大为3,可以控制4个伺服电机;
  • Snnn为控制时间,单位为毫秒,应该是一个500到2500之间的数值;
  • Rnnn为自动关闭时间,单位为毫秒;

M350 设置步进电机细分数

在支持细分数设置的3D打印机主板上(这类主板很少见),设置步进电机细分数。命令参数为

  • Snnn表示将细分数的每一位(bit)都设置为相同的值,S0表示所有都设置为0,S1表示所有都设置为1;
  • Xnnn表示设置细分数第0位;
  • Ynnn表示设置细分数第1位;
  • Znnn表示设置细分数第2位;
  • Ennn表示设置细分数第3位;
  • Pnnn表示设置细分数第4位;

需要注意的是,在大多数3D打印机主板上,细分数设置是主板硬件设计时就固定的,不能通过软件调整。这种情况下,M350命令无效。

M355 设置照明灯开关

设置照明灯的开关。命令参数为

  • Snnn表示照明灯的开关状态,S0表示关闭照明灯,S1表示打开照明灯;

无参数时输出当前照明灯的状态。

在固件配置中,定义

#define CASE_LIGHTS_PIN -1

表示照明灯的电路硬件连接pin值,-1代表照明灯未连接。

M355命令的输出,为当前是否打开了照明灯。打开时会输出:

Case lights on

关闭时会输出:

Case lights off


更多的参考资料:


推荐的在线模拟器:NCViewer

还有另一款模拟器:GCode Viewer (jherrm.com)

2023-10-18

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK