はじめに

前回、1mm単位で正確に動かす「距離の制御」をマスターしました。今回は、その仕組みをもう1セット増やして、いよいよ「XYテーブル(2軸)」としての形を作っていきます!
モーターが2台になると、配線やプログラムの管理が少し複雑になります。しかし、ここを乗り越えれば「点」の動きが「面」の動きに変わり、文字を書いたり絵を描いたりできる装置へと一気に近づきます。効率的な増設と制御のコツを詳しく見ていきましょう。
今回は: X軸とY軸を個別に動かせる状態を作る
最終目標はGUI付き(WINDOW付き)制御プログラムですが、
まずはその土台を作ります。
ハードウェア配線

画像の一部は raspberrypi.zyx さんより引用させて頂きました。
プログラムの前にVref調整(重要)
A4988を購入状態で使用すると焼損のリスクがあります。
必ずVref調整を実施しましょう。
Pythonプログラム
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 完了")
この記事で使用したコードはこちらからダウンロードできます。
XY_Move.py をダウンロード(ZIP)よくあるトラブル
✔ モーターが震えるだけ
→ コイル配線ミスの可能性
✔ 動かない
→ ENがHIGHのまま
✔ 異常に熱い
→ A4988の電流制限未調整
※必ず電流調整を行ってください。
これで出来ること
✅ X軸 20mm 移動
✅ Y軸 20mm 移動
次回予告
今回はただ動かすだけでしたが、次回は加減速制御を入れて動かしてみましょう
加減速制御・・・・徐々に早く → 中間は一定速 → 徐々に遅くなる
制御しているなと思えますよね
第5回Pythonでステッピングモーターの加減速制御を実装する(XYテーブル製作シリーズ)
XYテーブル製作シリーズはこちらから
- 【第0回】Raspberry PiのOSインストール完全ガイド|初心者向けにゼロから解説
- 【第1回】PythonでLEDを光らせる|GPIOの基本をやさしく解説
- 【第2回】ラズパイ+A4988でステッピングモーターを回す
- 【第3回】ステッピングモーターをmm単位で動かす|ベルト駆動の計算方法まで解説
- 【第1.5回】 A4988のVref調整手順(XYテーブル製作シリーズ)
- 【番外編】L6470が動かない?A4988と同じ感覚で使ってハマった話
- 【第4回】XYテーブル化の第一歩|X軸とY軸を2台動かす
- 【第5回】Pythonでステッピングモーターの加減速制御を実装する
- 【第6回】Pythonでステッピングモーターを2軸同時に動かす
- 【第7回】Raspberry PiでXYテーブル制御|リミットスイッチと原点復帰(Homing)の実装
- 【第8回】【Python × Raspberry Pi】XYテーブルをGUI操作する(Tkinter)
- 【第9回】Python×Raspberry PiでXYテーブルを制御するGUIを作る(原点復帰・位置表示・ソフトリミット実装)



コメント