センサーレスホーミングとは?Klipperでの設定手順を初心者向けに解説

3Dプリンターを自作したり改造したりしていると、配線がゴチャゴチャになって困ること、ありませんか?特にエンドストップスイッチの配線って、プリンターの端から端まで這わせる必要があって、見た目も作業性もイマイチですよね。

「物理エンドストップ配線が面倒」「TMC2209の機能を活かしたい」── そんな人におすすめなのがセンサーレスホーミングです。この記事では、仕組みから設定、トラブル対処までを初心者でもわかるように解説していきます。配線を減らしてスッキリしたプリンターを目指しましょう!

センサーレスホーミングとは?

センサーレスホーミングは、その名の通り「センサー(エンドストップスイッチ)なし」で原点復帰(ホーミング)ができる機能です。「えっ、スイッチなしでどうやって端っこを検出するの?」と思いますよね。実は、モータードライバの賢い機能を使っているんです。

エンドストップ不要の自動原点検出機能

通常、3Dプリンターは印刷を始める前に「原点」を確認する必要があります。X軸、Y軸、Z軸がそれぞれどこまで動けるのか、端っこはどこなのかを知らないと、印刷がズレたり失敗したりしてしまいます。

そこで従来は物理的なエンドストップスイッチ(マイクロスイッチや光学センサー)を設置して、「カチッ」とスイッチが押されたら「ここが端っこだよ!」と教えてあげていました。でも、センサーレスホーミングなら、この物理スイッチが不要になります。

TMCドライバの「StallGuard」を利用してモーター負荷を検出

センサーレスホーミングの仕組みは、TMCドライバに搭載されているStallGuard(ストールガード)という機能がカギです。

ステッピングモーターが何かにぶつかったり、動けなくなったりすると、モーターには「負荷」がかかります。StallGuardはこの負荷の変化をリアルタイムで監視していて、「あれ?急に重くなったぞ?」と検知すると、信号を出してくれるんです。

つまり、プリンターのヘッドがフレームの端っこにぶつかったとき、その「ぶつかった=負荷が増えた」という瞬間をStallGuardが捉えて、「ここが端っこです!」と教えてくれるというわけです。まるでモーター自身が触覚センサーになったような感じですね。

センサーレスホーミングに対応しているドライバ

残念ながら、すべてのステッピングモータードライバがこの機能を持っているわけではありません。センサーレスホーミングに対応しているのは、以下のようなTrinamic社製のTMCシリーズです。

  • TMC2209(一番人気・コスパ良好)
  • TMC2130(SPI通信タイプ)
  • TMC5160(高性能モデル)
  • その他、TMC2660やTMC2208の一部モデルなど

もし3Dプリンターに古いA4988やDRV8825などのドライバが載っている場合は、残念ながらセンサーレスホーミングは使えません。TMCドライバへの交換を検討してみましょう。

センサーレスホーミングのメリット・デメリット

どんな技術にも良い面と注意すべき面がありますよね。センサーレスホーミングも例外ではありません。

✅ メリット

  • 配線がシンプル・見た目スッキリ
    エンドストップスイッチへの配線が不要になるので、プリンター内部がスッキリします。配線の取り回しや断線の心配も減りますし、メンテナンスも楽になります。
  • スイッチの故障リスクがゼロ
    物理スイッチは何度も押されることで摩耗したり、接触不良を起こしたりすることがあります。センサーレスならその心配がありません。
  • デザインの自由度が上がる
    スイッチを取り付ける場所を考えなくていいので、プリンターの設計やカスタマイズの自由度が広がります。

⚠️ デメリット

  • 機械的精度は物理スイッチに劣ることもある
    物理スイッチは「カチッ」と明確に反応するので、位置の再現性が高いです。一方、センサーレスは負荷の検出なので、ベルトのテンションや速度によって若干のバラつきが出ることがあります。
  • 調整が必要
    「感度」の設定が適切でないと、うまく動作しません。初回のセットアップには少し試行錯誤が必要です。
  • Z軸には向かないことも
    後ほど詳しく説明しますが、Z軸は荷重が大きく変動するため、センサーレスホーミングが安定しないケースが多いです。

センサーレスホーミングの導入に必要なもの

センサーレスホーミングを始めるために、必要なものを確認しておきましょう。

まず絶対に必要なのは以下の3つです。

  1. TMC2209 / 2130 / 5160 などのドライバ
    前述の通り、StallGuard機能を持つTMCドライバが必要です。TMC2209が価格と性能のバランスが良くておすすめです。
  2. Klipper環境(設定ファイルにアクセスできること)
    この記事ではKlipperファームウェアを前提に説明します。Marlinでも可能ですが、Klipperの方が設定がシンプルで分かりやすいです。
  3. ドライバのUART通信が有効になっていること
    TMCドライバとマイコンボード(Raspberry Piなど)がUART(シリアル通信)で通信できる状態である必要があります。ほとんどのKlipper環境では既に設定済みですが、念のため確認しておきましょう。

あと、このようなスイッチのダミーも必要です。これに接触して停止します。

このデータはこちらからいただきました。

オプション

  • 一時的に物理エンドストップを残しておく
    最初のテスト段階では、物理スイッチをそのまま残しておくと安心です。センサーレスがうまく動かないときに、すぐ元に戻せますからね。

問題ないことを確認してからダミースイッチに変えましょう!

センサーレスホーミング設定手順

実際にKlipperの設定ファイル(printer.cfg)を編集して、センサーレスホーミングを有効にしていきます。一つずつ進めていきましょう。

ステップ1:ドライバ設定(diag_pinとdriver_SGTHRS)

この手順では、X軸を例に、原点がMin側(左側)にあるか、Max側(右側)にあるかで設定を分けて説明します。

まず、現在のTMCドライバの設定を確認します。Klipperの設定ファイルには、以下のようなセクションがあるはずです。

[tmc2209 stepper_x]
uart_pin: PE7
run_current: 0.800
stealthchop_threshold: 999999

これはX軸のTMC2209ドライバの基本設定です。この中に、センサーレスホーミング用の設定を追加していきます。

センサーレスホーミングを使うには、diag_pin(診断ピン)を指定する必要があります。これは、StallGuardが「負荷検出したよ!」という信号を出すピンです。マイコンボードによってピン番号が違うので、ボードのマニュアルやピン配置図を確認してください。

次に、負荷検出の「感度」を設定します。これがdriver_SGTHRS(StallGuard Threshold=ストールガード閾値)というパラメータです。この数値は0〜255の範囲で設定でき、数値が大きいほど感度が高くなります。つまり、小さな負荷でも「ぶつかった!」と判断するようになります。

閾値(いきち/しきいち):ある変化が起こる境目となる基準の値。この値を超えると、物事が「起きる」または「切り替わる」など、それまでと違う状態になります。

パラメータ意味設定例(X軸)
[tmc2209 stepper_x]X軸ドライバの設定開始
diag_pin:ストール検出信号が出力される診断ピンの指定diag_pin: ^PB14
^ マークプルアップ抵抗を有効化(ほとんどの場合必須)
driver_SGTHRS:ストール検出感度(0~255)。最初は100でテスト推奨。driver_SGTHRS: 100
[tmc2209 stepper_x]
uart_pin: PE7
run_current: 0.800
stealthchop_threshold: 999999
diag_pin: ^PB14  # ストール検出ピン。^でプルアップ有効
driver_SGTHRS: 100 # ストール検出感度

^マークは「プルアップ抵抗を有効にする」という意味で、ほとんどの場合この記号を付けておけばOKです。最初はdriver_SGTHRS: 100くらいから始めるのがおすすめです。あとで微調整していきます。

ステップ2:エンドストップ設定の変更

ドライバの設定ができたら、次は「エンドストップ」の設定を変更します。これまで物理スイッチのピンを指定していた部分を「仮想エンドストップ」に切り替え、軸の移動範囲とホーミングの方向を設定します。

設定ファイルの[stepper_x]セクションを探してください。おそらくこんな感じになっているはずです。

[stepper_x]
step_pin: PD4
dir_pin: PD3
enable_pin: !PD6
microsteps: 16
rotation_distance: 40
endstop_pin: ^PB13
position_endstop: 0
position_max: 235

このendstop_pinの部分を書き換え、さらにホーミング関連の設定を追加します。多くのプリンターではX軸とY軸は「マイナス方向」(左や手前)に動いて端っこを探します。

パターンA:原点が「Min側」(左側/手前/下側)の場合

多くの一般的な3Dプリンター(CoreXY、Prusaタイプなど)で採用される設定です。

パラメータ意味設定例
endstop_pin:仮想エンドストップの使用を指定tmc2209_stepper_x:virtual_endstop
position_endstop:原点位置の座標。Min側なので00
position_max:軸の最大移動量(例:235mm)235
homing_positive_dir:ホーム方向。Min側へ移動するためFalseFalse
homing_retract_dist:衝突後の後退距離。センサーレスでは00
[stepper_x]
# ... その他の設定(step_pin, dir_pinなど) ...
endstop_pin: tmc2209_stepper_x:virtual_endstop
position_endstop: 0 # 原点はMin側なので 0
position_max: 235
position_min: -5 # オーバーラン許容(任意)
homing_retract_dist: 0
homing_speed: 20
homing_positive_dir: False # Min側へ移動してホーム

主なポイント:

  • endstop_pin: tmc2209_stepper_x:virtual_endstop → 物理スイッチの代わりにTMC2209の仮想エンドストップを使用
  • position_min: -5 → ホーミング時に少しだけマイナス側にオーバーランできるようにする
  • homing_retract_dist: 0 → センサーレスでは二度押し動作が不要なので0に設定
  • homing_speed: 20 → 最初のテストでは安全のため速度を落とす(通常は40〜50mm/s)

パターンB:原点が「Max側」(右側/奥/上側)の場合

一部の特殊なプリンターや、Y軸/Z軸でMax側を原点とする場合に採用される設定です。

パラメータ意味設定例
endstop_pin:仮想エンドストップの使用を指定tmc2209_stepper_x:virtual_endstop
position_endstop:原点位置の座標。Max側なのでposition_maxと同じ値。235
position_max:軸の最大移動量(例:235mm)235
homing_positive_dir:ホーム方向。Max側へ移動するためTrueTrue
homing_retract_dist:衝突後の後退距離。センサーレスでは00
[stepper_x]
# ... その他の設定(step_pin, dir_pinなど) ...
endstop_pin: tmc2209_stepper_x:virtual_endstop
position_endstop: 235 # 原点はMax側なので 最大値
position_max: 235
position_min: 0
homing_retract_dist: 0
homing_speed: 20
homing_positive_dir: True # Max側へ移動してホーム

Y軸はX軸と同様に基本的な考え方、設定の構造、手順はX軸とまったく同じです。X軸との違いは、主にピンの名前セクション名です。

センサーレスホーミングを有効にするために必要な設定項目と、原点(ホーム)の位置による設定の変更点も、Y軸に対して同様に適用されます。

ただし、以下の3つの重要な変更点に注意が必要です。

ドライバー設定の変更 ([tmc2209 stepper_y])

X軸の設定をベースに、セクション名をstepper_yに変更し、Y軸ドライバ用のピン番号に置き換えます。

X軸の設定Y軸での変更点
[tmc2209 stepper_x][tmc2209 stepper_y] に変更
uart_pin: PE7Y軸ドライバの uart_pin に変更(例: PE3)
diag_pin: ^PB14Y軸ドライバの diag_pin に変更(例: ^PB15)
driver_SGTHRS: 100感度設定。X軸と同じ値から開始してOK。

Y軸のピン番号への変更

最も重要なのは、使用するマイコンピン番号です。

X軸で使用したピン(例:PE7, ^PB14)は、Y軸ドライバのソケットに接続されているピンとは異なります。お使いのボードのマニュアルを参照し、Y軸ドライバのUARTピンとDIAGピンに割り当てられたピン番号に置き換える必要があります。

原点位置の定義

Y軸の原点も、X軸と同様に「Min側」か「Max側」かで設定が変わります。

原点位置物理的な位置[stepper_y]で設定する値
Min側プリンターの手前homing_positive_dir: False (負の方向へ移動)
Max側プリンターの奥側homing_positive_dir: True (正の方向へ移動)

この通り、X軸の設定をピン番号と方向に注意してY軸用に書き換えれば完了です。

ステップ3:動作確認と感度(driver_SGTHRS)の微調整

設定を保存してKlipperを再起動したら、まずコンソールで状態を確認しましょう。

QUERY_ENDSTOPS

すると、こんな感じで表示されます。

x:open y:open z:TRIGGERED

openは「エンドストップに触れていない状態」、TRIGGEREDは「触れている状態」を意味します。何も動かしていない状態でx:openになっていればOKです。もし最初からTRIGGEREDになっている場合は、配線やピン設定が間違っている可能性があります。

では、準備ができたら、いよいよホーミングを実行してみましょう。

G28 X

これでX軸だけホーミングが始まります。ヘッドがゆっくり動いて、フレームの端に近づいていくはずです。

うまくいった場合:
端っこに到達すると、「コツン」と軽く当たって止まります。モーターが「ジジジ…」という音を立てることもありますが、これは正常です。

うまくいかない場合:

  • 端っこに当たっても止まらず、ガンガンぶつかり続ける → 感度が低すぎます。driver_SGTHRSを上げてください(例:150や200など)
  • 端っこに到達する前に止まってしまう → 感度が高すぎます。driver_SGTHRSを下げてください(例:50や80など)

もしendstop(virtual_endstop)が「逆」の反応をする(反転が必要なとき)

  • まず QUERY_ENDSTOPS を実行して、仮想エンドストップの状態を見ます(ホームしていない状態で TRIGGERED になっているなど、挙動が逆なら反転が必要)。
  • Klipper ではピン定義に ! を付けると論理反転(トリガーが low / high どちらで判定するか)ができます。たとえば物理ピンであれば endstop_pin: ^!PA2 のように ! を併用します。

注意(virtual_endstop の場合)

一部のボード/Klipperバージョンでは !tmc2209_stepper_x:virtual_endstop のように virtual pin に直接 ! が使えない・エラーになる報告もあります(ボード固有のピン割り当てやKlipperの古いバージョン依存)。

その場合の対処は:

  • diag_pin 側を ^!PB14(pull-up+反転)で指定してみる(Klipper のドライバ記述がそれを許す場合)。
  • ボードの回路図を確認して、DIAGとMCUの結線(すでに外付けプルアップがあるか)を確認する。必要なら外付けpull-up抵抗(10kΩ など)を使う。
  • Klipperのログ/DUMP_TMC 出力でDIAGの状態やSG_RESULT(StallGuardの生データ)を確認して原因を特定する。

感度調整は、設定ファイルのdriver_SGTHRSの数値を変えて、何度かテストを繰り返します。変更したら設定を保存して、Klipperを再起動(RESTARTコマンド)してから、もう一度G28 Xを試してみましょう。ちょうどいい感度は、プリンターの構造やベルトのテンション、モーターの電流値によって変わります。根気よく調整していきましょう!

Z軸への適用について

「X軸とY軸がうまくいったから、Z軸もセンサーレスにしちゃおう!」と思うかもしれませんが、ちょっと待ってください。Z軸へのセンサーレスホーミングは、かなり難易度が高いんです。

Z軸では失敗しやすい理由

Z軸がセンサーレスに向かない理由は、主に以下の2つです。

  1. 荷重が大きい
    Z軸にはホットエンド、ヒートシンク、ファン、そして場合によってはベッド全体がぶら下がっています。X軸やY軸に比べて、常に大きな負荷がかかっているんです。
  2. 負荷変動が多い
    ベッドの位置や温度によって、Z軸にかかる負荷は刻々と変わります。そのため、StallGuardが「これは端っこにぶつかったのか?それとも単に重いだけなのか?」を判断しにくいんです。

結果として、Z軸でセンサーレスホーミングを使うと、以下のようなトラブルが起こりやすくなります。

  • ノズルがベッドに激突してダメージを受ける
  • ホーミング位置が毎回バラバラになる
  • 全然止まらず、Z軸のネジが空回りする

正直なところ、Z軸は物理的なエンドストップスイッチやプローブを使った方が安定します。無理にセンサーレスにこだわらず、X軸とY軸だけでも十分メリットはありますよ。

よくあるトラブルと対処法

最後に、センサーレスホーミングでよくあるトラブルと、その対処法をまとめておきます。困ったときはここをチェックしてみてください。

トラブル1:モーターが全く動かない

症状:
G28 Xを実行しても、モーターがピクリとも動きません。

考えられる原因:
diag_pinの設定が間違っている可能性があります。ピン番号が間違っていたり、プルアップ記号(^)を付け忘れていたりすることがあります。

対処法:

  1. マイコンボードのマニュアルで正しいDIAGピンを確認する
  2. 設定ファイルのdiag_pinを見直す
  3. ^マークが付いているか確認する(例:^PB14

トラブル2:ホーム時にフレームに激しく衝突する

症状:
ホーミング中、ヘッドがフレームにガンガンぶつかって止まりません。モーターから「ガガガガ…」という不快な音がします。

考えられる原因:
感度設定(driver_SGTHRS)が低すぎて、負荷を検出できていません。

対処法:

  1. driver_SGTHRSの数値を上げる(例:100 → 150 → 200と段階的に)
  2. 設定を保存してRESTARTコマンドで再起動
  3. もう一度G28 Xでテストする

トラブル3:常にエンドストップがON判定になっている

症状:
QUERY_ENDSTOPSを実行すると、常にTRIGGEREDと表示されます。何もしていないのに、既にエンドストップが押されている状態になっています。

考えられる原因:
配線またはピン設定に誤りがあります。プルアップ/プルダウンの設定が逆だったり、ピン番号が間違っていたりする可能性があります。

対処法:

  1. diag_pinの設定を確認(^マークの有無)
  2. ピン番号がマイコンボードの実際の配線と合っているか確認
  3. 試しに^マークを外してみる、または^!にしてみる
  4. 他に同じピンを使っている設定がないか確認する

トラブル4:途中で勝手に停止してしまう

症状:
ホーミング中、端っこに到達する前に突然止まってしまいます。明らかに「まだ空間があるのに…」という場所で停止します。

考えられる原因:
感度が高すぎるか、ドライバ自体がStallGuardに対応していない可能性があります。

対処法:

  1. driver_SGTHRSの数値を下げる(例:150 → 100 → 80と段階的に)
  2. ドライバの型番を再確認(本当にTMC2209/2130/5160など対応モデルか?)
  3. ベルトのテンションを確認(緩すぎると誤検出しやすい)
  4. run_current(モーター電流)を確認(低すぎると検出しにくい)

まとめ

センサーレスホーミングは、慣れると非常に便利な機能です。配線がスッキリして、メンテナンスも楽になります。最初の設定には少し手間がかかりますが、一度決まってしまえばあとは快適そのものです。

ただし、すべての軸に適しているわけではありません。特にZ軸は慎重に検討しましょう。X軸とY軸だけでも、十分に恩恵を受けられますよ。

この記事を参考に、ぜひあなたのプリンターでもセンサーレスホーミングを試してみてください。最初は少し緊張するかもしれませんが、一歩ずつ進めていけば大丈夫です。

それでは、良い3Dプリンターライフを!