はじめに
XYテーブル製作シリーズ 第4回
はじめに:「点」の動きから「面」の動きへ
前回(第3回)で1mm単位の「距離の制御」をマスターしました。今回はその仕組みをもう1セット増やし、いよいよXYテーブル(2軸)の形を作ります。モーターが2台になると配線とプログラムの管理が少し複雑になりますが、ここを越えると「点」の動きが「面」の動きに変わり、文字や図形を描ける装置に近づきます。
この記事で分かること
- A4988ドライバー2台分のGPIO配線(X軸・Y軸で別々のピンを割り当てる)
- 軸ごとにピンをまとめて関数へ渡し、X軸・Y軸を個別に動かすPythonコード(ZIP配布)
- 1/16マイクロステップでの step/mm の計算(200 × 16 ÷ 移動距離)
- 「震えるだけ」「動かない」「異常に熱い」ときのチェックポイント
今回のゴールはX軸とY軸を個別に動かせる状態を作ることです。最終目標のGUI付き制御はこの土台の上に作ります。
ハードウェア配線(A4988 ×2)
画像の一部は pinout.xyz より引用しています。
プログラムの前にVref調整(重要):A4988を購入状態で使うと焼損のリスクがあります。2台とも必ずVref調整を実施してください。
⚡ 第1.5回・補足 A4988の電流制限(Vref)調整方法|焼損を防ぐ計算式とテスターでの設定手順 モーターを回す前に必ずやる A4988 の電流調整。 →Pythonプログラム(X軸・Y軸を個別に動かす)
軸ごとにピン番号をまとめて関数 move_axis() へ渡す構成にしています。X軸・Y軸で正転方向が逆になるよう、軸名で DIR を切り替えています。
import RPi.GPIO as GPIO
import time
# =====================================================
# GPIO モード設定
# =====================================================
GPIO.setmode(GPIO.BCM)
# =====================================================
# X軸 PIN設定
# =====================================================
X_STEP = 21
X_DIR = 20
X_EN = 16
X_MS1 = 17
X_MS2 = 27
X_MS3 = 22
X_RESET = 5
X_SLEEP = 6
# =====================================================
# Y軸 PIN設定
# =====================================================
Y_STEP = 2
Y_DIR = 26
Y_EN = 18
Y_MS1 = 23
Y_MS2 = 24
Y_MS3 = 25
Y_RESET = 12
Y_SLEEP = 13
# =====================================================
# モーション設定(将来互換)
# =====================================================
BELT_PITCH = 2.0
PULLEY_TEETH = 32
FULL_STEPS_PER_REV = 200
MICROSTEP = 16
MM_PER_REV = BELT_PITCH * PULLEY_TEETH
STEPS_PER_REV = FULL_STEPS_PER_REV * MICROSTEP
STEPS_PER_MM = STEPS_PER_REV / MM_PER_REV
# =====================================================
# GPIO 初期化関数(rev4互換)
# =====================================================
def gpio_init_axis(STEP, DIR, EN, MS1, MS2, MS3, RESET, SLEEP):
pins = [STEP, DIR, EN, MS1, MS2, MS3, RESET, SLEEP]
for pin in pins:
GPIO.setup(pin, GPIO.OUT)
GPIO.output(RESET, GPIO.HIGH)
GPIO.output(SLEEP, GPIO.HIGH)
GPIO.output(EN, GPIO.LOW)
# 1/16 マイクロステップ
GPIO.output(MS1, GPIO.HIGH)
GPIO.output(MS2, GPIO.HIGH)
GPIO.output(MS3, GPIO.HIGH)
# =====================================================
# 軸移動関数(一定速度)
# =====================================================
def move_axis(axis_name,
STEP, DIR, EN,
MS1, MS2, MS3,
RESET, SLEEP,
distance_mm):
gpio_init_axis(STEP, DIR, EN, MS1, MS2, MS3, RESET, SLEEP)
steps = int(distance_mm * STEPS_PER_MM)
if steps <= 0:
print(f"{axis_name}:移動量が小さすぎます")
return
print(f"{axis_name} を {distance_mm} mm 移動します")
# 軸ごとの正転方向(rev4と合わせる)
if axis_name == "X軸":
GPIO.output(DIR, GPIO.LOW)
else:
GPIO.output(DIR, GPIO.HIGH)
for _ in range(steps):
GPIO.output(STEP, GPIO.HIGH)
time.sleep(0.001)
GPIO.output(STEP, GPIO.LOW)
time.sleep(0.001)
GPIO.output(EN, GPIO.HIGH)
print(f"{axis_name} 移動完了")
# =====================================================
# メイン処理
# =====================================================
try:
# X軸 20mm
move_axis("X軸",
X_STEP, X_DIR, X_EN,
X_MS1, X_MS2, X_MS3,
X_RESET, X_SLEEP,
20)
time.sleep(1)
# Y軸 20mm
move_axis("Y軸",
Y_STEP, Y_DIR, Y_EN,
Y_MS1, Y_MS2, Y_MS3,
Y_RESET, Y_SLEEP,
20)
finally:
GPIO.cleanup()
print("GPIO cleanup 完了")よくあるトラブル
- モーターが震えるだけで回らない:コイル配線(A/Bの相の組み合わせ)のミス
- まったく動かない:
ENピンが HIGH のまま(LOWで有効) - 異常に熱い:A4988の電流制限(Vref)が未調整、または過大
これで出来ること
- X軸 20mm 移動
- Y軸 20mm 移動
まとめと次回予告
これでX軸・Y軸を個別に動かせるようになりました。ただし今回は「ただ動かすだけ」で、高速にすると脱調(ガガガと鳴って止まる)が起きます。次回・第5回では、速度を徐々に上げ下げする加減速制御(台形駆動)を実装します。
次に読む記事
📈 次回はこちら(第5回) ステッピングモーターの脱調を防ぐ加減速制御(台形駆動)をPythonで実装する方法 スローアップ・定速・スローダウンで滑らかに動かす。 → 🗺️ 全体像 自作XYテーブルの全手順ロードマップ|Raspberry Pi+ステッピングモーターで2軸制御 第0回〜第11回の全工程をまとめたロードマップ。 →よくある質問(FAQ)
QA4988を2台使うとき、電源やGNDはどうしますか?
Aモーター用12V電源は2台のVMOT/GNDに並列供給し、Raspberry PiのGNDとモーター電源のGNDを必ず共通(コモン)にします。各A4988のVMOT付近に電解コンデンサ(100μF程度)を入れると安定します。ロジック電源(VDD)はRaspberry Piの3.3Vから取ります。
QX軸とY軸でGPIOピンはどう割り当てればいいですか?
ASTEP/DIR/EN/MS1〜3/RESET/SLEEP を軸ごとに別のBCMピンへ割り当てます。本記事のコードはX軸=21/20/16…、Y軸=2/26/18… の例です。使っていないピンなら番号は自由ですが、I2C/SPI/UART用に予約されたピンは避けます。
Q2軸を「同時」に動かすにはどうしますか?
A本記事のコードはX→Yと順番に動かします。同時に動かすには threading で各軸を別スレッドにするか、両軸のSTEPパルスを1ループ内で交互に出す方式にします。同時制御は第6回で解説します。
Q片方の軸だけ回転方向が逆になります。
Aモーターの取り付け向きやコイル配線の都合で、軸ごとに正転の向きが変わります。コードのように軸名で GPIO.output(DIR, HIGH/LOW) を分けるか、配線でコイルのペアを入れ替えて合わせます。
Qマイクロステップ1/16にしたら遅くなりました。
A1回転に必要なパルスが16倍(200→3200)になるためです。step/mm も 200×16 ÷ 移動距離 で再計算し、time.sleep の delay を小さくして速度を補います。滑らかさと速度の両立には加減速制御(第5回)が有効です。
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アプリ化まで、実務で役立つ自動化ノウハウが満載です。
シリーズを読む


コメント