2026年5月27日 星期三

flatcam-evo 安裝

 https://github.com/roysa/flatcam-evo-ubuntu24


----------------
$ sudo apt update && sudo apt install pipx -y
$ pipx install appimage-builder
$ pipx ensurepath

$ sudo apt install fakeroot dpkg-dev -y



Ubuntu 24.04 (Noble) 的部分系統套件版本號採用了 1.22.6ubuntu6 這種命名格式,而新版的 Python packaging 嚴格遵循 PEP 440 規範。將 appimage-builder 所處環境的 packaging 降版,在 pipx 虛擬環境裡的相依套件,強迫它使用舊版、比較寬容的 packaging 庫。
$ /home/ajax/.local/share/pipx/venvs/appimage-builder/bin/python -m pip install "packaging<22.0"

----------------



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.
--------------




2026年5月8日 星期五

Klipper,使用 Fly D5 控制板及 EBB42 CAN 工具板

 



--------------
$ ip -s link show can0
5: can0: <NOARP,ECHO> mtu 16 qdisc noop state DOWN mode DEFAULT group default qlen 10
    link/can 
    RX:  bytes packets errors dropped  missed   mcast           
             0       0      0       0       0       0 
    TX:  bytes packets errors dropped carrier collsns           
             0       0      0       0       0       0 
$ sudo ip link set can0 up type can bitrate 1000000

$ ip -s link show can0
5: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UP mode DEFAULT group default qlen 10
    link/can 
    RX:  bytes packets errors dropped  missed   mcast           
             0       0      0       0       0       0 
    TX:  bytes packets errors dropped carrier collsns           
             0       0      0       0       0       0 

$ pip3 install python-can

$ python3 ~/klipper/scripts/canbus_query.py can0
Found canbus_uuid=8545cb97859e, Application: Klipper
Found canbus_uuid=82360ff863a5, Application: Klipper
Total 2 uuids found
SocketcanBus was not properly shut down

--------------

printer.cfg

--------------
[mcu]
# 主板 Fly D5 的 UUID
canbus_uuid: 8545cb97859e 

[mcu can]
# EBB42 的 UUID
canbus_uuid: 82360ff863a5
--------------






網誌存檔