在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    文章

    7945

    瀏覽量

    264639
  • 打印機
    +關注

    關注

    10

    文章

    771

    瀏覽量

    45681
  • 3D打印機
    +關注

    關注

    9

    文章

    526

    瀏覽量

    44143
  • Cura
    +關注

    關注

    0

    文章

    5

    瀏覽量

    2651

原文標題: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 ?6487次閱讀

    新手該怎樣使用小型3d打印機

    這幾年進出口貿易居多,3d打印技術引入國內,掀開一股3d打印風潮,風靡各個領域,3d打印技術在熱
    的頭像 發表于 12-04 15:26 ?3901次閱讀

    淺談影響3D打印機價格的因素

    隨著3d打印技術的不斷改進,3d打印機也在更新迭代,生產打印機的成本也隨之上漲或下跌。那么影響3d
    發表于 06-06 09:51 ?1230次閱讀

    選購3D打印機時應該注意哪些問題

    如今越來越多的小伙伴接觸到3D打印機技術,想擁有自己的3D打印機。那么我們在選購3d打印機的時候
    發表于 07-24 09:48 ?1082次閱讀

    哪種3d打印機精度高 哪家3d打印機性價比高

    廣泛的幾款品牌: 一、從3D打印機品牌廠家的綜合實力來分析。通常正規廠商生產的3D打印機在質量、安全等方面都有嚴格把控。而且口碑固市的
    發表于 11-22 14:12 ?7795次閱讀

    3D打印機USB接口和SD卡接口防靜電設計

    3D打印機USB接口和SD卡接口防靜電設計3D打印機的平民化帶來了一場應用革命,越來越多的教學,模型,設計,廣告場合應用。但由于眾多
    的頭像 發表于 12-31 10:54 ?1018次閱讀
    <b class='flag-5'>3D</b><b class='flag-5'>打印機</b>的<b class='flag-5'>USB</b>接口和SD卡接口防靜電設計
    主站蜘蛛池模板: 亚洲国产成人久久99精品| 五月婷婷一区| 日日噜噜夜夜狠狠tv视频免费| 精品欧美一区二区三区在线观看| 97伊人| 222aaa天堂| 一区二区三区伦理| 精品人人| 国产午夜精品福利| 一级特黄牲大片免费视频| 黄色大片播放| 国产精品免费看久久久| 亚洲伊人久久大香线蕉影院 | 久久综合九色综合97_ 久久久 | 欧美瑟瑟| 日韩黄色网| 高h细节肉爽文bl1v1| 久久精品视频国产| 精品视频一区在线观看| 亚洲天堂免费| 俺不色| 在线观看免费av网| 日本a在线看| 奇米影视大全| 亚洲天堂免费在线| 91po狼人社在线观看| 永久免费看黄| 伦理一区二区三区| 黄a免费| 色婷婷中文字幕| 色综合天天综合网亚洲影院| 国产精品久久久久免费| 国产亚洲精品激情都市| 日本janpanese护士bus中国| 日本亚洲精品色婷婷在线影院| 天天干天天色综合| 一级@片| 天天舔天天射| 亚洲男人精品| 婷婷九月色| 亚洲人成网站色7777|