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 です。
今回の配線
X_LIMIT = 4 # X軸リミットスイッチ
Y_LIMIT = 14 # Y軸リミットスイッチ
# リミットスイッチは NC(ノーマルクローズ)で接続
なぜ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.HIGHX軸は左方向、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 # 原点位置を確定まとめと次回予告
リミットスイッチ・原点復帰・バックオフの3つで、工作機械の基本制御が完成しました。次回・第8回では、Pythonの tkinter でGUI操作ソフト(移動量入力・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回)
- Raspberry Pi ImagerでのOSインストール手順|microSD書き込みから初期設定まで
- ラズパイでLチカ|PythonとRPi.GPIOでLEDを点灯・点滅させる方法
- ラズパイでステッピングモーターを回す方法|A4988の配線とPython制御・Vref調整
- ステッピングモーターをmm単位で動かす計算式とPython実装|step/mmの求め方
- PythonでX軸・Y軸のステッピングモーターを2軸制御する方法|A4988ドライバー2台
- ステッピングモーターの脱調を防ぐ加減速制御(台形駆動)をPythonで実装する方法
- Raspberry PiでXYテーブルを2軸同時制御|Pythonのthreadingでステッピングモーターを同時に動かす
- Raspberry Pi+PythonでXYテーブルの原点復帰(Homing)を実装|リミットスイッチ・バックオフ処理(この記事)
- PythonのTkinterでXYテーブルをGUI操作する|移動量入力・XY同時実行・緊急停止ボタン
- PythonのGUIが固まる理由とThreadの使い方|Tkinterでモーター制御中もボタンを効かせる
- XYテーブルGUIに原点復帰・現在位置表示・ソフトリミットを実装|Queueでスレッド安全にGUI更新
- XYテーブル制御GUIに単軸動作・片道移動・安全なプログラム終了を実装
- 自作XYテーブルの完成構成と設計資料(図面・BOM・結線図)|完成版Pythonコード配布
補足記事
⚡ 第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 をフォローシリーズ記事一覧
電子工作・自動化ツールの製作記録をシリーズごとにまとめています。気になるテーマからお読みください。
-
FILE.01 — IoT
Raspberry Pi Pico W × GASラズパイPico W×GASで自作!「LINEで動く温湿度&スマートリモコン」完全ロードマップ
「外出中のペットの室温が心配…」そんな思いからスタートしたIoT自作プロジェクトの総集編。温湿度監視からエアコン遠隔操作まで、仕組みをゼロから作りたい方のための全5回の開発記録です。
シリーズを読む -
FILE.02 — CNC
Arduino × レーザー刻印CNCCNC自作シリーズ
高精度な加工を目指し、本格的な自作CNC製作に挑戦中。現在は基幹パーツであるオリエンタルモーターの納品を待つ「設計・準備編」を公開。ハードとソフトの両面から、理想のマシンを形にする過程をリアルタイムにお届けします。
シリーズを読む -
FILE.03 — XY軸制御
Raspberry Pi × ステッピングモーターXYテーブルシリーズ
Raspberry Piとステッパモーターを使い、ゼロから2軸制御に挑む記録。OS設定から回路設計、多軸制御のPythonコードまで、躓きやすいポイントを徹底図解。電子工作初心者が「動く感動」を味わうための実戦ガイドです。
シリーズを読む -
FILE.04 — 業務自動化
Python × Excel × CustomTkinter【Python開発記】NINJIN Mail制作記
PythonとExcelを連携させ、実務で即戦力となるメール送信ツールを開発。CustomTkinterによるUI構築や、ミスを防ぐテンプレート活用術など、現場の「痒い所に手が届く」自動化ノウハウを細部まで丁寧に解説します。
シリーズを読む -
FILE.05 — 業務自動化
Python × Excel × GUIアプリ化Invoice Maker(請求書・見積書自動作成)
手作業の請求書作成から卒業!PythonでExcelデータを読み込み一括PDF化する「Invoice_Maker」の作り方を全3回で解説。基本ロジックからGUIアプリ化まで、実務で役立つ自動化ノウハウが満載です。
シリーズを読む



コメント