2026年5月30日 星期六

EBB42 使用

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





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條,再用精銑。



2026年4月1日 星期三

Raise3D N2 主板安裝最新的 Armbian OS

在 AI 的協助下,大約花了3天的時間,把板子裝上最新的 Armbian OS。啟動後的畫面如下。

這塊主板上的標示為 "Raise3d Controller v2.0",自己 Google 找不到相關的資料,但 Gemini 就有,只能靠它了。

原來的系統是 Yocto,用在嵌入式系統中。在確認新的 Armbian OS 可以成功啟動後,把原來的 emmc 備份後,就整個刪除,只留 uboot 的部分。

最初,藉著 AI 的協助,進入原系統,修改密碼。因為能夠進入舊系統,在後來啟動 Armbian 上,也很有幫助。

這是我第一次進入 uboot,以往從來不知在啟動時,按任何鍵,就能進入 uboot,因為那時機,可能不到 5秒。最主要的是,進到 uboot 後,也不知能幹嘛。

複製 armbian image 到 SD

因為這個舊 uboot 沒有支援 ext4,所以要將 SD 另外切出 FAT 格式的 boot partition,然後將開機所需的檔,放在這個 partition。

到 Armbian 的 SoC: i.MX 6 網頁,下載 image。沒有為這塊板子建的 image,可下載 Cubox-i 的 image。下載網址如下。

https://armbian.atomonetworks.com/dl/cubox-i/archive/

因為是舊版子,image 是比較舊的,目前下載的是 2025/5/19 的 
Armbian_25.5.1_Cubox-i_bookworm_current_6.6.90_minimal.img.xz


------------
# 抹除前 10MB,確保乾淨
sudo dd if=/dev/zero of=/dev/sdb bs=1M count=10

# 建立分割區
  1. 512M , type: c
  2. 剩下的,都給主系統

# format
sudo mkfs.vfat -F 32 -n "BOOT" /dev/sdb1
sudo mkfs.ext4 -L "ROOTFS" /dev/sdb2

$ sudo losetup -fP Armbian_25.5.1_Cubox-i_noble_current_6.6.90_minimal.img
$ lsblk /dev/loop*
。。。。
loop21       7:21   0   576K  1 loop /snap/snapd-desktop-integration/343
loop22       7:22   0   576K  1 loop /snap/snapd-desktop-integration/315
loop23       7:23   0   1.1G  0 loop 
└─loop23p1 259:0    0   1.1G  0 part 
loop23p1   259:0    0   1.1G  0 part 

$ sudo mkdir /mnt/img
$ sudo mount /dev/loop23p1 /mnt/img

-- 複製 /boot 下的檔
$ sudo cp -rvp /mnt/img/boot/* /media/ajax/BOOT/
-- FAT 下,無法建立 symbolic link,只好手動 copy
$ cd /media/ajax/BOOT/
$ mv dtb-6.6.90-current-imx6 dtb
$ cp initrd.img-6.6.90-current-imx6 initrd.img
$ cp initrd.img-6.6.90-current-imx6 initrd.img.old
$ cp uInitrd-6.6.90-current-imx6 uInitrd
$ cp vmlinuz-6.6.90-current-imx6 vmlinuz
$ cp vmlinuz-6.6.90-current-imx6 vmlinuz.old
$ cp vmlinuz-6.6.90-current-imx6 zImage

$ sudo rsync -axHAX --progress --exclude='/boot/*' /mnt/img /media/ajax/ROOTFS

$ sudo umount /mnt/img
$ sudo losetup -d /dev/loop10
-- 要 sync,檔案才會寫入
$ sync
------------

必要時,要用舊系統開機,如確定原本的設定,可以使用備份的 image,依上述步驟,建立開機的 SD卡。

手動啟動測試

進入 uboot,能指定開機裝置,載入 kernel image,ramdisk image,dtb 檔,然後就能用 ramdisk 開機。ramdisk 開機後,就能執行 linux 的指令。若無法正常開機,如缺少需要的 module,可以重包 ramdisk image。

mmc dev 1 -- 是 SD,對應  /dev/mmcblk2p2。mmc dev 2 -- 是 EMMC ,對應  /dev/mmcblk3p2。

--------
# 1. 進入 SD 卡 (mmc 1 代表 SD 卡槽)
mmc dev 1

# 2. 載入 6.6 核心、ramdisk 與設備樹 (載入位址拉開距離)
fatload mmc 1:1 0x10800000 zImage
fatload mmc 1:1 0x13000000 uInitrd  
fatload mmc 1:1 0x18000000 dtb/imx6q-sabresd.dtb

# 這裡直接指派裝置路徑試試 (mmcblk0 或 mmcblk1),也可以給 UUID
setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk2p2 rootwait rw'

# 啟動
bootz 0x10800000 0x13000000 0x18000000
--------

設備樹可以用 imx6q-sabresd.dtb。但是下載的 image,uInitrd 中,缺少啟動 mmc 裝置的 module。所以把 uInitrd 展開後,加入所需的 module 後,再重新打包。

缺少的 module,包括 mmc/core/mmc_block.ko,以及 mmc/host 目錄下的 sdhci.ko,cqhci.ko,sdhci-pltfm.ko,sdhci-esdhc-imx.ko。

在 ubuntu 重建 initramfs 的步驟。

---------------------
# 1. 掛載 EXT4 主分割區 (假設是 /dev/sdb2)
sudo mkdir -p /mnt/armbian_root
sudo mount /dev/sdb2 /mnt/armbian_root

# 2. 掛載 FAT boot 分割區到系統內的 /boot (假設是 /dev/sdb1)
sudo mount /dev/sdb1 /mnt/armbian_root/boot

# 3. 準備 Chroot 環境
sudo cp /usr/bin/qemu-arm-static /mnt/armbian_root/usr/bin/
for dir in /dev /dev/pts /proc /sys /run; do sudo mount --bind $dir /mnt/armbian_root$dir; done

# 4. 進入系統
sudo chroot /mnt/armbian_root

--- 進入 chroot 後

# 1. 確保模組清單包含驅動
echo -e "mmc_block\nsdhci\ncqhci\nsdhci-pltfm\nsdhci-esdhc-imx" >> /etc/initramfs-tools/modules

# 2. 找出核心版本字串 (例如 6.1.63-current-imx6)
KVER=$(ls /lib/modules | head -n 1)

# 3. 更新 initramfs
update-initramfs -u -k $KVER

# 4. 製作 U-Boot 使用的 uInitrd 並直接覆蓋到 /boot
mkimage -A arm -O linux -T ramdisk -C none -a 0 -e 0 -n uInitrd -d /boot/initrd.img-$KVER /boot/uInitrd

exit

==========
# cat /etc/initramfs-tools/modules 
# List of modules that you want to include in your initramfs.
# They will be loaded at boot time in the order below.
#
# Syntax:  module_name [args ...]
#
# You must run update-initramfs(8) to effect this change.
#
# Examples:
#
# raid1
# sd_mod
mmc_block
sdhci
cqhci
sdhci-pltfm
sdhci-esdhc-imx

----
# echo $KVER
6.6.90-current-imx6
---------------------

將 SD 的系統複製到 EMMC

確認可從 SD 開機後,再把原來 EMMC 上的 root partition,format 成 ext4 格式,再用 rsync 把檔案都複製到 emmc 上。然後修改 boot 資料,即可順利自動啟動。

複製 boot,和上面類似。複製系統的步驟如下。

--------------------------------
# 掛載 eMMC 的 EXT4 分區
mkdir -p /mnt/emmc_root
mount /dev/mmcblk3p2 /mnt/emmc_root

# 複製整個系統 (排除掉虛擬目錄)
rsync -aAXv --progress  --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} / /mnt/emmc_root/

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

修改 /boot/armbianEnv.txt。可以使用 blkid 確定分割區的 uuid

-----------
rootdev=UUID=9215a8fc-2099-4536-a045-55d15b44fba8
-------------

網路設定

改用

修改 /etc/netplan/armbian.yaml,將 renderer 改為 NetworkManager。

----
# /etc/netplan/armbian.yaml
# 修改後,執行 sudo netplan apply
yaml
network:
  version: 2
  renderer: NetworkManager
-----

移除 systemd-networkd-wait-online.service,不然沒連網路線時,開機要等 3分鐘。

-------
$ sudo systemctl disable --now systemd-networkd.service systemd-networkd.socket systemd-networkd-wait-online.service 
Removed "/etc/systemd/system/dbus-org.freedesktop.network1.service".
Removed "/etc/systemd/system/sockets.target.wants/systemd-networkd.socket".
Removed "/etc/systemd/system/sysinit.target.wants/systemd-network-generator.service".
Removed "/etc/systemd/system/network-online.target.wants/systemd-networkd-wait-online.service".
Removed "/etc/systemd/system/multi-user.target.wants/systemd-networkd.service".
Disabling 'systemd-networkd.service', but its triggering units are still active:
systemd-networkd.socket

$ sudo systemctl restart NetworkManager

$ sudo systemctl mask systemd-networkd-wait-online.service
Created symlink /etc/systemd/system/systemd-networkd-wait-online.service → /dev/null.
---------






網誌存檔