PR

Pythonで2軸制御!ラズパイでX軸・Y軸のステッピングモーターを動かす方法(自作CNC #4)

スポンサーリンク
RaspberryPi
スポンサーリンク

はじめに

前回、1mm単位で正確に動かす「距離の制御」をマスターしました。今回は、その仕組みをもう1セット増やして、いよいよ「XYテーブル(2軸)」としての形を作っていきます!

モーターが2台になると、配線やプログラムの管理が少し複雑になります。しかし、ここを乗り越えれば「点」の動きが「面」の動きに変わり、文字を書いたり絵を描いたりできる装置へと一気に近づきます。効率的な増設と制御のコツを詳しく見ていきましょう。

今回は: X軸とY軸を個別に動かせる状態を作る

最終目標はGUI付き(WINDOW付き)制御プログラムですが、
まずはその土台を作ります。

スポンサーリンク

ハードウェア配線

画像の一部は raspberrypi.zyx さんより引用させて頂きました。

プログラムの前にVref調整(重要)

A4988を購入状態で使用すると焼損のリスクがあります。
必ず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テーブル製作シリーズはこちらから

コメント