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
    +关注

    关注

    60

    文章

    7936

    浏览量

    264454
  • 打印机
    +关注

    关注

    10

    文章

    768

    浏览量

    45656
  • 3D打印机
    +关注

    关注

    9

    文章

    524

    浏览量

    44126
  • Cura
    +关注

    关注

    0

    文章

    5

    浏览量

    2649

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

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

收藏 人收藏

    评论

    相关推荐

    开源3D打印机开发套件

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

    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

    3d打印机结构_3d打印机分类

    3D打印机简称(3DP)是一位名恩里科·迪尼的发明家设计的一种神奇的打印机,不仅可以“打印”一
    的头像 发表于 04-28 14:19 2.1w次阅读

    3D打印机的简介

    3D打印机用于通过打印制作三维对象和实体。该过程也称为增材制造过程。在这些打印机中,特定材料的连续胶片和层被放置在计算机的控制下。在这些打印机
    的头像 发表于 12-06 15:23 1.1w次阅读

    3d打印机可以打印什么东西_3d打印机怎么用

    不同的3D打印机打印的东西是不同的。比如:有的3D打印机金属粉末
    的头像 发表于 03-21 10:32 1.1w次阅读

    3d打印机原理是什么_3d打印机怎么建模

    本文首先介绍了3d打印机原理,其次介绍了3d打印机运用领域,最后阐述了3d打印机建模教程。
    的头像 发表于 03-21 10:50 1.1w次阅读

    3D打印机是什么,3D打印机可以打印什么东西

    3D打印机是一款方便大众,而且十分容易操作的3D打印机,它能帮助你把你想象中的模型转化为现实的东西,可以创造玩具、珠宝、飞机等创意设计。
    的头像 发表于 04-12 22:31 1.1w次阅读

    工业级FDM 3D打印机,能够实现高温3D打印

    加拿大3D打印机制造商AON3D宣布推出新型FDM 3D打印机AON-M2 2020。
    的头像 发表于 04-28 15:19 6472次阅读

    新手该怎样使用小型3d打印机

    这几年进出口贸易居多,3d打印技术引入国内,掀开一股3d打印风潮,风靡各个领域,3d打印技术在热
    的头像 发表于 12-04 15:26 3889次阅读

    浅谈影响3D打印机价格的因素

    随着3d打印技术的不断改进,3d打印机也在更新迭代,生产打印机的成本也随之上涨或下跌。那么影响3d
    发表于 06-06 09:51 1207次阅读

    选购3D打印机时应该注意哪些问题

    如今越来越多的小伙伴接触到3D打印机技术,想拥有自己的3D打印机。那么我们在选购3d打印机的时候
    发表于 07-24 09:48 1068次阅读

    哪种3d打印机精度高 哪家3d打印机性价比高

    广泛的几款品牌: 一、从3D打印机品牌厂家的综合实力来分析。通常正规厂商生产的3D打印机在质量、安全等方面都有严格把控。而且口碑固市的
    发表于 11-22 14:12 7780次阅读

    3D打印机USB接口和SD卡接口防静电设计

    3D打印机USB接口和SD卡接口防静电设计3D打印机的平民化带来了一场应用革命,越来越多的教学,模型,设计,广告场合应用。但由于众多
    的头像 发表于 12-31 10:54 1003次阅读
    <b class='flag-5'>3D</b><b class='flag-5'>打印机</b>的<b class='flag-5'>USB</b>接口和SD卡接口防静电设计