雑食エンジニアの気まぐれレシピ

日ごろ身に着けた技術や見知った知識などの備忘録的なまとめ.主にRaspberry Piやマイコンを使った電子工作について綴っていく予定.機械学習についても書けるといいな.

3Dプリントが延々と終わらず苦しめられた話[Repeiter-Hostのバグ?]

最近ネタがなく停滞気味でしたが,久しぶりの更新.
実は先日つくばのminiMakerFaireに出展させていただいたのですが,それにあたり私の3Dプリンター(Flsun prusa i3)の限界サイズ(200mm * 200mm)をプリントする機会がありました. こんなに大きなものをプリントする機会がなかったので不安だらけでしたが,予想の斜め上の失敗をしました.

いつまでたってもプリントが終わらないのです.最初は順調なのですが,途中でいきなり止まったかのように静かになります.かのようにというのがキモで,よく目を凝らすとほんのわずかに動き続けているという症状でした.なので放っておけば一応形にはなるのですが,あまりにも時間がかかりすぎるので途中で中断せざるを得ないといった羽目になりました.
一応回避方法は分かったので,今回はそれについて書きたいと思います.

結論から先に書くと,Repeiter-HostのGコード生成のバグだと思います.Repeiter-Hostはスライス結果を保存する際に,下記二つのオプションが選べます.

  • Save to file
  • Save for SD Print
    f:id:shikky_lab:20200217045531p:plain
    Repeiter-Hostの保存ボタン

前者は人が読みやすいようにコメントなどが挿入されたGコードが生成され,後者はファイルサイズ削減のためにGコード以外の要素が削除されたものになります.ですのでSDカードからプリントする際は基本後者を選ぶのですが,どうやら今回の件は後者のGコードに異常があるため起こってしまう事態のようです.ですので,前者を選ぶと回避できます(若干ファイルサイズは増えますが).

以下,原因をそこに至るまでの過程についてつらつらと書いていきます.
Prusa i3でSDカード経由で印刷している際,UI上に現在の進捗(Gコード全体の何パーセント目を実行しているか)が表示されます.そこでおおよそのあたりをつけ,Gコードを読み込んでいきました.
そして非常にゆっくり動いているという今回の症状から,速度指定に関する箇所に何か異常があるのではと思って調べていきました.Gコードにて速度指定は"G1 F9600"のように"F"の後に数字で指定します.
これならサクッと調べていけるかなと思ったんですが,なんと今回のコードは160万行ありました.1%あたり1.6万行.これは無理...

というわけで,正常と思われるF指定を一つずつ削除していくことにしました.そんな作業を数分続けていると,ちょうど異常が発生したあたりのパーセンテージに以下のような箇所がありました.
G1 F12357800000000000
送り速度1京!?!?!?!?

どうやらこれが原因のようです.どういう条件で発生するかはわかりませんが,値が大きすぎてオーバーフローした結果?,微小な値で動作しているようです.ここまでわかったので,あとは正規表現使って"F\d\d\d\d\d\d\d"くらいで検索すれば洗い出せます.すると先述の2種類の出力方法のうち,"Save to SD Print"を選んだ際のみこのコードが含まれてしまっていることが判明しました.

というわけで要因は不明ですが,さしあたり回避はできるようになりました.何か大きめなデータ印刷する際は,一回正規表現使って大き目なF指定がないか調べてみたほうがいいのかもしれません.
以上,同じような事象に悩まされている方の助けになれば幸いです.

それでは.