Ender5Pro+SKR3+OctoPrint+Klipperの基本設定

# 記事一覧
- [環境構築](https://qiita.com/tanutanup/items/cbb0d0cabd8d976f0e38)
- 基本設定編(本記事)
- [BLTouch編](https://qiita.com/tanutanup/items/1da1edd8185b12224e9c)
- Klipperのマクロ設定練習
    - [【備忘録】klipperのマクロ設定が沼過ぎる件(前編)](https://qiita.com/tanutanup/items/05f9cb7b1600e6a7f985)
    - [【備忘録】klipperのマクロ設定が沼過ぎる件(後編)](https://qiita.com/tanutanup/items/433b3701a39a6fe7d37b)
- [フィラメントセンサ編](https://qiita.com/tanutanup/items/46b141d64c47779d34fa)
- ディスプレイ編(作成中)

# 今回の目的
（だいぶ時間が空きましたが）とりあえず印刷可能な状態に持ってきます。

# 事前準備

[前回](https://qiita.com/tanutanup/items/cbb0d0cabd8d976f0e38)と重複しますが、以下の準備を済ませておきます。
- RaspberryPiにOctoprint+Klipperの環境をインストール
- SKR3のハードウェアに合わせたファームのコンパイル・書き込み
- [ボードのgithub](https://github.com/bigtreetech/SKR-3/tree/master/Firmware/Klipper)からcfgファイルを入手しprinter.cfgとしてhomeディレクトリに保存します

cfgファイルは[公式HP](https://www.klipper3d.org/)を読んで構築するのがセオリーですが、ピン配置の設定は面倒でミスも起きやすいのでボードの公式から流用したほうが賢明です。

# 温度関係
まずはベッドとノズルの温度制御ができる必要があります。

## 温度センサ
大抵の温度センサであればそのまま温度が取得できているはずです。
温度が取得できていれば、Octoprintの画面で室温が計測できます。

## ヒータ
Octoprintの画面でノズルやベッドに温度設定を実施すると、温度が上昇するはずです。
（ファームやcfgファイルが正しく、SKR3とskr3が接続できていれば。）

## PIDチューニング
いくつかやり方があるようですが、klipperにPIDチューニングコマンドを使いました。実行すると目標温度が何回か変化します。
![スクリーンショット 2023-03-17 014813.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269597/7359055e-5254-bc0e-2253-10574e05cc91.png)
チューニングが終わると、このようにゲインを教えてくれるのでprinter.cfgに反映します。
![スクリーンショット 2023-03-17 014739.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269597/5160ffb5-c187-4bb9-a6d0-736ee84b5fe8.png)


# 各軸設定
温度が正しく制御でき、各軸が正しく動けば印刷できるはずです。
設定には[公式ドキュメント](https://www.klipper3d.org/Config_checks.html)が役に立ちました。

## エンドスイッチ
まず、エンドスイッチが押されるよう、(電源OFFの状態で)手で動かします。
この状態でシステムを起動し、OctoprintのTerminalに「QUERY_ENDSTOPS」と入れてEnterを押すと、各エンドスイッチの状態が"TRIGGERED"と帰ってくるはずです。
また、各スイッチが押されていない状態にして再度コマンドを送ると"open"が帰ってきます。
もし想定どおりでない場合は、ケーブルの接続が間違っているか、論理が間違っています。論理が間違っている場合、以下の通りに設定を変えると正しく読めるようになるはずです。
(cfgファイルの基本的な設定はピン設定に!をつけたり着けなかったりするのがほとんどです)

```printer.cfg
# 正論理。エンドストップが押されるとHiの電圧。
endstop_pin: PC0

# 負論理。エンドストップが押されるとLoの電圧。
# endstop_pin: !PC0

# 負論理かつマイコン内プルアップ有効。エンドストップが押されるとLoの電圧。
# endstop_pin: ^!PC0
```

## モータ

### 基本設定
使用するモータ・ドライバに合わせてコメントアウトします。今回は[TMC2209](https://github.com/bigtreetech/BIGTREETECH-TMC2209-V1.2)を使用します。
この設定を行い、Terminalに以下のコマンドを打ち込むと、何かしらモータが動きます。
```
STEPPER_BUZZ STEPPER=stepper_x
STEPPER_BUZZ STEPPER=stepper_y
STEPPER_BUZZ STEPPER=stepper_z
```
また、M84を打ち込むと、モータがフリーになるはずです。
この辺が正しく動かない場合は、enable_pinの設定を見直します。

```printer.cfg
#### Y軸の例 ####
[stepper_y]
step_pin: PA15
dir_pin: PA8
enable_pin: !PD1
```

### 距離・方向の設定
各軸の方向とエンドスイッチの位置関係を整理します。
![XYZ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269597/5b3b8c6d-b33b-8c0a-969b-b71ea61cf9a9.png)

### 座標系の設定
図の考えに従いエンドスイッチの位置を設定します。
```printer.cfg
[stepper_x]
# 3DプリンタのX軸最大可動位置220mmにエンドスイッチがある
position_endstop: 220
position_max: 220

[stepper_y]
# 3DプリンタのY軸最大可動位置220mmにエンドスイッチがある
position_endstop: 220
position_max: 220

[stepper_z]
endstop_pin: PC0
# 3DプリンタのZ軸最大可動範囲300mm。0.5mmにエンドスイッチがある
position_endstop: 0.5
position_max: 300
```
### 回転方向の設定
ヘッドやベッドをエンドスイッチ近くに動かしてOctoprintでHommingを指示します。
各モータの向きが合っていて、エンドスイッチの設定が正しければとりあえずHommingできるはずです。逆に動いてしまった場合はdir_pinの論理を反転させます。

### 各軸の移動距離設定
コメントによくある[Marlin Firmware](https://marlinfw.org/)からの設定値変換例があります。80[step/mm]の場合、rotation_distanceは40となるようです(microstep = 16)。
これはあくまでも理論値ですので、最終的にはマジックで印を着けて確認します。
Extruderはノズルの温度を上昇させないと動かせないため、温めてから動かします。
(こちらはなぜか計算通りに行かなかったので、何度か調整します)

# 最終的な設定
とりあえずこの設定で印刷できました。
```printer.cfg
####中略###
[stepper_x]
step_pin: PD4
dir_pin: PD3
enable_pin: !PD6
rotation_distance: 40
microsteps: 16
endstop_pin: PC1
# 3DプリンタのX軸最大可動位置220mmにエンドスイッチがある
position_endstop: 220
position_max: 220
homing_speed: 50

[tmc2209 stepper_x]
uart_pin: PD5
run_current: 1.200
hold_current: 0.950
stealthchop_threshold: 500
diag_pin: PC1

[stepper_y]
step_pin: PA15
dir_pin: PA8
enable_pin: !PD1
microsteps: 16
rotation_distance: 40
endstop_pin: PC3
# 3DプリンタのY軸最大可動位置220mmにエンドスイッチがある
position_endstop: 220
position_max: 220
homing_speed: 50
[tmc2209 stepper_y]
uart_pin: PD0
#run_current: 0.800
run_current: 1.200
hold_current: 0.950
stealthchop_threshold: 500
diag_pin: PC3

[stepper_z]
step_pin: PE2
dir_pin: !PE3
enable_pin: !PE0
microsteps: 16
rotation_distance: 4
endstop_pin: PC0
# 3DプリンタのZ軸最大可動範囲300mm。0.5mmにエンドスイッチがある
position_endstop: 0.5
position_max: 300
[tmc2209 stepper_z]
uart_pin: PE1
#run_current: 0.800
run_current: 1.200
hold_current: 0.950
stealthchop_threshold: 500
diag_pin: PC0

[extruder]
step_pin: PD15
dir_pin: PD14
enable_pin: !PC7
microsteps: 16
rotation_distance: 30.613
nozzle_diameter: 0.400
filament_diameter: 1.750
heater_pin: PB3
#heater_pin: PB4
sensor_type: EPCOS 100K B57560G104F
sensor_pin: PA2
control: pid
pid_Kp: 22.2
pid_Ki: 1.08
pid_Kd: 114
min_temp: 0
max_temp: 250

[tmc2209 extruder]
uart_pin: PC6
# モータが熱々なので多分過剰
run_current: 1.200
hold_current: 0.650
stealthchop_threshold: 500
diag_pin: PC2_C
####後略###
```

# 感想と今後
Marlinと違い、設定変更するたびにコンパイル・書き込みが不要なので結構楽ですね。設定ファイルも散り散りになっていないので見通しが付きやすい点も嬉しいです。
ただ、Marlinに比べてマイナーな感じが否めず、情報が少なめな点がデメリットです。
今後は、細かい設定を煮詰めつつ、BLtouchやfilamentセンサを使えるようにします。