0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

以Cura插件USBPrinting为例解读3D打印机USB联机打印实现方案

电子工程师 来源:嵌入式应用研究院 作者:嵌入式应用研究院 2022-09-27 11:35 次阅读

众所周知,对3D打印机感兴趣的小伙伴来说,都清楚Cura是3D打印机的切片软件,它的UI部分是基于QT来开发的。而Cura中很多功能其实是基于插件的形式来开发,其中,用于实现Cura的USB转串口联机打印的逻辑就是一个插件,它是使用Python语言来实现的,具体代码位于:

https://github.com/Ultimaker/Cura/tree/main/plugins/USBPrinting

之前我也做了一些3D打印机的联机打印的开源项目:

Anycubic Vyper 3D打印机串口屏改造开源项目之串口屏项目启动篇(一)

Anycubic Vyper 3D打印机串口屏改造开源项目之QT温度曲线显示(二)

而我前阵子参加开放原子基金会组织的开发者成长激励活动的作品其实也算是联机打印的一种,只是实现的方式不同而已罢了:

fae6f368-3ceb-11ed-9e49-dac502259ad0.png

开发者成长激励计划-基于TencentOS Tiny FDM 3D打印机云控制系统方案

说到Cura中的USB转串口联机打印,核心逻辑可以梳理下为以下几点:

(1)查找串口设备列表并获取对应的打印机设备端口号,这部分的代码是在USBPrinterOutputDeviceManager.py这个文件里实现的。

(2)设置串口设备参数并连接设备、启动更新线程来处理串口数据接收

具体的代码实现如下:

defconnect(self):
self._firmware_name=None#aftereachconnectionensurethatthefirmwarenameisremoved

ifself._baud_rateisNone:
ifself._use_auto_detect:
auto_detect_job=AutoDetectBaudJob(self._serial_port)
auto_detect_job.start()
auto_detect_job.finished.connect(self._autoDetectFinished)
return
ifself._serialisNone:
try:
#设置串口参数
self._serial=Serial(str(self._serial_port),self._baud_rate,timeout=self._timeout,writeTimeout=self._timeout)
exceptSerialException:
Logger.warning("Anexceptionoccurredwhiletryingtocreateserialconnection.")
return
exceptOSErrorase:
Logger.warning("Theserialdeviceissuddenlyunavailablewhiletryingtocreateaserialconnection:{err}".format(err=str(e)))
return
CuraApplication.getInstance().globalContainerStackChanged.connect(self._onGlobalContainerStackChanged)
self._onGlobalContainerStackChanged()
self.setConnectionState(ConnectionState.Connected)
#启动更新线程
self._update_thread.start()

(3)启动更新任务线程,更新任务线程的作用是处理以下几件事情:

以readline()的方式去接收打印机回复的数据,然后处理数据,例如接收到了ok或者温度信息等。

处理接收的数据,并接着发下一条Gcode指令,直到没有得发为止。

处理打印过程中发生的异常事件

发送M105获取温度命令,这里Cura是做了一些处理的,发送该条命令的前提是打印机不处于忙状态并且温度到了设定的固件超时时间才会进行发送。Cura的超时设置为3s。

Gcode重发机制的实现

具体的代码实现如下:

#线程_update_thread->更新任务函数的实现
def_update(self):
whileself._connection_state==ConnectionState.Connectedandself._serialisnotNone:
try:
line=self._serial.readline()
except:
continue

#获取固件信息
#如果是Marlin,则会输出类似如下所示的信息
#FIRMWARE_NAME:Marlin1.1.0....
ifnotself._firmware_name_requested:
self._firmware_name_requested=True
self.sendCommand("M115")

#获取FIRMWARE_NAME并保存起来
ifb"FIRMWARE_NAME:"inline:
self._setFirmwareName(line)

# time()是获取时间戳,以秒作为时间间隔,这里的timeout是3,也就意味着,Cura发送获取温度的条件是:
#1、当前的打印机不处于忙状态
#2、超时,这里设置的时间是大于3s
#以上两个条件需要同时满足
ifself._last_temperature_requestisNoneortime()>self._last_temperature_request+self._timeout:
self.sendCommand("M105")
self._last_temperature_request=time()

#使用正则表达式获取由打印机端上报的温度事件,其中T:开头的数据代表喷头温度,B:开头的数据代表热床温度
ifre.search(b"[B|Td*]:?d+.?d*",line):#Temperaturemessage.'T:'forextruderand'B:'forbed
extruder_temperature_matches=re.findall(b"T(d*):?(d+.?d*)s*/?(d+.?d*)?",line)
#Updatealltemperaturevalues
#获取喷头当前/目标温度值并更新到前端显示
matched_extruder_nrs=[]
formatchinextruder_temperature_matches:
extruder_nr=0
ifmatch[0]!=b"":
extruder_nr=int(match[0])
ifextruder_nrinmatched_extruder_nrs:
continue
matched_extruder_nrs.append(extruder_nr)
ifextruder_nr>=len(self._printers[0].extruders):
Logger.log("w","Printerreportsmoretemperaturesthanthenumberofconfiguredextruders")
continue
extruder=self._printers[0].extruders[extruder_nr]
ifmatch[1]:
extruder.updateHotendTemperature(float(match[1]))
ifmatch[2]:
extruder.updateTargetHotendTemperature(float(match[2]))

#获取热床当前/目标温度值并更新到前端显示
bed_temperature_matches=re.findall(b"B:?(d+.?d*)s*/?(d+.?d*)?",line)
ifbed_temperature_matches:
match=bed_temperature_matches[0]
ifmatch[0]:
self._printers[0].updateBedTemperature(float(match[0]))
ifmatch[1]:
self._printers[0].updateTargetBedTemperature(float(match[1]))

#空行表示固件空闲
#多个空行可能意味着固件和Cura正在等待
#因为错过了“ok”,所以我们跟踪空行
#因为ok可能丢掉了,所以我们需要将空行记录下来
ifline==b"":
#Anemptylinemeansthatthefirmwareisidle
#MultipleemptylinesprobablymeansthatthefirmwareandCuraarewaiting
#foreachotherduetoamissed"ok",sowekeeptrackofemptylines
self._firmware_idle_count+=1
else:
self._firmware_idle_count=0

#检查到ok字串或者_firmware_idle_count>1
ifline.startswith(b"ok")orself._firmware_idle_count>1:
#此时打印机忙状态解除
self._printer_busy=False
#设置接收事件为True
self._command_received.set()
#如果当前命令队列不为空,则从队列取出一条命令往打印机串口继续发送
ifnotself._command_queue.empty():
self._sendCommand(self._command_queue.get())
#如果处于正在打印中,则继续发送下一条Gcode命令
#如果此时暂停标志生效,则什么事情都不干
elifself._is_printing:
ifself._paused:
pass#Nothingtodo!
else:
self._sendNextGcodeLine()

#如果匹配到Marlin回复了"echo:busy"子串时,则设置打印机为忙状态
ifline.startswith(b"echo"):
self._printer_busy=True

#如果在打印中接收到'!!',则表示打印机发出致命错误,这个时候需要直接取消打印
ifself._is_printing:
ifline.startswith(b'!!'):
Logger.log('e',"Printersignalsfatalerror.Cancellingprint.{}".format(line))
self.cancelPrint()
#如果在打印中接收到"resend"或者"rs"这样的字符串,则可以通过 Resend、resend 或 rs 请求重新发送。
elifline.lower().startswith(b"resend")orline.startswith(b"rs"):
#AresendcanberequestedeitherbyResend,resendorrs.
try:
self._gcode_position=int(line.replace(b"N:",b"").replace(b"N",b"").replace(b":",b"").split()[-1])
except:
ifline.startswith(b"rs"):
#InsomecasesoftheRScommanditneedstobehandleddifferently.
self._gcode_position=int(line.split()[1])

在USB转串口联机打印中,也实现了一些打印的基本业务,待后续分析和开源作品分享。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • usb
    usb
    +关注

    关注

    59

    文章

    7432

    浏览量

    258136
  • 打印机
    +关注

    关注

    9

    文章

    724

    浏览量

    44831
  • 3D打印机
    +关注

    关注

    9

    文章

    508

    浏览量

    43591
  • Cura
    +关注

    关注

    0

    文章

    5

    浏览量

    2631

原文标题:3D打印机USB联机打印是如何实现的?(以Cura插件USBPrinting为例)

文章出处:【微信号:嵌入式应用研究院,微信公众号:嵌入式应用研究院】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    制作3D打印机

    请问有自己制作3D打印机的朋友吗??我想制作一台3D打印机
    发表于 06-05 16:33

    为什么没人用stm32做3d打印机

    3d打印机发展了怎么久都开源了为什么这么多人选择了arduino做3d打印机 而不选择stm32做3d
    发表于 09-15 17:49

    开源3D打印机开发套件

    `并联臂3D打印机一、产品介绍1.并联臂3D打印机是新型打印机结构,高精度,高速度深受DIY创
    发表于 10-23 11:23

    fmd 3D打印机

    `批量快速打印不是梦是桌面3D打印机的8倍以上成型速度 4工位3D打印机打印尺寸:300*215
    发表于 12-18 16:37

    中科院3D打印机CEST400|国产工业级3D打印机

    厂家的直径1.75 毫米的ABS材料等。获得“中国国际高新技术成果交易会”优秀产品奖(可提供证书)关键词:中科院3D打印机CASET400国产工业级3D
    发表于 08-10 17:27

    便宜工业级3D打印机CASET400

    。该工厂的夹具和治具部门已决定将3D打印机CASET400作为铣削、车削和钻孔等传统金属切割制造的替代方法。可降低工程文档、仓储和制造方面的成本。真正的生产解决方案改善生产效率、工
    发表于 09-06 14:44

    TI如何融入3D打印机技术

    电机驱动器是骨干,那么MCU就是大脑。超低功耗MSP430F5529 MCU让你能够控制3D打印机,并开始将打印出的物体应用到实际生活中。在集成USB的支持下,MSP430F5529能
    发表于 09-11 14:04

    3D打印机得用处和优点

    `3D打印机到底有什么用处和优点?什么样的三维打印机比较好随着创新速度日益加快,3D 打印解决方案
    发表于 09-13 11:38

    3D打印机技术材料怎么选择

    测量仪等设备,作为面向3D打印与三维扫描计量技术专业化技术服务提供商,已为全国超过160所院校、科研机构以及众多知名企业提供相关技术解决方案与项目实施。欢迎您前来体验考察及登录我司官网浏览(官网可直接搜索:中科院广州电子)!关键
    发表于 09-20 10:55

    教您玩转发光字3D打印机含教程

    `发光字3D打印机使用起来难不难?我是新手的话想学习使用的话需要多久?发光字的建模怎么建?今天我们教您玩转发光字3D打印机武汉智垒众立印
    发表于 10-14 11:52

    基于飞凌RK3399核心平台的3D打印机解决方案

    的方式来构造物体的技术。 二、 3D打印应用3D打印通常是采用数字技术材料打印机实现的。常在
    发表于 04-28 11:20

    3D打印机的EMC辐射整改

    ,大多都按照Cispr 11标准以及相关抗扰标准去做认证。但是,由于3d打印机3个步进马达、以及长的链接线缆、高速数据存储控制、各种MCU程序控制等,也给EMC带来了比较大的困难,下文
    发表于 05-12 10:21

    3D打印机原理

    ://www.zhihu.com/people/seanlety3D]3D[/url]打印机原理3D打印机
    发表于 09-08 07:57

    3D打印机是如何运作的

    首先需要正确的方向,而不是盲目的乱肝,在这编文章里,我将写下3D打印机如何运作及之后写文章的大致方向打印机是如何运作的首先需要一个3D模型,一般后缀名为stl,在切片软件完成切片,生成
    发表于 01-12 06:03

    基于RK3399设计3D打印机方案

    一、3D打印介绍3D打印即快速成型技术的一种,是一种数字模型文件基础,运用粉末状金属或塑料等
    发表于 04-06 15:43