2014年4月15日 星期二

End Stop 電路介紹

End Stop 限位開關,對許多不熟悉電子電路的同好還說,是一團難以摸透的迷霧。控制板上明明有三個腳位,為什麼接兩隻腳就可以用?微動開關上,接點有分NC、NO,是什麼意思啊?控制板上的S腳位是作什麼用的?S腳位直接跟 "-" 腳位短接在一起,為什麼不會燒毀?Marlin設定裡面,X_MIN_ENDSTOP_INVERTING 到底要設成 "true",還是"false"?

RAMPS控制板上的限位開關腳位


先來解釋RAMPS控制板上,關於限位開關的腳位。總共有六組限位開關腳位,分別定義給XYZ三軸的MAX/MIN位置。每組腳位各自有 "S"腳位、"-"腳位、"+"腳位。"+"腳位連結到RAMPS系統裡的5V電源供應系統;"-"腳位連結到接地線路;"S"腳位連結到Arduino的數位輸出/入腳位(IO),在Arduino+Marlin系統內,是設定成以一根電阻拉到高電位的"數位輸入"腳位。

電路I/O腳位的秘密


Pull high 電路示意圖

上圖中,PIN12是CPU偵測電位高低的IO腳位。透過一支10K毆母的電阻,接到系統的電源供應線路(5V)。所以當S1按鈕放開的時候,PIN12腳位偵測的的電壓會非常接近5V,軟體系統偵測這支腳位的狀態時,會讀取到"1"的結果。這個狀態下,軟體系統會定義為"Triggered"。當S1按鈕被按下,這時PIN12會直接接地,軟體系統偵測這支腳位的狀態時,會讀取到"0"的結果,判定為"Open"。這時5V的電源,會透過10K的電阻再接到接地點,所以並不會發生電源直接短路到接地線而燒毀電源供應系統(5V穩壓IC)。註1

微動開關腳位的定義




微動開關一般有三支接腳,分別為 "C"共同接腳、"NO" Normal Open 通常開路接腳、"NC" Normal Close 通常短路接腳。顧名思義,"通常開路接腳",在微動開關被放開的時候,跟"C"接腳是斷開的,被按壓後,跟"C"接腳才短路接在一起;"通常短路接腳"則是在放開時,跟"C"接腳短路接在一起,被按壓後才跟"C"接腳斷開不通電。所以透過不同的接線方法,可以選擇被按壓時,是要讓線路通電、或是要斷電。

Marlin內與限位器相關的設定


再來要了解Marlin Configuration.h裡,對於End-Stop腳位狀態的定義,要怎麼設定。一般軟體設計,都會定義IO腳位讀取值為1時,是為腳位驅動(Triggered)。Marlin裡也是這麼設計的。所以當RAMPS的S腳位浮接(不接任合線路)時,會視為Triggered。但是如果硬體線路必須要定義成S腳位為低電位時當作Triggered,這時可透過"ENDSTOP_INVERTING"的設定,改變Marlin對S腳位的定義。當設定值為"true",S腳位接地會變成"Triggered"。

另外還有 "DISABLE_MAX_ENDSTOPS" 跟 "DISABLE_MIN_ENDSTOPS" 兩個設定值,是用來告訴Marlin,是否有接 "MAX_ENDSTOPS" 跟 "MIN_ENDSTOPS"。例如沒有接MAX End-Stop的話,可以把 "//#define DISABLE_MAX_ENDSTOPS" 最前面的 "//" 刪掉,這樣Marlin就不會去讀取MAX End-Stop的狀態了。

融會貫通

綜合上述的所有設計細節,就可以融會貫通的解答END STOP相關的問題了。

如果單純使用微動開關當作限位器,那一定要接RAMPS上的 "S" 跟 "-" 腳位。因為"S"腳位在控制板CPU內部已經被Pull-up到高電位了,所以想要讓"S"腳位的狀態改變,只有把他拉去接地一途。"S"接到"+"是沒有作用的。

"S"腳位在CPU內部已經內見Pull-up電阻了,所以直接連接到"-"接地腳位,是不會燒毀的。

"ENDSTOP_INVERTING"設定值要看End-stop硬體線路的接法而定,如果希望"S"腳位為高電位或浮接時,定義為"Triggered",則"ENDSTOP_INVERTING"要設定成"false";反之如果希望"S"腳位為低電位或接地時,定義為"Triggered",則"ENDSTOP_INVERTING"要設定成"true"。

整個系統上有好幾個會改變狀態的變數,要全部融會貫通,才能設計出讓限位器正常工作的設定。如果不太確定自己能設計出對的設定,建議還是先依照i3組裝筆記內的說明進行安裝。而且務必檢查有沒有接錯,再開始做馬達的測試。

最後,祝大家列印愉快~


----
註1:ATmega-2560 的IO pin 有內建 Pull-Up 電阻在IC內部,不需要在外部電路另外安排 Pull-Up 電阻。ATmega-2560規格書第七頁。

12 則留言:

  1. 這個月初剛組好第1台3d印表機prusa i3是用機械限位開關,開始時我先測試電機部分,都很順利,一切OK,太高興了,結果樂極生悲,後來在整理電線重新插拔安裝時,不小心把Zmin EndStop的3個腳位都接了,結果導致在歸零時發生火花,把5V穩壓 IC燒毀了,而最近又嘗試換光學限位開關,也花了一些時間才搞好設定,從中學了一些不值一顧的笨經驗,在此留言,只因希望能對未來新近者有所助益,可少繞一些彎路,不用同樣再浪費許多時間在如何設定Marlin的EndStop上。

    1. 機械微動開關接法
    機械微動開關只需接2個腳位,就是陳先生上面所提的:單純使用微動開關當作限位器,那一定要接RAMPS上的 "S" 跟 "-" 腳位。絕對不要把3個腳位都接了,如果不小心接了3個腳位,那在觸發時會發生火花,會把5V穩壓 IC燒毀(就是Mega 2560上的AMS1117 5.0V穩壓 IC,位在電源插座旁)。

    2. 光學限位開關接法
    光學限位開關則是需要用到3條線,接到RAMPS上的"S"、"-"及"+" 3個腳位。

    3.使用 M119 指令,顯示各軸EndStop狀況,有助於Marlin的設定。
    Marlin的configuration.h中有關EndStop的設定,比較難直接明白的就是 "const bool 各軸_ENDSTOP_INVERTING" 的值,倒底是正相或反相,應該設定成true或false?
    這個設定是否正確,可以在測試時,下指令 M119 來觀察,它會顯示目前各軸min及max的EndStop狀況,是open或triggered。
    而在使用光學限位開關時,這個指令特別有用,因為對光學限位開關來說,"const bool 各軸_ENDSTOP_INVERTING" 的值,會同時影響min及max,導致不管你如何設定,都會出現 EndStop Hit的錯誤,因此無法正常動作。此時如果下M119指令,就可以看出問題所在,發覺必須搭配"DISABLE_MAX_ENDSTOPS" 或 "DISABLE_MIN_ENDSTOPS" 設定才可以解決問題。

    回覆刪除
    回覆
    1. 重新下載Marlin,可以發現到現在"ENDSTOP_INVERTING"已經有把Max、Min分開設定了,所以用起來不會那麼麻煩。
      不過我認為弄懂"DISABLE_MAX_ENDSTOPS" 與 "DISABLE_MIN_ENDSTOPS",會是比較正規的做法。
      謝謝你的補充~

      刪除
  2. 請教您...
    z軸下降後, 觸動光學限位開關會再往上升一點點, 這是正常的動作嗎??
    還是當光學限位開關在被觸動的當下, 即應立即停止??

    回覆刪除
  3. 有些版本的Marlin 會重複做兩次的Z軸歸零,第一次速度比較快,觸動開關後會再上升一小段距離,然後用更慢的速度下降,做第二次歸零。理論上速度越慢,歸零的精確度會越準。

    回覆刪除
  4. 版大您好, 感謝你的回覆!
    將z軸改成光學限位開關後, 我遇到的是在觸發開關後, 它會往上升一小段距離, 然後即停止, 也沒做第2次的歸零, 所以我有點不明白這樣的動作是否是正常的.
    而後, 我將configuration_adv.h內的 #define Z_HOME_RETRACT_MM 2改成0, 當光學限位開關觸發後, 已可立即停止動作, 不知這樣改是好是壞, 還需要些實驗跟時間來確認.

    回覆刪除
  5. 請問微動開關接B接點(N.C) 接S跟- , 要設定true或false ??

    回覆刪除
    回覆
    1. "B接點(N.C) 接S跟-",那到底是接在S還是 - ?
      什麼東西要設True或false?

      刪除
    2. 微動開關做動到,導通送GND給RAMPS1.4,屬於給負電訊號,那麼接Normal Close做動到,斷開,
      那麼configuration_adv.h裡面要設定true或false

      刪除
    3. 如果你的接法如下:
      1.微動開關 C 接到 RAMPS X end stop -
      2.微動開關NC接到 RAMPS X end stop S

      那你需要將configuration.h內的 X_MIN_ENDSTOP_INVERTING 該成 false

      刪除
  6. 被大你好,請問PIN12---10K歐姆---5V這部份,可以把5V disable嗎?

    回覆刪除
    回覆
    1. 不行,10K電阻接到5V的用意,是要確保微動開關放開時,pin12的電位會是5V而不是0~5V之間的不確定值。

      刪除