MakerLab创客实验室 — Let's Make something.
现在注册
已注册用户请 登入
收藏此话题的成员
小海 mini avatar
Andy large avatar
MakerLab创客实验室  ›  固件

如何添加或定制自己的特殊G代码命令

By Andy at 2 年前 , 3079 次浏览

Marlin固件具有很强大的功能,支持非常多G代码命令(参考:http://reprap.org/wiki/Gcode )。但很多朋友还是有特殊定制的需求,在这里简单写一个例子来说明一下如何添加或修改自己定制的G代码命令。

所有的G代码列表在Marlin_main.cpp文件中。
所有的相关代码都在process_commands这个函数里面。G开头的(G1、G2、G3等)及M开头的(M0、M1等)是分开的,所以一定要注意区分。

我这里以一个简单例子做说明,是@wanhaixin 提出的,执行M03的时候,接通一个继电器,执行M05的时候,关闭这个继电器

首先因为是M命令,所以应该将代码添加在M代码部分。为了方便查找,按照原顺序进行添加会更好,比如M3应该放在M2和M4之间。

添加代码是一定要注意#if、#endif这样的宏命令。

#ifdef ULTIPANEL
case 0: // M0 - Unconditional stop - Wait for user button press on LCD
case 1: // M1 - Conditional stop - Wait for user button press on LCD
{
LCD_MESSAGEPGM(MSG_USERWAIT);
codenum = 0;
if(code_seen('P')) codenum = code_value(); // milliseconds to wait
if(code_seen('S')) codenum = code_value() * 1000; // seconds to wait

st_synchronize();
previous_millis_cmd = millis();
if (codenum > 0){
codenum += millis(); // keep track of when we started waiting
while(millis() < codenum && !lcd_clicked()){
manage_heater();
manage_inactivity();
lcd_update();
}
}else{
while(!lcd_clicked()){
manage_heater();
manage_inactivity();
lcd_update();
}
}
LCD_MESSAGEPGM(MSG_RESUMING);
}
break;
#endif

//需要添加的代码应该放在这个位置
case 3:
digitalWrite(Pin,High);//Pin指你打算用于控制继电器的接口(arduino Pin编号)。如果跟其它管脚冲突,可能需要配置Pins.h文件中相关管脚为-1.
break;
case 5:
digitalWrite(Pin,LOW);
break;

//定制添加代码结束

case 17:
LCD_MESSAGEPGM(MSG_NO_MOVE);

添加代码后,就可以通过发送M3和M5来分别拉高(5V)和拉低(0V)相应的IO口,从而实现对继电器的控制了。
修改代码的话跟添加差不多,只是找到相应代码段进行修改就好了。

如果有疑问可以这下面提出来。

7 回复
小海 medium avatar
#1 - 2 年前
小海

不错,要想玩转3d打印机,就要对代码下手。

wanhaixin medium avatar
#2 - 2 年前
wanhaixin

arduino Pin编号从哪里查呢?是不是从电路图上看的?

Andy medium avatar
#3 - 2 年前
Andy

@wanhaixin 不知道你用的什么板子,如果是用的MakerLab 的合体板的话,拓展部分的IO口都有标记。如果是其它已用IO,可以参考我的固件中关于板子310对应的Pin定义。
如果是ramps1.4板子,可以参考相关说明:http://reprap.org/wiki/Ramps

gyp364638399 medium avatar
#4 - 一年前
gyp364638399

楼主你好.,我找大神帮忙改了固件,增加M3,M5代码 让D11实现高低电平。对比之后发现与您的这篇帖子一模一样的。 现在的问题是 联机以后可以用m3,m5来控制11口的高低电平,但是电压不足,用表测量4.5v左右,而实验热床,风扇,加热头(D8,D9,D10) 都是4.99v都能完美的点亮led,而用11口测试led只是轻微的亮非常弱,我用2560测试的 上面没有别的转接板,请问大神如何解决这个问题 ,万分感谢

Andy medium avatar
#5 - 一年前
Andy

@gyp364638399 D11直接驱动继电器?你把继电器拔掉后测试电压是多少?一般来说,继电器不能直接用IO口控制,因为IO的输出能力太低

gyp364638399 medium avatar
#6 - 一年前
gyp364638399   via Android

不是直接驱动继电器,继电器模块 ,别的端口都能驱动,比如说热床的或者风扇的,不说这些单说用表测量D8,D9,D10高电平都是4.99伏,而通过修改的这个D11就只有4.5伏,连一个小的lde都点不亮,随后我又改了D4,D5情况也是一样(我只用一块arduino2560测试的没有用转接板什么的)请问大神是不是程序上有什么问题?

xg medium avatar
#7 - 3 天前
xg

我添加的关于舵机的g代码,编译时出现错误Marlin_main.cpp.o: In function `__static_initialization_and_destruction_0':
添加的代码都报错,请问大神是什么原因?