そんなに複雑なことをしたいわけではないつもりだが、結果的に若干複雑なので記録しておく。

Notepad-8FX のわかりにくいところ

このミキサに限らないが、どこの信号がどこに入るのかわかりにくい。

USB に関してはドライバを入れると、USB Input 1+2 (ステレオライン入力として認識される) にくる信号をいくつか選べる

  • Mic Input 1+2 (1ch / 2ch がそれぞれ L/R になって入力される)
    • 当然 1ch にだけマイクを繋ぐとLchだけの信号となる。
    • ハイパスフィルタのあと、イコライザやFXの前
  • Stereo Input 3+4 (LINE 3/4 入力)
  • Stereo Input 5+6 (LINE 5/6 入力)
    • トリムの後
  • Mix L+R
    • Master ミックス後・フェーダー前
    • Mic Input はモノラルとしてPANにしたがいL/Rに振られるので、マイク音はL/Rチャンネル両方にくる

USB Out は 7/8ch として Master にミックスされるため、USB 出力を Notepad に設定した場合、Mix L+R はループバックということになる。(この機種はループバックできるできないという情報が混在してるが結論からいえばドライバいれればできる)

AUXとFX

AUXとFXはつまみは共有しているが信号としては独立している。ややこしい。

そもそもAUXとは何か?

  • Master とは別系統のもう1つの auxiliary (補助) 出力
    • モニターなどの用途が想定されている
  • この出力のミックスレベルは各チャンネルの AUX/FX つまみで決まる
  • AUX出力にはFXはかからない

FXは何か?

  • 内蔵エフェクト(リバーブなど)
  • 各チャンネルのAUX/FXで送る量を決められる
  • 効果のパラメータを PARAMETER つまみで決められる (全ch共通)
  • FXを通った結果は Master へミックスされる
    • 元の信号のMasterボリュームがゼロでないなら、元の信号に追加でミックスされる

FXの利用とAUXの利用は排他と考えたほうがすっきりする。というか、FXを使う場合、AUX 出力は FX を通る前の信号のモニタリングという用途に限定される。

ループバックしつつ、デスクトップ音量をコントロールする

自分はデスクトップ音とマイクのモニター音を常に聞くが、マイク入力には基本的にはマイク音しか入れない。ということをしたい場合、2通りの方法がある

  1. USB Input 1+2 を Mic Input 1+2 にし、Master mix を聞く
    • シンプルだがマイク入力しか入れることができない
    • マイク入力もミキサ上のイコライザを通した音にはならない
  2. USB Input 1+2 を Mix LR にし、AUX を聞く
    • イコライザなどミキサ上の設定が反映される
    • デスクトップ音のループバックができる
    • 他のチャンネルに入力した信号もコントロールして USB 入力にできる

後者のほうが自由度が高いので後者で考える。

やりたいこと

一旦 Mic1 + USB Out だけを考える。(Mic 2, LINE 3/4, LINE 5/6 は使わない)

ヘッドフォンOUTにヘッドフォンを接続して

  • マイク(1ch)をモニター
  • デスクトップ音(7/8ch)をモニター

かつ、USB 入力としては

  • マイク(1ch)を入れる
  • デスクトップ音(7/8ch)は入れない (というよりコントローラブルにする)

としたい。

この場合出力したいミックス系統がUSB入力音とモニター音とで2つあるため、Master 出力と AUX 出力を使うことになる。USB 入力できるのは Master 出力なため、AUX がモニター音になる。

運用方法

USB Input 1+2 を Mix L+R (ループバック) にしつつ、Notepad 側で 7/8ch の Master Level を調整する。

1ch と 7/8ch を AUX に送るようにする。

MASTER/AUX スイッチでヘッドフォンOUTに出力される音を MASTER と AUX で切り替えられる。つまりデスクトップ音を入れたマイク音と、実際にPCに入力されているマイク音を切り替えられる。

Master のフェーダーはUSB入力には影響しないので基本的に使わない。がPC側の入力ゲインとLEDの点灯が近いようにゲイン調整するとミキサ側で状態がわかりやすい。

問題点: FXは使えない。FX に送る信号量は前述の通り AUX ノブと共通なので、デスクトップ音を AUX に送っていると FX をオンにしたとき Master に FX 経由の音が漏れてきてしまう。

あとPC側でモニタ音を入れてはいけない。

ゲイン調整

マイクゲインが一番融通きかないのでここからはじめる。イコライザを中点にし、100Hzのハイパスフィルタを入れてゲインを3時ぐらいまで上げる。

イコライザは下から12kHz shelf, 2kHz bell, 80Hz shelf。

  1. トップ
  2. tech
  3. Notepad-8FX の運用方法メモ

最近のノートPCは「モダンスタンバイ」あるいは「スタンバイ (S0低電力)」という、CPU はS0(非スリープ)だが低消費電力で動き続けるという仕様になっている。これに伴ってか、スリープから時間が経過すると休止(ハイバネート)状態になるハイブリッドスリープをユーザ側でオフにできないらしい。

がいろいろ試した結果この挙動をある程度制御できることがわかった。

powercfg

コントロールパネルの電源オプションはコマンドラインからだと powercfg というコマンドで設定できる。上の画像はデスクトップPCの電源オプションで、「次の時間が経過後休止状態にする」という項目が表示されているが、ノートPCだと表示されないことがある。

powercfg で設定状況をすべて表示するには以下のようにする。

powercfg /q

HIBERNATEIDLE

休止状態に入るまでの時間は HIBERNATEIDLEという項目に設定されている。

単位秒 0x12c (300) がDC電源だとデフォルトだった。AC電源だと0で、休止に入らない設定になっていた。

48時間に設定する

powercfg -setdcvalueindex  381b4222-f694-41f0-9685-ff5bb260df2e 238c9fa8-0aad-41ed-83f4-97be242c8f20 9d7815a6-7ee4-497e-8888-515a05f02364 172800

デフォルトに戻す場合 (5分で休止)

powercfg -setdcvalueindex  381b4222-f694-41f0-9685-ff5bb260df2e 238c9fa8-0aad-41ed-83f4-97be242c8f20 9d7815a6-7ee4-497e-8888-515a05f02364 300

この設定をしていても、バッテリー残量が規定量減ると別途休止に入る制御が入っているようだが、ここからは特に設定が見えないのでよくわからない。

  1. トップ
  2. tech
  3. モダンスタンバイ環境のハイブリッドスリープを制御する

3Dプリンタでロータリーエンコーダやボリュームのノブをプリントする場合、プレスフィット設計だとうまくいかないことが多くて面倒くさい。確実に固定したい場合、ヒートセットナットを埋めてセットスクリューで固定するのが楽。

https://www.thingiverse.com/thing:6194

これを使うと楽そう。特にヒートセットナット専用のものではない。

setscrew_dia = setscrew_nut_w = 3.9 や 4.2 (ヒートセットの下穴経) をいれ、setscrew_nut_t = 0 にする。これで丸穴になるので、あとは好きなように形を設定する。

  1. トップ
  2. tech
  3. ヒートセットナットを使うノブ

FORMBOT のセットを買ってみた (先にいっておくとおすすめしない)。Aliexpress だとエクストルーダーの種類が選べないことに気付いたので、FORMBOT 公式サイトから PayPal で購入した。Dragon Hotend Standard Flow にした。

届いたセットに Z motor が含まれておらず、お問合せ。30分ぐらいで返信がきて対応は早かったが、さすがに届くのに1週間ぐらいはかかった…… (本体はUPSだったがZモーターはCNEで発送された)

1515 押し出し

A/B と H/C は端のM3タップの有無だけなので、セットのものはすべてタップが切ってあった。後述するけど、このタップがひどかった。

F/G は穴の有無だけなので同一のものが3つ入っていた。ベッドフレームだが、今回これらは使わない。

Kirigami mod

Kirigami mod というベッドのマウントをアルミ押し出しではなく板金にするmodがあるのだがこれも同時に注文した。鉄だと思ったが FORMBOT のものは磁石にくっつかず軽いのでアルミっぽい。

ベッドマウントがデフォルトのアルミ押し出しで何がダメか?

  • 剛性が低い
    • 伸びている2本の押し出しは blind joint ネジで止めてるにすぎない
  • ネジの増し締めがしにくい
    • 組立後にアクセスできない位置にネジがある
    • 3Dプリンタのねじはネジロックしない限り確実に緩むので厳しい

これらを解決するのが1枚板から折り曲げた Kirigami mod になる。

1515アルミ押し出しのタップ問題

端の穴にM3のタップが切ってある。トルクをかけなければ10mmのビスは最後まで入るので、一見問題なさそうだが、実はこの時点でかなりグラグラ。トルクをかけて締めることができなかった。下穴径がかなり大きいのだろう…… 不良品といえる。一応タップは切ってあるので、クレームいれてどうにかなるか面倒なため自分でなんとかすることにした。

Voron 2.4 の 2020 押し出しはクオリティ良かったが今回の 1515 は表面処理からして微妙な感じ。おそらく供給元が違うのだろう。Aliexpress で Voron 0.1 の 1515 だけのセットとかを見ていると「タップ穴がちゃんとしてます!」みたいな主張をしているショップがあるので「あるある」っぽい。

ということでこのネジ穴で「固定」することはできない。ほんの仮固定ぐらいが精々。

ネジ穴を埋めてタップを切りなおすとか、いろいろ考えてみたが強度的に安定させたかったので、アングルでスロットから固定することにした。追加のM3ナットを入れておく必要があったり、ほかのパーツと干渉しないか考える必要があるが、3D CAD を見ながら配置を決めた。

Z軸上側はA/Bドライブによってスロット同士も直角に固定されるが、下側は固定されないので、ここをサポートするアングルを追加。


あとは左右のフレームの上下前後四隅、及び全面フレームの下をアングルで固定した。右フレームの上の前側は Klicky をつけたかったため、Klicky のマウントとアングルを合体させたみたいなものをプリントした。

Mini Afterburner

なかなか組み立てが難しいツールヘッドみたいだし実際苦労した。組み立てが大変なのはともかく、エクストルーダー部分の設計がなんか微妙な感じがする。アイドラーのストッパ的なものがなくギアが全力で当たっていてよくない感じがする。

検索してみるとやはりエクストルーダー部分に不満がある人が結構いて、Mini-AfterSherpaというエクストルーダー部分をモジュール化する mod が出ていたりする。そしてこれの Kilicky 対応版まである。

Sherpa Mini は Mini Afterburner とほぼ部品共通で作りやすいかな?3mm シャフトだけ追加で必要

とりあえずは Mini Afterburner を使うことにする。ただ、アイドラー圧だけ気になるので、M2 のビスをアイドラーにねじこみ、圧を調整できるようにはした。

M3 Tナット


https://github.com/VoronDesign/VoronUsers/tree/master/printer_mods/Zen3D/V0_1515_T-nut

M3 ナットをそのまま T スロットに入れると重力に従ってあっちこっちいってしまうので、このTナット化するモデルをプリントして使った。これは本当によかった。

ただナット幅が増えるため、ハンドルの受け側の磁石を埋めるパーツだけはうまく固定できず、1本のビスで止めることになる。特に力がかかるところではないので、あんまり問題ない。

ケーブルチェーン

7x7mmのケーブルチェーンにJST 2ピンコネクタは通らないので、先にケーブルを通してからコネクタをつけないといけない。(圧着端子自体はもちろん通るので、つけてしまったら、一旦ハウジングから外すということ)

ついてきたケーブルチェーンは若干長かったため、数個リンクを外す必要があった。前述の通り、コネクタはチェーンを通らないので、先に調整しなければならない。めんどくさかった。

SKR Mini E3 V3

SKR Mini E3 V3.0 Pin 回路図

0.1 のマニュアルのマザーボードは SKR Mini E3 V2 なので、V3 だと微妙にというか結構違うので気をつけて配線しないといけない。

  • 24V入力端子は1つになっており入力方向が変わっている
  • ファン端子が1つ増えている
  • I/O 端子が増えている
  • SPI ヘッダの端子が増えておりピンアウトが変わっている

など。

ref. SKR Mini E3 V2.0 Pin

設定

デフォルトの設定だとベッドの max_power は設定されていない。ヒーターは24V 60W。120x120mm だと 144cm^2 なので、Rule of thumb is 0.4 watts / cm^2 に従うなら57.6Wぐらいが適切。60W で温めてもいいということだろう。

A/B モータの接続がマニュアル通りだと逆だった。なんでかはよくわからない。

X/Y/Z エンドストップの物理的な調整と position_endstop の調整。120x120x120 の印刷範囲があるが、これはベッドのサイズであると同時に、ツールヘッドの移動可能範囲と一緒なのでギリギリの設定をしっかり詰めてしないと物理的なリミットにあたってステップが飛んでしまう。

X/Y はレバー式のマイクロスイッチなので、 position_endstop は 119 ぐらいにして1mmほど余計に押せるように調整しとくと良さそう。

Zは調整が難しい。kirigami のせいかマニュアルのビス長だと短くてエンドストップにあたらなかった。長いのに交換して調整した。が初回プリントで使っただけで、後述する Klicky による仮想Zエンドストップを使っており、もともとのZエンドストップは使っていない。

V0-Umbilical

https://github.com/VoronDesign/Voron-Hardware/tree/master/V0-Umbilical/Software

FORMBOT のキットにはツールヘッドPCB及びマザーボード側のPCBのセットが同梱されていた。chamber temp のサーミスタもついている。

ただ chamber temp 用の配線ケーブルは入ってなかったので、自分で用意する必要がある。前述の通りだが V2 と V3 で SPI ヘッダのピンアウトが変わっているので気をつけて配線する。MISO が 10kΩのプルアップなのは変わってないのでソフトウェアの設定はそのままでいい。

Klicky プローブ

Voron 0.1 のデフォルト設計ではプローブを組みこむようにできていない。しかしどう考えてもプローブはあったほうがよいので、最初から Klicky を組みこむことを前提に作りはじめていた。Mini Afterburner も Klicky をマウントをつけれるタイプを使った。

SKR Mini E3 では BLTouch 用のヘッダの端2ピンが Probe (PC14) になっている。XH コネクタ2ピンのロック部分を切り飛ばしてはしっこだけ入れている。というのもこのヘッダからホットエンドファンにも接続する必要があるため。

なおこのプローブを仮想Zエンドストップにしてる。

Klicky (というか Probe の) メリットとしては

  • SCREWS_TILT_CALCULATE が使える。(紙を使う職人芸なしにベッドを水平にできる)
  • Zエンドストップの変わりになる (調整・設定項目がすくなくなる)
    • 0.1 は 2.4 みたいにノズルで押すエンドストップじゃないので、Zエンドストップを使うメリットがない

プローブ側は Unklicky にした。ロングタイプの Unklicky はバネ用の磁石を別につけるのだが、これがツールヘッドの磁石とくっついてガタガタいうので鬱陶しかった。機能的には問題なかったものの、0.2mm のスチールシートを切って貼ったらいい感じになった。

まあでも普通のKlickyでよかったかな…… Unklickyはsafe zがどうしても高くなるのでコンパクト感がない。

サーボで出てくるブラシ

https://www.printables.com/model/181785-voron-v01-nozzle-brush これをつけることにした。MG90S を使う。似たような小型サーボがいくつかあるが微妙に寸法が違うので MG90S しかフィットしない。

NeoPixel ヘッダから電源および制御をとるようにと書いてあるが、自分はそこは使わず、SPI の 5V / GND と I/O の PD0 に接続するようにした。

ブラシだけではなくパージバケツも欲しかったのでモデリングして追加した。

フロントディスプレイ+エンコーダー

https://www.printables.com/model/341330-voron-01-front-skirt-with-display

手持ちの I2C OLED とロータリーエンコーダを全面に取り付けた。どちらも SKR E3 ではなく Raspberry Pi 側に接続している。

Raspberry Pi 側に接続することで、systemd の起動/終了時にOLEDに簡単な文字を出すような制御をすることができる。

ノズル高さの調整の覚書

Klicky + 仮想Zエンドストップの場合、Probe Offset のキャリブレーションになる (Z Endstop キャリブレーションではない)。

  1. SCREWS_TILT_CALCULATE MAX_DEVIATION=0.025 でベッドのスクリューを調整して水平にする
    • 表示される hh:mm 表記は時計の時間表記でどのぐらい回せばいいかを表示している。00:10 なら10分にあたる角度を調整する。
    • CW/CCW はベッド上から見た方向
  2. ベッド中央で PROBE_CALIBRATE して高さを決定する。ここは紙を使う

ベッドメッシュすべきか

このサイズでこの厚さのベッドだと、ベッドメッシュは不要なのだが、Zホーミングはプローブと違い複数回サンプルをとって外れ値を除外するということができないため、Z原点の精度が信頼できない。これを補正するためにベッドメッシュをしている。ベッドメッシュは最低でも3x3はしなければならない。

Probe して結果をそのまま Z_OFFSET にぶちこむようなコードを書けばすみそうだが面倒なのでベッドメッシュしているという感じ。

トップハットのパネル厚さが厚い

どうやら0.5mmほど設計よりも厚いパネルのようで、うまく組み立てられなかった。Lower Corner Clip を少し修正するといい感じになった。

トップハットは全体的に若干高さを上げつつヒンジを追加する変更を入れて使っている。https://www.printables.com/model/109713-voron-v01-tophat-spacer-with-hinges

エレクトロニクスファンの追加

https://www.printables.com/model/345341-voron-01-splitted-backpanel-with-fan

Voron 0.1 は Raspberry Pi やコントローラーボードの排熱が考慮されておらず、排熱の行き場がないためプリント中は室温25℃程度でも、Raspberry Pi で60℃以上になってしまう。同じスペースにA/Bモーターもあるので、夏場は耐えられないのではと思いエアフローをつくることにした。

SKR E3 のファン端子はFETのローサイドスイッチになっているので、別途電源を供給しつつ - 側だけ配線することで任意の電圧をスイッチできるようになっている。実際 Voron 0.1 の設計上のホットエンドファンは 5V であり、この方法で制御するようになっている。

なので 12V ファンに 5V を供給し、GND は FAN2 の GND に接続するようにした。電圧的に速度調整はできないが、オンオフはできる

感想

Voron 2.4 は割とすんなり組み立てられたが、Voron 0.1 はかなりいろいろ手を加える必要があった。

上に細かく書いてないがX/Yジョイントがいまいちで固定しようとするとスムーズに動かなくて苦労したりもした (シムを入れて解決)し、トップハットは印刷しなおしたりもしている。

ただ小さくて可愛いし、高加速度設定にできるし、小さいぶんウォームアップタイプも早いので、小さいパーツを作るには良い感じがしている。

  1. トップ
  2. tech
  3. Voron 0.1 を組み立てた

ボード組み込みで8個まで、BIGTREETECH DCDC5V V1.0 module をつけて30個までらしい。ref. https://biqu.equipment/products/bigtreetech-dcdc5v-v1-0-power-module-5v-for-skr-mini-e3-v1-2-skr-mini-e3-v3-0-32bit-control-board-rgb-light

オンボードはMP1584ENによるスイッチングの最大5V 3A だが、この 5V は MCU の 3.3V への供給 (AS1117 800mA シリーズレギュレータ) にも使われ、1.1Aのヒューズがついている。NeoPixel は1つあたり約50mAだから400mAぐらいがRGB LEDで使える限度ということっぽい。基本的に、RGB LED をつけるなら、5V の外部電源が必要と思ったほうが良い。

Voron 0.1 の場合、5V 10AのDC/DCコンバータは既についているので、NeoPixel はこちらから電源をとったほうが良い。ただ、SKR Mini E3 V3 は 5V モジュールをとりつける用のピンヘッダがついており、ここに接続してやれば NeoPixel ヘッダをいじらずに 5V の供給元を変えることができる。

本来この「外部電源」というのは「BIGTREETECH DCDC5V V1.0 module」のことを差していて、POWER 近くの Vin から Vout を繋ぐような基板になっている。

Neo-PWR1 がオンボードの 5V レギュレータと外部電源を切り替えるジャンパになっている。そのすぐ隣に Vout というピンヘッダがたっているが、これが外部電源の接続口になっている。

  1. トップ
  2. tech
  3. SKR Mini E3 V3 の NeoPixel ピンの最大数

  • ノズル 245℃
  • ベッド 100℃
  • エンクロージャ (40~50℃)

この条件でも場合によっては反って剥れてくる。厚みがでるにつれて (25~30レイヤー)すぐ浮いてくるので形状と加工時間どちらも気にしたほうがいい。

ブリム

  • 原則 5mm のブリム

ブリムの効果は絶大で、5mm 程度でほぼ剥れてこなくなる。1layer目に追加の出力をするだけなので追加のコストは最低限といえる。欠点は外すのが面倒くさく、うまくやらないと後が汚くなってしまうところと、印刷可能最大サイズが減るところ。

原則的に ABS はブリム必須と考えたほうが良い。長辺10mm以下だったりある程度までの大きさの円形なら例外的にブリム不要にできるが特殊な例になる。

複数オブジェクトある場合、ブリムが重なるように、3mm 程度の間隔で配置する。

ただし非常に大きいオブジェクトの場合、ブリムをつけても負けて剥れてくることがある。なので

  • 長辺 150mm以上の場合ブリム10mm

とする。

反り

ブリムをつけても印刷中に剥れてこなくなるというだけで、反り自体は起こる。アスペクト比が極端だと外したあとに盛大に変形することがある。どうしようもない。

  1. トップ
  2. tech
  3. ABS 3Dプリントの条件

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で共振周波数を測定する

デフォルトでプライベートIPアドレスを許可するようなLAN内向けのアプリケーションがあったりする。つまり192.168.0.13 とかでアクセスする分には特に設定せず問題なく繋がるというもの。

IP アドレスを調べる手間をはぶくため、mDNS 対応していて、voron2.local というホスト名でアクセスできるようになっているとする。この場合、このホスト名でアクセスするときだけうまくアプリケーションが動かないという挙動をすることがある。

mDNS で voron2.local などとアクセスした場合、解決されるアドレスは環境によって IPv4 だったり IPv6 だったりになる。IPv4 で解決されるなら 192.168.0.13 などでアクセスしたことと同じで、問題ない。

問題は IPv6 かつ、しっかりグローバルIPアドレスを持っている場合で、アプリケーションはグローバルIPアドレスからのアクセスをデフォルトで許可するわけにはいかないので拒否される。

この件でやっかいなのは、アプリケーション自体はデュアルスタックで IPv6 対応しているが、IPアドレスベースのアクセス制限をかけているというところで、アクセス制限をかけてない部分には問題なくアクセスできる。

これは localhost と書くと IPv6 対応したときに死ぬことがあると同種の問題といえる。ホスト名はデュアルスタック環境だとどちらに解決されるか環境依存なので、IPv6 環境になり、特に今回の場合はグローバルアドレスが付与されているという条件付きでうまく動作しない環境ができあがる。

正攻法

IPv6 の Link local アドレスならデフォルトで許可しやすいので、mDNS でこのアドレスをひければ一番良いが、avahi でそのような設定を行うことは不可能なようだ (mDNS の仕様的にできないっぽい?)。

または自分と同じ IPv6 prefix を持つなら許可するみたいな動的なアクセス制御を行うようにすればいいがこれは実装が必要になる。

あるいは明示的に現在持っている IPv6 prefix を許可するようにする。が prefix がいつ変化するかよくわからないのでやりたくない。

IPv6 を無効にする

あまりやりたくはないが mDNS 時に利便性が悪 すぎるので、今回は該当機の IPv6 を無効にすることにした。

以下を /etc/sysctl.conf に書く。

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

これで aaaa が解決できなくなる。

dig aaaa voron2.local
  1. トップ
  2. tech
  3. mDNS と IPv6 とアクセス制限

プリント中に一部のオブジェクトだけ反って浮いてきてしまった場合やベッドから外れてしまった場合などに、該当するオブジェクトだけスキップして他のを完成させることができる。

スライサ・ユーザインターフェイス・G-code 実行器でそれぞれやることがあり、協調しないと実現しないので、なかなか難しい機能といえる。

Mainsail のドキュメント https://docs.mainsail.xyz/features/exclude_objects に従えばほぼ良いが、事前処理についてはスライサで完結させたほうが良い。

スライサの設定

スライサ側の設定「オブジェクトに名前をつける」をオンにし、G-code の生成後に preprocess_cancellationを通すようにする。

preprocess_cancellation 自体は moonraker (mainsail のバックエンド) へ enable_object_processing を設定することでも同様のことができるが、この設定はかなり重いようなので手元で処理してしまったほうが良さそう。G-code からオブジェクトの領域を算出しているようで、ちゃんとした CPU の手元でやってももそこそこ遅い。

どうなるか

キャンセルボタンが拡張され、一部のオブジェクトだけキャンセルできるようなUIが追加される。

  1. トップ
  2. tech
  3. 3Dプリンタの Object Cancellation (Klipper + Mainsail)

原則として、オーバーヒートしない限りできるだけたくさん電流を流すほうが安定する (トルクが高い)。

手元の Voron 2.4 の ABZ のモーターは Ralted Current 2A となっている。

RMS電流の最大は 0.707 をかけて 1.414A、ただし TMC2209 の最大電流が1.2Aなのでそっちで最大がきまる。

デフォルトは0.8Aになっていた。Zモーターは外に出ていて4つで重量を分けあってるが、A/B モーターは庫内でかなり加熱するのでちょっとこわい。

TMC2209 のリミットにあてるのも恐いので、とりあえず 1.0A にすることにした。→ 長時間やったあとサーモカメラでA/Bモーターの温度を見たところ60℃いかないぐらいだったので 1.1A に増やした。→音がやたらうるさくなったと感じたので1.0Aに戻した

ステッピングモータの熱

スペック上130℃の絶縁階級(B種)となっている。これは絶対最大定格にあたるので内部がこれを超えることがあってはいけない。

だいたい目安としてはケースで100℃ぐらいまで。触れないレベルで熱いのは危険。

ref. https://docs.vorondesign.com/community/howto/120decibell/calculating_driver_current.html

  1. トップ
  2. tech
  3. 3Dプリンタのステッピングモーターの電流 (run_current)

デフォルトで設定されているメニュー を完全に無効化して設定しなおす方法

デフォルトのメニューは type: disabled にすると部分的に無効化できるが、順番を変えるのが index を指定したりでめんどうさい。

以下のように display セクションで menu_root を指定してやると、自分で好きなように定義できる。

[display]
menu_root: __main0

[menu __main0]
type: list
name: Main

...
  1. トップ
  2. tech
  3. Klipper のメニューを完全にカスタマイズする

DS18B20 デジタル温度センサが便利。1-wire で複数のデバイスを同時に扱える。Klipper も対応している。

Raspberry Pi の場合 1-wire を有効にして GPIO4 (PIN7) に信号線を接続する。3.3Vから 4.7kΩ (信号線の長さで調整する)) でプルアップする。

  • 庫内温度(上) フレームあたり
  • 庫内温度(下) 高さはベッド付近
  • 室温(ファン近く)

あたりをモニタリングする。庫内温度は上と下で10℃ぐらい差があるのでどっちも見たい。

Raspberry Pi 上で

以下のように見える。22312 は1000倍した℃なのでこの場合は22.3℃

$ ls /sys/bus/w1/devices/
28-03039794629e  28-0306979425a5  28-030f979445fd  w1_bus_master1

$ cat /sys/bus/w1/devices/28-03039794629e/w1_slave
65 01 55 05 7f a5 a5 66 c5 : crc=c5 YES
65 01 55 05 7f a5 a5 66 c5 t=22312

Klipper での設定

以下のように設定する。

[temperature_sensor temp1]
sensor_type: DS18B20
serial_no: 28-03039794629e
sensor_mcu: host_mcu
min_temp: 0
max_temp: 100

ただし、以下のように host_mcu が定義されていないとエラーになる。

Unknown config object 'mcu host_mcu'

rpi 自身をセカンダリーmcuとしてセットアップする必要がある

上記ページの指示に従って host_mcu のサービスを起動する。そして printer.cfg に設定を追加する

[mcu host_mcu]
serial: /tmp/klipper_host_mcu

これで動くようになる

1-wire

しょうがないけど 1-wire は遅い。

OS起動直後、なんらかの原因で一部の 1-wire デバイスと通信できずに serial_no が認識されないと Klipper が起動に失敗する。

また 1-wire の通信に失敗すると Kilipper がエラーを吐いて止まることがある (1度あった)。のであまり大量に繋げたりしないほうが安全そう。念のためフェライトコアを噛ませている。

  1. トップ
  2. tech
  3. Voron 2.4 に温度センサーを追加

立方体とかをプリントすると角が膨らんでいることに気付くと思う。こういうのをできるだけなくすのが Pressure Advance 機能になる。

https://note.com/eitoku_note/n/n78f0d240940a このマクロをつかわせてもらう。

一番下は現在の設定値なので、その次のラインから console に表示されている値と突きあわせて見ていくのが早い。今回は 0.03 が適切だった。

  1. トップ
  2. tech
  3. Klipper Pressure Advance の調整

Klipper はなるべく早く起動して、ディプレイに起動してますよというアピールをしてほしい。しかしいろいろ設定した printer.cfg だと、なるはやで起動というのが難しいことがある。例えば 1-wire のデバイスを設定していると、1-wire のデバイスが OS に認識されるまで klipper を起動できなくなってしまう (さもなくばエラーになる)

ということで、最小限の cfg を作って最小限の gcode を実行してすぐ終了するようなことを OS 起動初期にやりたい。

Klipper batch モード

klippy.py に -i で gcode 入力ファイルを渡すとそのファイルだけ実行して終了してくれる。これをバッチモードという。

mcu のファームウェアを make したときにできる out/klipper.dict が必要になる。これは形式的にはJSONファイルで、mcu との通信プロトコルの規約が入っている。

以下のように cfg と gcode と dict を渡すと gcode の実行をして終了する。

/home/pi/klippy-env/bin/python /home/pi/klipper/klippy/klippy.py /home/pi/klipper_config/bootstrap.cfg -i /home/pi/klipper_config/bootstrap.gcode -d /home/pi/klipper/out/mcu_klipper.dict

systemd のサービス化

以下のようにする。なるはやで起動してさっさと終了してほしい意図がある。もっといい方法があるかもだけどとりあえずうまくいっている。

$ cat /etc/systemd/system/klipper_bootstrap.service
#Systemd Klipper Service

[Unit]
Description=Bootstrap klipper
Before=klipper.service
Wants=udev.target

[Install]
WantedBy=multi-user.target

[Service]
Type=oneshot
User=pi
RemainAfterExit=yes
ExecStart= /home/pi/klippy-env/bin/python /home/pi/klipper/klippy/klippy.py /home/pi/klipper_config/bootstrap.cfg -i /home/pi/klipper_config/bootstrap.gcode -d /home/pi/klipper/out/mcu_klipper.dict
systemctl enable klipper_bootstrap.service

備考

shutdown 時も同様のことをしたいが、batch モードではない klipper が終了するときに mcu を shutdown 状態 (estop) にしてしまいうまくいかない。batch モードではこの shutdown 状態を解除する方法がおそらくない (FIRMWARE_RESTART する前にエラーで死んでしまう)

良い方法

一番良いのは Klipper を経由せずに (Rapsberry Pi の GPIO で) 起動状態を示す LED などを外出しすること。

  1. トップ
  2. tech
  3. Klipper でOS起動時に oneshot gcode を実行する。

Octopus の基板上の RGBヘッダは Stealthburner が使うので、さらにストリップを追加しようと思うとなかなかピンが見当らない。BLTouch のところがあいてるなら使える。(PB6)


片側15個、合計30個の NeoPixel ストリップを固定した。

LED Strip Holder for Voron 2.4 の 250mm を2つ。上の左右フレームの内側にとりつけた。ついでに diffuser もつけている

  1. トップ
  2. tech
  3. Voron 2.4 + Octopus で NeoPixel ストリップの追加

CoreXY な駆動方式の3Dプリンタには元々興味があって、とはいえ現状の Original Prusa i3 2.5 でそれほど問題もなかったのだが、Voron 2.4 という3Dプリンタを知り、なんかわからんが格好がいいので急に作ってみたくなった。

ハードウェア

3Dプリントパーツ以外をセットにして売ってるところがいくつかある。今回は FORMBOT の Aliexpress から買ってみた。UPS で結構届くのがはやかった。

Voron 2.4 はデフォルトでは Afterburner という名前がついたエクストルーダだが、実は Stealthburner という新しいバージョンがでており、新規で作るならこちらを作ったほうがよい。パーツに一部非互換があるので別途部品を買う必要がある。

届いたセット




exhaustまわり、操作画面部まわり、エンドストップ、Afterburner 相当のインジェクションモールドのプラパーツが「オマケ」でついてきた。ほぼプリント済みだったが Afterburner はまるっとプリントせずにいたので、とりあえず動かすことができそうでありがたい。

このプラパーツは機能的にはオリジナル同様だが細部が違う。インジェクションモールドでは袋状のものは作れないので2パーツ貼りあわせる必要があったりする。

Raspberry Pi は付属しないが SD カードは SunDisk の A1 のちゃんとしたのがついていた。パチもんではなくちゃんと製品登録もできた。

3Dプリントパーツ

Voron は基本的に全てのパーツを ABS (104℃ぐらいで軟化する) で出力することとしている。局所的に温度が高くなることがあるので PETG (84℃ぐらいで軟化する) も推奨されていないようだ。(Original Prusa はホットエンドダクト以外は PETG になっており ABS 出力も今のところ問題ないが……)

PETG は非常にプリントしやすいため、できれば PETG でやりたかったが、ここで不安を残すのも精神に良くないので ABS との和解を試みてすべて ABS で出力することにした。


だいぶ前に Original Prusa i3 にかぶせていたエンクロージャはABSをプリントしないこととなかなか邪魔なこともあって捨ててしまったので、一時的にということでダンボールで箱をつくった。これで内部は40~50℃ぐらいになる。

ABS はとにかくあらゆる部分が反るので嫌なのだがこのぐらいの温度なら割とマシになる。とはいえ接着性が低いのでベッドとノズルの調整がよりシビアだったり、パーツ形状によっては一時的に反った部分ができてノズルにあたるので気を使う。

出力するパーツ数は結構多い (Prusa が 3D プリント部品を最小限にしているのと対照的)し、大きいものが多い。動作に必須な部品だけでも3~4日かかる。全部プリントするには一週間以上かかると思ったほうが良い。パーツを注文しても全部届くまで1ヶ月ぐらいかかるだろうからのんびりやって良い。

リニアレールの潤滑

IPA(無水エタノールでもいいけど高いので…)と柔らかめのグリスが必要。この手順でやった。グリスはSuper Lube 21030というNLGI(ちょう度) 2 で PTFE系のプラスチックに安全なやつ。

グリスポートがあればグリスポートから注射器で注入するのが正しいようだが、安いリニアレールでは見せ掛けのグリスポートで中に入っていかない場合があるようだ。

組立

マニュアルがよくできていて迷うところはほぼない。Gantry の組み立てまわりはマニュアルだけだと完璧にできないと思うので YouTube とかを見るべき。

あとはA/Bベルトを通すのが以下の点でなかなか困難

  • 長い (250mmモデル なら 1600mm のベルト)
  • 2本ある
  • 全体的に狭い
  • 複雑 (特にモータ付近)
  • アイドラー通すのが激むずい

デッキサポート

https://github.com/VoronDesign/Voron-Trident/issues/65

Voron 2.4 のマニュアルにはデッキサポートが抜けてる。使いかたは Trident のドキュメントを見るとわかる。あとからだとやりにくいので罠

配線


あまり気にしてなかったが部品セットには配線も含まれており、これがとてもよくできていた。すべてのコネクタが圧着済みかつ長さも適切なので、デフォルト設計なら何も考えずに組み立てできる。

WAGO の接続端子が複数ついており、配線部分でははんだ付けをする必要がなかった (マニュアルの5端子WAGOコネクタに加えてヒーター接続用と思われるの2端子WAGOコネクタもついていた)。

ソフトウェア

Klipper

制御は Klipper という3Dプリンタ向けファームウェアを使うのが一般的のようだ。

Klipper は Raspberry Pi で動く Python のコードと、コントローラーボードに書きこむファームウェアからなる。gcode の解釈や補正など計算負荷が高いことは Raspberry Pi 上で行ない、コントローラボードはIOの制御だけをする。LinuxCNC と同じようなイメージ。

そして Klipper は既存の3Dプリンタのシリアルポートでの通信をエミュレートするようなインターフェイスになっている (/tmp/printer)。つまり Klipper 自体は gcode (など) を受けとってデバイスを制御するだけの役割を持つ。

UI はこのシリアルポートを利用できるものならなんでも使える。Voron のドキュメントではMainsail, Fluidd, Octoprint が列挙されている。

mainsail

Rasbperry Pi 3 B に Mainsail のイメージを書きこんで使うことにした。Mainsail は Raspberry Pi Imager のメニューに入ってるので気楽。Mainsail は Klipper のインターフェイスとなるソフトウェア。イメージを書きこめば GUI なしで、ウェブインターフェイスが勝手に起動するようにセットアップされている。

より正確にいうと Klipper とやりとりしているのは Moonraker という Klipper のウェブAPIフロントエンドで、Mainsail はそのクライアント実装といえる。

初期スタートアップ

Stealthburner 用の部品が届く前に本体の部品が一通りきてしまったので、とりあえず Afterburner を乗せて組み立てて動作確認をした。

テンプレートの printer.cfgからたくさん書きかえていく。最低限の設定をしたあと、G-code で動かしつつ調整する。

とりあえずステッピングモーターの方向がすべて逆だったので dir を反転した。

ベッドの max_power が 0.6 になっている。Rule of thumb is 0.4 watts / cm^2 と書いてある (経験則では 0.4W/cm^2 ぐらいが適切)。250x250mm なら 625cm^2 なので、250Wぐらいが適切。300Wヒーターなため、0.83 に設定する。

なんで最大パワーを出さないかというと、ヒーターは中央を加熱するため熱伝導が十分されていないとベッドが歪んでしまうからで、早く加熱してもメリットがないということのようだ。

なおヒーターは100V AC商用電源を SSR で PWM 制御する設計になってる。

Stealthburner 化

結局 Afterburner をつけて動作確認しているうちにすぐ部品が届いてしまったので、一度もホットエンドにフィラメントを通すことなく Stealthburner に換装した。

Afterburner と Stealthburner だと NeoPixel LED 用の配線が増えている。このことはわかっていたので、Afterburner をつけて組み立てる時点で1セット配線を追加しておいた。

X-carriage にも互換性がないのでA/Bベルトも外す必要があった。思ったより苦労はしなかった。

Stealthburner は gear_ratio: 50:10 なので printer.cfg を直す必要がある。NeoPixel はとりあえず Voron 公式の stealthburner_leds.cfg を使った。

そしていろいろ調整して一発目のプリントはとりあえず成功。角がちょっと膨らむのは Pressure Advance というので調整していくらしい。

vs Original Prusa i3 2.5

Voron 2.4 のいいところ

  • 筐体剛性と重さのせいか振動が少なくて全体的に静か
  • めちゃくちゃキビキビ動く (加速度が高い?)
  • スカートのファンが割とうるさい (60x20mm * 2)
  • ベッドの安定感がすごい。first layer がとても安定している。
    • mesh bed leveling がいらない
  • カスタマイズ性
  • 早くて綺麗

Voron 2.4 のよくはないところ

  • Gantry の調整が難しい
  • 重い (250mm でもかなり重いので 350mm とかムキムキじゃないと無理だと思う)
  • スタートアップタイムが長い
    • Raspberry Pi が起動するまで使えない。最適化すればそこそこ早い
  • 電源切るタイミングがわかりにくい
    • Raspberry Pi をシャットダウンしたか確認する方法がない
    • overlayfs 化するほうがいいかもだけど、ログが結構でるので難しいかも……
  • Linux、Python、G-code にある程度慣れてないと設定でつまづくかもしれない
  1. トップ
  2. tech
  3. 3Dプリンタ Voron 2.4 を組み立てた