激光雕刻机的位图-GCode转换方法实践
Author:Gary LiDate:2019-5-21. 简介现在有一部分3D打印机带有激光雕刻功能,自己组装一台专用的激光雕刻机也并不复杂成本也很低。但是当我们使用激光雕刻机时,激光雕刻下位机只能接受路径指令,所以我们需要把位图——也就是我们平时最常见的jpg、png图片转换为控制板能理解的G-Code代码。根据需求以及复杂程度,转换有以下几种方法可以选择。下述方法所需的工具包均已打...
Author:Gary Li
Date:2019-5-2
1. 简介
现在有一部分3D打印机带有激光雕刻功能,自己组装一台专用的激光雕刻机也并不复杂成本也很低。但是当我们使用激光雕刻机时,激光雕刻下位机只能接受路径指令,所以我们需要把位图——也就是我们平时最常见的jpg、png图片转换为控制板能理解的G-Code代码。根据需求以及复杂程度,转换有以下几种方法可以选择。下述方法所需的工具包均已打包上传,且均为绿色免安装版,下载地址。
2. 位图->G-Code (使用JediMaster)
绝地大师(JediMaster)这个软件可以一键实现上述的目的,优点是使用简单,但是有一些致命的缺点,比如配置选项少导致最后效果不可控;只能支持简单的线条图形,复杂图形会转换失败等等。如果雕刻的原图片是一些logo之类的可以考虑使用此软件。
使用方法:解压后直接双击打开软件,左上角加号选择图片后等待转换完成就可以在主界面看到结果。双击主界面可以修改图片大小等等。使用方法很简单这里不详细说明了。解析完毕后图片就已经保存到了C:\Users<UserName>\.jedimaster中,将后缀为.nc的文件打开复制到上位机控制软件即可。
3. 位图->SVG->GCode (VectorMagic,JediMaster)
VectorMagic是一款位图转矢量图的小工具,具有很多功能比如去除背景,控制精细度等等功能并且支持较复杂的图形。弥补了JediMaster的缺点,将VectorMagic生成的SVG文件输入到JediMaster中即可。不过这个方法有个致命的缺点,那就是如下图所示,会生成很多移动路径,并且移动的时候激光头是打开状态的,所以会产生许多的杂线条。并且我观察了很久生成的GCode,并无法通过程序的方式将这些杂线条区分出来,所以这个致命问题导致了该方法不可用。
4. 位图 / 矢量图 -> GCode(InkScape) (推荐)
InkScape是个免费开源的矢量图作图软件,也支持大量的插件,功能选项很多,可以直接转换位图或者矢量图为GCode。这个软件还有个最大的优点是生成的路径是优化过的最短路径,效率很高;并且生成的路径原点在中间,方便定位。网上使用方法也很多,但是我折腾了大半天,原因是inkscape是个开源软件版本很多兼容性也控制得不是很好,下了很多版本要不就是功能残缺或者缺个库,或者就是运行时报很多错误。在我上传的资源包里有我测试完成的绿色版inkscape以及转换成GCode的插件。将资源包里的inkscape-unicorn-master的src文件夹里的内容解压到inkscape\share\extensions打开inkscape即可。使用方法参考这个视频:
不过转换出来的GCode不能直接使用,需要将里面的指令进行替换以及过滤。过滤脚本如下:
# AccLaser.py
# Usage:python3 AccLaser.py -f <gcode file> [-m <move speed> -c <crave speed>]
import sys, getopt
move_speed = 3000
crave_speed = 300
if __name__ == '__main__':
opts, args = getopt.getopt(sys.argv[1:], "f:m:c:")
input_file=""
#获取参数
for op, value in opts:
if op == "-f":
input_file = value
elif op == "-m":
move_speed = value
elif op == "-c":
crave_speed = value
print(input_file,move_speed,crave_speed)
if input_file == "":
print("Please input file name")
sys.exit()
lines = []
#设置初始参数
lines.append('G21')
lines.append('G90')
lines.append('G92')
lines.append('M05')
# 记录激光状态,用于判断移动速度
state = False
with open(input_file,'r') as ifd:
for index,line in enumerate(ifd):
#去除换行,避免换行混乱
line = line.replace("\n", "")
line = line.replace("\r", "")
#跳过前面几行生成的测试语句
if index <= 14:
continue
elif 'pen down' in line:
lines.append('M03')
state = True
elif 'pen up' in line:
lines.append('M05')
state = False
#如果读到了移动指令
elif line.startswith('G1'):
#判断激光状态,如果激光关了,则可以快速移动
if state == False:
lines.append(line.replace('F3500.00','F'+str(move_speed)))
#如果激光是关着的
else:
lines.append(line.replace('F3500.00', 'F' + str(crave_speed)))
#输出文件
output_file = input_file + '.acc'
with open(output_file,'w') as ofd:
for line in lines[:-3]:#跳过最后三行回家的指令
ofd.write(line+'\n')
print("文件生成成功:",output_file)
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)