PR

ラズパイでステッピングモーターを2軸制御する方法【XYテーブル自作 第4回】

RaspberryPi
スポンサーリンク

はじめに

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

スポンサーリンク

はじめに:「点」の動きから「面」の動きへ

このシリーズで製作する自作XYテーブルの外観図
このシリーズのゴール:自作XYテーブル

前回(第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)

Raspberry PiにA4988ドライバー2台を接続し、X軸・Y軸のステッピングモーターを制御する結線図
X軸・Y軸それぞれにA4988を1台ずつ

画像の一部は 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 完了")
⬇ XY_Move.py をダウンロード(ZIP)

スポンサーリンク

よくあるトラブル

  • モーターが震えるだけで回らない:コイル配線(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回)

補足記事

第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
スポンサーリンク

シリーズ記事一覧

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


超音波距離センサーHC-SR04をRaspberry Pi Picoで使う|仕組み・配線・精度検証
.uds1-block { position: relative; overflow: hidden; border-radius: 12px; border: 1px solid #f0cba8; background: linear-g…
今週の注目ガジェット〜09/07週〜|電子工作・自作向け新製品まとめ(TickrCast/Radxa Linkr ほか)
ニンジンのガジェット通信 09/07週。ESP32-P4の自作気象モニター、極小IP-KVM「Radxa Linkr」、ESP32のDINレール型PLC、LTE開発キットなど、電子工作で使えそうな新製品5つを解説。
サーボモータの角度をタクトスイッチで可変|OLED(SSD1306)に現在角度をリアルタイム表示
Raspberry Pi Pico 2W×MG996RにタクトスイッチとOLED(SSD1306)を追加。ボタンで角度を可変しながら現在角度をリアルタイム表示するMicroPython実装を、framebufの文字拡大やサーボの遊び対策まで実機ベースで解説します。
MG996RサーボモーターをRaspberry Pi Pico 2Wで動かす:PWM制御とキャリブレーション実践
MG996RサーボモーターをRaspberry Pi Pico 2Wで動かす方法を解説。公称180度のはずが実測198度だった個体差の原因究明から、ホーンのズレ補正、タクトスイッチでの角度制御まで実機検証の様子を紹介します。
Tapo P110Mの消費電力をExcelレポート化する【年次集計・電気代試算・セキュリティ判断編】
FastAPI+openpyxlでTapo P110Mの消費電力をExcelレポート化。15秒間隔の生ログを日次集計する設計や、31円/kWhでの電気代試算、外部公開を見送った理由まで解説します。

コメント