XYテーブル製作シリーズ 第2回
はじめに
PythonとRaspberry Piで「自作XYテーブル」を作るシリーズの第2回です。第1回のLチカでGPIOの基本を学んだので、今回はモータードライバー「A4988」でステッピングモーターを1軸分だけ回すところまで進めます。ここができれば、2軸に増やしてXYテーブルにするのは目前です。
この記事で分かること
- A4988 と Raspberry Pi の配線(STEP/DIR/ENABLE/MS1〜3/RESET/SLEEP と BCM ピンの対応)
- モーター用12V電源とラズパイのGNDを共通にする理由
- プログラムの前に必ずやる A4988 の Vref(電流制限)調整と、やらないと焼損する話
RPi.GPIOでSTEPパルスを送ってモーターを正転・逆転させるサンプルコード(stepper.py、ZIP配布)- 「ガガガと震えて回らない」「途中で止まる(脱調)」など、つまずいた時のチェックリスト
ステッピングモーターとは?
ステッピングモーターは一定角度ずつ正確に回転するモーターです。一般的な NEMA17 の場合、
- 1ステップ = 1.8°
- 1回転 = 200ステップ
つまり、STEPピンに200回パルスを送れば1回転します。
使用する主な部品
| 部品 | 役割 | リンク |
|---|---|---|
| Raspberry Pi 3 Model A+ | 制御に使用(GPIOがあれば他機種でも可) | Amazon |
| A4988(モータードライバー) | STEP/DIRパルスでモーターを制御。Vref調整が必須 | Amazon |
| NEMA17(ステッピングモーター) | 1.8°/step・200ステップで1回転 | Amazon |
| 12V 5A 電源(モーター用) | A4988の VMOT に接続。ラズパイの5Vとは別系統 | Amazon |
※一部のリンクはアフィリエイトプログラムを利用しています。
ハードウェア結線図(A4988 + Raspberry Pi)
GPIO(BCM)と A4988 の対応
| Raspberry Pi(BCM) | A4988 | 説明 |
|---|---|---|
| GPIO21 | STEP | ステップ信号(パルスで1ステップ進む) |
| GPIO20 | DIR | 回転方向 |
| GPIO16 | ENABLE | LOW で有効 |
| GPIO17 | MS1 | マイクロステップ設定 |
| GPIO27 | MS2 | マイクロステップ設定 |
| GPIO22 | MS3 | マイクロステップ設定 |
| GPIO5 | RESET | HIGH で有効 |
| GPIO6 | SLEEP | HIGH で有効 |
| GND | GND | ラズパイとモーター電源で必ず共通にする |
モーターの接続
A4988 の 1A / 1B / 2A / 2B に、NEMA17 のコイルを接続します。コイルの「組」を間違えると回らないので、テスターで導通する2本(1組)を確認してから、片方の組を 1A/1B、もう片方を 2A/2B につなぐと確実です。
電源の接続
| 接続先 | 内容 |
|---|---|
| VMOT | 12V 電源 + |
| GND(VMOT 横) | 12V 電源 − |
| VDD | Raspberry Pi 3.3V |
| GND | Raspberry Pi GND |
GND は必ず共通に:モーター用12V電源のマイナスと、Raspberry Pi の GND を必ずつなぎます。ここが分かれていると STEP パルスの基準がずれて、モーターが正しく動きません。
A4988 の基本動作
| ピン | 役割 |
|---|---|
| STEP | パルス1回で1ステップ進む |
| DIR | 回転方向(HIGH / LOW) |
| ENABLE | LOW で有効(ドライバをON) |
| MS1〜MS3 | マイクロステップ設定(今回はすべて LOW = フルステップ) |
| RESET / SLEEP | HIGH で動作 |
GPIO ピン定義(BCM モード)
X_STEP = 21
X_DIR = 20
X_EN = 16
X_MS1 = 17
X_MS2 = 27
X_MS3 = 22
X_RESET = 5
X_SLEEP = 6プログラムの前に:A4988 の Vref(電流制限)調整
Vref の計算式やテスターでの具体的な合わせ方は、別記事で詳しく解説しています。この記事のコードを動かす前に、必ず一度目を通してください。
⚡ 先に読む(必読) A4988の電流制限(Vref)調整方法!焼損を防ぐ計算式とテスターでの設定手順 A4988の発熱・焼損を防ぐVref調整を、計算式とテスターでの手順で解説しています。 →Python プログラム(stepper.py)
Raspberry Pi 側でターミナルを開き、ファイルを作成します。
nano stepper.pystepper.py が開いたら、以下のコードを入力(貼り付け)します。
import RPi.GPIO as GPIO
import time
# --- 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)
pins = [X_STEP, X_DIR, X_EN, X_MS1, X_MS2, X_MS3, X_RESET, X_SLEEP]
for pin in pins:
GPIO.setup(pin, GPIO.OUT)
GPIO.output(pin, GPIO.LOW)
# ドライバ有効化
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_motor(steps, direction, delay=0.01): # delayの値で速度調整 値が大きいと遅くなる
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("正転")
move_motor(50, GPIO.LOW) # 50=移動量(ステップ数) GPIO.LOW=正転
time.sleep(1)
print("逆転")
move_motor(50, GPIO.HIGH) # 50=移動量(ステップ数) GPIO.HIGH=逆転
time.sleep(1)
finally:
GPIO.cleanup()実行
Raspberry Pi のターミナルで実行します。
python3 stepper.py正転 → 停止 → 逆転 と動けば成功です。move_motor() の第1引数がステップ数(移動量)、第2引数が方向(GPIO.LOW=正転 / GPIO.HIGH=逆転)、delay がパルス間隔(大きいほどゆっくり)です。
なぜ200ステップで1回転?
NEMA17 は 1.8°/step なので、
1.8° × 200 = 360°で、200パルス送ると1回転します。次回はこの関係を使って「mm 単位」で動かせるようにします。
動かない時のトラブルシューティング・チェックリスト
うまく回らない場合は、上から順に確認してみてください。
1. モーターが「ガガガ」と震えるだけで回らない
ステッピングモーターのコイルの組が間違っている可能性が高いです。テスターで導通する2本(1組)を確認し、A4988 の 1A/1B に1組、2A/2B にもう1組を接続します。線の色が同じでもメーカーによって配列が違うことがあります。
2. 全く反応しない(軸が手でスルスル回る)
ドライバが無効(スリープ)状態です。プログラムで X_EN を LOW にしているか、RESET と SLEEP ピンが HIGH(または物理的にジャンパで接続)されているかを確認してください。
3. モーターやドライバーが異常に熱い/異音がする
A4988 の 電流制限(Vref)が合っていません。放置するとチップが焼損します。すぐに電源を切り、Vref調整記事を参考にボリュームを調整してください。
4. 動くけれど途中で止まる(脱調)
Python コード内の delay(パルス間隔)が短すぎて速すぎます。まずは delay=0.05 くらいまで大きくして、ゆっくり確実に回るか試してください。
まとめと次回予告
ここまでで、ステッピングモーターの パルス制御 ・ 方向制御 ・ ドライバ制御 の3つができるようになりました。1軸を思い通りに回せれば、XYテーブルはもう目前です。
次回・第3回では、いよいよ「mm 単位」で動かす制御を実装します。ベルトのピッチとプーリー歯数から必要なステップ数を計算する式まで解説し、ここから一気に「装置」らしくなっていきます。
次に読む記事
📏 次回はこちら(第3回) ステッピングモーターをmm単位で制御!ベルト駆動の計算式とPython実装を解説 パルス数と移動距離の関係を計算式で導き、mm 指定で動かせるようにします。 → ⚡ コードを動かす前に(必読) A4988の電流制限(Vref)調整方法!焼損を防ぐ計算式とテスターでの設定手順 A4988 を壊さないための Vref 調整。この記事で「必須」と書いた設定の詳細です。 → 🔀 番外編:A4988とL6470の違い L6470が動かない原因はこれ!A4988との違いとSPI通信による制御の注意点 「A4988と同じ感覚で使えるはず」とハマった話。パルス入力とSPIコマンド制御の違いを解説。 → 🗺️ シリーズ全体像 Raspberry PiとPythonでXYテーブルを自作する|回路設計からTkinter GUI制御まで 第0回〜第11回の全工程をまとめたロードマップ。どの順で読めばいいかが分かります。 →よくある質問(FAQ)
QGPIO のピン番号は記事と同じにしないとダメですか?
Aいいえ、出力に使えるGPIOなら自由に変えられます。コード冒頭の X_STEP = 21 などの番号を、実際に配線したピン(BCM番号)に合わせて書き換えてください。特殊機能ピン(I2C/SPI用など)は避けると無難です。
QMS1〜MS3 は全部つながないとダメですか?
A今回のフルステップ動作なら、MS1〜MS3 を GND(LOW)に落とすか、未接続でも動きます(A4988 内部でプルダウンされます)。1/2・1/4・1/16 などのマイクロステップを使うときに HIGH/LOW を組み合わせて指定します。
Q12V 電源とラズパイの 5V、GND はつないでいいの?
A電源の+どうしはつなぎません(12V系と5V系は別)。ただし GND(マイナス)は必ず共通にします。共通にしないと STEP パルスの電圧基準がずれて、モーターが誤動作します。
Qimport RPi.GPIO でエラーが出ます(最近の Raspberry Pi OS)
ABookworm 以降の Raspberry Pi OS では RPi.GPIO が動かないことがあります。その場合は gpiozero や lgpio、pigpio ベースの書き方に置き換えるか、sudo apt install python3-rpi-lgpio で互換ライブラリを入れる方法があります。
QA4988 が熱くなります。ヒートシンクは必要ですか?
Aマイクロステップや連続動作をさせるなら、付属のヒートシンクは貼っておくのが安全です。ただし「触れないほど熱い」場合は発熱そのものが多すぎるので、まず Vref を下げてモーターの定格電流に合わせてください。
Q2軸(X・Y)に増やすにはどうすればいいですか?
AA4988 をもう1枚用意し、STEP/DIR などを別のGPIOに割り当てて同じように配線します。コードも Y 軸用のピン定義と move_motor() 呼び出しを足すだけです。2軸同時制御は第4回で解説しています。
XYテーブル製作シリーズ(全12回)
- Raspberry PiのOSインストール完全ガイド|初心者向けにゼロから解説
- ラズパイでLチカ!PythonでのGPIO操作とLED点灯の基本を徹底解説
- ラズパイでステッピングモーターを回す方法|A4988の配線とPython制御・Vref調整(この記事)
- ステッピングモーターをmm単位で制御!ベルト駆動の計算式とPython実装を解説
- Pythonで2軸制御!ラズパイでX軸・Y軸のステッピングモーターを動かす方法
- ステッピングモーターの脱調を防ぐ!Pythonで加減速制御(台形駆動)を実装する方法
- Raspberry PiでXYテーブル制御|Pythonでステッピングモーターを2軸同時に動かす
- Raspberry PiでXYテーブル制御|リミットスイッチと原点復帰(Homing)の実装
- 【Python × Raspberry Pi】XYテーブルをGUI操作する(Tkinter)
- Pythonでモーター制御GUIを作るときのThreadの使い方(GUIが固まる理由を解説)
- XYテーブルを制御するGUIを作る(原点復帰・位置表示・ソフトリミット実装)
- XYテーブル制御GUIを作る 単軸動作・片道運動・安全終了の実装
- XYテーブルの完成構成と機構部品の資料(図面・BOM)の紹介
補足記事
⚡ 第1.5回・補足 A4988の電流制限(Vref)調整方法!焼損を防ぐ計算式とテスターでの設定手順 モーターを回す前に必ずやる A4988 の電流調整。 → 🔀 番外編 L6470が動かない原因はこれ!A4988との違いとSPI通信による制御の注意点 高機能ドライバ L6470 を A4988 と同じ感覚で使ってハマった話。 →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アプリ化まで、実務で役立つ自動化ノウハウが満載です。
シリーズを読む




コメント