はじめに
XYテーブル製作シリーズ 第3回
はじめに:「回転」から「距離」の制御へ
前回(第2回)でステッピングモーターを回すところまで進みました。今回は「10mm動かしたい」と思ったときに、プログラムへ何を書けばいいのか——タイミングベルトとプーリーの仕様から移動量を割り出す計算式と、そのPython実装を解説します。ここができると、工作から「装置設計」へレベルアップします。
この記事で分かること
- ベルト駆動で「1回転=何mm進むか」を求める式(ベルトピッチ × プーリー歯数)
- 「1mm動かすのに何ステップ必要か」= 1回転のステップ数(200)÷ 1回転の移動距離
- マイクロステップを使うときの計算の直し方
- 距離(mm)を指定してモーターを動かすPythonコード(
stepper_mm.py、ZIP配布) - A4988 + Raspberry Pi の結線(第2回のおさらい)とVref調整の確認
使用構成(おさらい)
ベルト駆動を想定
将来のXYテーブル構成をもとに、次の部品を想定してプログラムを組みます(今回は実装のみで組み立てはしません)。距離でモーターを動かすには、ハードウェアの数値がプログラム上で必要になるためです。
- タイミングベルト:GT2(2GT)タイプ … ピッチ2mm
- 歯付プーリー:32歯
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 の例) | 必要なステップ数 |
|---|---|---|
| 10mm | 10 × 5 | 50ステップ |
| 50mm | 50 × 5 | 250ステップ |
| 100mm | 100 × 5 | 500ステップ |
ハードウェア結線図(A4988 + Raspberry Pi)
結線は第2回と同じです。画像の一部は pinout.xyz より引用しています。
プログラムの前にVref調整を:A4988は購入状態のままだと焼損のリスクがあります。必ず電流制限(Vref)を調整してください。
⚡ 第1.5回・補足 A4988の電流制限(Vref)調整方法|焼損を防ぐ計算式とテスターでの設定手順 モーターを回す前に必ずやる A4988 の電流調整。 →Pythonプログラム(距離指定対応版・stepper_mm.py)
nano stepper_mm.pyimport 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()指示通りの距離(例: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回)
- 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アプリ化まで、実務で役立つ自動化ノウハウが満載です。
シリーズを読む






コメント