2026年6月14日 星期日

在 Oranage Pi Zero 3 的 Armbian 上,編譯 panel-mipi-dbi

 

在 boot 目錄下,查看 kernel 的設定,沒有將 panel_mipi_dbi 編進 kernel。

---------------
boot$ grep -i mipi config-6.18.33-current-sunxi64
# CONFIG_MIPI_I3C_HCI is not set
CONFIG_VIDEO_SUN6I_MIPI_CSI2=m
CONFIG_VIDEO_SUN8I_A83T_MIPI_CSI2=m
# CONFIG_VIDEO_GC2145_MIPI is not set
CONFIG_VIDEO_ST_MIPID02=m
CONFIG_DRM_MIPI_DBI=m
CONFIG_DRM_MIPI_DSI=y
CONFIG_DRM_NWL_MIPI_DSI=m
# CONFIG_DRM_PANEL_MIPI_DBI is not set
CONFIG_GENERIC_PHY_MIPI_DPHY=y
CONFIG_PHY_SUN6I_MIPI_DPHY=y
---------------

透過 Gemini 指導,自行編譯 out-of-tree module。

首先,使用 armbian-config 安裝當前核心版本的 headers,然後編譯所需的 module。

------------
cd ~
# 下載 Linux 6.18 核心原始碼(僅下載單一分支以節省時間與空間)
git clone --depth 1 -b linux-6.18.y https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git

# 進入 DRM 面板驅動的目錄
cd ~/linux/drivers/gpu/drm/tiny


# 建立存放驅動的目錄
sudo mkdir -p /lib/modules/$(uname -r)/kernel/drivers/gpu/drm/tiny/

# 複製驅動檔案
sudo cp panel-mipi-dbi.ko /lib/modules/$(uname -r)/kernel/drivers/gpu/drm/tiny

# 更新系統的核心模組相依性 
sudo depmod -a


# 測試載入
sudo modprobe panel-mipi-dbi
lsmod | grep panel_mipi_dbi
------------







2026年5月30日 星期六

把 EBB42 當「USB 轉 CAN 橋接網卡」使用

在 DIY 3D 印表機,第一次使用 CAN 工具頭,很不幸,24V 電源接反,一陣火光,上面的 TMC2209 步進馬達驅動燒毀了。但吃 3.3V 的 STM32G0B1 MCU 還是好的,捨不得丟,當下也想不到可以做什麼用。

使用多買的 EBB42,搭配 FLY D5 使用,順利完成機器設定,可以跑起來,歸位,加熱。但測試列印時,一開始印,就當。懷疑是 FLY D5 同時兼 X / Y 移動控制 和 USB to CAN bus bridge,效能不夠。

以前只用 FLY D5 控制整機,都不會有問題。 打算把 FLY D5 重刷舊的 firmware,另外用 USB to CAN converter 連 EBB42。想要下訂轉換器,等拿到要等約兩個星期,又要把機器擺著,不能繼續後面的整理。

後來想到剩下一半功能的 EBB42,正好可以當 USB to CAN 轉換器使用。

在這過程,靠著 Gemini 幫忙,才能快速順利完成。

燒錄 Katapult

Katapult(前身為 CANBoot)是 Klipper 生態系中常用的 Bootloader,可以無需拆卸或透過 USB 連接,直接透過 CAN 匯流排為 EBB42 工具板無線更新韌體。

 1. 正確的 EBB42 Katapult 編譯設定

請回到 katapult 資料夾,執行 make menuconfig 並按照以下參數設定:

  • Micro-controller Architecture: Stm32
  • Processor model: STM32G0B1
  • Build Layout: No bootloader (因為 Katapult 自己就是引導程式)
  • Clock Reference: 8 MHz crystal
  • Communication interface: USB (on PA11/PA12)  <-- 關鍵:選這個才會出現 /dev/serial/by-id/
  • Application start offset: 8KiB offset (這決定了之後 Klipper 存放在哪裡)
  • Support bootloader entry on rapid double click of reset button: Enabled (非常有用的功能,快速按兩下 Reset 就能進入燒錄模式)
  • Enable Status LED: Enabled
  • Status LED GPIO Pin: PA13 (EBB42 的藍燈)

2. 重新燒錄 Katapult

編譯完後(make),再次進入 DFU 模式燒錄:

sudo dfu-util -a 0 -d 0483:df11 --dfuse-address 0x08000000:force:mass-erase -D out/katapult.bin

重啟後,假如還沒燒錄 klipper firmware,會直接進入 Katapult,藍色 LED 閃爍。

把 EBB42 刷成 「USB 轉 CAN 橋接網卡」

進入 Klipper 的 make menuconfig:

  • Micro-controller Architecture: STM32 
  • Processor model: STM32G0B1
  • Communication interface: 💡 關鍵! 選擇 USB to CAN bus bridge
  • CAN interface: 選擇板子上連向 CAN 晶片的腳位(EBB42 v1.1/v1.2 通常是 CAN bus (on PB0/PB1),請對照你的原廠 Pinout)。
  • CAN bus speed: 1000000。

燒錄指令

指令如下

----------------
$ ~/klippy-env/bin/python ~/katapult/scripts/flashtool.py  -d /dev/serial/by-id/usb-katapult_stm32g0b1xx_3E0034000250505539323520-if00
------------------

刷好之後,用 USB 線把它插上 Orange Pi。這時候,這張燒掉驅動的 EBB42 在 Linux 系統裡,就會直接變成標準的 can0 實體網卡!

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

~/klippy-env/bin/python ~/klipper/scripts/canbus_query.py can0

Queue 長度太少問題

另外使用新改的 EBB42 USB-to-CAN 連接 EBB42 CAN 工具板,可ivo執行列印測試,但列印一陣子後,還是當掉,出現 "MCU 'mcu' shutdown: Timer too close" 的錯誤。

當機的原因是 'Got error -1 in can write: (105)No buffer space available'。在 Klipper 的相關文件提到,要將 CAN 的 txqueuelen 增加到 128,原來預設是 10。但也不能設到太大,怕等待時間太長,影響 Klipper 的錯誤判斷的時效。

----------
$ ip -details link show can0
3: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UP mode DEFAULT group default qlen 10
    link/can  promiscuity 0  allmulti 0 minmtu 0 maxmtu 0 
    can state ERROR-ACTIVE restart-ms 0 
  bitrate 1000000 sample-point 0.750
  tq 62 prop-seg 5 phase-seg1 6 phase-seg2 4 sjw 2 brp 3
  gs_usb: tseg1 1..16 tseg2 1..8 sjw 1..4 brp 1..1024 brp_inc 1
  clock 48000000 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 tso_max_size 65536 tso_max_segs 65535 gro_max_size 65536 parentbus usb parentdev 5-1:1.0 

# 手動改變設定,可以成功完成列印
$ sudo ip link set can0 txqueuelen 128

$ ip -details link show can0
3: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UP mode DEFAULT group default qlen 128
    link/can  promiscuity 0  allmulti 0 minmtu 0 maxmtu 0 
    can state ERROR-ACTIVE restart-ms 0 
  bitrate 1000000 sample-point 0.750
  tq 62 prop-seg 5 phase-seg1 6 phase-seg2 4 sjw 2 brp 3
  gs_usb: tseg1 1..16 tseg2 1..8 sjw 1..4 brp 1..1024 brp_inc 1
  clock 48000000 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 tso_max_size 65536 tso_max_segs 65535 gro_max_size 65536 parentbus usb parentdev 5-1:1.0 
-----------

Klipper 的文件,說可以建立 /etc/network/interfaces.d/can0,開機或接上裝置後,自動設定,但照著做,並沒有效果。改用 udev rule,可以成功運作。設定如下。

---------------
$ cat /etc/udev/rules.d/99-can-txqueuelen.rules
SUBSYSTEM=="net", ACTION=="add", KERNEL=="can*", RUN+="/bin/sh -c 'sleep 0.5; /sbin/ip link set %k txqueuelen 128'"
---------------

連上裝置後,等待半秒鐘後,系統完成設定,再修改 txqueuelen。







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






2026年4月29日 星期三

VBlocks Pecker Light 桌上型雕刻機

 上課後收的中古機


FB 網頁的貼文,2024年5月13日
-----------
VBlocks Desktop CNC- Pecker Light 
套裝優惠中 
NTD$:35,000
*自組價 *外罩需另購
可加工材料:木、工程塑膠、鋁 (低進給)
工作臺面積:寬 (X) 140 mm、深 (Y) 210 mm
操作行程:寬 (X) 130 mm、深 (Y) 190 mm、高 (Z) 48 mm
機架規格:鋁合金 CNC 結構 + VSlot 鋁擠型、霧色陽極處理
驅動系統:57步進電機
傳動系統:VSlot 滑輪 (POM輪) + T8螺桿
主軸馬達:250w 無刷主軸-風冷
主軸轉速:12000RPM
刀筒規格:ER11
控制語法:GCODE、nc格式
尺寸:寬 (X) 329 mm、深 (Y) 491 mm、高 (Z) 447 mm
重量:20 kg
電源:AC 110V
-----------

2026年4月中古價,主機 9,000元,外罩 1,500元。和照片不同的地方,主軸改用直流馬達,電控箱也不太一樣。

主軸直徑 52mm


2026年4月21日 星期二

CNC 上課簡記

 

練習的作品,銑刀工具盒。材料 婆羅洲鐵木。


基本術語,"條",1mm = 100條,即 1條 = 0.01mm。

尺寸圖


刀具設定,只用一把雙刃平底銑刀,刃徑 4mm,刃長 20mm,柄徑 4mm,長度 48mm。

因為 FreeCAD 無法在 operation 裡設定轉速和進給,所以同一把刀,不同轉速和進給都建一個 tool。如下圖。


銑切摘要

CAM 的工序如下圖。

  • 毛胚,底面不加工,設成 0。上面,和左右 都設 2mm。零點,設定在工件的左下角。

  • 開始時,先 面銑 (mill face) 到設計的高度。深度 step down 0.4mm,進給可以較高,如1,400 mm/min。面銑會銑掉最上面的 2mm。

  • 大面積的開孔,圖中直徑20mm的圓孔和大的方形孔,用挖槽 (pocket shape),深度 step down 0.4mm,進給可以稍高,如1,000 mm/min。start depth 設成 -2mm,因為面銑銑掉2mm 了,不要再跑空刀,節省時間。

  • 稍小面積的開孔,圖中兩個直徑 11mm的圓孔,也是用 挖槽 (pocket shape),深度 step down 0.4mm,進給要低,如600 mm/min。不能用 螺旋 (helix),因為孔徑大於 8mm,刀徑的2倍,用螺旋,中間會留下一根沒銑掉的柱子。

  • 兩個 6.2mm的開孔,使用 螺旋 (helix),進給 500 mm/min。

  • 三個 4.2mm的開孔,使用 鑽孔 (drilling),選 硺鑽 (peck),便於排屑,peck depth 3mm,retract height 3mm。

  • 最後切外框 (profile),可以速度快,吃深淺,外觀較漂亮,只要跑一次就好。step down 0.2mm,進給 1,400mm/min。不過,依上課發生的意外事件來看,在切到快結束時,物件都飛出去。我誤設為 300mm/min,進給提高到2倍,也只有600mm/min,順利完成。

  • 銑外框,也可以粗銑,留餘量 20~30條,再用精銑。



網誌存檔