雕刻機虛擬仿真及上位機設計(Labview上位機+Proteus仿真)


寫在前面:本人對Arduino、Labview、CNC都了解不多,如有錯誤,請私信指正。

需求

  • 設計雕刻機上位機,能夠向下位機發送G代碼
  • 下位機能解釋G代碼並控制電機行動

設計

設計流程圖

  • 實現流程圖
    實現過程如下:

  • 操作流程圖
    實際情況操作流程如下:

上位機部分

設計思路:

參考了一些現有的雕刻機上位機軟件(以下貼圖來自奎享雕刻軟件,其他也差別不大),發現基本功能如下:
1.建立連接,選擇端口、波特率、燒錄的固件,由於我使用的是GRBL固件,所以沒有添加選擇固件的功能(還有其他固件如Gcode-Interpreter,都大同小異)

2.可以確認機器狀態,可以設置工作位置和實時顯示機器位置,方便做出調整。

3.設置起點,單獨設置X,Y,Z軸的起點和返回工作位置(原點)。

4.設置XYZ軸移動步長(由於X和Y都在水平方向所以放在一起,當然,如果是讀入.nc文件是直接根據文件中的信息來設置的),設置主軸運轉的速度。

5.基本的三軸移動功能。

6.開啟和關閉主軸。

7.讀入.nc文件並執行。

參考上述的功能,設計了如下基於Labview的雕刻機上位機控制系統。(關於讀取G代碼的部分,由於時間和精力的限制暫時還未能做出來,如果后續有機會實現,會貼在最后)
其整體前面板如下:

實現了基本的開關、選擇串口、串口狀態提示、顯示歷史命令、清除歷史命令、通過上位機控制XYZ軸移動、打開/關閉主軸、選擇主軸正/反轉、設置主軸轉動速度、直接發送G命令、設置工作原點、返回工作原點、設置XYZ軸移動步長、顯示工作坐標和機械坐標的功能。前面板的功能顧名思義,下面是程序內部的說明。

整個程序設計思路較為簡單,主要是通過檢查按鈕的01狀態來實現功能,所有的操作都放在一個if判斷中,由總的開關控制,外套接一個while循環。

接下來,就每個功能說明實現方法:

顯示及清除歷史命令:

設置一個顯示字符串的前面板控件,通過該控件來顯示歷史命令。

具體的操作為,在每個命令執行后(向下位機發送G代碼字符串),分開一條支路連接到歷史命令,通過字符串拼接完成對所有命令的顯示。

歷史命令清除,是通過將空字符串覆蓋到歷史命令控件中實現,較為簡單。

正轉、反轉、關閉主軸:

查閱G代碼資料發現,控制主軸運動主要由M3 M4 M5及Sxxx組成。其中,M3表示主軸正轉,M4表示主軸反轉,M5表示主軸停止轉動。而Sxxx,如S500則是用於控制主軸轉速的G代碼,基於此,通過將M3/M4/M5發送至串口下位機接收完成對主軸的控制操作。

對工作原點的設置:

查閱G代碼資料,發現G10 P0 L20然后設置X0 Y0 Z0是對工作原點的設置代碼,同樣的,發送相應的代碼即可完成設置,不過需要在上位機設置相應的顯示控件,如我這里選擇了三個數值量來顯示,當設置工作原點后,將三個數值量置0,表明設置完成,也方便后續查看。

單獨G命令的發送:

將文本輸入框控件連接到該if框架中,點擊發送后串口傳輸對應的內容,還設置了一個小的發送后清零,通過發送后判斷標志,如果成功發送則將命令輸入框清空。

對XYZ軸轉動的控制:

查閱G代碼發現,G21G91G0X/Y/Z增量F1000,G90 G21可以完成對三軸的移動,通過選擇X/Y/Z及其步長來控制運動。由於X/Y/Z軸、正負都是相同的結構,這里不再贅述。

串口的連接檢測:

通過將VISA serial的錯誤輸出簇拆分出Status,並將其接到一個小燈來查看串口是否正確連接。

返回原點:

通過G90 G0+X0/Y0/Z0的命令來完成三軸步進電機返回初始位置的功能。

主軸轉速控制:

使用一個滑動桿來設置主軸的轉速,讀取滑動桿數值后,將其向下取整並轉化為字符串,在前邊添加S后邊添加換行字符即可。設置好后通過按下確定按鈕操作。

其他:

由於if結構在為真時執行,需要將按鈕的機械動作選擇為:釋放時觸發,否則可能因為操作不當陷入死循環或者發送很多次。

關於讀取.nc文件:

由於時間等原因並未實現該功能,但是基於.NC文件的格式,給出以下實現的思路:使用note pad++打開.NC文件查看其格式,發現前兩行也許是類似於前綴之類的,從第三行開始執行N20,N30,N40。這些NX0代表第X步的操作。根據以上思路,可以用Labview打開后逐行讀取.nc文件,丟掉前兩行后開始執行后邊的內容(如果有用的話則保留,我沒有查閱到相關信息),逐行通過串口發送即可。

下位機部分

使用Arduino UNO板來作為G代碼的解釋器和控制電機。由於手頭並沒有實物,所以使用了Proteus中的仿真儀器進行實驗。

關於Arduino的導入:

1.可以選擇下載Arduino UNO Library for Proteus器件庫,從而在器件中選擇UNO板。Load好lib后搜索Arduino如下:

2.可以選擇不下載器件庫,使用原生的ATmega328P,和UNO板沒有差別。此種方式需要在創建新工程的時候選擇->從開發板,選擇Arduino 328P器件,如下圖。

進入Proteus界面后,該種方式和導入器件庫不太一樣,顯示的是沒有封裝殼的樣式,但引腳均和UNO板一致。

GRBL介紹:

GRBL是一款針對Arduino的G代碼編譯和運動控制的開源程序(由於其開源特性也被移植到了諸如STM32之類的平台)。本身GRBL就帶有上位機,叫做GRBL Controller,與上學期使用的GRBL control類似,估計后者就是用這個開源的版本修改的。作為硬件程序的下位機部分則被普遍稱為GRBL固件,可運行在ATmega168/328P上,串口接收到上位機的Gcode指令即可轉換為對應的控制電機指令。對於使用者的我們,只需要知道哪個口輸出控制什么的信號、通過串口傳輸指令就好了,而這些都在cpu_map_atmega328p.h這個配置文件中給出了。

關於Gcode:是用於數控的語言。 NC 代碼主要包含了各種准備功能的 G 指令、輔助功能的 M 指令、坐標功能字、進給功能字 F、主軸轉速功能字 S、刀具功能字 T 和其他指令。該系統所能識別的指令包括 9 組,即非模態控制指令 G4、G10、G28、G30、G53、G92,運動控制指令G0、G1、G2、G3、G80,平面選擇指令G17、G18、G19,相對/絕對坐標 G90、G91,程序停止M0、M1、M2、M3,進給速度 G93、G94,單位選擇 G20、G21,主軸旋轉控制M3、M4、M5,坐標系選擇指令G54、G55、G56、G57、G58、G59。

電路設計:

  • 步進電機部分
    由於Proteus庫中並沒有集成的電機驅動模塊,所以使用了L297和L298芯片作為步進電機的控制芯片。其中,L297是一款步進脈沖時序分配器,可以驅動兩個半橋和一組全橋電路,而L298是一個由兩個獨立半橋組成的全橋電路,既可驅動兩只有刷電機(需要正反轉時),也可驅動一只兩相步進電機。由於本實驗中燒錄了GRBL固件,無法對Arduino的管腳進行操作,所以選擇了L297+L298的組合作為步進電機的驅動。組合后,每只步進電機都只需步進脈沖(由L297提供)和正反轉信號即可。
    L297和L298如下:

    其管腳配置和使用說明如下:
    L298:可視為直流電機的驅動芯片,將AB使能端給高電平供電,將SENSA和SENSB(電流監測端)接地(如果需要使用則接兩個對應步進電機功率的電阻到地)。將L297輸出的步進脈沖輸入到L297的IN1~IN4口作為輸入,輸出接到42步進電機。
    L297:L297芯片是一個步進電機控制器,可以產生四相驅動信號。該芯片內部的PWM斬波器允許在關模式下控制步進電機繞組電流,由於相序也是由內部產生的,所以它只需要時鍾、方向和模式輸入信號就能控制步進電機,可減輕處理器和程序設計的負擔。將Arduino輸出的控制信號和方向信號輸出到CW和CLOCK端口,再通過L297控制L298完成對步進電機的控制。
    根據GRBL配置文件,可以看到X、Y、Z軸的控制信號和方向信號分別由如下引腳控制:


    通過將這些引腳接到L297完成單片機->電機驅動芯片的連接。

  • 主軸電機部分
    根據GRBL程序說明,燒錄GRBL固件之后的Arduino板使用PIN11和PIN12分別作為主軸的PWM控制和方向控制。


    同樣,由於器件庫不完備,使用L298作為直流電機的驅動芯片。
    L298作為直流電機驅動時,當使能端為高電平時,輸入端IN1為PWM信號,IN2為低電平信號時,電機正轉;輸入端IN1為低電平信號,IN2為PWM信號時,電機反轉;IN1與IN2相同時,電機快速停止。當使能端為低電平時,電動機停止轉動。
    因此,為了功能完好地使用正轉和反轉功能,需要兩片L298芯片,分別在正轉時選通和反轉時選通,用於產生對應的信號。

    使用了一個非門來獲得方向信號的反電平,這是由於正轉時方向輸出低電平,為了能讓其選通使能端用了一個非門。這樣,就能根據方向信號選通L298中的一只,從而完成對主軸的方向控制。而主軸的轉速,則通過解析G代碼后發出的PWM信號控制。

整體電路圖如下:


其中, 是仿真用的,將在聯合調試中說明, 為四相步進電機, 為直流電機,其他的元器件(328P板,L298,L297)則是在上邊詳細說明了。

聯合調試

准備工作:

1.為了完成Labview上位機和Proteus虛擬下位機的聯合調試,還需要建立二者的通信,這需要一個虛擬串口軟件來完成。在網上查閱資料后,發現VSPD(Virtual Serial Port Driver)可以很好地滿足我們的需求。
VSPD使用說明:
打開虛擬串口驅動,可以看到左邊有實際的端口和虛擬的端口。

選擇兩個虛擬的端口,點擊添加端口,這樣就創建了一組虛擬串口端口,例如我的是COM3和COM7.
這樣,就完成了虛擬串口的互聯。需要注意的是,如果接收的一方使用某個端口,比如COM3,則需要發送的一端使用COM7對COM3發送,這也是為什么是一對的原因。

2.為了在Proteus這邊接收到串口數據,需要使用Proteus提供的串口組件。在元器件庫中搜索Compim,得到如下結果:

使用該虛擬串口組件作為接收端的串口。
連接如下:

將串口的RXD(接收)和TXD(發送)引腳分別與Arduino的RXD、TXD引腳(PIN0與PIN1)相連即可。
3.還需要一個虛擬的終端來顯示接收到的數據,以確認無誤。
虛擬終端的創建可以在左側儀器儀表目錄下的Virtual Terminal中選擇。

由於我們只需要顯示接收到的數據就好了,所以將接收端RXD與串口的RXD連接即可。

建立連接:

雙擊點開串口,選擇需要使用的端口,並配置波特率。由於Grbl新版的波特率要求是115200,所以選擇115200的波特率,關於波特率這里還有一個小坑,會在遇到的問題提到。

這樣,串口方面就算配置完成了。

Arduino板程序的燒寫:

將程序燒錄到虛擬的Arduino中,需要其編譯完成的Hex文件。對Grbl固件編譯,需要先在github上下載其代碼,鏈接如下:
https://github.com/grbl/grbl
將文件夾導出后,在Arduino-IDE中添加Grbl庫,如下:

添加相應文件夾,之后可以在下列的庫中看到grbl庫。

之后,打開文件目錄下的grbl->examples->grblUpload,打開如下文件

進行編譯。
編譯完成后,選擇

就可以在這個ino文件的目錄下生成對應的hex文件。
在Proteus中,雙擊328P板,將Program File選擇對應的hex文件即可。

測試:

使用串口調試助手測試是否能收到數據。

發送你好,接收到你好。(這里是用9600的波特率發送的,原因會在問題里匯總)
功能正常。

初始配置:

使用$命令可以查看所有的grbl可選項,包括一些參數和設置的修改。

我將xyz的都設成了53.333(初始的是100,感覺太大了),還有一些其他的設置,需要的時候可以在這里修改。

Labview和Proteus的聯合調試:

在Labview中循環運行程序,打開開關后選擇串口

打開Proteus仿真,
二者就連接好了。
測試XYZ軸移動、發送命令、設置初始點、主軸的正反轉及調速,均工作正常。由於是動態的過程不方便演示,以錄制視頻的形式做了展示。

現實中的方案

以上是仿真時使用的方案,然而在現實生活中,如果要做一個雕刻機,有更多更方便好用的選擇。

方案一:

Arduino CNC 盾板,專為數控雕刻機設計的拓展,其原理圖如下。

CNC Shield V3.0可用作雕刻機,3D打印機等的驅動擴展板,板上一共有4路步進電機驅動模塊的插槽,可驅動4路步進電機,而每一路步進電機都只需要2個IO口,也就是說,6個IO口就可以很好的管理3個步進電機,使用起來非常的方便,告別傳統步進電機操作繁瑣。將Arduino CNC Shield V3.0插到Arduino UNO上,並且安裝GRBL固件就可以進行操作。
一般搭配A4988使用的較多,直接插上去就能用了,示意圖如下:

使用Arduino的控制方法如下:
Arduino引腳 8 ———————– CNC 擴展板 EN ( 所有電機驅動板使能引腳/低電平有效 )
Arduino引腳 5 ———————– CNC 擴展板 X.DIR ( X端口方向控制引腳)
Arduino引腳 2 ———————– CNC 擴展板 X.STEP ( X端口步進控制引腳)
Arduino引腳 6 ———————– CNC 擴展板 Y.DIR ( Y端口方向控制引腳)
Arduino引腳 3 ———————– CNC 擴展板 Y.STEP ( Y端口步進控制引腳)
Arduino引腳 7 ———————– CNC 擴展板 Z.DIR ( Z端口方向控制引腳)
Arduino引腳 4 ———————– CNC 擴展板 Z.STEP ( Z端口步進控制引腳)
Arduino引腳 13 ———————– CNC 擴展板 A.DIR ( A端口方向控制引腳)
Arduino引腳 12 ———————– CNC 擴展板 A.STEP ( A端口步進控制引腳)

控制多個步進電機的接法如下:

方案二:

使用EasyDriver。EasyDriver是一款步進電機驅動器,如下是v4.4版本的示意圖。

每個EasyDriver能為兩級步進電機提供大約750mA的驅動(一共1.5A)。它默認設置為8步細分模式(所以如果你的電機是每圈200步,你使用EasyDriver時默認為每圈1600步),更多細分模式可以通過將MS1或MS2兩個接腳接地進行設置。
這樣的話,思路就很清晰了,Arduino接出來三個EasyDriver控制三個軸就是了。

方案三:

使用A4988驅動步進電機。硬件連接如下圖,也是只需兩個管腳即可完成控制。

但是根據網友們的反應來看,發熱嚴重,並不推薦

方案四:

使用TB6560,或者其升級版,TB6660。這兩款都是額定電流在3A及以上(6660能到4.5A)的大功率驅動。但由於並未使用,我查閱的資料不多,不再詳細講述。

總結:

以上幾種方法是對驅動步進電機的不同方案的探討,Arduino還是刷相應的Grbl固件。首先,實際中肯定不會使用L298+L297這樣的芯片,而會選擇集成的驅動,但究竟應該選擇哪一種方案,我覺得還是應該從預算、預期的功能(如需要大功率的就可以考慮TB6560)等方面考慮,此處提出幾種只是將幾種合理的辦法匯總,如果有需要可以按需做出選擇。

操作過程中遇到的問題及解決辦法

1.一開始想使用STM32作為主控,但是在調試過程中奇怪地爆RAM了,我並沒有做什么別的操作,只是把例程打開在虛擬環境運行而已。

可以看到程序卡在了Debug模式。
此外,STM32 for Labview的程序在2012年就停止更新了(我用的2012的Labview跑的不然不兼容),我想也許是當時程序里就有一些bug把,再加上沒辦法拿實物連,更無從下手。
這個問題至今仍未解決,使用STM32的方案被我拋棄了。

2.一開始,程序燒錄的是0.9c版本,這是因為從0.9d版本開始,波特率就從9600變成了115200。而根據Proteus的虛擬串口組件來看,只能選擇到57600的波特率,由於條件的不支持,我一開始一直是用的老版本的9600的波特率。

但是這個問題在調試主軸的時候就暴露了出來。
相關資料顯示,舊版本的主軸控制是用的開關量,也就是純粹的高低電平(我沒想懂怎么控制速度的),為了讓電機能夠轉動,我測試了正轉、反轉、停止轉動三種情況下三個口的電平,得到了目標函數,根據數字電路所學的知識,我搭建了能讓其正常轉動的電路。(當然,沒有加驅動,所以轉的特別慢)

這樣,就是我完成的第一版主軸,但是這樣的主軸不但功率很低,而且不能調速度。
后來,我發現Proteus里串口的波特率不用非得選擇那幾個選項,而是可以自己設定的,這個問題也就解決了。不過這樣同時也導致了另一個問題,由於Proteus內置並不支持這么高的波特率,所以在115200的情況下虛擬終端顯示的是亂碼,不過這個在后期調試已經完成的情況下影響不大。
於是,我燒錄了0.9j版本的新版固件,這樣一來,就可以通過PWM來控制主軸轉動了。

3.由於Labview程序運行邏輯的問題,強制關閉后並不會運行“關閉串口”的指令,所以在離開Labview時一定要關掉綠色開關,否則該串口會一直被占用,如下圖:

4.換行的問題。Labview向Arduino串口發送數據時,並不會自己換行,這就導致如果不換行並不會執行命令,使用Labview字符串中的換行字符串與原字符串拼接得到換行的效果。

5.由於之前使用LIFA庫(Labview Interface For Arduino)使用的是Arduino1.05-r2版本,這個版本過低,在生成hex文件時並不能像新版一樣直接在目錄那里選擇生成,而是需要進行一些設置。

可以看到並沒有直接生成hex文件的選項。
需要點擊文件->參數設置

中編輯。
注意編輯的時候要關掉IDE,否則會自動取消保存
在最后一行加上需要保存hex文件的目錄,這樣編譯就會生成相應的hex文件了。

個人的一些其他想法

1.使用pyserial/micropython+GUI來做上位機
可以使用pyqt一類的GUI庫來設計交互界面,而上位機和下位機的通訊采用pyserial或者micropython來實現。
Pyserial:pyserial是python的一個串口通信庫,上手比較簡單,網絡上也有很多教程。隨便貼一個吧:
Pyserial教程
Micropython:micropython的來頭就更大了,是由劍橋大學的理論物理學家喬治.達明設計,遵循MIT許可協議,與Arduino類似,擁有自己的解析器、編譯器、虛擬機和類庫等,MicroPython更強大。目前它支持基於32-bit的ARM處理器,比如STM32F405、STM32f407等,也就是說ARM處理器STM32F405上直接可運行Python語言,用Python語言來控制單片機。在單片機上能運行Python,實際上Python已經完全脫離系統,也就是說,你可以通過Python腳本語言開發單片機程序。

2.查閱資料的過程中發現前些年好多人拿光驅中的步進電機來做激光雕刻機,成本也不高,大概在100~200左右,還挺有意思的。

總結和感悟

由於器材的限制導致只能完成仿真,這也導致了在仿真過程中的一些麻煩,一路上踩了不少坑,從stm32爆RAM到控制主軸輸出的是開關量,都讓我印象很深刻。就本次雕刻機仿真來說,因為沒有什么頭緒,前期感覺花在查閱資料上的時間太多了,導致后期時間並不是很充裕,但也給了我一些相關的知識,下次再遇見類似的問題可以快速構建一個解決方案。
本次設計讓我了解了開源硬件的樂趣,我也在了解Grbl這種固件之后知道了Arduino也可以玩出這么多花樣,才真正理解了“開源”的含義,完成本實驗的仿真后,我在考慮購入esp8266,做一些物聯網相關的小東西。
關於雕刻機,我的Labview程序當然還有很多可以,甚至說是需要優化的地方,比如之前提到的直接關掉會占用串口,如何繞過這個關閉串口,等等,都是可以進行提升的地方。
總的來說,雖然過程很痛苦,但是從結局來看還是學到了不少,如Proteus的使用,對Labview的理解等提升了一些。

參考資料

Grbl:

https://github.com/grbl/grbl
https://blog.csdn.net/abbrCN/article/details/80119099

Arduino CNC拓展盾:

http://www.taichi-maker.com/homepage/reference-index/motor-reference-index/arduino-cnc-shield/

L297+L298控制步進電機:

http://www.51hei.com/bbs/dpj-81319-1.html
https://zhidao.baidu.com/question/122096928.html
https://wenku.baidu.com/view/af6b16126c175f0e7cd137ec.html

EasyDriver:

https://www.geek-workshop.com/thread-8746-1-1.html

主軸控制(Grbl版本需≥0.9c):

http://bbs.mydigit.cn/read.php?tid=1826080
http://www.ndiy.cn/thread-37518-1-14.html

虛擬串口

https://blog.csdn.net/qq_34202873/article/details/88391265

燒錄程序到Proteus虛擬儀器:

https://www.jianshu.com/p/7f8cdef72e33


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM