PR

XYテーブルの原点復帰(Homing)をPythonで実装する方法【XYテーブル自作 第7回】

RaspberryPi

XYテーブル製作シリーズ 第7回

スポンサーリンク

はじめに:電源投入後の「原点復帰」で現在位置を確定する

前回でX軸・Y軸を同時に動かせるようになりましたが、まだ「現在位置が分からず、安全制御がない」状態です。多くの工作機械は電源投入後に原点復帰(Homing)を行い、機械の基準位置を確定します。今回はそれをXYテーブルに実装します。

この記事で分かること

  • リミットスイッチ(機械の端を検出するセンサー)の役割と、NC(ノーマルクローズ)配線
  • 原点復帰の流れ:原点方向へ移動 → スイッチON → 停止 → バックオフ → 現在位置0mm確定
  • X軸・Y軸の原点復帰を threading で同時実行する仕組み
  • 軸ごとに原点方向(homing_dir)を分ける理由
  • フルコード(XY_safe_move.py、ZIP配布)と動作動画

スポンサーリンク

リミットスイッチとは・今回の配線

リミットスイッチは「機械の端(移動限界)をスイッチが押されることで検出するセンサー」です。XYテーブルではX軸・Y軸の端に1個ずつ設置します。使用するのは オムロン製 D2JW-01K1A1 です。

オムロン D2JW-01K1A1 リミットスイッチの外観
D2JW-01K1A1
D2JW-01K1A1 の端子側
端子(NC接続で使用)

今回の配線

X_LIMIT = 4    # X軸リミットスイッチ
Y_LIMIT = 14   # Y軸リミットスイッチ
# リミットスイッチは NC(ノーマルクローズ)で接続
A4988ドライバー2台とX軸・Y軸のリミットスイッチをRaspberry Piに接続した結線図
リミットスイッチを加えた結線図

なぜNC(ノーマルクローズ)か:通常時は電流が流れており、スイッチが押されると接点が開いて電流が止まります。ケーブルが断線したときも電流が止まるため異常として検知でき、安全側に倒れる「フェイルセーフ」設計になります。


スポンサーリンク

Pythonで原点復帰を実装する

① 原点復帰を開始する関数(X・Yを別スレッドで)

def start_homing():
    threading.Thread(
        target=homing_axis,
        args=("X軸", X_STEP, X_DIR, X_EN, X_LIMIT,
              X_MS1, X_MS2, X_MS3, X_RESET, X_SLEEP),
        daemon=True
    ).start()

    threading.Thread(
        target=homing_axis,
        args=("Y軸", Y_STEP, Y_DIR, Y_EN, Y_LIMIT,
              Y_MS1, Y_MS2, Y_MS3, Y_RESET, Y_SLEEP),
        daemon=True
    ).start()

X軸・Y軸の原点復帰を別スレッドで実行するため、両軸が同時に原点復帰します。

② 原点方向の設定(軸ごとに分ける)

if axis_name == "X軸":
    homing_dir = GPIO.HIGH
    backoff_dir = GPIO.LOW
else:
    homing_dir = GPIO.LOW
    backoff_dir = GPIO.HIGH

X軸は左方向、Y軸は下方向、のように軸ごとに原点方向が異なることがあるため、軸名で方向を切り替えます。

③ 原点探索:スイッチが押されるまで移動

while GPIO.input(limit_pin) == GPIO.LOW:
    GPIO.output(STEP, GPIO.HIGH)
    time.sleep(0.001)
    GPIO.output(STEP, GPIO.LOW)
    time.sleep(0.001)

④ バックオフ:少し逆方向へ戻す

スイッチを押した状態のままだと次の動作ができないため、少しだけ逆方向へ戻します(バックオフ)。その位置を current_pos[axis_name] = 0.0 として現在位置の基準にします。

GPIO.output(DIR, backoff_dir)
for _ in range(BACKOFF_STEPS):
    GPIO.output(STEP, GPIO.HIGH)
    time.sleep(0.001)
    GPIO.output(STEP, GPIO.LOW)
    time.sleep(0.001)

current_pos[axis_name] = 0.0   # 原点位置を確定

スポンサーリンク

フルコードのダウンロードと動作

⬇ XY_safe_move.py をダウンロード(ZIP)

プログラムを起動すると「X軸 原点復帰 → Y軸 原点復帰」が実行され、その後XY移動が可能になります。


スポンサーリンク

まとめと次回予告

リミットスイッチ・原点復帰・バックオフの3つで、工作機械の基本制御が完成しました。次回・第8回では、Pythonの tkinterGUI操作ソフト(移動量入力・XY同時制御・緊急停止)を作ります。

次に読む記事

🖥️ 次回はこちら(第8回) PythonのTkinterでXYテーブルをGUI操作する|移動量入力・XY同時実行・緊急停止ボタン アプリのウィンドウからXYテーブルを操作する。 🗺️ 全体像 自作XYテーブルの全手順ロードマップ|Raspberry Pi+ステッピングモーターで2軸制御 第0回〜第11回の全工程をまとめたロードマップ。

スポンサーリンク

よくある質問(FAQ)

QリミットスイッチはNO(ノーマルオープン)でもいいですか?

ANOでも原点復帰は動きますが、断線を検知できません。NC(ノーマルクローズ)なら「スイッチON」でも「断線」でも電流が止まって異常検知できるため、工作機械ではNCが基本です。NC配線時はコード側で GPIO.input の判定を反転させます。

Qバックオフ(BACKOFF_STEPS)は何ステップにすべきですか?

Aスイッチが確実にOFFに戻る量が必要です。1/16マイクロステップなら100〜300ステップ程度が目安。少なすぎるとスイッチが押されたままになり次の動作でエラー、多すぎると原点位置が実際の端から離れます。

Q原点探索でスイッチを通り過ぎて軸が突き当たります。

A探索速度が速すぎるか、スイッチのレバーが軸に届いていません。time.sleep の値を大きくして低速で探索し、スイッチの取り付け位置を調整します。GRBLなどでは低速で2回当てる方式(第2回・CNC編で解説)が使われます。

QX軸とY軸で原点方向が逆になります。

Aモーターの取り付け向きやリミットスイッチの設置位置によって、原点(機械の基準端)へ向かう回転方向が軸ごとに変わります。コードのように homing_dir / backoff_dir を軸名で切り替えて合わせます。

Q原点復帰後、current_pos を0にしたのに座標がずれます。

Aバックオフ量ぶんだけ実際の端から離れた位置を0にしています。これは仕様として問題ありません(毎回同じ位置に戻るため再現性がある)。厳密に端を0にしたい場合はバックオフ後に低速で再度スイッチに当て直します。


スポンサーリンク

XYテーブル製作シリーズ(全12回)

補足記事

第1.5回・補足 A4988の電流制限(Vref)調整方法|焼損を防ぐ計算式とテスターでの設定手順 モーターを回す前に必ずやる A4988 の電流調整。 🔀 番外編 L6470が動かない原因|A4988との違いとSPI通信・デイジーチェーンの罠 高機能ドライバ L6470 を A4988 と同じ感覚で使ってハマった話。 🗺️ 全体像 自作XYテーブルの全手順ロードマップ|Raspberry Pi+ステッピングモーターで2軸制御 第0回〜第11回の全工程をまとめたロードマップ。

ニンジン🥕アイコン

Follow me on X

本ブログの中の人「ニンジン🥕」はXやってます。新着記事はいち早くポストでお知らせしているので、見逃したくない方は @ninjin_py_vba をフォローしてみてください🥕

@ninjin_py_vba をフォロー

この記事が役に立ったら、シェアしてもらえると嬉しいです🥕

Xでポスト はてブ LINE Pocket

PROJECT LOG — SERIES INDEX
スポンサーリンク

シリーズ記事一覧

電子工作・自動化ツールの製作記録をシリーズごとにまとめています。気になるテーマからお読みください。

コメント