【3Dプリンタ】Ender-3 ProにKlipperファームウェアを導入した – OctoPi+Klipper編

 4,438 total views,  19 views today

今回、3DプリンタのファームウェアをMarlinからKlipperへ移行してみることにした。

Marlinファームウェア

3Dプリンタ用のオープンソースのファームウェアとしてはMarlinが有名で、Ender-3 ProのファームウェアにもMarlinが使われている。

Marlinの歴史は古く、開発が始まってからすでに10年ほど経っているようである。

Marlinの開発は現在、8bitボード対応のバージョン1.0から32bitボードに対応したバージョン2.0に移行しており、より高機能なものとなってきている。

【Ender-3改造】Ender-3に32bitのメインボードを導入した(Marlin 2.0.x)

Klipperファームウェア

Klipperとは、3Dプリンタにもともと備わっているボードと比較してはるかに高性能であるRaspberry Pi(ラズベリーパイ)のようなシングルボードコンピュータに3Dプリンタの制御を肩代わりさせるというファームウェアである。

シングルボードコンピュータが、3Dプリンタのモーター制御に必要な演算を行うことで、もともとのボードでは実現できなかったようなより複雑な制御が可能となる。

Klipperを導入することで得られる恩恵(メリット)としては、以下のようなものが挙げられる。

Klipperファームウェアの導入

Klipperファームウェアの導入に際しては、Raspberry Piなどのシングルボードコンピュータが必須となるほか、無線LAN接続可能なPCも必要となる。

Raspberry Pi(ラズベリーパイ)

Raspberry Piにはいろいろなモデルがあるが、公式に推奨されているのはRaspberry Pi 2Raspberry Pi 3Raspberry Pi 4となっている。

もし今からRaspberry Piを調達しようとするのであれば、最新モデルのRaspberry Pi 4を選んでおくのが無難である。

Raspberry Pi 4とそれ以前のモデルでは性能やインターフェースに大きな違いがあるためである。

Raspberry Pi 4Raspberry Pi 2
Raspberry Pi 3
CPUCortex-A72
1.5 GHz (クアッドコア)
Cortex-A53
Pi 2 : 900 MHz (クアッドコア)
Pi 3 model B : 1.2GHz (クアッドコア)
Pi 3 model B+ : 1.4 GHz (クアッドコア)
メモリ1/2/4/8GB (LPDDR4)Pi 2 : 1GB (LPDDR2)
Pi 3 : 1GB (LPDDR2)
無線LANIEEE 802.11.b/g/n/ac
(2.4Ghz/5Ghz)
Pi 2 : なし
Pi 3 model B : IEEE 802.11.b/g/n (2.4Ghz)
Pi 3 model B+ : IEEE 802.11.b/g/n/ac
(2.4Ghz/5Ghz)
USBポートUSB 3.0 x 2
USB 2.0 x 2
USB 2.0 x 4
電源コネクタUSB Type-CMicroUSB
HDMI端子マイクロ HDMI (4Kp60対応) x 2HDMI x 1

無線LAN接続可能なPC

ノートPCであれば、どんなに安いものでもほぼ間違いなく無線LAN接続可能であるし、デスクトップPCの場合でも、無線LAN子機を追加することにより無線LAN接続可能となる。

Klipperファームウェアの導入方法

Raspberry PiにKlipperを導入する方法には大きく分けて2つあり、①OctoPi+Klipperを導入する方法②MainsailOSを導入する方法とがある。

これらの違いは簡単に言うと、OctoPi用のプラグインが使えるかどうかの違いとなる。

①の方法ではOctoPi用のプラグインが使えるが、②の方法ではOctoPi用のプラグインが使えない

OctoPi + KlipperMainsailOS
導入時の手間手間がかかるやや手間がかかる
プラグインによる
機能追加
できるできない
WebUI設定項目が多く
やや複雑
設定項目が少なく
シンプル

ここでは①の方法、つまりOctoPi+Klipperの導入手順について紹介し、②の方法については別記事で扱う。

【3Dプリンタ】Ender-3 ProにKlipperファームウェアを導入した – MainsailOS編

OctoPi + Klipperの導入手順

OctoPi + Klipper以下の手順により導入することができる。

  1. Raspberry PiにOctoPiをインストール
  2. OctoPiのネットワーク設定を編集
  3. PCからOctoPiにSSH接続
  4. Raspberry Piの設定を変更
  5. Klipperをインストール
  6. Klipperを使用できるようOctoPiの各種設定を変更
  7. 各種ボードのMCUに対応したファームウェアファイルの作成
  8. 各種ボードのシリアルポートの名前を特定
  9. ボードへのファームウェア書き込み
  10. Klipperの各種設定を変更

OctoPi + Klipperの導入に際して必要となるソフトウェア

  • Raspberry Pi imager – OctoPiのイメージファイルをmicroSDカードに書き込む際に使用
  • Tera Term – OctoPiにPCからSSH接続する際に使用
  • WinSCP – OctoPiからファームウェアファイル(Klipper.bin)をダウンロードする際に使用

1.Raspberry PiにOctoPiをインストール

MainsailOSのインストールには、Raspberry Pi imagerという便利なツールがあるので、これを使用する。

Raspberry Pi imagerの使い方は簡単で、以下のとおりである。

  1. 書き込みたいOSファイルを選択(CHOOSE OS) ※「Erase」を選択するとストレージのフォーマットができる
  2. 書き込み先のストレージを選択(CHOOSE STORAGE)
  3. 書き込む(WRITE)
書き込みたいOSのファイルを選択

Other specific purpose OS」を選択し、

OctoPi」を選択する。

書き込み先のストレージを選択

USB接続のストレージが自動的に表示されるので、目的のストレージを選択する。

書き込み

WRITEボタンを押せば、選択したストレージにOSのイメージファイルの書き込みが始まる。

処理を続行していいかの確認画面が表示されるので、「YES」を選択する。

書き込みが完了したら、完了画面が表示される。

2.OctoPiのネットワーク設定を編集

各自の無線LAN環境に応じて「OctoPi-wpa-supplicant.txt」のネットワーク設定の行頭にある「#」を消して

  • SSID
  • パスワード

を設定する。

具体的には、該当部分を

から

のように書き換える。

3.PCからOctoPiにSSH接続

無線LAN接続可能なPCからOctoPiをインストールしたRaspberry PiにSSHで接続する。

接続の設定は、

  • ホスト:octopi.local
  • ユーザー:pi
  • パスフレーズ:raspberry

である。

途中、セキュリティ警告が表示されるが、かまわず「続行」を選択する。

ユーザー名とパスフレーズを入力して「OK」を押せば、SSH接続が完了する。

SSH接続が成功すれば、↓のような画面が表示される。

4.Raspberry Piの設定を変更

パスワードの変更

System Options」→「Password」の順にたどり、パスワードを変更する。

新規パスワードの入力画面になるので、パスワードを入力する。

タイムゾーンの設定

Localisation Options Configure language and regional settings」→「Timezone」の順にたどりタイムゾーンを変更する。

Asia」→「Tokyo」の順にたどりタイムゾーンを「Tokyo」に設定する。

5.Klipperをインストール

git clone https://github.com/KevinOConnor/klipper

と入力して実行すると、パスワードを求められるので、手順4.で設定したパスワードを入力する。

./klipper/scripts/install-octopi.sh

と入力して、Klipperをインストールする。

6.Klipperを使用できるようOctoPiの各種設定を変更

初期設定

まずは、OctoPiの初期設定を行う。

Webブラウザのアドレスバーに「http://octopi.local」または「http://octopiのIPアドレス」と入力し、OctoPiのWebUIにアクセスする。

画面の表示に従って初期設定を行っていく。

ユーザーネーム」と「パスワード」を設定する。

この後は、すべて「Enable~」となっている方を選択していく。

スポンサーリンク

プリンタ名」を設定する。

設定の変更

初期設定完了後、設定の変更を行っていく。

OctoPiのWebUIの上部にあるレンチアイコンをクリックしてOctoPiの設定ページを表示する。

Serial Connection」の「General」タブ内にある「Additional serial ports」欄に「/tmp/printer」と入力し、設定ページの下部にある「Save」で設定内容を保存する。

再度、OctoPiの設定ページに入り「Serial Connection」の「General」タブ内にある「Serial Port」欄で先ほど入力した「/tmp/printer」を選択する。

Serial Connection」の「Behaviour」タブ内にある「Cancel any ongoing prints but stay connected to the printer」という項目にチェックを入れ、設定を保存する。

OctoKlipperのインストール

設定画面の「Plugin Manager」からOctoPi用のKlipperプラグイン(OctoKlipper)をインストールする。

Get More」からプラグインの追加を行う。

「Klipper」で検索して出てくる「OctoKlipper」をインストールする。

プラグインのインストール完了後、再起動すると新たに「Klipper」タブが追加されていたりと変化がみられる。

Klipper」タブに移動すると、設定ファイルの編集などKlipperに関する操作がWebUI上からできるようになっている。

7.各種ボードのMCUに対応したKlipper用ファームウェアファイルの作成

SSH接続後の画面で

cd ~/klipper/

と入力してエンターキーを押した後、

make menuconfig

と入力してエンターキーを押す。

すると、ファームウェアの設定画面が表示される。

後は、各種ボードに対応した設定を行うのだが、ここでは「SKR Mini E3 V1.2」を例にとり説明する。

Enable extra low-level configuration options」が選択されている状態で、スペースキーまたはエンターキーを押して、追加の設定項目を表示させる。

Micro-controller Architecture」で「STMicroelectronics STM32」を選択。

Processor model」で「STM32F103」を選択。

Bootloader offset」で「28KiB bootloader」を選択。

GPIO pins to set at micro-controller startup」を選択し、「!PC13」と入力。

最終的には、↓のように設定されていればよい。

Q」を押して、「Y」を押したのち、

make」と入力し、エンターキーを押す。

すると、ファームウェアファイル(klipper.bin)が作成される。

8.各種ボードのシリアルポートの名前を調べる

通電した3Dプリンタのボード(ここでは、SKR Mini E3 V1.2)とRaspberry PiをUSB接続した状態で、

cd ~/klipper/
ls /dev/serial/by-id/*

というコマンドを入力する。

9.ボードへのファームウェア書き込み

ボードとOctoPiをUSB経由で接続して直接ファームウェアを書き込む場合

下記のコマンドを実行してファームウェアをボードに書き込む。

cd ~/klipper/
sudo service klipper stop
make flash FLASH_DEVICE=/dev/serial/by-id/usb-Klipper_stm32f103xe_33FFD9054242363231822357-if00

※「make flash FLASH_DEVICE=」以下には、手順8.で調べたシリアルポートの名前が入る。

sudo service klipper start

ボードによっては、USB経由で直接ファームウェアを書き込むできないことがある

そのような場合には、microSDカード経由でファームウェアを書き込むことになる。

microSDカード経由でファームウェアを書き込む場合

WinSCPを使ってRaspberry PI上にあるファームウェアファイル(Klipper.bin)をmicroSDカードにコピーする。

Tera TermでSSH接続したときと同様に接続設定を行い、

  • ホスト名:octopi.local
  • ユーザ名:pi
  • パスワード:raspberryまたは自身で設定したパスワード

↓のような画面を表示させる。

右画面のフォルダを「klipper」→「out」の順にたどり、「klipper.bin」をみつける。

klipper.bin」をドラッグアンドドロップで右側から左側へ移動し、PC上にコピーする。

後は、「klipper.bin」を「firmware.bin」にリネームし、microSDカードへコピーする。

firmware.bin」の入ったmicroSDカードを「SKR mini E3 V1.2」に差し込んだ状態で電源を入れ、ファームウェアを書き込む。

ファームウェアの書き込みが完了すると、Ender-3 Proのディスプレイには何も表示されない状態となる。

10.Klipperの各種設定を変更

まずは、GithubのKlipperのページにある「↓ CODE」→「Download ZIP」と辿り、KlipperのZIPファイルをダウンロードする。

次にダウンロードしたZIPファイルを解凍してできたフォルダの中にある「config」フォルダ内から自分の環境に合ったプリンタの設定ファイル(拡張子がcfgのファイル)を探す。

その後、プリンタの設定ファイルをテキストエディタなどで開き、[MCU]の「serial:」以降の部分を手順8.で調べたシリアルポートの名前に変更する。

serial:/dev/serial/by-id/usb-Klipper_stm32f103xe_33FFD9054242363231822357-if00

保存して終了後、ファイル名を「printer.cfg」に変更する。

printer.cfg」をWinSCPでOctoPi上(/home/pi/)にアップロードする。

「printer.cfg」のアップロードが完了したら、OctoPiのWebUI上から「printer.cfg」の編集が可能となる。

Klipper」タブ内の「Open Klipper config」から「printer.cfg」の編集ができる。

これで、Klipperの導入作業は一通り完了となる。

あとは、各自の環境に合わせてオートレベリング(BLTOUCH)などの設定を追加していくことになる。

printer.cfg

最後に、参考として私の環境でのprinter.cfgを掲載しておく。

  • ノーマルEnder-3 Proと異なる点
    • ボード:SKR Mini E3 V1.2
    • Zプローブ:BLTOUCH
    • エクストルーダー:BMGクローン
    • モーター:ステップ角0.9°
    • モーターの回転方向
# This file contains common pin mappings for the BIGTREETECH SKR mini
# E3 v1.2. To use this config, the firmware should be compiled for the
# STM32F103 with a "28KiB bootloader" and USB communication. Also,
# select "Enable extra low-level configuration options" and configure
# "GPIO pins to set at micro-controller startup" to "!PC13".

# The "make flash" command does not work on the SKR mini E3. Instead,
# after running "make", copy the generated "out/klipper.bin" file to a
# file named "firmware.bin" on an SD card and then restart the SKR
# mini E3 with that SD card.

# See docs/Config_Reference.md for a description of parameters.

# Note: This board has a design flaw in its thermistor circuits that
# cause inaccurate temperatures (most noticeable at low temperatures).

[virtual_sdcard]
path: ~/gcode_files

[display_status]

[pause_resume]

[gcode_macro PAUSE]
rename_existing: BASE_PAUSE
default_parameter_X: 230    #edit to your park position
default_parameter_Y: 200    #edit to your park position
default_parameter_Z: 10     #edit to your park position
default_parameter_E: 1      #edit to your retract length
gcode:
    SAVE_GCODE_STATE NAME=PAUSE_state
    BASE_PAUSE
    G91
    G1 E-{E} F2100 
    G1 Z{Z}
    G90
    G1 X{X} Y{Y} F6000

[gcode_macro RESUME]
rename_existing: BASE_RESUME
default_parameter_E: 1      #edit to your retract length
gcode:
    G91
    G1 E{E} F2100
    G90
    RESTORE_GCODE_STATE NAME=PAUSE_state MOVE=1
    BASE_RESUME

[gcode_macro CANCEL_PRINT]
rename_existing: BASE_CANCEL_PRINT
gcode:
    TURN_OFF_HEATERS
    CLEAR_PAUSE
    SDCARD_RESET_FILE
    BASE_CANCEL_PRINT

[stepper_x]
step_pin: PB13
dir_pin: PB12
enable_pin: !PB14
microsteps: 64
full_steps_per_rotation: 400
rotation_distance: 40
endstop_pin: ^PC0
position_endstop: 0
position_max: 230
homing_speed: 50

[tmc2209 stepper_x]
uart_pin: PB15
run_current: 0.580
hold_current: 0.500
stealthchop_threshold: 250

[stepper_y]
step_pin: PB10
dir_pin: PB2
enable_pin: !PB11
microsteps: 64
full_steps_per_rotation: 400
rotation_distance: 40
endstop_pin: ^PC1
position_endstop: 0
position_max: 200
homing_speed: 50

[tmc2209 stepper_y]
uart_pin: PC6
run_current: 0.580
hold_current: 0.500
stealthchop_threshold: 250

[stepper_z]
step_pin: PB0
dir_pin: !PC5
enable_pin: !PB1
microsteps: 64
full_steps_per_rotation: 400
rotation_distance: 8
endstop_pin: probe:z_virtual_endstop
position_max: 230
position_min: -10
homing_speed: 10
homing_retract_dist: 5.0

[bltouch]
sensor_pin = ^PC2
control_pin = PA1
x_offset = 1.0
y_offset = -30.25
z_offset = 1.00

[bed_mesh]
speed = 150
horizontal_move_z = 6
mesh_min = 10, 10
mesh_max = 190, 190
probe_count = 5, 5
mesh_pps = 2,2

[safe_z_home]
home_xy_position: 115,130.25
speed: 50
z_hop: 10
z_hop_speed: 15

[tmc2209 stepper_z]
uart_pin: PC10
run_current: 0.280
hold_current: 0.280
stealthchop_threshold: 5

[extruder]
step_pin: PB3
dir_pin: !PB4
enable_pin: !PD2
microsteps: 64
full_steps_per_rotation: 400
gear_ratio: 50:17
rotation_distance: 22.15 #diameter:9.5

nozzle_diameter: 0.400
filament_diameter: 1.750
heater_pin: PC8
sensor_type: NTC 100K beta 3950
sensor_pin: PA0
control: pid
pid_Kp: 21.527
pid_Ki: 1.063
pid_Kd: 108.982
min_temp: 0
max_temp: 250

[tmc2209 extruder]
uart_pin: PC11
run_current: 0.280
hold_current: 0.280
stealthchop_threshold: 5

[heater_bed]
heater_pin: PC9
sensor_type: ATC Semitec 104GT-2
sensor_pin: PC3
control: pid
pid_Kp: 54.027
pid_Ki: 0.770
pid_Kd: 948.182
min_temp: 0
max_temp: 130

[fan]
pin: PA8

[mcu]
serial:/dev/serial/by-id/usb-Klipper_stm32f103xe_33FFD9054242363231822357-if00

[printer]
kinematics: cartesian
max_velocity: 300
max_accel: 3000
max_z_velocity: 5
max_z_accel: 100

[static_digital_output usb_pullup_enable]
pins: !PC13

[bltouch]
sensor_pin: ^PC2
control_pin: PA1
pin_move_time: 0.680
#stow_on_each_sample: True
#probe_with_touch_mode: False
#pin_up_reports_not_triggered: True
#pin_up_touch_mode_reports_triggered: True
#set_output_mode:
x_offset: 1.0
y_offset: 30.25
z_offset: 2.0
#speed:
#samples:
#sample_retract_dist:
#samples_result:
#samples_tolerance:
#samples_tolerance_retries:
#   See the "probe" section for information on these parameters.

[board_pins]
aliases:
    # EXP1 header
    EXP1_1=PB5, EXP1_3=PA9,   EXP1_5=PA10, EXP1_7=PB8, EXP1_9=<GND>,
    EXP1_2=PB6, EXP1_4=<RST>, EXP1_6=PB9,  EXP1_8=PB7, EXP1_10=<5V>

[display]
lcd_type: st7920
cs_pin: EXP1_7
sclk_pin: EXP1_6
sid_pin: EXP1_8
encoder_pins: ^EXP1_5, ^EXP1_3
click_pin: ^!EXP1_2
#kill_pin: ^!EXP2_8

[output_pin beeper]
pin: EXP1_1
# See the sample-lcd.cfg file for definitions of common LCD displays.