2015年4月3日 星期五

3DP : 電容式近接開關平台自動補正

3D printer 的噴頭與列印平台的距離,太高或太低都會影響到印出來的結果,這部份對初學者是一大關卡。以我自己組裝的 Prusa i3 來說,如果平台已調整好四個角落的高度,讓整個平台能和 X 軸平行,接著就是利用 Z 軸的限位開關位置與微調的螺絲來調整平台與噴頭的距離。好不容易調好了,如果動到了平台的高度,又得重新調整 Z 軸限位開關。有沒有調整好第一次,之後可以自動幫我們偵測、保持原本設定噴頭高度的感應開關呢?甚至平台不平,在偵測差多少高度後,列印時自動幫我們補正噴頭高度的感應開關呢?較新版本的 Marlin 有支援「Bed Auto Leveling」,只要有個夠靈敏的感應開關,就有可能達成前述的兩種「自動」的需求。

原本我在研究由舊滑鼠拆下來的紅外線開關,及以微動開關+伺服馬達的方案,後來東湖國中偉銘師送了一支電容式近接開關給我玩,焦點就放在這支非接觸式的近接開關,使用過後,體驗到了自動的好處。底下就將一些重點整理出來。
手上這一支近接開關型號為「LJC18A3-8-Z/BX」
  • C : 感應方式為電容式
  • 18 : 感應頭直徑 18mm
  • A : 圓柱形
  • 3 : 金屬外殼
  • 8 : 動作距離,標準感測距離 8mm
  • Z : 工作電壓 DC 6~36V
  • B : 輸出型式為三線常開
  • X : 輸出電流 NPN 200MA

「LJC18A3-8-Z/BX」是常開(Normal Open , NO)式的,跟我機器原有的 Z 軸限位開關的動作是一樣(未觸發時,「Signal」腳位保持高電位,觸發時「Signal」腳位為接近 0V 的低電位),這樣一來,Marlin 的設定檔中,要改的地方就較少一些囉!

先來看看電路的部份,近接開關的三條線和 RAMPS 控制板要如何接。基本上,在應用時有兩種架構方式:
  • 架構一:完全取代原有的 Z 軸限位開關。
  • 架構二:保留原來的 Z 軸限位開關,將電容式近接開關和原有的開關並接,也就是讓 Z 軸限位可以擁有兩個觸發的來源。
「架構一」必須要保證「LJC18A3-8-Z/BX」隨時都能在設定的距離內觸發,不然,噴頭已到最低點,卻因為感應器未觸發而繼續「下壓」列印平台,其結果應該會很慘。

因為我曾經有理線完,卻忘記將 Z 軸 Endstop 的線接上,就進行 AutoHome 程序的恐怖經驗,因此,目前採取的是「架構二」的方案,也就將近接開關和原有的微動開關並聯,調整時,故意把原來 Z 軸 Endstop 上的開關(微動開關),調整得比新加上的近接開關晚一點觸發(位置調低)。這樣子,當「LJC18A3-8-Z/BX」沒動作時,至少還有原有的限位開關當「保險」,避免噴頭「墜機」,把列印平台壓壞了。

架構一


如果想採取「架構一」的方案,接線的方式可以參考下列網址中附的圖:
除了近接開關,尚需用到一顆 15k ohm 和一顆 10k ohm 的電阻來做降壓和 pull-up 。雖然作者用的感應器是 PNP 常開型的「LJ12A3-4-Z/BY」,但是也適用於「LJC18A3-8-Z/BX」。

下圖是我實作的東西及與 RAMPS 連接的示意圖:


線路文字說明如下:

  • 近接開關棕線(Vin) → RAMPS 12V AUX 正極
  • 近接開關黑線(Output) → 串連 15k ohm 電阻 → RAMPS Zmin 的 Signal 腳位
  • 近接開關藍線(GND) →  RAMPS Zmin 的 GND 腳位
  • 在 RAMPS Zmin Signal 和 RAMPS Zmin  GND 之間加一顆 10k ohm 電阻 (Pull-up)

註:因為沒有 15k ohm 的電阻,拿了一顆 10k ohm 和一顆 5k1 ohm 串在一起。


架構二

架構二的應用方式是架構在已有的限位開關上,我原有的限位開關是常開型(NO),所以它實際動作時,微動開關應該只使用到「C」(下圖左側的腳位)和「NO」兩個腳位(下圖中間的腳位),「NC」(下圖右側的腳位)應該是使用不到。所以,首先將「NC」的腳位解焊,或是像我偷懶,剪開斷線;然後將近接開關的「黑線」接原來微動開關的「C」腳位(下圖左側的腳位),近接開關的「藍線」接原來微動開關的「NO」腳位(下圖中間的腳位)。



最後再將近接開關的「棕線」接到 RAMPS 的 12V (12V AUX) 正極上,即完成。

無論採用的是「架構一」或是「架構二」,記得要利用 G-Code 測試一下,在未觸發時,以「M119」的 G-Code 來觀察各個限位開關觸發的狀態,測試一下近接開關是否動作。


18mm近接開關架

確認電路的部份沒問題了,需要一個牢固開關架來固定我們的近接開關。台北市東湖國中偉銘老師設計了一個可以掛在 NEMA 17 馬達上的近接開關暨風扇架:


如果機器架構和我們的不同,也可以在 Thingiverse 中以「Proximity Sensor」當關鍵字搜尋看看。
近接開關放到架子上後,我們必須調整它至合適的高度。我目前的做法是:
  • 調整列印平台的四顆螺絲,確認列印平台台已和 X 軸平行。
  • 將噴頭下降至距平台約一張名片的厚度(0.3mm)。
  • 將近接開關放到架子上,以手持電線的方式(避免觸發),由上而下慢下降至剛好會觸發的高度,開始鎖緊近位開關的螺帽,抬高噴嘴高度 1mm 後,以0.1mm慢慢下降,再度測試是否在自己預設的高度時,剛好觸發近接關關;迫緊固定架後,反覆的測試觸發位置,直到穩定為止。

啟用 Marlin 的 Bed Auto Leveling

硬體的部份準備好了,接下來要修改 Marlin 的組態檔(Configuration.h、Configuration_adv.h),啟用並設定「Bed Auto Leveling」的相關選項,並重新編譯 Arduino MEGA 2560 的靭體,才能在列印時讓「G29」等相關指令有作用。

修改 Configuration.h


※ 先檢查一下 EndStops 的相關設定:

要有底下這行:

#define ENDSTOPPULLUPS

要有底下這幾行:

#ifdef ENDSTOPPULLUPS
  #define ENDSTOPPULLUP_XMAX
  #define ENDSTOPPULLUP_YMAX
  #define ENDSTOPPULLUP_ZMAX
  #define ENDSTOPPULLUP_XMIN
  #define ENDSTOPPULLUP_YMIN
  #define ENDSTOPPULLUP_ZMIN
#endif

最主要的是「#define ENDSTOPPULLUP_ZMIN」這行一定要有。

因為我的限位開關和近接開關是 Normal Open (NO) 型的,所以底下的設定必須為「true」:

const bool Z_MIN_ENDSTOP_INVERTING = true;

檢查底下這兩行的設定值:

#define Z_HOME_DIR -1
#define Z_MIN_POS 0


※ 啟用「Bed Auto Leveling」的功能,將底下這行前面的註解符號(雙斜線)刪除:

//#define ENABLE_AUTO_BED_LEVELING // Delete the comment to enable (remove // at the start of the line)

變成

#define ENABLE_AUTO_BED_LEVELING // Delete the comment to enable (remove // at the start of the line)


將它的下一行加雙斜線註解掉,變成:

// #define Z_PROBE_REPEATABILITY_TEST  // If not commented out, Z-Probe Repeatability test will be included if Auto Bed Leveling is Enabled.

※ 如果想要使用「G29」的平台自動補正功能,要依可列印範圍及近接開關安裝位置,修改偵測的範圍,可能需修改底下的設定:

    #define LEFT_PROBE_BED_POSITION 15
    #define RIGHT_PROBE_BED_POSITION 170
    #define FRONT_PROBE_BED_POSITION 20
    #define BACK_PROBE_BED_POSITION 170

以我的機器為例,近接開關安裝在噴頭的前面約 35mm,偏右約 30mm,如果設定的可偵測範圍太大,近接開關可能會突出列印平台無法觸發,或是安裝位置較底的吹物件風扇會撞到平台玻璃的固定夾,而造成憾事。所以保險一點的做法,就縮小四個 PROBE_BED_POSITION ,改為:

    #define LEFT_PROBE_BED_POSITION 15
    #define RIGHT_PROBE_BED_POSITION 150
    #define FRONT_PROBE_BED_POSITION 40
    #define BACK_PROBE_BED_POSITION 160

另外一個方式是利用底下的三個 PROBE_OFFSET_FROM_EXTRUDER 參數,讓系統自動計算並修正偵測的範圍:

  #define X_PROBE_OFFSET_FROM_EXTRUDER -25     // Probe on: -left  +right
  #define Y_PROBE_OFFSET_FROM_EXTRUDER -29     // Probe on: -front +behind
  #define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35  // -below (always!)

哈!我都自己算好了,就通通設為零,改成:

  #define X_PROBE_OFFSET_FROM_EXTRUDER 0
  #define Y_PROBE_OFFSET_FROM_EXTRUDER 0
  #define Z_PROBE_OFFSET_FROM_EXTRUDER 0

註:在另一篇「雄 : 3DP : 近接開關距離與靭體設定調整」中補充「Z_PROBE_OFFSET_FROM_EXTRUDER」的使用。

※ 接下的幾個是在進行偵測時,Z 軸要先抬高多少的相關設定:

執行「G28」G-code (Auto Home)前,Z 軸要先抬高多少:

  #define Z_RAISE_BEFORE_HOMING 4

執行「G29」G-code ,移動到第一點前, Z 軸要抬升多少:

  #define Z_RAISE_BEFORE_PROBING 4

執行「G29」G-code ,移動到下一偵測點前, Z 軸要抬升多少:

  #define Z_RAISE_BETWEEN_PROBINGS 5

執行「G29」G-code ,全部都偵測完後,Z 軸要抬升多少:

  #define Z_RAISE_AFTER_PROBING 4

修改 Configuration_adv.h


Configuration_adv.h 中,必須要有底下這行:

#define ENDSTOPS_ONLY_FOR_HOMING

好了!如果組態檔改完,就可以將程式編譯,並上載到 Arduino MEGA 2560 中。


測試前的小叮嚀


哈~到這裡,一定很想看看「Bed Auto Leveling」的效果如何,千萬要記得再次以「M119」觀察並測試近接開關有動作,而且可以在合理的距離內觸發,不然,噴頭衝過頭會很「可怕」!

如何測試 Bed Auto Leveling?先來測試一下「G28」的 G-Code,讓噴嘴歸位回家!如果使用 Repetier-Host,在「Manual Control」裡,如果看不到「G-Code」的輸入區,要先按一下右上方「Easy Mode」的按鈕,讓它由綠色按鈕變成紅色按鈕,變成進階模式。想看 Marlin 回應的結果,就按一下上方「Toggle Log」的按鈕。



剛開始測試時,比較安全的做法,在執行 XY方向的移動前,手動讓 Z 軸先抬升一下,才不會在移動時,噴頭刮到平台。嗚~嗚~這是我刮壞好幾次平台膠帶換來的經驗!

執行完「G28」進行 XYZ 的歸零後,我們就可以執行平台補正偵測用的「G29」G-Code 。完成偵測後,Marlin 回應各點偵測完的結果,類似下圖:


如果手動執行「G29」的 G-Code 沒問題,我們就可以將「G29」加入開始列印的前面。以 Cura 為例,將「G29」加到「Start/End GCode」裡的「start.gcode」,找到最後一個「G28」的指令,然後在下面加一行「G29」即可。

底下是之前故意將平台弄得很不平,然後利用加過「G29」的 G-Code 後,列印的影片片段:



玩玩人工提高 Zmin


使用了「G29」讓 Marlin 幫我們做平台自動補正,很酷!不過,如果平台調得不夠平,本來每抬升一層才會忙一次的 Z 軸馬達會變得很忙,我還是乖乖的調好平台,讓它夠平,而不使用「G29」。近接開關則是用來幫我找到合適的噴頭高度,只要近接開關固定得夠牢,和噴頭的相對位置沒有改變,列印平台高度怎麼變,都可以自動將噴頭調整到合適的位置。

後來發現,有了近接開關這個「活動式的」Z 軸限位開關,當噴頭離平台太近,可以這樣玩:


照片中的那張 TPET 的名片可不是放好玩的,我在 XY 軸移動時, Z 軸歸零前,在近接開關的預定「落地處」放了這張名片,等它執行完歸零的動作後,噴嘴就抬升了名片的厚度,以那個高度為零點,這樣一來,就可以立即修正噴頭離平台太近的問題。不過,這只適用在暫時不想動近接開關螺母的狀況,不是長治久安之計,要我每次都在列印前追著噴頭跑,太累了!

相關文章




19 則留言:

  1. 作者已經移除這則留言。

    回覆刪除
  2. 您好~改marlin到※ 啟用「Bed Auto Leveling」的功能,將底下這行前面的註解符號(雙斜線)刪除:
    此步驟,按驗證時出現"Marlin_Bed_Auto_Leveling.cpp.elf section .text will not fit in region text
    d:/arduino/hardware/tools/avr/bin/../lib/gcc/avr/4.3.2/../../../../avr/bin/ld.exe: region text overflowed by 14854 bytes"
    求解~

    回覆刪除
  3. 請問 光學限位 可以搭 電容接近開關嗎?

    回覆刪除
    回覆
    1. 您好:
      原理差不多, 在猜應該是可以吧~ 沒試過光學限位吔~

      刪除
  4. 請問一下,找不到//#define ENABLE_AUTO_BED_LEVELING // 這個參數,是否要自已添加??

    回覆刪除
    回覆
    1. 您好:
      如果預設的設定檔中沒有該參數, 會不會是 Marlin 的版本不同, 沒有支援, 建議您可能要先查一下該 frimware 是否有支援。

      刪除
  5. 請問一下是否一定要加電阻???不是線直接插上就可以了??不同主機板有差??

    回覆刪除
    回覆
    1. 是否需要降壓應該要看控制板那邊的限制, 我的 RAMPS EndStop 那邊只能吃 5V , 而感應器那邊是 12V, 所以要得加。
      不過, 後來我將感應器拆掉了, 平臺調平後, Prusa i3 用較軟(靈敏)的機械式微動開關就很好用了, 很久才需要重調。

      刪除
  6. 請問N.C 和N.O 要加什麼電子零件 切換到同一種...

    回覆刪除
    回覆
    1. 您好:
      不是很清楚您提的「切換到同一種」是什麼;而我的微動開關是原來組 Prusa i3 買的現成模組,並沒有研究它的電路,您可能要自己去搜尋。

      刪除
  7. 請問架構二
    是不是依樣要加電阻?

    回覆刪除
    回覆
    1. 您好:
      架構二是利用觸發時, 藍線和黑線會導通, 因此不用加電阻, 不過, 我是亂玩亂試的, 建議您還是要先查一下廠商給的接線方式, 並用電錶觀察一下它的動作後再接。

      刪除
  8. 請問一下,此方法需要金屬來觸動電感,若平台不是金屬的話要用甚麼法法呢,金屬膠帶可行嗎

    回覆刪除
    回覆
    1. 您好:
      我這支電容式的, 紙膠帶上也可以感應到, 如文章的照片中所示, 在名片卡也會觸發, 端看您的 sensor 是哪一種。

      刪除
    2. 謝謝回復,我最後使用金屬膠帶來讓感測器觸發,請問大哥的Marlin是哪一版的呢,謝謝。

      刪除
    3. 您好:
      我現在已沒用這個機構, 改用全手動校正了。查了一下, 那時的 Marlin 應該是 2015年的 1.0.x

      刪除
  9. 請問 這隻有感應的距離嗎?? 譬如頭到玻璃 要多遠??

    回覆刪除
    回覆
    1. 您好:
      我買的這支觸發的距離似乎會因為電壓而有所差異, 以 12V 與 5V 來比較, 12V 時可以在較遠一點就觸發。相關的機置, 建議還是要查一下廠商給的規格書並實測較好。

      刪除

 
© 2009. Design by Pocket