PR

ラズパイでステッピングモーターを回す!A4988の接続とPython制御を徹底解説(自作CNC #2)

スポンサーリンク
RaspberryPi

はじめに

本シリーズでは、PythonとRaspberry Piを使った「自作XYテーブル」の製作をゴールに設定しています。第1回のLチカでGPIOの基本を学んだ次は、いよいよ「物理的な動き」を作るステップです。


今回はモータードライバー「A4988」を使用し、ステッピングモーターを1軸分制御する方法を解説します。これができるようになれば、XYテーブル完成への道が一気に開けます!

使用する主な部品:

ステッピングモーターとは?

ステッピングモーターは
一定角度ずつ正確に回転するモーターです。

一般的なNEMA17の場合:

  • 1ステップ = 1.8°
  • 1回転 = 200ステップ

つまり、200回パルスを送れば1回転します。

スポンサーリンク

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

画像の一部は raspberrypi.zyx さんより引用させて頂きました。

Raspberry Pi(BCM)A4988説明
GPIO21STEPステップ信号
GPIO20DIR回転方向
GPIO16ENABLELOWで有効
GPIO17MS1マイクロステップ設定
GPIO27MS2マイクロステップ設定
GPIO22MS3マイクロステップ設定
GPIO5RESETHIGHで有効
GPIO6SLEEPHIGHで有効
GNDGND必ず共通にする

🔹 モーター接続

  • A4988の 1A / 1B / 2A / 2B
    NEMA17のコイルを接続

※テスターでコイルの組を確認すると確実です。

🔹 電源接続

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

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の基本動作

ピン役割
STEPパルスで1ステップ進む
DIR回転方向
ENLOWで有効
MS1〜3マイクロステップ設定
RESET/SLEEPHIGHで動作

今回はフルステップ動作です。

プログラムの前にVref調整(重要)

A4988を購入状態で使用すると焼損のリスクがあります。
※A4988を壊さないために、必ず先にこちらの設定を確認してください。

A4988のVref調整手順を詳しく解説しています。

スポンサーリンク

Pythonプログラム

stepper.py を作成します。
Radpberry Pi側でコンソールを開き、下記コマンドを実行

nano stepper.py

→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()

この記事で使用したコードはこちらからダウンロードできます。

led.py をダウンロード(ZIP)

実行

Raspberry Piのターミナルで以下を入力しEnterを押す

python3 stepper.py

正転 → 停止 → 逆転
と動けば成功です。

なぜ200ステップで1回転?

NEMA17は1.8°/step。

1.8° × 200 = 360°

だから200パルスで1回転します。

改善案:初心者救済!トラブルシューティング・チェックリスト

もし動かない場合は、以下の3点を上から順番に確認してみてください。

  • 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 くらいまで数値を大きくして、ゆっくり確実に回るか試してみましょう。

ここまでできればOK

✅ パルス制御
✅ 方向制御
✅ ドライバ制御


今回使用したモーター等はこちらです。

次回予告

次はいよいよ

mm単位で動かす制御を実装します。

✔ ベルトピッチ計算
✔ ステップ数変換式
✔ XYテーブル設計への布石

いよいよ「装置」になります。

スポンサーリンク

XYテーブル製作シリーズはこちらから

コメント