Ender5 Pro with Bigtreetech SKR2

3Dプリンタとして比較的メジャーな、Creality社製EnderシリーズとBigtreetech製SKRボードですが、Ender-5 ProとSKR2はいずれも情報が不足気味であったため、色々と苦労しました。購入後四苦八苦すること約1ヶ月。ようやく形になってきたので記事にまとめます。

#経緯
3Dプリンタライフを始めて約1年。オートレベリングやランアウトセンサ、デュアルエクストルーダ化など色々欲望・願望が高まって来ており能力不足を実感。

(私が購入した3Dプリンタのボードはv1.15でIOは完全に埋まっており、ほぼ拡張はできないと判断。)

サードパーティ製のマザーボードへ換装。制御系を全てリニューアルすることとした。


#必要なもの

## ハードウェア
- 3Dプリンタ
    - [Creality社製 Ender-Pro](https://www.creality3dofficial.com/ja/products/ender-5-pro-3d-printer) ([github](https://github.com/Creality3DPrinting/Ender-5-Pro))
        - (Ender3は3Dモデルから、ボードの回路図、ファームまで何でも載っているのにも関わらず、Ender5は[中身空っぽで全く更新されないというシュールなイシュー](https://github.com/Creality3DPrinting/Ender-5-Pro/issues/1)が発行される状況)
- マザーボード
    - [Bigtreetech社製 SKR-2](https://github.com/bigtreetech/SKR-2)
        - [SKR1.4](https://www.biqu.equipment/products/btt-skr-v1-4-skr-v1-4-turbo-32-bit-control-board-with-tft35-v3-0-e3-v3-0-screen-with-tmc2208-tmc2209-driver-board)の後継。
        - Enderシリーズを使う方は[SKR miniシリーズ](https://www.biqu.equipment/products/bigtreetech-skr-mini-e3-v2-0-32-bit-control-board-integrated-tmc2209-uart-for-ender-3)をよく使っていらっしゃいますが、IOが足りないので採用見送り。
- TMC2208モータドライバボード
    - SKR2にはモータドライバが付属していなかったため購入
    - 静音化やエンドストップスイッチ省略も可能とのこと。
        
- ディスプレイ
    - [Bigtreetech社製 TFT](https://www.biqu.equipment/products/btt-tft35-e3-v3-0-display-touch-screen-two-working-modes)
        - Ender5純正ディスプレイが使えなかったため購入
        - タッチスクリーン&アイコンの操作性は意外とGood

- 筐体
    - Enderシリーズの筐体にポン付け出来るSKR miniシリーズを使わなかったため、適当なアルミ筐体を作成。どうせならと、OctoprintをインストールしたRaspberryPi 4(8GB)とその電源を格納。


## ソフトウェア
- [Marline](https://marlinfw.org/) [github](https://github.com/MarlinFirmware/Marlin)
    - 実際は初心者故、ボードごとのカスタマイズが完了しているソフト[Marline for SKR2](https://github.com/bigtreetech/SKR-2)を使用。最新ではない可能性あり。
- [VScode](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)
- [Auto Build Marlin](marlinhttps://marlinfw.org/docs/basics/auto_build_marlin.html)
    - VSCode用プラグイン
    - platform IOでビルドする例が多いがこちらの方が環境構築が楽。
    
# 最低限の設定

ファームウェアを入手(Bigtreetech製のレポジトリ。ボードのハードウェアマニュアルと共にSRK2用のカスタマイズ済み)。

```bash
git clone  https://github.com/bigtreetech/SKR-2
```

## 座標系の設定

まずはX・Y・Z軸エンドストップ位置を設定するが、座標軸の定義を決めておく必要がある。X・Y軸はLCDディスプレイのアイコンに合わせ左手前を0.0に設定。Z軸はディスプレイとは逆になるが、プラットフォーム最上昇位置を0とする座標と定義。そのうえで、エンドストップ取り付け位置はXYZそれぞれ、右・奥・上であることを確認した上で設定。

![XYZ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269597/5b3b8c6d-b33b-8c0a-969b-b71ea61cf9a9.png)

ホームポジションとエンドスイッチの場所を指定(Configration.h)。

```cpp
#define X_HOME_DIR 1
#define Y_HOME_DIR 1
#define Z_HOME_DIR -1
#define USE_XMAX_PLUG
#define USE_YMAX_PLUG
#define USE_ZMIN_PLUG
```

印刷範囲を設定(configration.h)。

```cpp
#define X_BED_SIZE 220
#define Y_BED_SIZE 220
#define X_MIN_POS 0
#define Y_MIN_POS 0
#define Z_MIN_POS 0
#define X_MAX_POS X_BED_SIZE
#define Y_MAX_POS Y_BED_SIZE
#define Z_MAX_POS 300
```


## モータ設定


購入したモータドライバ(今回はTMC2208)に合わせて編集(Configration.h)。

```cpp
#define X_DRIVER_TYPE   TMC2208
#define Y_DRIVER_TYPE   TMC2208
#define Z_DRIVER_TYPE   TMC2208
#define E0_DRIVER_TYPE TMC2208
#define E1_DRIVER_TYPE TMC2208
```

ボードの方もピンヘッダをUARTモードに設定![UART.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269597/8863f470-7fe6-fd92-5451-6eafbf763382.png)。

モータの回転方向を設定(Configration.h)。

```cpp
#define INVERT_X_DIR false
#define INVERT_Y_DIR false
#define INVERT_Z_DIR false
#define INVERT_E0_DIR false
```

軸ごとの移動量を設定(configration.h)。
（後の試運転で定規を使って移動量を確認します。）

```cpp
#define DEFAULT_AXIS_STEPS_PER_UNIT   { 80, 80, 400, 93 } 
```

## LCDとの接続設定

LCDとの接続を設定(Configration.h)。

(不要かも)

```cpp 
#define SERIAL_PORT_3 3
#define CUSTOM_MACHINE_NAME "Ender-5 Pro Cstm"
```

おそらくエクストルーダの電流が過剰なため修正(Configration_adv.h)。

```cpp
#if HAS_TRINAMIC_CONFIG
// 中略
  #if AXIS_IS_TMC(E0)
    // 中略
    #define E0_CURRENT      600
```


## 試運転

電源、モータ、LCD等を接続して動作を確認する。

軸ごとの回転方向を設定。
(こちらも試運転でLCD指示と実際の移動方向が一致するかを確認)


# ヒータのPID制御
PID制御の設定有効化したりオートチューニングによりゲインを最適化するとノズル・ベッドの昇温が早くなる。

## ノズル温度制御

ノズルは元々PID制御となっているためオートチューニングメニューを有効化する(configration.h)。

```cpp
#define PID_EDIT_MENU
#define PID_AUTOTUNE_MENU   
```

## ベッド温度制御

ベッドはON-OFF制御となっているためPID制御を有効化する(Configration.h)。

```cpp
#define PIDTEMPBED
```

## 試運転

LCDディスプレイの温度設定にPIDチューニングが表示されるはず。オートチューニングを実施するとしばらく画面が固まるが数分後に完了する。同定したゲインはEEPROMへ保存できるので保存。

# Next Modify

次回は、[BLTouchを用いたオートレベリング及びZ軸エンドストップ](https://qiita.com/tanutanup/items/b3d6d973e286503a8620)についてまとめます。