2026年5月10日 星期日

使用 servo 控制 cr touch

 在淘寶買了一堆淘汰的 cr touch,使用 bltouch 的設定,不一定能成功控制。透過 AI 確認,可以像伺服舵機 mg90s 那樣控制它。改變 pwm 的 pulse width,cr touch 會解讀成對應的指令。可能是 cr touch 內部的頻率基準偏移,使用標準的 pulse width 會運作失敗。 

參考資料

  • klipper 源碼 klippy/extras/bltouch.py
  • Klipper 的文件 BL-Touch

基本原理

接線如圖。(網路借來的圖)。

透過 Servo Signal 控制桿子伸出與收回。延用伺服舵機的 PWM 控制信號。PWM 信號的頻率為 50 HZ,即週期為 20ms。改變脈波寬度可以改變舵的角度。

BLtouch 將 0° ~ 180° 分割成不同指令的區段。下面是 klipper 的原始碼的資料。

---------
klipper/klippy/extras/bltouch.py
# V0.8.0 以前 (含)
Commands = {
    None: 0.0, 'pin_down': 0.000650, 'touch_mode': 0.001165,
    'pin_up': 0.001475, 'self_test': 0.001780, 'reset': 0.002190,
}

# V0.8.0 以後
Commands = {
'pin_down': 0.000650, 'touch_mode': 0.001165,
'pin_up': 0.001475, 'self_test': 0.001780, 'reset': 0.002190,
'set_5V_output_mode' : 0.001988, 'set_OD_output_mode' : 0.002091,
'output_mode_store' : 0.001884,
}
----------

klipper 的設定

使用 [bltouch] 的設定,無法順利動作,不知問題出在那裡。klipper 的文件,也提到使用 clone bltouch 時,一堆可能會碰到的問題。後來使用 [servo] 和 [probe] 設定,更能彈性的設定,讓它正常運作。

--------------
[servo my_probe]
pin: can: PB9 # 桿子伸出/縮回的控制引腳 (即原本 BLTouch 的 PWM pin)
initial_angle: 90
maximum_servo_angle: 180

minimum_pulse_width: 0.0001   # 確保下限夠低 (100µs)
maximum_pulse_width: 0.0025   # 確保上限夠高 (2500µs)

[probe]
pin: ^can:PB8 # 原本 BLTouch 的輸出引腳
# 注意加上 ^ (上拉電阻),因為 CR Touch 觸發時通常是將信號拉低 (Open Collector)
z_offset: 0

activate_gcode:
    PROBE_DEPLOY

deactivate_gcode:
    # PROBE_STOW
    # 當探針完成一次探測後,CR Touch 可能已經自動縮回並閃紅燈了
    # 所以我們需要在這裡發送 RESET 脈衝,讓它恢復正常
    SET_SERVO SERVO=my_probe_servo WIDTH=0.00220
    G4 P200
    {action_respond_info("cr touch reset")}
    SET_SERVO SERVO=my_probe_servo WIDTH=0.001475 # 回到標準收回狀態

[gcode_macro PROBE_DEPLOY]
gcode:
    G4 P500
    # SET_SERVO SERVO=my_probe ANGLE=10
    SET_SERVO SERVO=my_probe WIDTH=0.00060
    G4 P500  # 確保探針在重力作用下已經完全穩定伸出

[gcode_macro PROBE_STOW]
gcode:
    # SET_SERVO SERVO=my_probe ANGLE=90
    SET_SERVO SERVO=my_probe WIDTH=0.0014750
    G4 P500  # 確保探針在重力作用下已經完全穩定縮回
  
[gcode_macro PROBE_RESET]
gcode:
    SET_SERVO SERVO=my_probe WIDTH=0.002200
    G4 P300 # 等待 300ms
    # SET_SERVO SERVO=my_probe ANGLE=90  # 回到縮回狀態
    SET_SERVO SERVO=my_probe WIDTH=0.0014750
    G4 P500  # 確保探針在重力作用下已經完全穩定縮回

[gcode_macro PROBE_TEST]
gcode:
    # SET_SERVO SERVO=my_probe ANGLE=160
    # SET_SERVO SERVO=my_probe WIDTH=0.001800
    SET_SERVO SERVO=my_probe WIDTH=0.000600
    G4 P1000 # 等待 3秒
    # SET_SERVO SERVO=my_probe ANGLE=90  # 回到縮回狀態
    SET_SERVO SERVO=my_probe WIDTH=0.0014750
    G4 P500  # 確保探針在重力作用下已經完全穩定縮回

[delayed_gcode boot_probe_test]
initial_duration: 2.0  # Klipper 啟動 2 秒後執行
gcode:
    # 1. 先執行 Reset (清除可能存在的紅燈)
    SET_SERVO SERVO=my_probe WIDTH=0.00220
    G4 P500
    
    # 2. 測試:伸出
    SET_SERVO SERVO=my_probe WIDTH=0.00060
    G4 P800
    
    # 3. 測試:縮回 (回到待命狀態)
    SET_SERVO SERVO=my_probe WIDTH=0.001475
    G4 P200
    
    # 在終端機顯示訊息提醒你
    M118 CR Touch Boot Test Completed.
--------------




沒有留言:

張貼留言

網誌存檔