2013年11月2日 星期六

組裝 3D 印表機 (盘古3D打印机) 軟體部分

續前篇 組裝 3D 印表機 (盘古3D打印机) 硬體部分
接下來我們來研究一下軟體部分
買一台印表機回來就是為了要印自己想要的東西
總不能都抓別人的吧 (雖然有人這樣做)
某站新聞 新的 3D 列印技術可以完美複製畫作,甚至包括畫筆筆觸效果(影片)
另外還有一篇找不到了, 有人印了仿某水果牌的殼, 被要求下架
隨著網路上模型資料量的遞增以及設備的精確度增強
仿冒已經不再僅限於數位資料, 就算有實體, 只要外型被數位化描述
它將可以像電影裡的量子傳輸一般在網路的另一端重新呈現
現在這議題已經漸漸浮現, 不過還沒到擋人財路的程度
或許將來會有類似 成功大學MP3事件 這樣的事件發生
扯遠了XD

如果只是印別人的東西是相當容易的, 就像印 word 文件一般
檔案->開啟->列印, 然後等它完成, 結束XD
可是如果要自己產生 "內容" 呢? 那就要需要不少技巧
這裡先簡單的描述其流程, 然後再針對細項描述
3D 列印首先要弄到模型檔, 目前看到自由軟體選的是 STL 格式
有文字版和二進位版, 以我手邊的軟體看來產生的是二進位版
這檔案可以用 3D 繪圖軟體製作, 工業用的 CAD 或是美工用的都行, 只要能輸出 STL 即可
這模型檔會被送進一套軟體轉成印表機控制碼, 接著再把這些控制碼送給印表機就可以完成列印
所以總共有四個步驟

  3D 繪圖 -> 輸出 STL -> 轉 G code -> 依序送至印表機





3D 繪圖部分使用 3D 繪圖軟體, 我使用的是 Blender3D 這套自由軟體
學 3D 繪圖是很費時的, 我運氣不錯, 從 10 年前就開始接觸, 以前是為了做遊戲
還記得當年剛接觸時光是編輯時想將模型轉到我要的角度就耗很多時間
不太有方向感, 操作介面上滿滿的按鈕看起來很恐怖XD
以前剛學的是 3D Studio Max R3 的樣子, 當時大家螢幕多只有 800x600
可是它卻要 1280x1024 以上才可以顯示所有按鈕而不需捲動, 非常夭壽XD
這件事到現在依然不變, 因為這是需要講究效率的生產型工具軟體, 本來就不是給一般人用的
Blender3D 看起來按鈕比較少, 那是因為全部有快速鍵, 是的, 要用這軟體是要背快速鍵的
我想這是 3D 印表機普及的障礙, 這是高技術成份的機器

在設計模型時就我所學過的大致有兩種策略, 不過我不知道其正式的稱呼
所以這裡就用我自己發明的XD



上圖1稱做長出法, 是我剛學 3D 繪圖時書本上教的方法
(不過當時書上沒說是長出法, 這是我隨便取的XD)
當時是用軟體裡的 lift 功能, 往上長出形狀, 故稱長出法
如上圖1, 多邊型是從內建基本型長出, 內建基本型 (primitive) 即軟體提供的多邊形
例如長方形, 四面體, 球體, 圓錐體 ... 等
特殊內建體則是軟體特色, 像是 3DS 的茶壺, Blender3D 的猴子...等
恩, 扯遠了XD

上圖2稱做縫圖法, 這是以前同學說的, 出處不明
所謂縫圖法就是把頂點或線零散的產生出來, 然後再把它們組合起來, 也就是縫起來
就像 2D 畫圖一樣, 先畫出輪廓, 再描繪細節, 然後再著色
縫圖法的精神就是這樣, 從零散片段漸漸組合出成品, 屬於比較進階的玩法, 原因後面寫

不管用哪種做法, 製作出來的模型必須是 "完整的"
有一個專有名詞在說這, 不過年代久遠我已經忘了, 若有圖學專家經過請協助補完, 感謝XD
現在有搜尋到的是 "mesh integrity" 這詞, 直接翻成 "完整性"
所謂完整的模型即模型必須符合幾項規則, 不可破壞 mesh integrity, 不可以有下圖的現象發生



上圖1 稱做 self intersection, 也就是模型內頂點產生的線或面和模型內其他線或面交叉
上圖2 也是 self intersection, 不過不是頂點問題, 而是法向量
每個點都有一個法向量, 這是 3D 繪圖中判斷面的方向的依據, 亦是打光時用來運算的參數
合格的模型必須法向量都向外, 沒有在外側卻朝內的面
上圖3 稱做破面, 灰色部分是面, 可以看到有白色部分沒有面, 呈現一個開口
上圖4 為空懸頂點, 它沒有和其他頂點組成面, 就算有, 若這個面四周沒有其他面
它一樣是空懸的狀態, 這都是不可被接受的
如果所有面都有其他面連接, 這也不一定是良好的, 這範例比較不容易畫, 所以我就不畫了XD

上述問題如果用前面寫的 "長出法" 製圖會比較不容易遇到
因為模型在製作時總是保持在完整的狀態, 3D 軟體知道如何幫你調整向量和頂點接線問題
不過長出法因為總是對現有點框架進行分割, 往往會產生很多多餘的面
或是僑不出想要的形狀, 因此對於複雜模型我們會想用縫的
可是縫圖法就不一樣了, 模型一直呈現在破碎的狀態, 直到最後才組合成一體
當在破碎狀態下要軟體把任意 3 個頂點接成面, 它當然就隨便選方向接了
它不可能會知道你打算把這面貼成內側面還是外側面, 最後接合時自然就亂了
不過這不難解, 只要在最後模型完成時把點全選起來, 然後執行法向量重算


各家軟體應該都有, 不過名稱會不相同, 這樣就可以解決法向量交叉的問題
但是若是破面或是空懸點或面就比較難解了, 畢竟有的點靠得很近不容易找
Blender3D 有把重疊頂點合併的功能, 不過這只能解決靠得近的點, 空懸較遠的還是得靠自己找
所以縫圖法屬於比較進階的做法, 它需要比較仔細的檢查以及對空間中物體要能完整的掌握
目前我的做法是縫圖和長出併行, 可以長出的就用長的, 不容易長的就用縫的
兩種工法混合進行

以上說的是模型結構上的注意事項, 滿足了這些項目可以幫助你通過模型轉換工具
但不代表印得出來, 由於列印時是一層一層堆疊, 不可能從半空中開始印
這部分的內容留到後面轉換工具段時再一起說明



當 3D 模型完成了就可以開始輸出了
先將模型輸出成常用格式, 這樣別的程式才看得懂
這裡選用 STL 輸出, 在 Blender3D 已經內建, 不用裝外掛


選取要輸出的模型, 接著選擇輸出 STL


輸出時可選擇放大率
這用意是 STL 的單位蠻大的, 在我這機器上每個單位會對應到 mm
也就是模型長 2, 印出來只有 2mm, 這樣的結果是模型製作時很大
往往超過 Blender3D 的網格, 我個人是靠網格來感覺位置的, 網格消失我會很困擾
這看個人喜好, 有些人可能不介意就沒差, 而我都是以 1/10 的比例編輯, 然後放大 10 倍輸出



輸出完成後就是轉 G code
以我使用的軟體來說就是 Slic3r, 如同其名, 這軟體是切片用的 (slice)
將模型切成數百份, 讓印表機一層一層印出, 像這樣



印表機會把切出來的形狀一層一層往上列印, 最後堆出模型檔的內容
所以設計模型時不要要求印表機從半空中開始印, 如下圖


上圖1 就是印不出來的類型, 紅色箭頭指處浮在半空中
印表機印到那裡時只會射在熱床上XD
不過上圖1 的形狀射出成型的設備可以很輕易的作出
反而是上圖2, 中間空心, 這只有 3D 印表機能印
若是射出成型, 上圖2 會無法製模, 因為不可能讓模具浮在半空中
而必須進行分割, 然後再黏合
對 3D 印表機來說則是圖1 需要分割黏合, 或是橫著印
但這樣會有一面需要貼在熱床, 它就會呈現光滑狀而失去細節

這切片軟體雖寫作 G-code 產生器, 實際上我覺得它是一個 "列印模擬器"
控制印表機用的 G code 是一群控制指令
它們很細部的設定印表機的動作, 例如將噴頭移到指定座標, 轉動擠出馬達送料
噴頭加熱到 230 度, 熱床加熱到 110 度, 開啟風扇並設定轉速 ... 等
而切片軟體根據模型切片來判斷該如何設定移動噴頭來印出切片形狀
例如切片是方形, 那我就應該先將噴頭移到左下角, 然後往右下角移動, 移動時邊移動邊擠料
接著再往右上角移動, 接著是左上角, 然後回到左下角, 然後停下來, 並停止擠出馬達
以上每一步都可換成兩三行的 G-code, 把這堆上千上萬行的 G code 都寫入檔案就是列印指令

由於是根據模型然後模擬列印所需的指令, 因此參數就很重要
如果沒有給正確的參數就會模擬出奇怪的結果, 例如這樣

上圖左不用說, 看就知道是成功品
上圖右兩個都是失敗品, 但是仔細看會發現有些不同
較大的失敗品是擠料設定錯誤, 噴嘴直徑也錯的
所以 G-code 產生器會認為這台機器料線較粗, 噴出較多, 應該設定馬達時轉慢些
可是我的料線其實是比較細的, 被設定成擠較少就變成擠出不足, 空隙變大
而上圖右較小的失敗品則是改過料線參數以及噴嘴直徑的, 它就比較緊密
(這是線間距的部分, 然而, 照片上那線本體忽然粗忽然細的問題是前篇描述的噴嘴問題)
因為產生器知道我的料線比較細, 轉動擠出馬達時應該轉多一點
這些設定都會被寫到 G-code 檔案裡, 每一步驟都是透過評估輸入參數以及切片形狀來決定的
因此這些參數關鍵的影響列印成敗

我不知道別台印表機是否 STL 的 1 單位對應到 1mm
目前我是先印一個 2 x 2 x 1 的長方形, 然後用尺量

上圖左為 Blender3D 10 倍放大, 右為 5 倍放大, 然後用尺量就可以知道比例
右邊的整個膨脹了, 印的東西太小結果擠出過多, 不過我認為這應該是參數問題



G-code 產生完成後接著就是送給印表機
目前我只有概略的看一下印表機的韌體, 工作內容大致上就是 :

中斷: UART 收資料 -> 放貯列
主回圈: 檢查貯列 -> 取出指令 -> 執行 -> 完成後若需返回值由 UART 印出 -> 下一指令

移動噴頭時有沒有直接下一個指令就要再查
個人感覺移動噴頭的指令會連續好幾個回圈才會完成, 這要花點時間研究才知
韌體使用的是 arduino 的 library, 原始碼中參考的 G-code 設計來自 Linux CNC
Linux CNC ! 老外的自由軟體專案真是什麼都有, 實在太閒了XD

步進馬達控制透過 A4988 這顆 IC, 和前篇 透過 L297 / L298 控制四線式步進馬達 類似
內建 H 橋和信號序列產生器, 只要設定好 pin, 接著送 clock 進去就會轉
(所以上一段寫的 "連續好幾個回圈" 可能會有問題, 這樣連續送 clock 是需要高度同步的)
不過不同的是它可以更精細的輸出步數, 以往的步進馬達控制是一個 clock 一步
這顆可以 1/2, 1/4, 1/8, 1/16 步, 產生出來的是類似 DAC 出來的弦波, 挺強的
封裝為近代手機等小器材常用的 QFN, 體積可以做到極小
不過要手工上料就比較困難了, 技術不好的話容易冷焊, 還好這貨模組很多人做, 買現成的 ! XD

目前我這包韌體感覺上是有問題的, 它的 Z 軸無法歸零, 無法回到原位
不過我看源碼裡都有寫啊...
目前解法是 slic3r 裡加些設定

Start G-code 寫入些指令, 這裡的指令在產生 G-code 時會被自動放在前面
預設是 G28 三軸, 讓 XYZ 都移回原點, 這裡刪除 Z 軸的, 只留 XY
Z 軸用人體歸零, 用手轉到原位XD
然後強制重設三軸和擠出馬達 (這條: G92 E0 X0 Y0 Z0)
如果不這樣, 當我印一半發現有問題不想繼續列印 (例如: 模型脫離熱床), 假設印到第 50 層
接著我停止, 然後重新列印, 結果印表機會一直在同一層印, Z 軸不會上升
原因是印表機以為 Z 軸現在在 50 層, 而我的指令在 0 層
可是 Z 軸無法歸 0, 所以就一直在同一高度印
加了強制重設, 然後手動轉回 0, 這樣還是可以印XD



這整套系統是相當複雜的, 牽涉的軟硬體很多, 不過因為老外把它以自由軟體專案放出
然後再由對岸人打包出貨, 使得我們可以有機會了解其細部運作原理, 可以從中獲取些技術
我個人是對其細節有興趣才買套件
一般用戶若只是想印最好還是加錢買成品, 這樣日子會比較好過XD

沒有留言:

張貼留言

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