0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

以Cura插件USBPrinting為例解讀3D打印機(jī)USB聯(lián)機(jī)打印實(shí)現(xiàn)方案

電子工程師 ? 來(lái)源:嵌入式應(yīng)用研究院 ? 作者:嵌入式應(yīng)用研究院 ? 2022-09-27 11:35 ? 次閱讀

眾所周知,對(duì)3D打印機(jī)感興趣的小伙伴來(lái)說(shuō),都清楚Cura是3D打印機(jī)的切片軟件,它的UI部分是基于QT來(lái)開(kāi)發(fā)的。而Cura中很多功能其實(shí)是基于插件的形式來(lái)開(kāi)發(fā),其中,用于實(shí)現(xiàn)Cura的USB轉(zhuǎn)串口聯(lián)機(jī)打印的邏輯就是一個(gè)插件,它是使用Python語(yǔ)言來(lái)實(shí)現(xiàn)的,具體代碼位于:

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

之前我也做了一些3D打印機(jī)的聯(lián)機(jī)打印的開(kāi)源項(xiàng)目:

Anycubic Vyper 3D打印機(jī)串口屏改造開(kāi)源項(xiàng)目之串口屏項(xiàng)目啟動(dòng)篇(一)

Anycubic Vyper 3D打印機(jī)串口屏改造開(kāi)源項(xiàng)目之QT溫度曲線顯示(二)

而我前陣子參加開(kāi)放原子基金會(huì)組織的開(kāi)發(fā)者成長(zhǎng)激勵(lì)活動(dòng)的作品其實(shí)也算是聯(lián)機(jī)打印的一種,只是實(shí)現(xiàn)的方式不同而已罷了:

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

開(kāi)發(fā)者成長(zhǎng)激勵(lì)計(jì)劃-基于TencentOS Tiny FDM 3D打印機(jī)云控制系統(tǒng)方案

說(shuō)到Cura中的USB轉(zhuǎn)串口聯(lián)機(jī)打印,核心邏輯可以梳理下為以下幾點(diǎn):

(1)查找串口設(shè)備列表并獲取對(duì)應(yīng)的打印機(jī)設(shè)備端口號(hào),這部分的代碼是在USBPrinterOutputDeviceManager.py這個(gè)文件里實(shí)現(xiàn)的。

(2)設(shè)置串口設(shè)備參數(shù)并連接設(shè)備、啟動(dòng)更新線程來(lái)處理串口數(shù)據(jù)接收

具體的代碼實(shí)現(xiàn)如下:

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:
#設(shè)置串口參數(shù)
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)
#啟動(dòng)更新線程
self._update_thread.start()

(3)啟動(dòng)更新任務(wù)線程,更新任務(wù)線程的作用是處理以下幾件事情:

以readline()的方式去接收打印機(jī)回復(fù)的數(shù)據(jù),然后處理數(shù)據(jù),例如接收到了ok或者溫度信息等。

處理接收的數(shù)據(jù),并接著發(fā)下一條Gcode指令,直到?jīng)]有得發(fā)為止。

處理打印過(guò)程中發(fā)生的異常事件

發(fā)送M105獲取溫度命令,這里Cura是做了一些處理的,發(fā)送該條命令的前提是打印機(jī)不處于忙狀態(tài)并且溫度到了設(shè)定的固件超時(shí)時(shí)間才會(huì)進(jìn)行發(fā)送。Cura的超時(shí)設(shè)置為3s。

Gcode重發(fā)機(jī)制的實(shí)現(xiàn)

具體的代碼實(shí)現(xiàn)如下:

#線程_update_thread->更新任務(wù)函數(shù)的實(shí)現(xiàn)
def_update(self):
whileself._connection_state==ConnectionState.Connectedandself._serialisnotNone:
try:
line=self._serial.readline()
except:
continue

#獲取固件信息
#如果是Marlin,則會(huì)輸出類似如下所示的信息
#FIRMWARE_NAME:Marlin1.1.0....
ifnotself._firmware_name_requested:
self._firmware_name_requested=True
self.sendCommand("M115")

#獲取FIRMWARE_NAME并保存起來(lái)
ifb"FIRMWARE_NAME:"inline:
self._setFirmwareName(line)

# time()是獲取時(shí)間戳,以秒作為時(shí)間間隔,這里的timeout是3,也就意味著,Cura發(fā)送獲取溫度的條件是:
#1、當(dāng)前的打印機(jī)不處于忙狀態(tài)
#2、超時(shí),這里設(shè)置的時(shí)間是大于3s
#以上兩個(gè)條件需要同時(shí)滿足
ifself._last_temperature_requestisNoneortime()>self._last_temperature_request+self._timeout:
self.sendCommand("M105")
self._last_temperature_request=time()

#使用正則表達(dá)式獲取由打印機(jī)端上報(bào)的溫度事件,其中T:開(kāi)頭的數(shù)據(jù)代表噴頭溫度,B:開(kāi)頭的數(shù)據(jù)代表熱床溫度
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
#獲取噴頭當(dāng)前/目標(biāo)溫度值并更新到前端顯示
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]))

#獲取熱床當(dāng)前/目標(biāo)溫度值并更新到前端顯示
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]))

#空行表示固件空閑
#多個(gè)空行可能意味著固件和Cura正在等待
#因?yàn)殄e(cuò)過(guò)了“ok”,所以我們跟蹤空行
#因?yàn)閛k可能丟掉了,所以我們需要將空行記錄下來(lái)
ifline==b"":
#Anemptylinemeansthatthefirmwareisidle
#MultipleemptylinesprobablymeansthatthefirmwareandCuraarewaiting
#foreachotherduetoamissed"ok",sowekeeptrackofemptylines
self._firmware_idle_count+=1
else:
self._firmware_idle_count=0

#檢查到ok字串或者_(dá)firmware_idle_count>1
ifline.startswith(b"ok")orself._firmware_idle_count>1:
#此時(shí)打印機(jī)忙狀態(tài)解除
self._printer_busy=False
#設(shè)置接收事件為True
self._command_received.set()
#如果當(dāng)前命令隊(duì)列不為空,則從隊(duì)列取出一條命令往打印機(jī)串口繼續(xù)發(fā)送
ifnotself._command_queue.empty():
self._sendCommand(self._command_queue.get())
#如果處于正在打印中,則繼續(xù)發(fā)送下一條Gcode命令
#如果此時(shí)暫停標(biāo)志生效,則什么事情都不干
elifself._is_printing:
ifself._paused:
pass#Nothingtodo!
else:
self._sendNextGcodeLine()

#如果匹配到Marlin回復(fù)了"echo:busy"子串時(shí),則設(shè)置打印機(jī)為忙狀態(tài)
ifline.startswith(b"echo"):
self._printer_busy=True

#如果在打印中接收到'!!',則表示打印機(jī)發(fā)出致命錯(cuò)誤,這個(gè)時(shí)候需要直接取消打印
ifself._is_printing:
ifline.startswith(b'!!'):
Logger.log('e',"Printersignalsfatalerror.Cancellingprint.{}".format(line))
self.cancelPrint()
#如果在打印中接收到"resend"或者"rs"這樣的字符串,則可以通過(guò) Resend、resend 或 rs 請(qǐng)求重新發(fā)送。
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轉(zhuǎn)串口聯(lián)機(jī)打印中,也實(shí)現(xiàn)了一些打印的基本業(yè)務(wù),待后續(xù)分析和開(kāi)源作品分享。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • usb
    usb
    +關(guān)注

    關(guān)注

    60

    文章

    7963

    瀏覽量

    265257
  • 打印機(jī)
    +關(guān)注

    關(guān)注

    10

    文章

    775

    瀏覽量

    45804
  • 3D打印機(jī)
    +關(guān)注

    關(guān)注

    9

    文章

    527

    瀏覽量

    44206
  • Cura
    +關(guān)注

    關(guān)注

    0

    文章

    5

    瀏覽量

    2659

原文標(biāo)題:3D打印機(jī)USB聯(lián)機(jī)打印是如何實(shí)現(xiàn)的?(以Cura插件USBPrinting為例)

文章出處:【微信號(hào):嵌入式應(yīng)用研究院,微信公眾號(hào):嵌入式應(yīng)用研究院】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    開(kāi)源3D打印機(jī)開(kāi)發(fā)套件

    `并聯(lián)臂3D打印機(jī)一、產(chǎn)品介紹1.并聯(lián)臂3D打印機(jī)是新型打印機(jī)結(jié)構(gòu),高精度,高速度深受DIY創(chuàng)
    發(fā)表于 10-23 11:23

    3D打印機(jī)原理

    ://www.zhihu.com/people/seanlety3D]3D[/url]打印機(jī)原理3D打印機(jī)
    發(fā)表于 09-08 07:57

    3D打印機(jī)是如何運(yùn)作的

    首先需要正確的方向,而不是盲目的亂肝,在這編文章里,我將寫下3D打印機(jī)如何運(yùn)作及之后寫文章的大致方向打印機(jī)是如何運(yùn)作的首先需要一個(gè)3D模型,一般后綴名為stl,在切片軟件完成切片,生成
    發(fā)表于 01-12 06:03

    基于RK3399設(shè)計(jì)3D打印機(jī)方案

    一、3D打印介紹3D打印即快速成型技術(shù)的一種,是一種數(shù)字模型文件基礎(chǔ),運(yùn)用粉末狀金屬或塑料等
    發(fā)表于 04-06 15:43

    3d打印機(jī)結(jié)構(gòu)_3d打印機(jī)分類

    3D打印機(jī)簡(jiǎn)稱(3DP)是一位名恩里科·迪尼的發(fā)明家設(shè)計(jì)的一種神奇的打印機(jī),不僅可以“打印”一
    的頭像 發(fā)表于 04-28 14:19 ?2.1w次閱讀

    3D打印機(jī)的簡(jiǎn)介

    3D打印機(jī)用于通過(guò)打印制作三維對(duì)象和實(shí)體。該過(guò)程也稱為增材制造過(guò)程。在這些打印機(jī)中,特定材料的連續(xù)膠片和層被放置在計(jì)算機(jī)的控制下。在這些打印機(jī)
    的頭像 發(fā)表于 12-06 15:23 ?1.1w次閱讀

    3d打印機(jī)可以打印什么東西_3d打印機(jī)怎么用

    不同的3D打印機(jī)打印的東西是不同的。比如:有的3D打印機(jī)金屬粉末
    的頭像 發(fā)表于 03-21 10:32 ?1.1w次閱讀

    3d打印機(jī)原理是什么_3d打印機(jī)怎么建模

    本文首先介紹了3d打印機(jī)原理,其次介紹了3d打印機(jī)運(yùn)用領(lǐng)域,最后闡述了3d打印機(jī)建模教程。
    的頭像 發(fā)表于 03-21 10:50 ?1.1w次閱讀

    3D打印機(jī)是什么,3D打印機(jī)可以打印什么東西

    3D打印機(jī)是一款方便大眾,而且十分容易操作的3D打印機(jī),它能幫助你把你想象中的模型轉(zhuǎn)化為現(xiàn)實(shí)的東西,可以創(chuàng)造玩具、珠寶、飛機(jī)等創(chuàng)意設(shè)計(jì)。
    的頭像 發(fā)表于 04-12 22:31 ?1.2w次閱讀

    工業(yè)級(jí)FDM 3D打印機(jī),能夠實(shí)現(xiàn)高溫3D打印

    加拿大3D打印機(jī)制造商AON3D宣布推出新型FDM 3D打印機(jī)AON-M2 2020。
    的頭像 發(fā)表于 04-28 15:19 ?6518次閱讀

    新手該怎樣使用小型3d打印機(jī)

    這幾年進(jìn)出口貿(mào)易居多,3d打印技術(shù)引入國(guó)內(nèi),掀開(kāi)一股3d打印風(fēng)潮,風(fēng)靡各個(gè)領(lǐng)域,3d打印技術(shù)在熱
    的頭像 發(fā)表于 12-04 15:26 ?3941次閱讀

    淺談?dòng)绊?b class='flag-5'>3D打印機(jī)價(jià)格的因素

    隨著3d打印技術(shù)的不斷改進(jìn),3d打印機(jī)也在更新迭代,生產(chǎn)打印機(jī)的成本也隨之上漲或下跌。那么影響3d
    發(fā)表于 06-06 09:51 ?1312次閱讀

    選購(gòu)3D打印機(jī)時(shí)應(yīng)該注意哪些問(wèn)題

    如今越來(lái)越多的小伙伴接觸到3D打印機(jī)技術(shù),想擁有自己的3D打印機(jī)。那么我們?cè)谶x購(gòu)3d打印機(jī)的時(shí)候
    發(fā)表于 07-24 09:48 ?1100次閱讀

    哪種3d打印機(jī)精度高 哪家3d打印機(jī)性價(jià)比高

    廣泛的幾款品牌: 一、從3D打印機(jī)品牌廠家的綜合實(shí)力來(lái)分析。通常正規(guī)廠商生產(chǎn)的3D打印機(jī)在質(zhì)量、安全等方面都有嚴(yán)格把控。而且口碑固市的
    發(fā)表于 11-22 14:12 ?7836次閱讀

    3D打印機(jī)USB接口和SD卡接口防靜電設(shè)計(jì)

    3D打印機(jī)USB接口和SD卡接口防靜電設(shè)計(jì)3D打印機(jī)的平民化帶來(lái)了一場(chǎng)應(yīng)用革命,越來(lái)越多的教學(xué),模型,設(shè)計(jì),廣告場(chǎng)合應(yīng)用。但由于眾多
    的頭像 發(fā)表于 12-31 10:54 ?1048次閱讀
    <b class='flag-5'>3D</b><b class='flag-5'>打印機(jī)</b>的<b class='flag-5'>USB</b>接口和SD卡接口防靜電設(shè)計(jì)