PR

ラズパイでステッピングモーターを回す方法|A4988の配線とPython制御・Vref調整【XYテーブル製作 第2回】

RaspberryPi

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

スポンサーリンク

はじめに

このシリーズで製作する自作XYテーブルの外観図。2軸のステッピングモーターとリニアガイドで構成
このシリーズのゴール:自作XYテーブル

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ステッピングモータードライバー基板
A4988
NEMA17 ステッピングモーター
NEMA17
12V 5A のDC電源
12V 5A 電源

※一部のリンクはアフィリエイトプログラムを利用しています。


スポンサーリンク

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

A4988とRaspberry Piの結線図。STEP・DIR・ENABLE・MS1〜3・RESET・SLEEPの各ピンとGPIO、VMOTへの12V電源、共通GNDの配線
A4988 + Raspberry Pi の結線図(一部の図は pinout.xyz より引用)

GPIO(BCM)と A4988 の対応

Raspberry Pi(BCM)A4988説明
GPIO21STEPステップ信号(パルスで1ステップ進む)
GPIO20DIR回転方向
GPIO16ENABLELOW で有効
GPIO17MS1マイクロステップ設定
GPIO27MS2マイクロステップ設定
GPIO22MS3マイクロステップ設定
GPIO5RESETHIGH で有効
GPIO6SLEEPHIGH で有効
GNDGNDラズパイとモーター電源で必ず共通にする

モーターの接続

A4988 の 1A / 1B / 2A / 2B に、NEMA17 のコイルを接続します。コイルの「組」を間違えると回らないので、テスターで導通する2本(1組)を確認してから、片方の組を 1A/1B、もう片方を 2A/2B につなぐと確実です。

電源の接続

接続先内容
VMOT12V 電源 +
GND(VMOT 横)12V 電源 −
VDDRaspberry Pi 3.3V
GNDRaspberry Pi GND

GND は必ず共通に:モーター用12V電源のマイナスと、Raspberry Pi の GND を必ずつなぎます。ここが分かれていると STEP パルスの基準がずれて、モーターが正しく動きません。

A4988 の基本動作

ピン役割
STEPパルス1回で1ステップ進む
DIR回転方向(HIGH / LOW)
ENABLELOW で有効(ドライバをON)
MS1〜MS3マイクロステップ設定(今回はすべて LOW = フルステップ)
RESET / SLEEPHIGH で動作

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(電流制限)調整

⚠️ 先にこれをやってください。A4988 を購入したままの状態で使うと、モーターの定格を超える電流が流れてチップが焼損するリスクがあります。基板上の半固定抵抗(ボリューム)を回して、使うモーターに合わせた電流値(Vref)に調整します。

Vref の計算式やテスターでの具体的な合わせ方は、別記事で詳しく解説しています。この記事のコードを動かす前に、必ず一度目を通してください。

先に読む(必読) A4988の電流制限(Vref)調整方法!焼損を防ぐ計算式とテスターでの設定手順 A4988の発熱・焼損を防ぐVref調整を、計算式とテスターでの手順で解説しています。

スポンサーリンク

Python プログラム(stepper.py)

Raspberry Pi 側でターミナルを開き、ファイルを作成します。

nano stepper.py

stepper.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()
⬇ stepper.py をダウンロード(ZIP)

実行

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_ENLOW にしているか、RESETSLEEP ピンが 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 が動かないことがあります。その場合は gpiozerolgpiopigpio ベースの書き方に置き換えるか、sudo apt install python3-rpi-lgpio で互換ライブラリを入れる方法があります。

QA4988 が熱くなります。ヒートシンクは必要ですか?

Aマイクロステップや連続動作をさせるなら、付属のヒートシンクは貼っておくのが安全です。ただし「触れないほど熱い」場合は発熱そのものが多すぎるので、まず Vref を下げてモーターの定格電流に合わせてください。

Q2軸(X・Y)に増やすにはどうすればいいですか?

AA4988 をもう1枚用意し、STEP/DIR などを別のGPIOに割り当てて同じように配線します。コードも Y 軸用のピン定義と move_motor() 呼び出しを足すだけです。2軸同時制御は第4回で解説しています。


スポンサーリンク

XYテーブル製作シリーズ(全12回)

補足記事

第1.5回・補足 A4988の電流制限(Vref)調整方法!焼損を防ぐ計算式とテスターでの設定手順 モーターを回す前に必ずやる A4988 の電流調整。 🔀 番外編 L6470が動かない原因はこれ!A4988との違いとSPI通信による制御の注意点 高機能ドライバ L6470 を A4988 と同じ感覚で使ってハマった話。

ニンジン🥕アイコン

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での電気代試算、外部公開を見送った理由まで解説します。

コメント