林志偉, 徐冠華, 吳森洋
(1. 浙江大學(xué) 機(jī)械工程學(xué)院, 浙江省三維打印工藝與裝備重點(diǎn)實(shí)驗(yàn)室, 浙江 杭州 310027;2. 浙江大學(xué) 機(jī)械工程學(xué)院 實(shí)驗(yàn)教學(xué)中心, 浙江 杭州 310027;3. 浙江大學(xué) 工程訓(xùn)練(金工)中心, 浙江 杭州 310058)
三維打印是一種從零件幾何模型出發(fā),通過(guò)軟件分層離散,用激光或其他方法將材料逐層堆積而形成三維實(shí)體的增材制造技術(shù)[1],突破了傳統(tǒng)制造業(yè)“設(shè)計(jì)—試驗(yàn)—改進(jìn)設(shè)計(jì)—工藝準(zhǔn)備—制造”的生產(chǎn)模式[2],被廣泛應(yīng)用于產(chǎn)品原型、模具制造、生物醫(yī)療、藝術(shù)創(chuàng)作等領(lǐng)域,已成為引領(lǐng)未來(lái)制造業(yè)的重要技術(shù)之一。
三維打印相繼出現(xiàn)了選擇性激光燒結(jié)(SLS)[3]、光固化(SLA)[4]、熔融沉積制造(FDM)[5]等十幾種工藝方法。在這些工藝中,FDM具有設(shè)備結(jié)構(gòu)簡(jiǎn)單、操作方便、維護(hù)成本低、材料利用率高、安全無(wú)毒等特點(diǎn),應(yīng)用最為廣泛,尤其適合向教育培訓(xùn)行業(yè)推廣。目前國(guó)內(nèi)一些高校已建立FDM三維打印開(kāi)放實(shí)驗(yàn)室,用于培養(yǎng)學(xué)生實(shí)踐能力及創(chuàng)新能力[6-7]。
桌面式FDM三維打印機(jī)一般由打印機(jī)本體和上位機(jī)組成[8]。運(yùn)動(dòng)控制卡是核心單元,通?;趩纹瑱C(jī)開(kāi)發(fā),一般運(yùn)行開(kāi)源Marlin固件[9-11],主要實(shí)現(xiàn)加工代碼解析及運(yùn)動(dòng)插補(bǔ)等功能。上位機(jī)一般為個(gè)人計(jì)算機(jī)(PC),運(yùn)行打印控制軟件,通過(guò)串口和打印機(jī)連接。使用PC作為上位機(jī)的優(yōu)勢(shì)是在Windows系統(tǒng)下三維打印控制軟件開(kāi)發(fā)難度低,甚至可直接使用免費(fèi)開(kāi)源軟件(如Repetier-Host),缺點(diǎn)是PC占用空間大,搬運(yùn)困難,且價(jià)格較為昂貴,難以物盡其用。
樹(shù)莓派(Raspberry Pi)[12-13]是一款采用ARM架構(gòu)處理器和Linux操作系統(tǒng)的卡片式計(jì)算機(jī),外形只有信用卡大小,購(gòu)買(mǎi)成本只需200元左右,卻具有強(qiáng)大的系統(tǒng)功能和接口資源,包括4個(gè)USB接口、1個(gè)以太網(wǎng)口、1個(gè)HDMI口等,可實(shí)現(xiàn)普通PC機(jī)的全部功能。樹(shù)莓派支持多種語(yǔ)言進(jìn)行應(yīng)用開(kāi)發(fā),包括C和Python等,開(kāi)發(fā)者社區(qū)資源極為豐富[14]。與傳統(tǒng)的嵌入式平臺(tái)相比,樹(shù)莓派在速度、集成度、價(jià)格和效率上有明顯優(yōu)勢(shì),近年來(lái)在嵌入式開(kāi)發(fā)領(lǐng)域發(fā)展迅速。
本文開(kāi)發(fā)一套基于樹(shù)莓派的三維打印上位機(jī)控制軟件系統(tǒng),在樹(shù)莓派端實(shí)現(xiàn)打印控制及人機(jī)交互基本功能,包括打印機(jī)串口通信、自動(dòng)打印、打印狀態(tài)查詢(xún)等,從而取代PC機(jī),大幅降低桌面式FDM三維打印機(jī)成本,提升打印機(jī)靈活性和產(chǎn)品競(jìng)爭(zhēng)力。
固件是指燒錄在控制卡中的嵌入式軟件,其作用是解釋上位機(jī)程序發(fā)來(lái)的指令,并讓機(jī)器執(zhí)行這些指令。Marlin固件是基于Arduino單片機(jī)開(kāi)發(fā)的一種三維打印的開(kāi)源固件,與其他固件相比,Marlin固件的功能最為健全和強(qiáng)大,功能包括控制板驅(qū)動(dòng)、代碼解析、插補(bǔ)運(yùn)算、各軸步進(jìn)電機(jī)運(yùn)動(dòng)控制、擠出機(jī)及加熱板的溫度控制等。
類(lèi)似于一般數(shù)控系統(tǒng),Marlin固件通過(guò)接收上位機(jī)發(fā)送的G代碼指令控制各運(yùn)動(dòng)軸進(jìn)給及I/O點(diǎn)輸入輸出。Marlin固件常用的G代碼及輔助代碼(M代碼)功能見(jiàn)表1。
表1 Marlin固件常用G和M代碼功能
表1中的G0和G1表示直線插補(bǔ),兩者功能一樣;G28表示打印機(jī)各軸回零,G29用于打印機(jī)工作臺(tái)面水平補(bǔ)償;G90和G91用于選擇坐標(biāo)系,其中G90為絕對(duì)坐標(biāo),G91為相對(duì)坐標(biāo),默認(rèn)使用G90。如下代碼:G1 X10 Y20 Z30 E1.0 F100,X、Y、Z為各軸進(jìn)給量,E為進(jìn)絲長(zhǎng)度,F為進(jìn)給速度;該行代碼表示打印機(jī)噴頭從當(dāng)前點(diǎn)運(yùn)行至(10, 20, 30)絕對(duì)坐標(biāo)點(diǎn),絕對(duì)進(jìn)絲長(zhǎng)度為1.0 mm,進(jìn)給速度為100 mm/min。Marlin固件中,輔助代碼M105用于查詢(xún)打印機(jī)噴頭及熱床溫度,M106、M107分別用于開(kāi)啟、關(guān)閉風(fēng)扇。
本文使用的運(yùn)動(dòng)控制卡集成了USB轉(zhuǎn)RS232串口芯片,對(duì)外提供USB接口,可與樹(shù)莓派直接通過(guò)USB數(shù)據(jù)線建立物理連接,如圖1所示。樹(shù)莓派端外接觸摸屏,安裝基于Linux的Raspbian操作系統(tǒng),該系統(tǒng)自帶串口驅(qū)動(dòng),開(kāi)發(fā)人員在系統(tǒng)中可直接使用控制卡對(duì)應(yīng)的串口資源(如“/dev/ttyUSB0”)。本文選用Python語(yǔ)言編程,通過(guò)第三方serial組件向控制卡寫(xiě)入G代碼字符指令,并讀取返回參數(shù),從而實(shí)現(xiàn)樹(shù)莓派和控制卡串口通信。
圖1 樹(shù)莓派與打印機(jī)運(yùn)動(dòng)控制卡物理通信架構(gòu)
打印機(jī)運(yùn)動(dòng)控制卡上的用于暫存G代碼的寄存器容量非常有限(100個(gè)B左右),僅能保存1~3行指令,因此不能一次性向控制卡發(fā)送多行指令,否則會(huì)導(dǎo)致固件宕機(jī)。上位機(jī)在向控制卡發(fā)送一條指令后,須等待下位機(jī)CPU從寄存器取走該指令后才能繼續(xù)發(fā)送下一條指令。Marlin固件規(guī)定:上位機(jī)發(fā)送的每條指令必須以‘ ’字符結(jié)尾,如“G01 X20 Y20 E1.7 ”;下位機(jī)讀取該指令后,向上位機(jī)返回“ok”字符串;上位機(jī)必須在接收到下位機(jī)返回的“ok”后才可繼續(xù)發(fā)送下一條指令,即在指令發(fā)送過(guò)程中,‘ ’和“ok”的數(shù)目必須保持一致。根據(jù)Marlin固件的這一代碼發(fā)送規(guī)則,可在樹(shù)莓派上設(shè)計(jì)相應(yīng)程序,實(shí)現(xiàn)G代碼逐行自動(dòng)發(fā)送。
本文選用Python語(yǔ)言編程,利用Python簡(jiǎn)潔的語(yǔ)法特性和強(qiáng)大的庫(kù)支持,實(shí)現(xiàn)樹(shù)莓派端包括打印機(jī)串口自動(dòng)連接、G代碼文件逐行自動(dòng)發(fā)送、打印過(guò)程參數(shù)實(shí)時(shí)采集以及人機(jī)界面交互等功能。樹(shù)莓派端打印控制程序隨樹(shù)莓派開(kāi)機(jī)啟動(dòng),總體架構(gòu)見(jiàn)圖2。工作流程簡(jiǎn)述如下:首先樹(shù)莓派開(kāi)機(jī)后自動(dòng)掃描并連接打印機(jī)串口,一方面,操作人員可以通過(guò)人機(jī)交互界面選擇需要打印的G代碼文件,開(kāi)始或終止打印;另一方面,樹(shù)莓派端不斷向打印機(jī)查詢(xún)當(dāng)前打印機(jī)狀態(tài),如噴頭、熱床溫度等,并將這些參數(shù)顯示在人機(jī)界面上。
圖2 樹(shù)莓派端打印控制程序架構(gòu)
打印控制程序隨樹(shù)莓派啟動(dòng)后,首先進(jìn)入串口自動(dòng)連接模塊。該模塊主要執(zhí)行一段循環(huán)程序,如圖3所示,不斷掃描樹(shù)莓派上所有串口資源,即從“/dev/ttyUSB0”掃到“/dev/ttyUSB3”,這些資源分別對(duì)應(yīng)樹(shù)莓派上4個(gè)USB端口。對(duì)某一特定串口資源,如“/dev/ttyUSBi”,首先調(diào)用serial組件嘗試連接該資源。在程序中,設(shè)置連接超時(shí)(timeout)為2 s,即如果超過(guò)2 s尚未建立串口連接,則終止當(dāng)前嘗試,轉(zhuǎn)而連接下一個(gè)串口資源。
如果上位機(jī)和打印機(jī)控制卡建立串口連接,Marlin固件將返回固件初始化信息,包括固件廠商、版本信息等,這些信息最終以“ok”字符串結(jié)尾。根據(jù)這一原理,樹(shù)莓派端程序通過(guò)識(shí)別返回信息中的特定字段(如廠商),可進(jìn)一步校驗(yàn)當(dāng)前連接的串口資源是否有效,即當(dāng)前連接的對(duì)象是否確實(shí)為打印機(jī)。如果連接無(wú)效,則斷開(kāi)當(dāng)前連接,并繼續(xù)嘗試下一個(gè)串口資源。如此循環(huán)往復(fù),直至連上打印機(jī)。樹(shù)莓派和打印機(jī)建立連接之后,控制程序向打印機(jī)發(fā)送“G28”指令,使其執(zhí)行回零動(dòng)作。
圖3 樹(shù)莓派端窗口自動(dòng)連接流程
根據(jù)上述串口連接流程可知,若打印機(jī)先于樹(shù)莓派啟動(dòng),則樹(shù)莓派完成啟動(dòng)后能馬上連上打印機(jī);若樹(shù)莓派先于打印機(jī)啟動(dòng),則在打印機(jī)啟動(dòng)前,樹(shù)莓派上的串口連接模塊將處于嘗試連接的循環(huán)狀態(tài),直至打印機(jī)啟動(dòng),建立連接。打印機(jī)和樹(shù)莓派的開(kāi)機(jī)先后順序不影響兩者串口連接。在兩者建立連接后,如果出現(xiàn)連接異常,如USB線被拔出等,則需重啟樹(shù)莓派才能使兩者重新建立連接。
由于打印機(jī)運(yùn)動(dòng)控制卡寄存器大小限制,在三維打印過(guò)程中,G代碼只能以一行一行的形式發(fā)送給打印機(jī)。在樹(shù)莓派和打印機(jī)建立串口連接之后,經(jīng)人機(jī)交互界面觸發(fā),代碼發(fā)送模塊在獨(dú)立線程中啟動(dòng)運(yùn)行,主要實(shí)現(xiàn)G代碼文件自動(dòng)逐行發(fā)送機(jī)制。
根據(jù)Marlin固件串口通信規(guī)則,當(dāng)上位機(jī)向下位機(jī)發(fā)送一行指令后,上位機(jī)須在接收到下位機(jī)返回的“ok”字符串才能發(fā)送下一行指令。根據(jù)這一規(guī)則,設(shè)計(jì)代碼發(fā)送模塊核心流程(偽代碼)如圖4所示,該流程包含兩重循環(huán)。
圖4 樹(shù)莓派端代碼發(fā)送模塊核心流程
圖4中,path為指定的代碼文件名,open為Python內(nèi)置文件打開(kāi)函數(shù),file表示已打開(kāi)的文件對(duì)象。for循環(huán)中,readlines函數(shù)返回包含該文件所有行的列表。需要強(qiáng)調(diào)的是,readlines函數(shù)會(huì)自動(dòng)為返回列表的每行字符串元素結(jié)尾添加‘ ’字符,因此在下面的串口發(fā)送中無(wú)需額外添加‘ ’字符。樹(shù)莓派在向串口寫(xiě)完一行G代碼指令后,隨即讀取下位機(jī)返回的內(nèi)容。為了增加代碼發(fā)送流程的魯棒性,這里在讀取串口部分也添加了一個(gè)循環(huán),即如果返回的字符串(recvtxt)中不包含“ok”字符串,則繼續(xù)讀取串口,直至返回內(nèi)容包含“ok”,跳出讀取循環(huán)。隨后重新進(jìn)入外部循環(huán)繼續(xù)發(fā)送下一行G代碼。
樹(shù)莓派上位機(jī)通過(guò)上述模式可實(shí)現(xiàn)G代碼文件自動(dòng)逐行發(fā)送,直至文件末尾,退出循環(huán)。圖4僅給出了樹(shù)莓派發(fā)送G代碼的核心流程,在實(shí)際程序編寫(xiě)過(guò)程中,還需考慮諸如異常處理、線程同步等問(wèn)題。
數(shù)據(jù)采集模塊主要實(shí)現(xiàn)打印參數(shù)實(shí)時(shí)采集功能。類(lèi)似于代碼發(fā)送模塊,它同樣運(yùn)行于獨(dú)立線程中。不同的是,數(shù)據(jù)采集模塊不用從人機(jī)交互界面觸發(fā),它隨樹(shù)莓派啟動(dòng)并建立串口連接后開(kāi)始運(yùn)行,隨樹(shù)莓派關(guān)閉而結(jié)束。下面以打印機(jī)噴頭及熱床溫度參數(shù)采集為例說(shuō)明樹(shù)莓派數(shù)據(jù)采集方法及流程,其他參數(shù)類(lèi)似。
類(lèi)似于G代碼逐行發(fā)送過(guò)程,數(shù)據(jù)采集模塊也需在一個(gè)循環(huán)內(nèi)不斷向下位機(jī)發(fā)送查詢(xún)指令。對(duì)噴頭及熱床溫度查詢(xún)來(lái)說(shuō),在一次循環(huán)內(nèi),樹(shù)莓派首先向打印機(jī)發(fā)送“M105 ”指令,然后進(jìn)入和圖4相似的串口讀取流程,打印機(jī)向樹(shù)莓派返回如下字符串:“T:24.0/200.0 B:24.0/50.0 ”“ok ”。在以上字符串中,T表示噴頭溫度,24.0為實(shí)際溫度值,200為設(shè)定溫度值;B表示熱床溫度,24.0為實(shí)際溫度值,50.0為設(shè)定溫度值;“ok”表示參數(shù)讀取完畢。據(jù)此可從返回字符串中提取當(dāng)前噴頭及熱床溫度。為了降低樹(shù)莓派及打印機(jī)運(yùn)動(dòng)控制卡串口通信壓力,在數(shù)據(jù)采集模塊的循環(huán)內(nèi)添加sleep方法,每次數(shù)據(jù)采集完成后讓線程暫停若干秒鐘。
必須注意的是,在三維打印過(guò)程中,樹(shù)莓派同時(shí)運(yùn)行代碼發(fā)送線程和數(shù)據(jù)采集線程,且在這兩個(gè)線程中,都需要循環(huán)讀取串口返回?cái)?shù)據(jù),為避免其中一個(gè)線程將另一個(gè)線程的“ok”讀走,造成另一個(gè)線程卡死,必須做好線程同步,即對(duì)兩個(gè)線程的串口讀寫(xiě)部分分別加上線程鎖。
樹(shù)莓派端打印控制程序的人機(jī)交互界面(圖5)主要用來(lái)實(shí)現(xiàn)簡(jiǎn)單的打印控制及打印過(guò)程參數(shù)顯示功能,采用Python自帶的tkinter庫(kù)實(shí)現(xiàn)。該界面包含回零、代開(kāi)代碼、開(kāi)始打印、停止打印、急停等功能按鈕。其中回零按鈕邏輯上只有當(dāng)打印機(jī)處于空閑(非打印)狀態(tài)下才有效,通過(guò)手動(dòng)發(fā)送一行“G28 ”指令實(shí)現(xiàn)。代開(kāi)代碼按鈕能從當(dāng)前樹(shù)莓派存儲(chǔ)卡或U盤(pán)選擇需要打印的G代碼文件,所選的文件名將同時(shí)被顯示在上方代碼標(biāo)簽中。在G代碼文件選定之后,點(diǎn)擊開(kāi)始打印按鈕可開(kāi)啟打印線程,并在其中調(diào)用以上介紹的代碼發(fā)送模塊,實(shí)現(xiàn)自動(dòng)打印功能;停止打印按鈕可終止當(dāng)前打印線程。右上方為急停按鈕,該按鈕通過(guò)強(qiáng)制斷開(kāi)、重連當(dāng)前串口實(shí)現(xiàn)急停功能。
除以上功能按鈕外,界面上還包含一些打印狀態(tài)顯示標(biāo)簽。串口標(biāo)簽,顯示當(dāng)前連接的串口資源;噴頭和熱床標(biāo)簽分別用于顯示打印機(jī)噴頭和熱床實(shí)際溫度,這些參數(shù)值通過(guò)上述數(shù)據(jù)采集模塊獲??;打印標(biāo)簽用于顯示當(dāng)前打印機(jī)狀態(tài);代碼標(biāo)簽用來(lái)顯示當(dāng)前選擇的代碼文件名;進(jìn)度標(biāo)簽用于顯示打印過(guò)程中的打印進(jìn)度,該參數(shù)值通過(guò)當(dāng)前已發(fā)送的G代碼行數(shù)除以總G代碼行數(shù)計(jì)算得到。
圖5 樹(shù)莓派端人機(jī)交互界面
為驗(yàn)證樹(shù)莓派作為上位機(jī)的穩(wěn)定性及樹(shù)莓派端三維打印控制程序的有效性,搭建如圖6所示測(cè)試平臺(tái)。該平臺(tái)硬件上包含一臺(tái)FDM三維打印機(jī),一臺(tái)樹(shù)莓派及一塊觸摸屏。該打印機(jī)X、Y、Z三向行程均為100 mm左右,其中Z軸負(fù)載較大,由2個(gè)步進(jìn)電機(jī)雙驅(qū)。樹(shù)莓派配置一散熱風(fēng)扇,其上運(yùn)行基于Linux的Raspbian操作系統(tǒng),在該系統(tǒng)中,將文本開(kāi)發(fā)的打印控制程序設(shè)置為開(kāi)機(jī)啟動(dòng)。樹(shù)莓派一方面通過(guò)USB線和打印機(jī)運(yùn)動(dòng)控制卡相連,另一方面通過(guò)其上DISPlAY端口及專(zhuān)用排線和觸摸屏連接。在觸摸屏上,可對(duì)三維打印過(guò)程進(jìn)行基本控制。
圖6 以樹(shù)莓派為上位機(jī)的三維打印測(cè)試平臺(tái)
圖7為使用該測(cè)試平臺(tái)打印的愛(ài)因斯坦頭像。打印層高為0.15 mm,填充率為20%,全局不使用支撐,打印材料為PLA,噴頭溫度設(shè)置為210 ℃,熱床溫度為0 ℃(即不使用熱床),打印時(shí)間約為8 h,能夠穩(wěn)定運(yùn)行。在打印過(guò)程中未見(jiàn)各軸移動(dòng)出現(xiàn)卡頓等現(xiàn)象,且得到的打印樣品表面光滑,說(shuō)明本文設(shè)計(jì)的G代碼逐行發(fā)送機(jī)制能夠完全適應(yīng)打印機(jī)運(yùn)動(dòng)控制卡的代碼讀取速度。
圖7 三維打印頭像
本文開(kāi)發(fā)的基于樹(shù)莓派的三維打印控制配套軟件系統(tǒng)體積小、成本低,能充分發(fā)揮卡片式計(jì)算機(jī)樹(shù)莓派的強(qiáng)大功能,大幅降低三維打印機(jī)成本,而且功能可擴(kuò)展性強(qiáng),結(jié)合樹(shù)莓派豐富的接口及Python強(qiáng)大的庫(kù)支持,可方便將本系統(tǒng)向網(wǎng)絡(luò)化、智能化等方向擴(kuò)展。
本文后續(xù)工作主要集中在以下兩個(gè)方面:
(1) 在樹(shù)莓派端開(kāi)發(fā)CAM功能,即G代碼生成功能,充分發(fā)揮樹(shù)莓派強(qiáng)大的運(yùn)算能力,使其真正意義上取代PC。
(2) 以樹(shù)莓派為網(wǎng)絡(luò)節(jié)點(diǎn),構(gòu)建打印網(wǎng)絡(luò)集群,開(kāi)發(fā)遠(yuǎn)程打印控制、數(shù)據(jù)采集存儲(chǔ)等功能,實(shí)現(xiàn)三維打印機(jī)物聯(lián)。