唐智超,李仲豪,蔣世奇,張 杰,鄭富中
(1.成都信息工程大學(xué)自動(dòng)化學(xué)院,四川成都 610225;2.四川輕化工大學(xué)機(jī)械工程學(xué)院,四川自貢 643000;3.重慶電子工程職業(yè)學(xué)院智能制造與汽車學(xué)院,重慶 401331)
Marlin 是一款開(kāi)源3D 打印機(jī)固件,其強(qiáng)大之處在于支持X-Y-Z直角結(jié)構(gòu),coreXY、SCARA、三角洲等多種不同結(jié)構(gòu)的3D 打印機(jī),支持多種硬件電路板與多種計(jì)算機(jī)語(yǔ)言,還附加了自動(dòng)調(diào)平等功能。正因?yàn)镸arlin 在3D 打印系統(tǒng)中的強(qiáng)大功能且運(yùn)行穩(wěn)定,各種基于個(gè)人計(jì)算機(jī)的3D 打印軟件也層出不窮,如:Repetier-Host、replicatorG 和SelfCAD 等,基于C++的微型液晶控制面板也已相當(dāng)成熟。但這些技術(shù)不能與其他設(shè)備或儀器取得有效銜接和信息互通,不利于3D 控制平臺(tái)的二次開(kāi)發(fā),缺乏靈活性[1]。
LabVIEW 是圖形化編程語(yǔ)言,隨著PC 能力的增強(qiáng)而不斷發(fā)展其功能,使面向?qū)ο缶幊?、多線程、ActiveX,以及在此基礎(chǔ)上發(fā)展起來(lái)的消息隊(duì)列框架(QMH)、隊(duì)列消息(JKI)狀態(tài)機(jī)、異步消息通信(AMC)等多線程LabVIEW 程序框架應(yīng)運(yùn)而生,進(jìn)一步簡(jiǎn)化了科研和工程技術(shù)人員的工作[2-5]。這些技術(shù)可以快速實(shí)現(xiàn)Marlin 與其他設(shè)備或儀器的靈活重組和互聯(lián)互通,同時(shí)還可以把Marlin 的各個(gè)硬件功能模塊便捷地整合成具有獨(dú)立功能的LabVIEW 控件或子虛擬儀器程序文件(virtual instrument file,VI),供其他LabVIEW 應(yīng)用程序調(diào)用[6]。
近年來(lái),關(guān)于通用串口的LabVIEW 程序應(yīng)用已十分廣泛,但是針對(duì)開(kāi)源固件Marlin的LabVIEW驅(qū)動(dòng)程序還沒(méi)有出現(xiàn),不能有效利用Marlin 固件上3D 電機(jī)驅(qū)動(dòng)、溫度控制與獲取、限位開(kāi)關(guān)的狀態(tài)獲取、風(fēng)扇的速度控制等功能。因此,如何利用LabVIEW 編制Marlin 的驅(qū)動(dòng)程序,迅速完成3D 控制平臺(tái)與其他工程儀器或科研設(shè)備的信息互通,為基于高速總線或?qū)拵ЬW(wǎng)絡(luò)的LabVIEW 集散控制系統(tǒng)的構(gòu)建提供低成本技術(shù)實(shí)現(xiàn)的新途徑。
驅(qū)動(dòng)程序的開(kāi)發(fā)步驟依次為:了解Marlin 的硬件結(jié)構(gòu),串行字符串的識(shí)別,串口讀取子VI 的實(shí)現(xiàn),驅(qū)動(dòng)程序初始化和溫度控制與結(jié)果顯示應(yīng)用,如圖1所示。
圖1 開(kāi)發(fā)步驟框圖
Marlin 開(kāi)始于2011年,經(jīng)過(guò)10 余年的發(fā)展,目前最新的版本為2.0,固件上配置的內(nèi)容主要包括:1 個(gè)STM32 7805 主控芯片、1 個(gè)CH340G 數(shù)據(jù)傳輸轉(zhuǎn)換芯片、1 個(gè)USB 通信接口、4 個(gè)42 步進(jìn)電機(jī)的驅(qū)動(dòng)接口、2 個(gè)12 V直流電源輸出接口、另配2 組加熱電源、X-Y-Z3 個(gè)軸的限位開(kāi)關(guān)以及2 個(gè)溫度傳感器等,如圖2所示。具有利用PID 控制加熱溫度、溫度檢測(cè)精度高、支持圓弧軌跡的規(guī)劃、在中斷中處理步進(jìn)電機(jī)的梯形加減速、限位開(kāi)關(guān)觸發(fā)時(shí)有中止運(yùn)作的功能等。
圖2 Marlin 的硬件結(jié)構(gòu)組成圖
由Marlin 的硬件組成可知,固件上配有通用串行總線(universal serial bus,USB)接口,能實(shí)現(xiàn)與PC 的快速通信,相當(dāng)于測(cè)控系統(tǒng)中的下位機(jī)[7-9]。為節(jié)省資源,固件上的微處理器STM32 7805 仍采用異步收發(fā)傳輸器(universal asynchronous receiver/transmitter,UART)與外設(shè)進(jìn)行數(shù)據(jù)收發(fā),而實(shí)現(xiàn)USB 與UART 轉(zhuǎn)換的芯片是CH340G,如圖3所示[10]。
圖3 CH340 的工作方式示意圖
在串口方式下,CH340 提供常用的調(diào)制解調(diào)器聯(lián)絡(luò)信號(hào),用于計(jì)算機(jī)擴(kuò)展異步串口;或者將普通的串口設(shè)備直接升級(jí)到USB 總線,芯片內(nèi)置USB 上拉電阻,它的D+與D-引腳直接連到USB 的兩條總線上;又或者直接外加紅外收發(fā)器即可構(gòu)成USB 紅外線適配器,實(shí)現(xiàn)SIR 紅外線通信。在并口方式下,可轉(zhuǎn)換并口打印機(jī)為USB 打印機(jī)。
要實(shí)現(xiàn)Marlin 的驅(qū)動(dòng)編程,先在PC 上安裝CH340G 的芯片驅(qū)動(dòng)程序,建立PC 與Marlin 的通信。為確認(rèn)通信是否已建立,利用串口助手軟件Termite 3.4檢測(cè)串口通信是否正常。方法是先在PC 的設(shè)備管理器中確認(rèn)串口編號(hào)后,再打開(kāi)串口助手選中此編號(hào)并設(shè)置波特率為250000。在串口助手軟件的輸入窗口中發(fā)送G-code 命令M119,獲取限位開(kāi)關(guān)狀態(tài),在顯示區(qū)中就會(huì)顯示出收發(fā)的消息,并報(bào)告3 個(gè)限位開(kāi)關(guān)的狀態(tài),如圖4所示。當(dāng)3 個(gè)限位開(kāi)關(guān)完全處于斷開(kāi)狀態(tài)時(shí),顯示區(qū)將顯示第一條M119 命令獲得的消息;當(dāng)把圖2 右下部的Y軸限位開(kāi)關(guān)用金屬線短路后再發(fā)送M119 命令,顯示區(qū)將獲得圖4 中第二條M119 命令的應(yīng)答消息,說(shuō)明PC 與Marlin 已建立正確的通信。
圖4 串口助手檢測(cè)通信狀態(tài)
為更準(zhǔn)確地掌握消息的傳輸方式,將CH340G 的2 和3 引腳分別與示波器的兩個(gè)信號(hào)輸入端相連,如圖3 的右上角所示,上面的引線接示波器的1 號(hào)通道,產(chǎn)生的信號(hào)顯示在示波器屏幕的下半部分,下面的引線接示波器的2 號(hào)通道,產(chǎn)生的信號(hào)顯示在示波器屏幕的上半部分[11]。
當(dāng)PC 通過(guò)串口助手發(fā)送M119 命令時(shí),通過(guò)抓取瞬間波形,示波器屏幕下半部分就會(huì)出現(xiàn)一串高低電平的方波,時(shí)序方向是從右向左,信號(hào)下的二進(jìn)制數(shù)從左向右每10 位的前兩位1 和0 表示一個(gè)字符的停止位和起始位。當(dāng)信號(hào)有了一個(gè)從1 到0 的跳變表示發(fā)送開(kāi)始,UART 傳送的數(shù)據(jù)是由低位到高位,需要把二進(jìn)制數(shù)作反轉(zhuǎn),每8 位逐位對(duì)調(diào)后,產(chǎn)生第二排二進(jìn)制數(shù),再查ASCII 碼對(duì)照表,由此可知PC 向Marlin 發(fā)送了M119 指令與換行符。同理,示波器屏幕上半部分顯示的接收到的消息頭為Rep……(圖5)。圖6 接收到的消息尾經(jīng)過(guò)譯碼為ok 與換行符,與圖4 接收到的消息頭與消息尾是一致的。通過(guò)以上實(shí)驗(yàn),確立了PC與Marlin 的數(shù)據(jù)收發(fā)方式。
圖5 命令字符串與消息頭字符串
圖6 消息尾字符串
利用串口助手或具有瞬間波形抓取功能的示波器,獲取Marlin的響應(yīng)字符串,再利用此字符串消息尾和LabVIEW 中的虛擬儀器軟件架構(gòu)(virtual instruments software architecture,VISA)控件,可快速建立串行讀取子VI 和初始化控件。串口讀取程序流程如圖7所示,其中的雙橫線代表多線程并行。
圖7 串口讀取程序流程
程序開(kāi)始后,由條件結(jié)構(gòu)檢查錯(cuò)誤輸入控件中有無(wú)錯(cuò)誤產(chǎn)生。若有錯(cuò)誤,直接輸出錯(cuò)誤后結(jié)束;若沒(méi)有錯(cuò)誤,由設(shè)備輸入控件輸入設(shè)備端口號(hào),并發(fā)送至“Instr”屬性節(jié)點(diǎn)。字節(jié)屬性獲取端口字節(jié)數(shù)并輸出端口號(hào)后,同時(shí)進(jìn)行以下3 個(gè)任務(wù):消息頭或尾的判斷,返回True 和超時(shí)判斷。
任務(wù)1,消息頭或尾的判斷。其步驟:先將從端口讀取到的字符串循環(huán)連接后送入“While 循環(huán)”的移位寄存器,等待循環(huán)結(jié)束或繼續(xù)從端口讀取字符串,同時(shí)將連接好的字符串去除首尾空白字符。接著,判斷前兩個(gè)字符的大寫(xiě)是否為OK,或顛倒字符串后判斷前兩個(gè)字符的大寫(xiě)是否為OK,將以上兩個(gè)OK 判斷結(jié)果做邏輯或運(yùn)算,即判斷字符串頭或尾是否存在ok 字符。若存在則邏輯或控件輸出布爾值1,點(diǎn)亮LED 燈;否則邏輯或控件輸出布爾值0,關(guān)閉LED 燈。同時(shí),邏輯或控件輸出的布爾值作為“消息頭或尾的判斷”任務(wù)的輸出待用。當(dāng)任務(wù)2 和任務(wù)3 的布爾值相或后,再和任務(wù)1 的待用輸出相與布爾值作為是否關(guān)閉“While 循環(huán)”的依據(jù)。
任務(wù)2,返回True。其步驟:先判斷“While 循環(huán)”的移位寄存器中存儲(chǔ)的布爾常量是“True” 還是“False”,默認(rèn)為“False”,判斷“Instr”屬性節(jié)點(diǎn)輸出的字節(jié)數(shù)是否不為0,若為0,則移位寄存器返回“False”,斷續(xù)等待,直到“Instr”屬性節(jié)點(diǎn)輸出的字節(jié)數(shù)不為0,則移位寄存器返回“Ture”,進(jìn)入另一個(gè)條件,此條件保持移位寄存器中的布爾值為“Ture”,且“Wait for OK”控件為“False”。“While 循環(huán)”是否結(jié)束由任務(wù)2 和任務(wù)3 的輸出布爾值相或后決定,判斷“Instr”屬性節(jié)點(diǎn)輸出的字節(jié)數(shù)是否為0。若不為0,則由任務(wù)3“超時(shí)判斷”決定是否結(jié)束“While 循環(huán)”。如果沒(méi)有超時(shí),則繼續(xù)循環(huán),直到“Instr”屬性節(jié)點(diǎn)輸出的字節(jié)數(shù)為0。然后結(jié)束“While 循環(huán)”,停止串口讀取。最后輸出端口號(hào),讀取緩存,LED 燈保特熄滅。如果“Wait for OK”控件被置為“True”,當(dāng)“Instr”屬性節(jié)點(diǎn)輸出的字節(jié)數(shù)為0,任務(wù)2 和任務(wù)3 的布爾值相或后輸出必為1,則等待字符串中的ok 出現(xiàn)。當(dāng)任務(wù)1 的布爾值輸出為1 時(shí),LED 燈被點(diǎn)亮,則可結(jié)束循環(huán),停止串口讀取,最后輸出端口號(hào),讀取緩存。
任務(wù)3,超時(shí)判斷。其步驟:用循環(huán)外的時(shí)間減去循環(huán)內(nèi)的時(shí)間,其中,循環(huán)內(nèi)的時(shí)間是指程序每次在“While 循環(huán)”內(nèi)進(jìn)行字符串讀取時(shí),循環(huán)內(nèi)的一個(gè)時(shí)鐘開(kāi)始計(jì)時(shí)的時(shí)刻,循環(huán)外的時(shí)間是指進(jìn)入“While 循環(huán)”的時(shí)刻,兩者的差值與設(shè)定的默認(rèn)等待10 s 比較。若大于等于設(shè)定時(shí)間則報(bào)錯(cuò),并輸出布爾值1。如果“Wait for OK”控件被置為“False”,則結(jié)束“While 循環(huán)”;如果“Wait for OK”控件被置為“Ture”,則等待ok 字符串來(lái)結(jié)束“While 循環(huán)”[12]。若小于設(shè)定時(shí)間,同樣分“Wait for OK”控件為“Ture”和“False”兩種情況討論,但是否結(jié)束循環(huán)則由任務(wù)1 和任務(wù)2 的輸出布爾值決定。
要調(diào)用串口,首先要對(duì)串口進(jìn)行初始化編程,整個(gè)初始化程序也可被封裝為一個(gè)控件,簡(jiǎn)稱初始化控件,其程序流程如圖8所示。以默認(rèn)方式打開(kāi)VISA 控件,先通過(guò)“VISA 資源名”的枚舉型控件選擇準(zhǔn)備好的端口號(hào),如果作為控件則可通過(guò)創(chuàng)建引腳來(lái)接收輸入[13]。通過(guò)VISA 清空源緩存,判斷有沒(méi)有錯(cuò)誤產(chǎn)生。若有錯(cuò)誤,關(guān)閉資源,清除錯(cuò)誤;同時(shí),通過(guò)“Instr”屬性節(jié)點(diǎn)獲得設(shè)備的初始化接口類型,與預(yù)先選定的接口類型比較,產(chǎn)生真假兩種條件,并設(shè)定等待獲取的超時(shí)時(shí)間為10 s。如果獲取的接口類型與預(yù)先在枚舉型字符串常量控件中選定的字符串Serial 不相等,進(jìn)入假條件,重新選取對(duì)應(yīng)的接口類型;如果相等,則進(jìn)入真條件,進(jìn)行串口設(shè)置。在串口設(shè)置部分,首先給端口屬性賦值,通過(guò)“Instr”屬性節(jié)點(diǎn)將輸入與輸出的結(jié)束終端字符都設(shè)定為0 換行符,波特率設(shè)置為250000。然后清空接收與發(fā)送的緩存,再將接收和發(fā)送的緩存大小都設(shè)置為4096 字節(jié)。隨后,進(jìn)行條件判斷“有無(wú)錯(cuò)誤?”。若有,則直接輸出錯(cuò)誤和端口號(hào);若無(wú),則進(jìn)入假條件中,調(diào)用串口讀取子VI 進(jìn)行串行讀取,延時(shí)3 s且無(wú)需字符串首或尾的ok 字符串來(lái)停止串行讀取,防止沒(méi)有消息。然后向?qū)?yīng)的串口緩存中寫(xiě)M27 指令加換行符字符串,清除未知消息,再次調(diào)用串口讀取子VI,超時(shí)參數(shù)采用默認(rèn)10 s且需要字符串首或尾的ok字符串來(lái)停止讀串口,結(jié)束后輸出端口號(hào)和錯(cuò)誤,供其他控件使用,同時(shí)生成初始化控件。
初始化程序可以作為公共的函數(shù)控件出現(xiàn)在Instrument I/O 下的Instr Drivers 面板中供其他程序調(diào)用,而串口讀取程序則是作為私有的子VI,可通過(guò)復(fù)制或拖拽的方式調(diào)用,進(jìn)一步還可建立Marlin 上各硬件的VI 控件[14-15]。以Marlin 對(duì)3D 打印機(jī)中熱床和打印頭的溫度控制與結(jié)果顯示為例,演示Marlin 串口驅(qū)動(dòng)的運(yùn)行效果。串口完成初始化后,設(shè)置打印頭溫度為200 ℃,熱床溫度為60 ℃,如圖9所示。程序設(shè)置約10 ms從串口讀取一個(gè)溫度數(shù)據(jù),并把圖形的更新頻率設(shè)置為1 s,確保實(shí)時(shí)清楚地觀察到曲線的變化[16-18]。從圖9 可以看出,約在80 s時(shí),打印頭的溫度達(dá)到預(yù)設(shè)的200 ℃。
圖9 初設(shè)溫度跟蹤曲線
接下來(lái)將打印頭和熱床的溫度又分別設(shè)置為100 ℃和50 ℃,經(jīng)過(guò)約1 s的時(shí)間即調(diào)整為設(shè)定值。隨后打印頭的溫度立刻開(kāi)始下降,而熱床的溫度仍有一個(gè)較短的上升過(guò)程才開(kāi)始緩慢下降,如圖10所示,這與兩次溫度設(shè)置的溫差有關(guān)。當(dāng)溫差設(shè)得較大時(shí),溫度變化會(huì)較明顯,溫差設(shè)得較小時(shí)溫度變化較緩慢。
圖10 變溫跟蹤曲線
為實(shí)現(xiàn)開(kāi)源固件Marlin 的LabVIEW 串口驅(qū)動(dòng)程序,利用串口助手和示波器的瞬間波形抓取功能,準(zhǔn)確地掌握Marlin 通過(guò)USB 接口的消息發(fā)送與接收方法,從而確立在PC 上利用LabVIEW 編程驅(qū)動(dòng)Marlin 的串行通信模式,開(kāi)發(fā)串行讀取子VI 和初始化控件,以供開(kāi)發(fā)Marlin 的其他硬件功能時(shí)調(diào)用。在此基礎(chǔ)上,以溫度控制與結(jié)果顯示為例,調(diào)用初始化控件和串行讀取子VI,同時(shí)利用LabVIEW 的圖形化顯示控件,對(duì)Marlin 的兩個(gè)溫度傳感器通路實(shí)驗(yàn)了實(shí)時(shí)的溫度控制與溫度數(shù)據(jù)采集及其圖形化顯示。為3D 運(yùn)動(dòng)控制設(shè)備的開(kāi)發(fā)和優(yōu)化提供了便利,具有良好的應(yīng)用前景。
實(shí)驗(yàn)結(jié)果表明針對(duì)Marlin的LabVIEW驅(qū)動(dòng)程序能夠穩(wěn)定運(yùn)行,完成了PC 與Marlin 之間的串行數(shù)據(jù)通信,為Marlin 的高效利用開(kāi)辟了新路線。
致謝:感謝過(guò)程裝備控制工程四川省高校重點(diǎn)實(shí)驗(yàn)室資助項(xiàng)目(GK202010)對(duì)本文的資助