Klicky

https://github.com/jlas1/Klicky-Probe

Klicky はプローブ(ベッドの高さを測るセンサ)の実装の1つで、誘導プローブを置き換えて使えるような設計になっている。

誘導プローブの変わりにマイクロスイッチを使うのが基本形。誘導プローブは運用温度が案外狭く、温度の影響をうけて不安定になる。ノズルはかなり高温になり、測定対象も高温のベッドとなるので、誘導プローブが溶けたりする問題もある。

ということで物理的な接触スイッチのほうがプローブとして都合が良いが、ノズルよりも下にスイッチがこなければベッドにノズルがあたってしまうという物理的な問題がある。ということでプローブ自体を取り外し可能にしたり、サーボで一時的にスイッチを展開したりしてがんばるほうに発展しているが、そのひとつが Klicky になる。

メリットは温度にあまり関係なくなりプローブが安定することろ。デメリットは設定が難しいところ。

動作のおもしろさ

磁石が電気的接点とドッキング機構・アライメントを兼ねている。

ドッキングできなくてベッドに衝突することはないのか?と思うが、スイッチはノーマリクローズ (プローブがトリガーするとオープンになる) が前提なため、これによってドッキング失敗を検出することができる (プローブがオンにならない高さでプローブがトリガーされているならば、ドッキングされていないと判定できる)

Auto Z Calibration

https://github.com/protoloft/klipper_z_calibration

これもいれるとZオフセットを自動算出するようになる。Klicky によるベッドのプローブと Voron に元々ある Z エンドストップ(ノズルで押してノズル位置を決定できるプローブ)の差分をつかう。

これによりベッドの高さが多少変化してもノズルとベッドの関係(3Dプリントにおいて一番重要)を一定にできる。

ノズルとベッドの関係は最終的には switch_offset という値によって決まる。

Unklicky

Klicky はマイクロスイッチを使うのが基本だが、マイクロスイッチはそもそも精密位置決め向けではなく、そこそこオペレーションポイント(オンになるポイント)がずれる。何度か測定して平均をとったり外れ値を除外したりして対処してソフトウェア的に精度を高めるが、トレードオフとして時間がかかる。

Unklicky は 3D プリントパーツで接触プローブを作るというもので、構造的には精密位置決めに使われるタッチスイッチとよく似ている。おもしろいのはバネなどは使わず、手に入りやすい (そして Klicky でも大量に使う) 6x3mm磁石を採用してるところ。

Unklicky にするとマイクロスイッチのときにあったプローブのやりなおしが劇的に減る。

  1. トップ
  2. tech
  3. Voron2.4 Klicky、Auto Z Calibration、そして Unklicky

Octopus の場合 STOP 用のターミナル (Stop_0~Stop_7) ならどこでも良いっぽい? 一応 PG12 か PG13 が指定らしい。ので Stop_4 = PG12 に繋ぐことに。

BigtreeTech Smart Filament Sensor を使うことにしてみた。この記事の解説が割と詳しい。

BTT SFS の端子は PH (2.0mm) 4PIN。付属ケーブルは XH 3PIN (BTT Octopus とかにはそのままつけられる配線)

XH3PIN な Stop_4 のターミナルを右スカートに延長して外から接続するようにした。フィラメントセンサはなんとなく壊れやすそうなので、あまり中に組みこみたくない。あとで気が変わって単純なスイッチにしたりもできるように。

スマートフィラメントセンサーってなんなのか?

マイクロスイッチとかで単純にフィラメントの有無を検出する方法もあり、こちらのほうがよりシンプルである。ただフィラメントの有無の検知だけなので「フィラメント切れ」は検知できるがより「フィラメントの停止」は検知できない。

スマートフィラメントセンサーはフィラメントの動きを検知する。このため「フィラメントの停止」も検知できる。例えば

  • フィラメントの絡まり
  • エクストルーダの不良(モーターのオーバーヒートやギアのゴミなど)

これらは単純なフィラメント切れよりも重大なトラブルなので、はやめに検知して止められるのはありがたい。

設定

BTT Smart Filament Sensor は Klipper 的には filament_motion_sensor になる。以下のように設定する。

[filament_motion_sensor filament_sensor]
detection_length: 7.0
extruder: extruder
switch_pin: PG12
event_delay: 3.0
pause_delay: 0.5
pause_on_runout: False
runout_gcode:
    {action_respond_info("RUNOUT: Filament runout")}
    {% if printer.idle_timeout.state == "Printing" %}
    PAUSE
    {% endif %}
insert_gcode:
    {action_respond_info("RUNOUT: Filament inserted")}

filament_motion_sensor はフィラメントが動いている場合、該当のピンをon/offするという伝えかたをする。ソフトウェア的には以下のように処理している。

  • extrude しているのに、想定される信号がこなかった場合 runout
    • 具体的には detection_length [mm] 分 extrude しても信号がない場合
  • runout している状態で信号がくれば inserted

filament_switch_sensor と違って、フィラメントが実際にセンサー部分にあるかどうかは判断しないので注意がいる。つまり extrude して runout 状態にならなければ実際にフィラメントを入れても insert_gcode は実行されないし、フィラメントを抜いても extrude されなければ runout_gcode は実行されない。

  1. トップ
  2. tech
  3. Voron 2.4 に BTT Smart Filament Sensor を追加

Raspberry Pi の負荷が高くなると mcu との通信に支障がおこり、最悪プリンタが止まる。なので cron をできるだけ止める

apt

https://blog.turai.work/entry/20191005/1570271926

systemctl stop apt-daily.timer
systemctl disable apt-daily.timer
systemctl stop apt-daily.service
systemctl disable apt-daily.service

/etc/apt/apt.conf.d/02periodicに以下

APT::Periodic::Enable "0";

man-db

raspi で man 見ない

sudo chmod ugo-x /etc/cron.daily/man-db
sudo chmod ugo-x  /etc/cron.weekly/man-db
systemctl stop man-db.timer
systemctl disable man-db.timer

bsdmainutils

calendar -a が動いているが使わない。

sudo chmod ugo-x /etc/cron.daily/bsdmainutils
  1. トップ
  2. tech
  3. Klipper 用の raspiberry pi のカスタマイズ

基本的に Klipper のドキュメントに従うのみ。ただ準備がなかなか面倒くさい

https://www.klipper3d.org/Measuring_Resonances.html

ADXL345 用の SPI コネクタを外だし

ADXL345 は SPI 接続するため、Raspberry Pi の SPI (SPI0) をパネルに出してくるような配線をした。Qi コネクタ 3x2 ピンを使うことにした。

ピン配列は AVR ISP に似たような感じにした。

ケーブル配線

1m のフラットなLANケーブルを切って配線した。以下のペアになるように配線。8P8Cだと1ペア余る。

GND+MISO
3.3V+MOSI
SCLK+CS

Stealthburner への取り付け

Stealthburner は最初から ADXL345 をとりつける治具と場所が用意されているのでそれに従うだけ。

測定

MEASURE_AXES_NOISE からはじめる。全体的に若干ノイズが多いが、特に z 方向のノイズが多い。

Axes noise for xy-axis accelerometer: 138.329734 (x), 93.558179 (y), 339.566789 (z)
Axes noise for xy-axis accelerometer: 138.329734 (x), 93.558179 (y), 339.566789 (z)
Axes noise for xy-axis accelerometer: 109.878052 (x), 98.976760 (y), 286.407229 (z)

で手順通りやってグラフ化したのが以下 (結果 csv を手元にダウンロードして、klipper/scripts/calibrate_shaper.py は手元で実行した)


TUNING_TOWER による共振周波数測定だと、

shaper_freq_x: 53
shaper_freq_y: 72
shaper_type: mzv

だったが、ADXL345 で測定した結果は

shaper_freq_x: 54.8
shaper_type_x: mzv
shaper_freq_y: 41.8
shaper_type_y: mzv

だった。X の周波数は結構近くだったが y がだいぶずれていた (yは複数共振が見られたので TUNING_TOWER だと測定が難しかった)

max_accel は 5100 未満と、あまり高くできなそう。

  1. トップ
  2. tech
  3. Voron 2.4 ADXL345で共振周波数を測定する