PR

ステッピングモーターをmm単位で動かす計算式とPython実装【XYテーブル自作 第3回】

RaspberryPi
スポンサーリンク

はじめに

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

スポンサーリンク

はじめに:「回転」から「距離」の制御へ

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

前回(第2回)でステッピングモーターを回すところまで進みました。今回は「10mm動かしたい」と思ったときに、プログラムへ何を書けばいいのか——タイミングベルトとプーリーの仕様から移動量を割り出す計算式と、そのPython実装を解説します。ここができると、工作から「装置設計」へレベルアップします。

この記事で分かること

  • ベルト駆動で「1回転=何mm進むか」を求める式(ベルトピッチ × プーリー歯数)
  • 「1mm動かすのに何ステップ必要か」= 1回転のステップ数(200)÷ 1回転の移動距離
  • マイクロステップを使うときの計算の直し方
  • 距離(mm)を指定してモーターを動かすPythonコード(stepper_mm.py、ZIP配布)
  • A4988 + Raspberry Pi の結線(第2回のおさらい)とVref調整の確認

スポンサーリンク

使用構成(おさらい)

A4988 モータードライバー基板
A4988
NEMA17 ステッピングモーター
NEMA17
モーター用12V 5A 電源
12V 5A 電源

ベルト駆動を想定

将来のXYテーブル構成をもとに、次の部品を想定してプログラムを組みます(今回は実装のみで組み立てはしません)。距離でモーターを動かすには、ハードウェアの数値がプログラム上で必要になるためです。

  • タイミングベルト:GT2(2GT)タイプ … ピッチ2mm
  • 歯付プーリー:32歯
GT2 歯付プーリー(32歯)
歯付プーリー 32歯
GT2 タイミングベルト
GT2 タイミングベルト

スポンサーリンク

mm単位で動かすための計算式(step/mm の求め方)

STEP1:1回転で何mm進むか

1回転の移動距離 = ベルトピッチ × プーリーの歯数

例:GT2ベルト(2mmピッチ)+20歯プーリー → 2.0mm × 20 = 40mm(1回転で軸が40mm動く)

STEP2:1mm動かすのに何ステップ必要か(step/mm)

1mmあたりのステップ数 = モーターの1回転ステップ数(200)÷ 1回転の移動距離

例:200 ÷ 40mm = 5 ステップ/mm(1mm動かすには5ステップ送る)

マイクロステップを使う場合:200の部分をその倍数に置き換えます。1/16マイクロステップなら 200 × 16 = 3200 で計算します。

STEP3:移動量(mm)をステップ数に変換

動かしたい距離計算式(5 step/mm の例)必要なステップ数
10mm10 × 550ステップ
50mm50 × 5250ステップ
100mm100 × 5500ステップ

スポンサーリンク

ハードウェア結線図(A4988 + Raspberry Pi)

A4988とRaspberry PiのSTEP/DIR/ENABLE/MS1〜3/RESET/SLEEPピンをBCMピンに接続した結線図
A4988とRaspberry Piの結線(第2回のおさらい)

結線は第2回と同じです。画像の一部は pinout.xyz より引用しています。

プログラムの前にVref調整を:A4988は購入状態のままだと焼損のリスクがあります。必ず電流制限(Vref)を調整してください。

第1.5回・補足 A4988の電流制限(Vref)調整方法|焼損を防ぐ計算式とテスターでの設定手順 モーターを回す前に必ずやる A4988 の電流調整。

スポンサーリンク

Pythonプログラム(距離指定対応版・stepper_mm.py)

nano stepper_mm.py
import RPi.GPIO as GPIO
import time

# ===== 機構設定 =====
BELT_PITCH = 2.0 #2GTタイミングベルトによる固定値
PULLEY_TEETH = 32 #32歯プーリーによる固定値
STEPS_PER_REV = 200

MM_PER_REV = BELT_PITCH * PULLEY_TEETH
MM_PER_STEP = MM_PER_REV / STEPS_PER_REV

# ===== 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

GPIO.setmode(GPIO.BCM)

for pin in [X_STEP, X_DIR, X_EN, X_RESET, X_SLEEP]:
    GPIO.setup(pin, GPIO.OUT)

GPIO.output(X_EN, GPIO.LOW)
GPIO.output(X_RESET, GPIO.HIGH)
GPIO.output(X_SLEEP, GPIO.HIGH)
GPIO.output(X_MS1, GPIO.LOW)
GPIO.output(X_MS2, GPIO.LOW)
GPIO.output(X_MS3, GPIO.LOW)

def move_mm(distance_mm, direction, delay=0.01):    # delayの値で速度調整 値が大きいと遅くなる
    steps = int(distance_mm / MM_PER_STEP)
    GPIO.output(X_DIR, direction)

    for _ in range(steps):
        GPIO.output(X_STEP, GPIO.HIGH)
        time.sleep(delay)
        GPIO.output(X_STEP, GPIO.LOW)
        time.sleep(delay)

try:
    print("20mm 正転")
    move_mm(20, GPIO.LOW)  # 20=移動量(mm) GPIO.LOW=正転
    time.sleep(1)

    print("10mm 逆転")  # 10=移動量(mm) GPIO.HIGH=逆転
    move_mm(10, GPIO.HIGH)

finally:
    GPIO.cleanup()
⬇ stepper_mm.py をダウンロード(ZIP) python3 stepper_mm.py

指示通りの距離(例:10mm)動けば成功です。


スポンサーリンク

まとめと次回予告

今回で「回転制御」から「距離制御」へ進化し、機構設計とプログラムが連動しました。次回・第4回では、モーターを2台に増やしてX軸・Y軸を個別に動かし、いよいよXYテーブル(2軸)の形にします。

次に読む記事

🔀 次回はこちら(第4回) PythonでX軸・Y軸のステッピングモーターを2軸制御する方法|A4988ドライバー2台の配線とコード モーターを2台に増やして「点」から「面」の動きへ。 🗺️ 全体像 自作XYテーブルの全手順ロードマップ|Raspberry Pi+ステッピングモーターで2軸制御 第0回〜第11回の全工程をまとめたロードマップ。

スポンサーリンク

よくある質問(FAQ)

Qstep/mm(1mmあたりのステップ数)はどう計算しますか?

A「1回転のステップ数 ÷(ベルトピッチ × プーリー歯数)」です。フルステップ200・GT2ベルト(2mm)・20歯なら 200 ÷(2×20)= 5 step/mm。1/16マイクロステップなら 3200 ÷ 40 = 80 step/mm になります。

Qプーリーの歯数を変えると精度はどうなりますか?

A歯数が少ないほど1回転あたりの移動距離が短くなり、1mmあたりのステップ数が増えるため分解能(細かさ)が上がります。ただしトルクは実効的に増える一方、同じ速度を出すには多くのパルスが必要になります。20歯前後がバランスの良い選択です。

Qマイクロステップにすると move の速度が遅くなりました。

A1/16にするとステップ数が16倍になるため、同じ time.sleep(delay) だと16倍時間がかかります。マイクロステップを上げたら delay を小さくして調整するか、加減速制御(第5回)を導入します。

Q計算通りに動かず距離がずれます。

Aベルトのたるみ、プーリーの歯数の勘違い(実測して数える)、脱調(速すぎ・トルク不足)が主な原因です。まず delay を大きめ(0.005〜0.01)にして低速で10mm・100mmを実測し、ずれるなら step/mm を実測値で補正します。

QVref調整をしないとどうなりますか?

AA4988は初期状態だとモーター定格を超える電流を流すことがあり、ドライバやモーターが異常発熱して焼損する恐れがあります。テスターでVrefを測りながら半固定抵抗を回して、モーターの定格電流に合わせて設定します(第1.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での電気代試算、外部公開を見送った理由まで解説します。

コメント