3Dプリンタ魔改造沼を楽しもう

3Dプリンタのメインボードを交換してラズパイに繋げてしまった人が
魔改造をさらに楽しむための記事です

まだメインボード交換・ラズパイ接続が終わってない方は
この記事を読んで深い沼に思いを馳せながら
[前回の記事](https://qiita.com/kemako/items/88c61fe97a8e74664b74)を参考に改造を完了してください

# NeoPixelをつけてみよう（★☆☆）
私がものづくり施設で使ってたUPBOXという30万円の3Dプリンタだと
印刷中にNeoPixelをつけることができて綺麗だったんです

3万円のEnder 3 ProにもNeoPixelをつけてみましょう

まずは[NeoPixelのテープLED](https://www.amazon.co.jp/dp/B01MYT6JH9/ref=cm_sw_r_cp_tai_1MR.EbA6H5QJH)を購入します

![スクリーンショット 2020-07-06 17.09.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164897/c2ab40ba-56fd-850e-2709-ac8b13548d71.png)


## ファームウェアを書き換えよう

[Githubに載っている回路図](https://github.com/bigtreetech/BIGTREETECH-SKR-V1.3/blob/master/BTT%20SKR%20V1.4/Hardware/BTT%20SKR%20V1.4PIN.pdf)を見てみると
NeoPixel用のピンが用意されていることがわかります

<img width="1120" alt="68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3136343839372f35663430383562312d636539372d313630362d326230312d6634376163343265326534642e6a706567.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164897/da5c7dd2-1ec7-dbc8-fdbd-76383836cb50.jpeg">

回路図には1.24と書いてありますが
ファームウェアでNeoPixelのピンを指定するときは`P1_24`と書きましょう

[この記事](https://www.makenprint.uk/3d-printing/3d-printing-guides/skr-v1-4-adding-neopixel-leds/)を参考にしてファームウェアを書き換えていきましょう

```Configuration.h
// Support for Adafruit Neopixel LED driver
#define NEOPIXEL_LED
#if ENABLED(NEOPIXEL_LED)
  #define NEOPIXEL_TYPE   NEO_GRB // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h)
  #define NEOPIXEL_PIN     P1_24       // LED driving pin
  //#define NEOPIXEL2_TYPE NEOPIXEL_TYPE
  //#define NEOPIXEL2_PIN    5
  #define NEOPIXEL_PIXELS 30       // Number of LEDs in the strip, larger of 2 strips if 2 neopixel strips are used
  #define NEOPIXEL_IS_SEQUENTIAL   // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once.
  #define NEOPIXEL_BRIGHTNESS 127  // Initial brightness (0-255)
  #define NEOPIXEL_STARTUP_TEST  // Cycle through colors at startup

  // Use a single Neopixel LED for static (background) lighting
  //#define NEOPIXEL_BKGD_LED_INDEX  0               // Index of the LED to use
  //#define NEOPIXEL_BKGD_COLOR { 255, 255, 255, 0 } // R, G, B, W
#endif
```

`#define NEOPIXEL_PIXELS` で何個LEDを使うか指定することができます

```Configuration_adv.h
  #define LED_CONTROL_MENU
  #if ENABLED(LED_CONTROL_MENU)
    #define LED_COLOR_PRESETS                 // Enable the Preset Color menu option
    #if ENABLED(LED_COLOR_PRESETS)
      #define LED_USER_PRESET_RED        255  // User defined RED value
      #define LED_USER_PRESET_GREEN      255  // User defined GREEN value
      #define LED_USER_PRESET_BLUE       255  // User defined BLUE value
      #define LED_USER_PRESET_WHITE      255  // User defined WHITE value
      #define LED_USER_PRESET_BRIGHTNESS 255  // User defined intensity
      #define LED_USER_PRESET_STARTUP       // Have the printer display the user preset color on startup
    #endif
  #endif
```

ファームウェアの変更ができたら電源をつけるとLEDテープが光るはずです

*`#define NEOPIXEL_STARTUP_TEST`によって電源をつけると赤→緑→青→白の順番に光るはずです*

メニューの`LED Control`からプリセットに入っている色を指定して
正しく光るか試してみましょう

[このLEDテープ](https://www.amazon.co.jp/dp/B01MYT6JH9/ref=cm_sw_r_cp_tai_1MR.EbA6H5QJH)の場合は`NEO_GRB`と書くところを`NEO_GRBW`と書いていると
ちゃんと色の指定ができないので注意です


## Ender3に取り付けよう

LEDテープを取り付けるためのパーツを設計してもいいのですが

パイプの溝に入れてしまえば簡単に取り付けることができます

ただしLEDテープの幅が溝より少し広いので端を切る必要があります

![BA6DDDFE-D1FF-4788-9D9C-3470144D9E22.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164897/e9253a92-5e0a-9dd1-1644-63d797da8083.jpeg)

こんな感じでパイプの溝に差し込めたらなんかおしゃれな3Dプリンタになります
*本当におしゃれなのか？*
*個人的にはスターウォーズのライトセーバーに見える*

![33BD11A7-0642-4368-93FB-D3494BCB2EC3.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164897/a81b5756-65a4-6401-88bb-6402818730fc.jpeg)

![8218B245-73B5-40CC-8F23-5E2B57E597C8.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164897/682edb3b-443a-7b1e-83e9-9d232ca29e2d.jpeg)

![07785B86-005D-456C-9697-A931489F8DC8.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164897/2d45d1e3-337b-da74-edd2-bc7f65f071ca.jpeg)

Gコードでは
`M150 B255 R20 U150`
のようにすると色の指定ができます

*R = Red　B = Blue　U = Green*

M150コマンドの詳細は[こちら](https://marlinfw.org/docs/gcode/M150.html)を見てください


# モータドライバをTMC2208にして静音化しよう（★★☆）

TMC2208ってすごいんです

![HTB1jeMRa.WF3KVjSZPhq6xclXXak.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164897/12d2509d-8c75-677a-9a90-6b0f72b780bc.jpeg)


SpreadCycleモードとStealthChop2モードの二つを切り替えることができるようになっています

#### SpreadCycleモード
- サイクル単位で高精度に電流制御を行う

#### StealthChop2モード
- 非常に静かな動作モード
- 電流変動を減らし磁気歪みによる低周波ノイズの発生を抑える
- 高速で動かすと脱調しやすい

らしいです（参考：[Trinamicのカタログ](https://uploads-ssl.webflow.com/5ab90dd1fc0a9245a3adc92f/5ac61338b922b4150318e81f_TMC_tech_flyer_STEALTHCHOP_A4_JPN_V01_WEB.pdf)，[キットではじめる3Dプリンタ自作入門](https://www.amazon.co.jp/3D%E3%83%97%E3%83%AA%E3%83%B3%E3%82%BF%E3%81%AE%E8%87%AA%E4%BD%9C-%E5%90%B9%E7%94%B0-%E6%99%BA%E7%AB%A0/dp/4899774915/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E3%82%AD%E3%83%83%E3%83%88%E3%81%A7%E5%A7%8B%E3%82%81%E3%82%8B3D%E3%83%97%E3%83%AA%E3%83%B3%E3%82%BF%E8%87%AA%E4%BD%9C&qid=1594028758&sr=8-1)）

つまり
**低速での動作時はStealthChop2モードでめっちゃ静か
高速での動作時はSpreadCycleモードで脱調防止**
という風にうまく使い分けることができるんです

それではこのTMC2208を扱えるようにファームウェアを変更していきましょう

[Teaching Techの動画1](https://www.youtube.com/watch?v=-Gdk0wHg51w&list=PLGqRUdq5ULsPQv_rpBL_BGG11rvIKgXoI)と[Teaching Techの動画2](https://www.youtube.com/watch?v=7VHwcEroHPk&list=PLGqRUdq5ULsOIIaBONPU65uH2s6iI6GqY&index=2)を参考にしました

```Configuration.h
#define X_DRIVER_TYPE  TMC2208
#define Y_DRIVER_TYPE  TMC2208
#define Z_DRIVER_TYPE  TMC2208
#define E0_DRIVER_TYPE TMC2208

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

```Configuration_adv.h
#if HAS_TRINAMIC_CONFIG
  #if AXIS_IS_TMC(X)
    #define X_CURRENT       760

  #if AXIS_IS_TMC(Y)
    #define X_CURRENT       760

  #if AXIS_IS_TMC(Z)
    #define X_CURRENT       760

  #if AXIS_IS_TMC(E0)
    #define X_CURRENT       900

 #define MONITOR_DRIVER_STATUS

 #define HYBRID_THRESHOLD

 #define TMC_DEBUG
```

`#define HYBRID_THRESHOLD`では
StealthChop2モードとSpreadCycleモードの切り替えの閾値を設定することができます

向きを間違えないようにモータードライバを差し込めば完成です

*SKR V1.4は裏面を見るとGNDとか書いてるので
モータードライバのGNDと合わせるとかすると安心感あると思います*

![6665A093-AB47-41B3-B37D-C3A74C2ECD5E.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164897/cfa4cbab-0ebf-8ba5-b777-1048403cd19f.jpeg)

これでメニューから`Move Axis`で動作チェックをすると
静かすぎて驚くこと間違いなし

もうファンの音しか聞こえません

# PID制御器のチューニングをしよう（★★★）

ホットエンドの温度制御にはPID制御が使われています

せっかくOctoPrintで温度推移のログを取れるようになったので
PID制御器のチューニングをしてみましょう

ログを取りたいときだけ
`設定 > Serial Connection > Serial logging`
をオンにしてあとで
`設定 > Logging > serial.log`
をダウンロードしましょう

終わったら`serial.log`を削除して`Serial logging`もオフにしておきましょう


ダウンロードした`serial.log`はこんな感じになっているわけですが ↓
<img width="510" alt="スクリーンショット 2020-07-06 11.32.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164897/6811d4df-ceb1-9936-e24f-56015bfe4912.png">

MATLABなりPythonなりなんなり好きなツールを使ってデータを処理するとこんな風にプロットすることができます

![default.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164897/890cc754-328d-f993-213d-dd2e7240237a.png)

ここでMarlinのコード（[temperature.cppのget_pid_output_hotend](https://github.com/MarlinFirmware/Marlin/blob/a73e61078de06599b3bd58a4b1f705c7b6f72b24/Marlin/src/module/temperature.cpp#L837)）を読んでみると

ホットエンドの温度制御はBang Bang制御とPID制御を切り替えていることがわかります

- 目標値より10度低い値まではBang Bang制御
- 目標値より10度低い値に達したらPID制御

という風に早く目標値に達するための工夫がなされてたんですね

デフォルトのゲインは機種ごとに決まっているみたいです

```Configuration.h
  // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it
  // Creality Ender-3
  #define DEFAULT_Kp 21.73
  #define DEFAULT_Ki 1.54
  #define DEFAULT_Kd 76.55
```

またPIDゲインのオートチューニング機能というのがあって
`M303`コマンドを使うとジーグラ・ニコルス法を用いてKp，Ki，Kdを算出してくれるらしいです（[参考](https://reprap.org/wiki/PID_Tuning/ja)）

例えば`M303 E0 S150 C8`を実行してみると
![スクリーンショット 2020-06-26 17.48.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164897/4553c039-74b6-df46-3968-e58e59d9ce21.png)

150度を8回前後してゲインを算出してくれます

```
bias: 154 d: 100 min: 196.93 max: 203.61 Ku: 38.12 Tu: 32.30
Classic PID
Kp: 21.51 Ki: 1.29 Kd: 89.44
PID Autotune finished! Put the last Kp, Ki and Kd constants from below into Configuration.h
```

ゲインはもちろん自分で変更することができて
`M301`コマンドで設定することができます

`M301 P21.51 I1.29 D89.44`というような感じです

*Configuration.hを書き換えてもいいと思います*

設定を保存したいときは`M500`コマンドでできます（[参考](https://reprap.org/wiki/PID_Tuning/ja)）

ではPID制御器のチューニングをしてみましょう

目標値より10度低いところで切り替え制御がなされているので
一旦140度で落ち着かせてから目標値を150度に設定したときの応答で評価してみようと思います

まずはオートチューニングで算出されたゲインを使ってみると

![auto_0706.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164897/68ce2f98-d415-7bb4-0b8d-2aad277784ee.png)

結構オーバーシュートしてますね

Pゲインを小さくしてみます

`M301 P20.5 I1.29 D89.44`

![auto_fine.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164897/9252999f-86c7-73f2-3dcc-a944e9854446.png)

オーバーシュートがかなり抑えられていい感じです

今回は150度でチューニングしてみましたが
フィラメントを使うときの温度でチューニングすると良さそうですね

この記事ではここまでにしますが
もうちょっとチューニングしてみようと思います

ちなみにベッドはデフォルトではBang Bang制御みたいです
こちらもPID制御に変更可能です
PIDゲインの変更は`M304`コマンドでできます

# 最後に
3Dプリンタ魔改造沼はまだまだ深いです

次は何しようかなあ

デュアルエクストルーダとかやってみたいですねっ

もしできたらまた記事に残そうと思います


# 参考
- [3Dプリンタ魔改造沼へようこそ](https://qiita.com/kemako/items/88c61fe97a8e74664b74)
- [SKR V1.4 Adding NeoPixel LED's - How to guide - Make 'N' Print](https://www.makenprint.uk/3d-printing/3d-printing-guides/skr-v1-4-adding-neopixel-leds/)
- [TMC2208 guide - Stepper driver upgrades part 2](https://www.youtube.com/watch?v=7VHwcEroHPk&list=PLGqRUdq5ULsOIIaBONPU65uH2s6iI6GqY&index=2)
- [Bigtreetech SKR V1.4 (Turbo) comprehensive guide](https://www.youtube.com/watch?v=-Gdk0wHg51w&list=PLGqRUdq5ULsPQv_rpBL_BGG11rvIKgXoI)
- [PID Tuning/ja - RepRap](https://reprap.org/wiki/PID_Tuning/ja)
- [Trinamicのカタログ](https://uploads-ssl.webflow.com/5ab90dd1fc0a9245a3adc92f/5ac61338b922b4150318e81f_TMC_tech_flyer_STEALTHCHOP_A4_JPN_V01_WEB.pdf)
- [キットではじめる3Dプリンタ自作入門](https://www.amazon.co.jp/3D%E3%83%97%E3%83%AA%E3%83%B3%E3%82%BF%E3%81%AE%E8%87%AA%E4%BD%9C-%E5%90%B9%E7%94%B0-%E6%99%BA%E7%AB%A0/dp/4899774915/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E3%82%AD%E3%83%83%E3%83%88%E3%81%A7%E5%A7%8B%E3%82%81%E3%82%8B3D%E3%83%97%E3%83%AA%E3%83%B3%E3%82%BF%E8%87%AA%E4%BD%9C&qid=1594028758&sr=8-1)