Ender 5 S1事始め②

前回でとりあえずプリントすることはできたため、セッティングを詰めていく。
かなり問題にぶち当たったので、Ender5 S1を購入した人は他山の石として欲しい。

## Beep音に関しての問題
結論から言うとEnder5 S1では**現状（ファームウェアv1.0.4時点）Beep音を鳴らすことは不可能**となっている。

通常、3Dプリンタは印刷完了時に何らかの音を鳴らして完了を知らせるようにすると思う。
Marlinにはそのためのgcode`M300 [P<ms>] [S<Hz>]`があるが、これに現状では対応していない。
しかし、タッチパネルではタッチ音が鳴るためハードウェアは存在しているはず。
メーカーに問い合わせたら「以降のファームウェアバージョンにこの機能があるかにご留意ください」とのことなので
今後のファームウェア改良に期待したい。
## CR touchに関わる問題
Ender5 S1にはCR touchというセンサがデフォルトで搭載されており、ベッドレベリングが可能となっている。
しかし現状下記の問題があり、使うためのハードルがやたら高かった。

* G28（原点復帰）後のG29（ベッドレベリング）が動作しない場合がある
思い切りコレに引っかかり対策に悩んだ。
どうもZ軸リミットスイッチがONの状態でG29を行うと動作しない場合があるようだ。
必ず、という訳でもなくTeraTermで手打ち実行すると失敗するときとしないときがある。
とりあえずの対策として
```
G28
G1 Z10
G29
```
というように`G1 Z10`でZ軸をノズル下10mmに移動する動作を挟んでやると現状上手く行っているくさい。
誰か正式な対策方法を教えてもらえませんかね？

[2023/1/29 追記]ファームウェアが2023/1/11に更新されver1.0.6となっており、[Creality cloud](https://www.crealitycloud.com/software-firmware/firmware?type=2)のdescriptionを読むと
This firmware is the factory firmware of Ender-5 S1. Supports automatic leveling and material breakage detection functions,
となっており、お！？とうとう改善されたのか？と思って喜び勇んでバージョンアップしたものの
結論から言うと**完全な罠**であった。
Z軸のリミットスイッチを使わずに、CR touchのプローブを使うことで高速かつ正確に
原点復帰できるようになったのは良いとして、何故かオートベッドレベリングをやると
CR touchがベッド外でレベリングしようとして失敗する（**ヘッドがベッドにぶち当たる**）
タッチパネル上でやった場合にすら失敗するため、逆に**オートベッドレベリングを使用不可にする**ファームウェアであった。
ヘッドとCR touchのオフセットしくじってませんか？
何を見てヨシって言ったんですか？Creality…。

* G29でノズル温度がリセットされる
G29を実行すると勝手にノズル温度が0になる（ベッド温度はリセットされない）。
このため、**G29の後**にノズル温度を上げないとフィラメントが送られず印刷が始まらない。
個人的には時間削減のためにG29実施中にノズル温度を上げたかったが・・・。
調べてみると、Marlinの機能としてコンパイル時に以下を選択できるようだ。
```
#define PROBING_HEATERS_OFF       // Turn heaters off when probing
#define PROBING_FANS_OFF          // Turn fans off when probing
```
センス時にヒーター電流＆ファン振動により精度が悪化するのを防ぐらしい。
PWMでヒーター駆動してるだろうから、電流がパルス状で、かつ抵抗負荷なもんで物凄くバタバタしてるんだろうな。
しかもその信号と長距離並行配線してるから・・・。残念だが、改善の見込みは薄そうな感じ。

* 勝手にストアされる
G29はS0なんかのオプションを付けない限り本来ストアされず、M500で初めてストアされるはず。
しかし、TeraTermでG29を打つと
echo:Settings Stored
となっており、勝手にストアされているくさい。
STM32F401は100k回書き込めるからまぁ寿命にはそうそう到達しないだろうけども
勝手に書き換えられるので少しイラッとした。

* 連続でCR touchを使うとエラーが発生する
Marlin3DprinterToolで8x8でベッドの傾きを見ようとした際に遭遇。
途中で止まる・・・。謎。

## G-Code開始コード
とりあえず現在は以下の開始コードで運用している。

```
M140 S{material_bed_temperature_layer_0} ; set bed temperature but do not wait
G28 ;Home
G1 Z10 ; bug? not start bed leveling when Z end limit on
M190 S{material_bed_temperature_layer_0} ; block waiting for bed temp
G29 ; bed leveling
M104 S{material_print_temperature_layer_0} ; set nozzle temperature but do not wait
M109 S{material_print_temperature_layer_0} ; block waiting for nozzle temp

G92 E0 ;Reset Extruder
G1 Z2.0 F3000 ;Move Z Axis up
G1 X10.1 Y20 Z0.28 F5000.0 ;Move to start position
G1 X10.1 Y200.0 Z0.28 F1500.0 E15 ;Draw the first line
G1 X10.4 Y200.0 Z0.28 F5000.0 ;Move to side a little
G1 X10.4 Y20 Z0.28 F1500.0 E30 ;Draw the second line
G92 E0 ;Reset Extruder
G1 Z2.0 F3000 ;Move Z Axis up
```
まずM140でベッドの温度を上げつつ並行してG28でホームへ。
G1 Z10でベッドを上げて、その後温度上昇を待つ（ベッドは熱膨張するためベッドレベリング前に温度を上げきる）。
G29でベッドレベリング開始。
M104,M109でノズル温度を上げる。
それ以下はデフォルト。
ばね鋼シートの乗せ方が均一である自信が無く、安心のために印刷ごとに毎回ベッドレベリングやっている。

メーカー的手順では、コンソールでオートベッドレベリングを行い
```
M501 ; Restore Setting
M420 S1 ; Enable bed leveling
```
で呼び出して使うことを想定してるんだと思う。こちらの方が印刷時間が早くなるし。

そろそろ印刷品質と速度の関係についても詰めていきたい。