2014年12月24日 星期三

土砲 CNC:控制界面軟體

接續前篇:土砲 CNC:控制器和韌體 (Grbl)
韌體裝好了, 接著就可以連線測試了
arduino 上有兩顆 AVR, 一顆面對 USB 的被刷成 USB serial
現行版本的 ubuntu 看到這裝置會產生 ttyACM 節點, 用 minicom 打開就可以通訊
手動輸入 G code 機器就會動, 挺容易的, 不過通常我們不會想這樣操作
一行一行輸入喔臥槽! 這樣不行吧
總要有個 UI 吧! 這裡有個現成的:

Grbl Controller 3.0

看起來好像能用, 不過我沒測, 因為我做完了才發現有這種軟體XD
如果上面那軟體看了喜歡就跳過這篇文章吧XD
我知道還有 Linux CNC 這種東西, 也把它裝起來看過, 發現它實在太肥大了
而且它的硬體抽象層 EMC 是個 Parallel Port 控制軟體
簡單說就是把 Grbl 做的事在電腦上重寫, 它的算法可能更好但我不需要
我們的土砲用那樣太複雜了, 土砲就應該簡單!XD 所以沒有採用



一開始寫程式之前我是用 python3, 要裝幾個插件 (python3-serial) 才能跑, 程式在此:

#!/usr/bin/python3
import time
import serial # sudo apt-get install python3-serial
import sys

argc = len(sys.argv)

if argc < 3:
    print("Usage: " + sys.argv[0] + " <com_port> <gcode_file>")
    sys.exit()

print("Open COM port: " + sys.argv[1])
# configure the serial connections (the parameters differs on the device you are connecting to)
ser = serial.Serial(
    port = sys.argv[1],
    baudrate = 115200,
    parity = serial.PARITY_NONE,
    stopbits = serial.STOPBITS_ONE,
    bytesize = serial.EIGHTBITS,
    timeout = None,
    rtscts = None,
    dsrdtr = None
)
# wait for welcome message and flush it
# when open device node, cnc controller will reset and print message
time.sleep(1)
ser.flushInput()

# load ngc file
print("Open Gcode file: " + sys.argv[2])
f = open(sys.argv[2])
lines = f.readlines()
f.close()

# feed g codes line by line
for line in lines:
    if line[0] == ';':
        # drop comment
        continue;
    line_for_print = line.strip()
    print("Send: " + line_for_print)
    ser.write(str.encode(line))
    line_bytes = bytearray()
    while 1:
        c = ser.read()
        if c == b'\n':
            print("Recv: " + line_bytes.decode("utf-8"))
            break
        elif c >= b' ':
            # drop other control character such as 0xD
            line_bytes += c

ser.close()


程式就是開檔, 讀取 G code, 一行一行塞, 每塞一行就等, 等到回應再塞第二行
全部塞完就離開程式, 實驗過能用, 沒問題, 不過實際上使用會有問題
我們的土砲 CNC 並沒有自動回原位的功能, 一開機在哪裡, 哪裡就是原點
每次重新開啟 ttyACM 原點也會重設, 不知道是不是面對 USB 的 AVR 幹的好事
而我們的土砲機總是很隨意的選地方固定待加工品, 常常要先把銑刀移到參考點
然後才開始工作, 不預期的歸零我們會很困擾, 所以需要一個 UI
這 UI 總是維持 USB 連線, 手動移動完就讀 G code 發送, 不要中途歸零

桌上型電腦實現 UI 的方法很多, 也很雜, 所以我選了一個比較單純的環境

Android CNC !
UI API 可以跨版本直接執行, 也不用擔心用戶有沒有 OpenGL 驅動
因為你很難買到沒有 OpenGL 加速的 Android 平板 (其實硬要買還是有啦......(小聲))
不過裝置有限制, 因為要透過 USB, 平板上要有 USB Host 支援
目前看華碩 MeMO 系列應該都有, 我這台是 ME172V, 現在只要三張小朋友就有
加上無線網路, 自己架個網頁伺服器丟 G code 檔, 平板下載後開啟就能執行任務

原始碼附上:
AndroidCNC.zip

紅線為 X 軸, 綠線 Y 軸, 深藍色線為 Z 軸, 淺藍色粗線是當前銑刀位置
按下 X+ 按鈕會把當前 X 軸加上步進值的數字後做成 G code 送出
按下 X- 按鈕會把當前 X 軸減去步進值的數字後做成 G code 送出
改動 "移至:" 旁的欄位後按送出會將銑刀移到輸入的位置上, 以上單位都是 mm
YZ 軸以此類推, 自訂指令欄位就是輸入什麼字串就送出去給機器, 不檢查
三軸返回零點就是送 G0 X0 Y0 Z0
開始 / 暫停 / 停止則是 G code 檔案在用的
先按下面的 "開啟 G code 檔" 打開內建儲存空間的根目錄, 選好檔案後
接著按下 "讀取 G code 檔", 就會把移動路線畫到下面的視窗中
只能平移不能旋轉, 旋轉很難寫的好嗎! 不要太麻煩!(被巴)XD
一兩年沒看 OpenGL 就忘光了, 翻一堆資料才拼出來
反正轉換模型時軟體都會顯示了, 這裡只是用來看有沒有開錯檔案而已
只有解 XYZ 路徑, 曲線不解, 一樣是太麻煩了!XD
完成後按開始就會動, 銑刀位置會隨當前送出的指令改變, 可以從畫面看到現在送到哪
"送到哪" 不代表 "動到哪", Grbl 有緩衝機制, 緩衝滿了才會工作, 所以會導致不同步
因為它要進行向量運算, 沒法看一個做一個, 因此如果按下暫停它也不會馬上停
已經進緩衝的指令砍不掉, 我看韌體源碼印象中好像可以用特殊指令, 不過還沒研究
反正源碼都給了, 有需要就自己寫唄XD

這 APP 透過 USB Manager 操作 USB Host, 這個 API 在 Android 3.x 開始才有
建議找 Android 4.0 以上的平板可用機率較高, 並注意是否有 USB Host 功能
API 的 USB Host 和可插滑鼠那種 USB Host 是兩回事, 前者是 API 可控制
後者只是 Linux Kernel 可以認, 雖然都是 USB Host, 但後者那種沒法用
由於對 USB 通信會需要權限, 但是權限喪失或是斷線後不知道為什麼我沒法再取得
而即時旋轉畫面也會觸發這問題, 所以雖然我的 APP 橫的直的都可以用
但只要啟動後就會鎖住方向不能再改, 以免 USB 問題發生
如果遇到碰撞導致 USB 斷線, 那我的 APP 就可能會死, 沒仔細處理, 反正能用就好XD

arduino 面對 USB 的 AVR 是裝成 CDC 設備 (communications device class)
可以透過 set line coding 這命令設定和 arduino 主要的 AVR 通信的參數
這命令的細節在 USB CDC 1.1 規格裡的 section 6.2 有描述, 這裡設 115200 8N1
完成後對兩 data endpoint 讀寫即可通信
USB 相關的規格內容非常~非常之多, 因為非常多所以要說兩次
這裡無法詳述, 只概略提一下

這界面軟體大致上就這樣, 再附兩張截圖


讀取 G code 檔後:

這是切削出 Y 軸側邊螺桿推進塊的 G code


接著是整套機器的 demo
首先用軟體一張圖, 我用 inkscape 做, 然後丟進 PyCAM 就可以產生這樣的 G code
輸入為 SVG 圖檔, 2D 的, 設定深度自動變 3D, 網路上很多教學, 這裡就不重複了
這軟體只適合做 2D 形狀切割, 3D 的部份很有問題...
雖然 Y 軸側邊螺桿推進塊還算成功, 但是那是因為它體積小
後來我嘗試設定一些大一點的模型 (和 3D 印表機吃一樣的 STL 檔)
結果算一算記憶體就被吃光了, 8 GB 記憶體居然不夠算一個圓孔, 這需要換方案
所以目前先用 2D 做 demo

整套系統

因為 3D 切削的 G code 還沒法生成, 所以至今依然先用手握住電磨機XD
等 3D 的 G code 產生問題解決, 才有辦法把固定架做完整


平板電腦, 送 G code 用, 展示才放這裡, 開始切時當然不會插這裡XD


CNC Shield 和工業用 12V 變壓器


Y 軸兩顆馬達都已就緒


整套系統放在台車上, 方便移動並維護, PID 控制器放在下面
應該要做個架子移到上面


塗上螺絲固定劑的止推機構

切割成品:


看起來還行


一開始想挑戰金屬, 結果切是切下去了, 馬上聽到異音, 緊急停止查看


原來是四刃銑刀斷了一刃, 老外網站不斷強調, 金屬切削的參數很重要
也就是 feedrate, 單層切削厚度以及電機主軸的轉速, 需互相配合
我以為鋁很軟應該隨便給都行, 結果就.......
不過也不排除是電磨機固定架不正, 有點歪的話也會這樣
這些問題明年再說吧, 至少塑膠是能切的了

這個計畫到這裡進行了五個月, 燃燒了我所有週末
燒錢買材料, 燒體能加工, 流血流汗, 動不動就被夾到切到
完成階段性成果就該休息了, 快受不了了
這一切都是為了心中某個莫名其妙的理想目標!XD
同時跨領域學習, 對於這不穩定的時局, 累積實力我想才是最好的投資
或許哪天我工作搞砸了, 可以換去找機台類的工作XD

下篇:土砲 CNC:G code 轉換軟體

13 則留言:

  1. 可能進給太快,Z螺母結構回彈造成的,我覺的改成像XY一樣會比較好,Z螺母結構,塑鋼要換成鋁下去做
    大概F50內,轉速3k-6k調節嘗試銑鋁看看,你還有側刃可用,可以銑鋁邊看機身狀況好不好

    小弟不才,研究兩三年,花了一年多在組40*60檯面雕刻機,也是移動龍門結構,
    在台灣玩雕刻機真的很貴,很少人玩.委外代工不好找又貴
    如果你需要幫忙製作,精度要求沒有非常高,小的可以代勞
    但是要等最近的檯面升級件收到才能效勞,

    我都窩在http://www.diychina.org/這個論壇,台灣人架的,因為群眾關係,是簡體的
    可以來交流交流,要找我可以加我好友傳訊id:weeper

    論壇主要都討論機械加工方面的東西,資訊很豐富,希望對你有幫助

    回覆刪除
    回覆
    1. 今天才發現 Google 有丟垃圾留言的功能啊臥槽, 還好有注意到, 下次我會多留意這區...
      >大概F50內,轉速3k-6k調節嘗試銑鋁看看,你還有側刃可用,可以銑鋁邊看機身狀況好不好
      F50 太慢啦, 會等到抓狂啊XD
      目前用 F300 轉速 6k 還行, 不過要看刀具, 感覺越細的就要越慢...感覺啦, 沒有根據XD
      >在台灣玩雕刻機真的很貴,很少人玩.委外代工不好找又貴
      真的 ! 最近有去詢價, 不是做這台要用的, 然後看到報價簡直吐血啊
      我們國內都做精密的了, 收費都很恐怖, 而做手動機台低精度的老師傅應該都快退休了
      所以只能靠自己啦!
      >如果你需要幫忙製作,精度要求沒有非常高,小的可以代勞
      多謝!
      >我都窩在http://www.diychina.org/這個論壇,台灣人架的,因為群眾關係,是簡體的
      多謝情報 ! 先蹲場外看一陣子...XD

      刪除
  2. 您好,最近我在玩雷射雕刻機,我也使用 GRBL 軟體(這是從大陸買套件所附送的)原先我的雷射0.2W 雕刻範圍 39mm*39mm 不覺得有問題,後來我用 掃描器(Y軸)和印表機(X軸)之後可以雕刻350mm*210mm 我就覺得雕刻時間辯的很長,我目前只是嘗試把步進驅動器的模式變更,但是還是很慢,不知道有沒有參數可以把速度變快 幾倍或是10倍,因為我買了 0.5w 和1w的雷射!! 感謝!!

    回覆刪除
    回覆
    1. 噢!雷射雕刻真先進!
      若要檢查可以下 G code 指定 feedrate 並試著移動一段距離
      例如 : 先 X0 然後 F100 X100 類似這樣, 然後用碼表計算移動時間
      如果沒有差太多應該就是正常的
      雕刻面積變大, 長寬各兩倍的話, 面積是四倍, 時間自然也是四倍......
      速度要變快就要改 feedrate, 轉換軟體裡應該可以設, 不然就手動改 G code 檔
      但是改了的話雷射對相同長度輸出的能量就變少
      有可能會沒法留下夠深的痕跡, 這要實驗一下才知道是否可行

      刪除
    2. 請問一下 雷射 如果想射穿2mm 橡膠 大約需要幾瓦 還有大大雷射頭也是 左岸買的嗎 還是台灣哪裡好入手!!

      刪除
  3. 我的cnc磨好久了,最近要買刀具又遇難題,一堆不同刀具有直刀,清底刀……不會選請問你雕時的刀具是用那一種呢?

    回覆刪除
  4. 我的cnc磨好久了,最近要買刀具又遇難題,一堆不同刀具有直刀,清底刀……不會選請問你雕時的刀具是用那一種呢?

    回覆刪除
    回覆
    1. 我是用銑床在用的鎢鋼鋁用銑刀, 通常用刀的角度去分
      常見外型有平刀和球刀兩種, 你說的那一堆外型特殊的應該是木工用的吧
      如果是雕木頭的話除了修邊刀前端有軸承擋著可能不好用以外
      其他應該都能用, 要看應用, 如果是雕刻精細圖案就不太適合
      木工刀具通常直徑在 6mm 以上, 如果要刻細的還是鎢鋼銑刀為主

      刪除
  5. 我是買現成的CNC機正在學習
    看到你這製作過程,佩服啊~

    回覆刪除
    回覆
    1. 多謝捧場!
      有現成的若有興趣也可用 CNC 做 CNC!
      如果有閒的話XD

      刪除
  6. 問個問題 你下移動的G碼是使用哪個增量的方式還是使用絕對的方式疊加上去移動
    像是G90 X10 這樣的指令嗎??

    回覆刪除
    回覆
    1. 如果是問步進值那三個欄位的話不是 G90
      程式會記當前位置, 加減步進值後用 G0 下絕對位置快速移動

      刪除

注意:只有此網誌的成員可以留言。