
KP3S(Klipper)でレーザー刻印
※マザーボードが故障する可能性が有りますので、改造はご自身の判断にて行ってください。
KP3Sに半導体レーザーをつないでレーザー刻印をしています。
低コストの割にとても便利なので、主にKlipperでの設定を中心に私の使用の仕方を記入しておきます。
備忘録を兼ねていますので、少しずつ補足を追記していくかもしれません。
電子工作について初心者になりますので、高出力のレーザーをPWMで使う等はよく分かりません。Youtube等にて似た内容があるかと思いますので、そちらで探してみてください。申し訳ありません。
純正のファームの場合はレーザー対応のファームを公式が公開しているようなのでそちらを使用してみても良いかとは思いますが、私が試した時はうまく動きませんでした。
レーザーの接続
パーツクーリングファンのコード(PB1)を切って直接24V・500mwのAliexpressにて購入した半導体レーザー(Ender3用としてCrealityが発売をしているもの)を直接繋いでいます。
KP3Sのボード(V1.2)では大丈夫でしたが、この繋ぎ方でボードが壊れてしまう機種もありそうなので注意をしてください。
(SKR mini e3 v1.2で同じ繋ぎ方をしたら、パーツクーリングファンが100%の速度でしか動かなくなったことがあります。私は2回試して2回とも同じ挙動になってしまい2枚ボードを壊しました)
公式(kingroon)では空きエクストルーダーのヒーター端子(PB0)に繋いで、少し高出力(1600mW)のレーザーでも大丈夫なようなので、こちらの端子を使用した方が無難かもしれません。



3Dプリントとレーザー刻印の設定を簡単切り替え
簡単に3Dプリント時の設定とレーザー刻印時の設定を簡単に変更できるように下記の様な記述をprinter.cfgに追加しました。
これで使用しない方をコメントアウトしておくと、一時的に一気に設定を変更できます。
[include x_3d_printer.cfg]
# [include x_laser_plotter.cfg]
ヘッドパーツ
以降のオフセット等の数値はこちらのヘッド用パーツを使用して半導体レーザーを取り付けて使用することが前提となっております。Ender3用レーザー取り付け用のマウンターもモデルとしてセットしております。

レーザー用の設定です
x_laser_plotter.cfg
と名前を設定しています。
printer.cfgと同じ場所に保存してください。
ベッドの使用領域は180mm×130mmになります。
[fan]
pin: PB1
kick_start_time: 0.01
[printer]
kinematics: cartesian
max_velocity: 105
max_accel: 1000
max_accel_to_decel: 1000
max_z_velocity: 24
max_z_accel: 240
square_corner_velocity: 5
[stepper_x]
step_pin: PE3
dir_pin: PE2
enable_pin: !PE4
microsteps: 32
rotation_distance: 40
full_steps_per_rotation: 200
endstop_pin: ^!PA15
position_max: 180
position_endstop: -5.5
position_min: -5.5
homing_speed: 50
[stepper_y]
step_pin: PE0
dir_pin: PB9
enable_pin: !PE1
microsteps: 32
rotation_distance: 40
full_steps_per_rotation: 200
endstop_pin: ^!PA12
position_endstop: -48
position_max: 135
position_min: -48
homing_speed: 50
[bltouch]
sensor_pin: ^PC4
control_pin: PA8
stow_on_each_sample:False
x_offset: 26.5
y_offset: 31
#z_offset: 0
speed: 10
samples: 3
[bed_mesh]
speed: 105
horizontal_move_z: 10
mesh_min: 18,10
mesh_max: 170,130
probe_count: 5,5
[gcode_macro CANCEL_PRINT]
rename_existing: CANCEL_PRINT_OLD
gcode:
G90
G0 X30 Y120 F3000 ; park toolhead
CLEAR_PAUSE
M84 ; disable steppers
M107 ; fan off
BED_MESH_CLEAR
CANCEL_PRINT_OLD
SDCARD_RESET_FILE
3Dプリンター用の設定
x_3d_printer.cfg
と名前を設定しています。
printer.cfgと同じ場所に保存してください。
[printer]
kinematics: cartesian
max_velocity: 200
max_accel: 10000
max_accel_to_decel: 10000
max_z_velocity: 24
max_z_accel: 240
square_corner_velocity: 5
[stepper_x]
step_pin: PE3
dir_pin: PE2
enable_pin: !PE4
microsteps: 32
rotation_distance: 40
full_steps_per_rotation: 200
endstop_pin: ^!PA15
position_max: 180
position_endstop: -8
position_min: -8
homing_speed: 50
[stepper_y]
step_pin: PE0
dir_pin: PB9
enable_pin: !PE1
microsteps: 32
rotation_distance: 40
full_steps_per_rotation: 200
endstop_pin: ^!PA12
position_endstop: -5
position_max: 180
position_min: -5
homing_speed: 50
[bltouch]
sensor_pin: ^PC4
control_pin: PA8
stow_on_each_sample:False
x_offset: 24
y_offset: -12
#z_offset: 0
speed: 10
samples: 3
[bed_mesh]
speed: 105
horizontal_move_z: 10
mesh_min: 18,10
mesh_max: 170,160
probe_count: 5,5
[fan]
pin: PB1
kick_start_time: 0.5
[gcode_macro CANCEL_PRINT]
rename_existing: CANCEL_PRINT_OLD
gcode:
M300
G91 ; relative
G1 E-2 F300 ; retract
{% if printer.toolhead.position.z <= 60 %}
G90
G0 Z70 F3000
G91
{% else %}
G0 Z5 F3000
{% endif %}
G90
G0 X30 Y150 F3000 ; park toolhead
CLEAR_PAUSE
TURN_OFF_HEATERS
M84 ; disable steppers
M107 ; fan off
BED_MESH_CLEAR
;SET_FILAMENT_SENSOR SENSOR=bear_ir ENABLE=1
CANCEL_PRINT_OLD
SDCARD_RESET_FILE
printer.cfg
x_3d_printer.cfg もしくは x_laser_plotter.cfg
と重複した項目が無いようにしてください。
[include x_3d_printer.cfg]
# [include x_laser_plotter.cfg]
[mcu]
serial: /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0
restart_method: command
[force_move]
enable_force_move: False
[stepper_z]
step_pin: PB5
dir_pin: !PB4
enable_pin: !PB8
rotation_distance: 8
full_steps_per_rotation: 200
microsteps: 32
endstop_pin: probe:z_virtual_endstop
position_max: 250
position_min: -2
homing_speed: 8
second_homing_speed: 3
homing_retract_dist: 3
[extruder]
step_pin: PD6
dir_pin: PD3
enable_pin: !PB3
rotation_distance: 22.885
gear_ratio: 50:17
microsteps: 32
full_steps_per_rotation: 200
nozzle_diameter: 0.4
filament_diameter: 1.750
max_extrude_only_distance: 1400.0
max_extrude_only_velocity: 75.0
max_extrude_only_accel: 1500
min_temp: 1
max_temp: 300
max_power: 1.0
min_extrude_temp: 170
smooth_time: 2.0
heater_pin: PC3
sensor_type: Generic 3950
sensor_pin: PC1
[safe_z_home]
home_xy_position: 66,102
speed: 50
z_hop: 15
z_hop_speed: 5
[heater_bed]
heater_pin: PA0
sensor_pin: PC0
sensor_type: EPCOS 100K B57560G104F
control: pid
pid_Kp: 325.10
pid_Ki: 63.35
pid_Kd: 417.10
max_temp: 130
min_temp: 1
max_power: 0.8
[static_digital_output display_reset]
pins: !PC6, !PD13
[virtual_sdcard]
path: ~/gcode_files
[pause_resume]
recover_velocity: 50
[mcu rpi]
serial: /tmp/klipper_host_mcu
[adxl345]
cs_pin: rpi:None
[resonance_tester]
accel_chip: adxl345
probe_points:
90,90,20
[input_shaper]
shaper_freq_x: 40.4
shaper_type_x: mzv
shaper_freq_y: 50.4
shaper_type_y: mzv
[filament_switch_sensor filament_sensor]
switch_pin:^!PA11
pause_on_runout: True #pause handled by macro
# When set to True, a PAUSE will execute immediately after a runout
# is detected. Note that if pause_on_runout is False and the
# runout_gcode is omitted then runout detection is disabled. Default
# is True.
runout_gcode:
M600
[gcode_arcs]
resolution: 1
[display_status]
[gcode_macro POWER_OFF_PRINTER]
gcode:
{action_call_remote_method("set_device_power",
device="printer",
state="off")}
[delayed_gcode delayed_printer_off]
initial_duration: 0.
gcode:
{% if printer.idle_timeout.state == "Idle" %}
POWER_OFF_PRINTER
{% endif %}
[idle_timeout]
gcode:
TURN_OFF_MOTORS
TURN_OFF_HEATERS
UPDATE_DELAYED_GCODE ID=delayed_printer_off DURATION=300
timeout: 900
[gcode_macro LASER_HOMING]
gcode:
G28
G90
G1 Z100 F3000
[gcode_macro M900]
gcode:
SET_PRESSURE_ADVANCE ADVANCE={params.K|default(0)|float}
[gcode_macro M125]
gcode:
SAVE_GCODE_STATE NAME=parking
G91
G1 Z{params.ZLIFT|default(10)|int} F3000
G90
G1 X{params.XPOS|default(-2)|int} Y{params.YPOS|default(160)|int} F3000
RESTORE_GCODE_STATE NAME=parking
[gcode_macro RESUME]
rename_existing: RESUME_OLD
gcode:
G91
G92 E0 ;Reset Extruder
G1 E0.5 F300
G90
;SET_FILAMENT_SENSOR SENSOR=bear_ir ENABLE=1
RESTORE_GCODE_STATE NAME=PAUSE_state MOVE=1
RESUME_OLD
[gcode_macro PAUSE]
rename_existing: PAUSE_OLD
gcode:
SAVE_GCODE_STATE NAME=PAUSE_state
PAUSE_OLD
G91
G92 E0 ;Reset Extruder
G1 E-2 F300
M125 ; parking
;SET_FILAMENT_SENSOR SENSOR=bear_ir ENABLE=0
[gcode_macro M600]
gcode:
PAUSE
[gcode_macro M701]
gcode:
SAVE_GCODE_STATE NAME=loading_filament
M83
G92 E0.0
G1 E{params.FEED_LENGTH|default(10)|int} F200 ; slow feed filament
G1 E{params.FAST_LOAD_LENGTH|default(50)|int} F2000 ; Fast load to cold zone
G1 E{params.SLOW_LOAD_LENGTH|default(50)|int} F100 ; Slow load to nozzle
G92 E0.0
RESTORE_GCODE_STATE NAME=loading_filament
# Unload filament. Extrude a small amount, quick pull then slow pull
[gcode_macro M702]
gcode:
SAVE_GCODE_STATE NAME=unloading_filament
G91 ; set relative
G1 E{params.FEED_LENGTH|default(30)|int} F200
G92 E0.0
G1 E-{params.FAST_UNLOAD_LENGTH|default(70)|int} F3000 ; fast unload
G92 E0.0
G1 E-{params.SLOW_UNLOAD_LENGTH|default(40)|int} F1000 ; slow unload
G92 E0.0
RESTORE_GCODE_STATE NAME=unloading_filament
[gcode_macro FILAMENT_PURGE]
gcode:
G91
G1 E20.0 F180
G90
Gcode作成
私はフリーソフトの Inkscape とそのプラグインの Lasertools を使用してデータを作成しています。
(レーザーのプラグインは J TECH のも有りますのが、Lasertools の方が使いやすいです。塗りつぶしも別のプラグインを使う必要が無いですし、G2,G3を使わないので変な挙動が無い)
GitHubにあるlasertoolsのファイルをダウンロード後、v1.0のフォルダの中身をInstallationに書いてあるディレクトリにコピーをして、
Inkscapeを立ち上げて画像ファイルを読み込み

画像をクリックして選択状態にしてパスからビットマップのトレースを選ぶ(画像がPNGやJPEGの場合もビットマップのトレースを選びます)

しきい値を調節してプレビューで確認をしてちょうど良い状態にしてから適用のボタンを押すと、画像からベクターデータを作成できます。

必要があればベクターデータをクリック後に出てきたポッチをドラッグすることによって微調節することもできます。

データの作成に戻りますが、先ほどのベクターデータを選択した状態でプラグインの Lasertoolsを選択します。

Lasertools 設定の小窓が出ますので、数値を設定しましょう。M106 S に続く数値がレーザーの強弱を示します。
私の設定はこんな感じです。
KP3Sだとスピードが速すぎるとレーザーの制御がうまくいきませんでしたのでスピードは控えめにしております。




適用を選択すると設定したディレクトリにGcodeが作成されます。
(名前に bounding_box や crosshair が付いているファイルは刻印位置確認用のGcodeで設定通りにすると弱いレーザーでおおまかな刻印位置をお知らせします)

ただ、このままではこのGcodeはKlipperで読めない形式(G1がG01、G0がG00)で保存されているので、一度テキストエディタ等でGcodeを開いて

内容をコピーして文字列を置換するツール等を使って内容を修正します。
画像ではhttps://html-css-javascript.com/replace/でG00をG0に、G01をG1に置換させていただいてます。
(Windows標準の「メモ帳」でも置換はできます)
先程のGcodeを置換した内容で上書きをして刻印データの作成は終了です。
(なぜかbounding_box や crosshair のファイル名のGcodeは修正の必要が無いです)

レーザー刻印
ホーミング後にZ100mmに移動してからレーザーに付属のゴーグルを装着して目を守ってからM106 S1をターミナルで送り、弱いレーザーを出力して刻印する場所に当たるレーザーを収束させて、できるだけ光の大きさが小さくなるように調節します。
調節が終わりましたらM107 もしくは M106 S0でレーザーの出力を止めます。
先程ファイルで出力した名前に bounding_box や crosshair が付いているGcodeを使って大まかな刻印位置を確認した後に実際の刻印用のGcodeで刻印を開始しましょう。
かなり煙と臭いが出ますので換気には注意をしてください。

終わりに
今回使用しているレーザーは刻印のみで切断はできない出力ですが、既製品にオリジナルの刻印をするだけでも楽しいものです。
火災の危険性は3Dプリントよりも大変高くなりますので、色々注意をしながらお使いいただけると嬉しいです。
おまけ
どうしても180mm × 180mmサイズでレーザーを使用したい場合はベースの磁気鋼板をYマイナス側にずらすと刻印領域が大きくなります。
下記の.cfgをx_laser_plotter.cfgの代わりに使用をしてみてください。
x_laser_plotter_Y180.cfg
[fan]
pin: PB1
kick_start_time: 0.01
[printer]
kinematics: cartesian
max_velocity: 105
max_accel: 1000
max_accel_to_decel: 1000
max_z_velocity: 24
max_z_accel: 240
square_corner_velocity: 5
[stepper_x]
step_pin: PE3
dir_pin: PE2
enable_pin: !PE4
microsteps: 32
rotation_distance: 40
full_steps_per_rotation: 200
endstop_pin: ^!PA15
position_max: 180
position_endstop: -5.5
position_min: -5.5
homing_speed: 50
[stepper_y]
step_pin: PE0
dir_pin: PB9
enable_pin: !PE1
microsteps: 32
rotation_distance: 40
full_steps_per_rotation: 200
endstop_pin: ^!PA12
position_endstop: -5
position_max: 180
position_min: -5
homing_speed: 50
[bltouch]
sensor_pin: ^PC4
control_pin: PA8
stow_on_each_sample:False
x_offset: 26.5
y_offset: 31
#z_offset: 0
speed: 10
samples: 3
[bed_mesh]
speed: 105
horizontal_move_z: 10
mesh_min: 18,10
mesh_max: 170,130
probe_count: 5,5
[gcode_macro CANCEL_PRINT]
rename_existing: CANCEL_PRINT_OLD
gcode:
G90
G0 X30 Y120 F3000 ; park toolhead
CLEAR_PAUSE
M84 ; disable steppers
M107 ; fan off
BED_MESH_CLEAR
CANCEL_PRINT_OLD
SDCARD_RESET_FILE